xboard-4.7.3/0000755000175000001440000000000012262562300007777 500000000000000xboard-4.7.3/po/0000755000175000001440000000000012262562300010415 500000000000000xboard-4.7.3/po/uk.po0000644000175000001440000025217212262562300011325 00000000000000# Ukrainian translation for xboard. # Copyright (C) 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the xboard package. # # Yuri Chornoivan , 2011, 2012, 2013. msgid "" msgstr "" "Project-Id-Version: GNU xboard-4.7.0.20130224\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: 2013-02-26 22:30+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "%s у файлі параметрів\n" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "Помилкове ціле значення %s" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "Невідомий аргумент %s" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "Не вказано значення для аргументу %s" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "Неповне екранування \\ у значенні для %s" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "Не вдалося відкрити файл переспрямування %s" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "Невідоме значення булевого аргументу %s" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "перший" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "другий" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "підтримки версії протоколу %d не передбачено" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "Вами не вказано виконуваного файла рушія" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "помилковий параметр timeControl %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "помилковий параметр searchTime %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "Підтримку варіанта %s передбачено лише у режимі ICS" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Невідома назва варіанта %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Запуск шахової програми" #: backend.c:1398 msgid "Bad game file" msgstr "Помилковий файл гри" #: backend.c:1405 msgid "Bad position file" msgstr "Помилковий файл позиції" #: backend.c:1419 msgid "Pick new game" msgstr "Виберіть нову гру" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" "Вами перезапущено вже завершений турнір.\n" "Тепер до турніру буде додано ще одне коло.\n" "Ігри розпочнуться за 10 секунд." #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "Всі ігри турніру «%s» вже зіграно або вже розпочато" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "Не можна розпочати матч, якщо не встановлено шахових програм" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "Не вдалося відкрити порт comm %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "Не вдалося з’єднатися з вузлом %s, порт %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "Невідоме значення initialMode %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "У режимі аналізу файла потрібен файл гри" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "У режимі аналізу потрібен шаховий рушій" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "Робота режиму разом з режимом ICS неможлива" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "У режимі гри комп’ютера білими потрібен шаховий рушій" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "Робота режиму гри комп’ютером білими разом з режимом ICS неможлива" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "У режимі гри комп’ютера чорними потрібен шаховий рушій" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "Робота режиму гри комп’ютером білими разом з режимом ICS неможлива" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "" "Режимом гри між двома комп’ютерами можна скористатися, лише якщо встановлено " "шаховий рушій" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "Робота режиму гри між двома комп’ютерами разом з режимом ICS неможлива" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "У режимі тренування потрібен файл гри" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Помилка під час спроби запису до ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Помилка під час читання даних з клавіатури" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Отримано символ кінця файла з клавіатури" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "Невідомий «дикий» тип %d" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Помилка запису на дисплей" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "втручання вашого суперника: %s" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Помилка під час збирання списку ходів: два заголовки" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Помилка під час збирання списку ходів: вкладеність" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "проти" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "Некоректний хід (заборонено ICS)" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "З’єднання розірвано з боку ICS" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Помилка під час спроби читання з ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" "Не вдалося обробити рядок дошки:\n" "\"%s\"" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" "Гра є занадто довгою. Збільшіть значення MAX_MOVES і перезберіть програму." #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Помилка під час збирання списку ходів: вихід за межі дошки" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "Не вдалося обробити хід «%s» з ICS" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say Internal error; bad moveType %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "Ця дія неможлива у режимі гри або спостереження" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" "Повторно зберіть програму з підтримкою цих значень BOARD_RANKS і BOARD_FILES!" #: backend.c:6491 msgid "You are playing Black" msgstr "Ви граєте чорними" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Ви граєте білими" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Хід білих" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Хід чорних" #: backend.c:6552 msgid "Displayed position is not current" msgstr "Показана позиція не є поточною" #: backend.c:6790 msgid "Illegal move" msgstr "Недозволений хід" #: backend.c:6857 msgid "End of game" msgstr "Кінець гри" #: backend.c:6860 msgid "Incorrect move" msgstr "Некоректний хід" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "Потягніть пішака назад, щоб знизити ранг фігури" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "Турнір за швейцарською системою завершено" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "Рушієм визначення пар повернуто некоректне значення пари" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Некоректний хід «%s» від комп’ютера %s" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "Отримано помилкові дані FEN від рушія" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "У %s не передбачено аналізу" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "" "Недозволений хід «%s» (у реєстрації ходу відмовлено шаховою програмою %s)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Не вдалося запустити шахову програму %s %s на %s: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Підказка: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" "Некоректна підказка щодо ходу «%s»\n" "від шахової програми %s" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "Ком’ютер погодився з вашою пропозицією нічиєї" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" "Комп’ютером запропоновано нічию\n" "Скористайтеся пунктом меню «Дія->Нічия», щоб погодитися" #: backend.c:8977 msgid "failed writing PV" msgstr "не вдалося записати PV" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Неоднозначний хід у виведених ICS даних: «%s»" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Некоректний хід у виведених даних ICS: «%s»" #: backend.c:9296 msgid "Gap in move list" msgstr "Пропущено хід у списку ходів" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "Варіант %s не підтримується %s" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Помилка запуску на «%s»" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "Очікування на запуск першої шахової програми" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "Очікування на запуск другої шахової програми" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "Не вдалося виконати запис до файла турніру" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" "Не можна міняти рушій, який зараз використовується!\n" "Спочатку перервіть гру." #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "Рушія з вказаною вами назвою не встановлено" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" "Спочатку змініть рушій редагуванням списку учасників турніру\n" "у діалоговому вікні «Параметри турніру»" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "Одночасно змінювати можна лише один рушій" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "Не встановлено жодного рушія %s" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" "Для запису результатів турніру\n" "вам слід вказати файл турніру." #: backend.c:10259 msgid "Not enough participants" msgstr "Недостатньо учасників" #: backend.c:10460 msgid "Bad tournament file" msgstr "Помилковий файл турніру" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "Очікування на результати інших ігор" #: backend.c:10485 msgid "No pairing engine specified" msgstr "Не вказано рушія визначення пар" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Матч між %s і %s: остаточний рахунок — %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Недозволений хід: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Неоднозначний хід: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "Не вдалося відкрити «%s»" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "Не вдалося побудувати список ігор" #: backend.c:11594 msgid "No more games in this message" msgstr "У цьому повідомленні більше немає результатів ігор" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Ще не завантажено жодної гри" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Подальше створення резервних копій неможливе" #: backend.c:12077 msgid "Game number out of range" msgstr "Номер гри поза доступним діапазоном" #: backend.c:12088 msgid "Can't seek on game file" msgstr "Пошук у файлі гри неможливий" #: backend.c:12146 msgid "Game not found in file" msgstr "У файлі немає даних щодо гри" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Помилкова позиція FEN у файлі" #: backend.c:12426 msgid "No moves in game" msgstr "У записі гри немає жодного ходу" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Жодної з позицій ще не завантажено" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "Пошук у файлі позицій неможливий" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "У файлі не знайдено позиції" #: backend.c:12632 msgid "Black to play" msgstr "Хід чорних" #: backend.c:12635 msgid "White to play" msgstr "Хід білих" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "Очікування на доступ до можливості збереження файла" #: backend.c:12724 msgid "Saving game" msgstr "Збереження гри" #: backend.c:12725 msgid "Bad Seek" msgstr "Помилкове позиціювання" #: backend.c:13085 msgid "Saving position" msgstr "Збереження позиції" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" "Вами внесено зміни до журналу гри.\n" "Скористайтеся пунктом «Перезавантажити гру» і повторіть ваш хід." #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" "Вами введено занадто багато ходів.\n" "Поверніться до правильної позиції і повторіть спробу." #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" "Показана позиція не є поточною.\n" "Продовжіть гру, щоб виправити позицію і повторіть спробу." #: backend.c:13268 msgid "You have not made a move yet" msgstr "Вами ще не зроблено жодного ходу" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" "Повідомлення cmail не завантажено.\n" "Скористайтеся пунктом «Перезавантажити повідомлення CMail» і повторіть ваш " "хід." #: backend.c:13294 msgid "No unfinished games" msgstr "Немає незавершених ігор" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" "Ви вже надіслали хід поштою.\n" "Зачекайте, доки буде отримано хід від вашого суперника.\n" "Щоб повторно надіслати той самий хід, віддайте команду\n" "\"cmail -remail -game %s\"\n" "у командному рядку." #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Не вдалося викликати cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Очікування на відповідь від суперника\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Слід зробити хід у грі\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Слід зробити ходити у обох іграх\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Слід зробити ходити у всіх %d іграх\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Слід зробити хід у грі %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "Немає незавершених ігор\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Програма готова до надсилання пошти\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Слід зробити ходи у іграх %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "Редагувати коментар" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Змінити коментар щодо %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "Ви не спостерігаєте за грою" #: backend.c:13796 msgid "It is not White's turn" msgstr "Зараз хід чорних" #: backend.c:13877 msgid "It is not Black's turn" msgstr "Зараз хід білих" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "Запуск шахової програми %s" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" "Зачекайте на ваш хід або\n" "виберіть пункт «Ходити»" #: backend.c:14147 msgid "Training mode off" msgstr "Режим тренування вимкнено" #: backend.c:14155 msgid "Training mode on" msgstr "Режим тренування увімкнено" #: backend.c:14158 msgid "Already at end of game" msgstr "Гру вже завершено" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Попередження: гра ще триває" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Попередження: ви ще продовжуєте спостерігати за грою" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Попередження: ви ще вивчаєте гру" #: backend.c:14311 msgid "Click clock to clear board" msgstr "Клацніть на годиннику, щоб спорожнити дошку" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "Завершити процес аналізу рушія ICS…" #: backend.c:14609 msgid "That square is occupied" msgstr "Цю клітинку зайнято" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "У черзі немає пропозицій щодо цього ходу" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "У вашого суперника ще залишився час" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Перш ніж запропонувати нічию, вам слід зробити хід" #: backend.c:15109 msgid "You are not examining a game" msgstr "Ви не вивчаєте гру" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "Скасовувати ходи у призупиненій грі не можна" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "Ваш хід" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Очікувати на ваш хід" #: backend.c:15237 msgid "No hint available" msgstr "Немає підказки" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "Список гри не завантажено або цей список є порожнім" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "Файл книги вже існує! Повторіть спробу, щоб перезаписати його." #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Помилка під час спроби запису даних до шахової програми %s" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "Програма %s завершила роботу у нічийній позиції (%s)" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Помилка: шахова програма %s (%s) несподівано завершила роботу" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Помилка під час спроби читання даних з шахової програми %s (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "Для рушія %s передбачено занадто багато параметрів\n" #: backend.c:16343 msgid "Displayed move is not current" msgstr "Показаний хід не є поточним" #: backend.c:16352 msgid "Could not parse move" msgstr "Не вдалося обробити хід" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Обидва прапорці впали" #: backend.c:16479 msgid "White's flag fell" msgstr "Прапорець білих впав" #: backend.c:16501 msgid "Black's flag fell" msgstr "Прапорець чорних впав" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "Коригування годинника у режимі автоматичних прапорців заборонене" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Помилкова позиція FEN у буфері обміну" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "Некоректна бібліотека позицій" #: book.c:701 msgid "Book Fault" msgstr "Помилка бібліотеки позицій" #: book.c:836 msgid "Hash keys are different" msgstr "Ключі хешів не збігаються" #: book.c:1003 msgid "Could not create book" msgstr "Не вдалося створити книгу" #: dialogs.c:259 msgid "Tournament file: " msgstr "Файл турніру: " #: dialogs.c:260 msgid "Sync after round" msgstr "Синхронізувати після рауду" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr " (для одночасної гри окремого" #: dialogs.c:262 msgid "Sync after cycle" msgstr "Синхронізувати після кола" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr " турніру з декількома XBoard)" #: dialogs.c:264 msgid "Tourney participants:" msgstr "Учасники турніру:" #: dialogs.c:265 msgid "Select Engine:" msgstr "Виберіть рушій:" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "Система турніру (0 = кругова, 1 = почергова):" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "Кількість кіл турніру (швейцарських раундів):" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "Типова кількість ігор у матчі:" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "Проміжок між іграми у матчі (у мілісекундах):" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "Зберігати ігри турніру до:" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "Файл гри з початковими рядками:" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "Номер гри (-1 або -2 = автоматичне збільшення):" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "Файл з початковими позиціями:" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "Номер позиції (-1 або -2 = автоматичне збільшення):" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" "Відновлювати початковий номер після вказаної кількості ігор (0=ніколи):" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "Типово вимкнути власні бібліотеки позицій рушія" #: dialogs.c:284 msgid "Replace Engine" msgstr "Замінити рушій" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "Оновити рушій" #: dialogs.c:286 msgid "Clone Tourney" msgstr "Клонувати турнір" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "Спочатку вам слід вказати вже створений файл турніру для клонування" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "# не встановлено жодного рушія" #: dialogs.c:344 msgid "Match Options" msgstr "Параметри партії" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "Абсолютні оцінки аналізу" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "Майже завжди королева (відхиляти неповні перетворення)" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Анімація перетягування" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Анімація ходів" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Автопрапорець" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Автоматичне обертання дошки" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Наосліп" #: dialogs.c:370 msgid "Drop Menu" msgstr "Спадне меню" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "Увімкнути дерево варіантів" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "Приховувати обмірковування від людини" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Позначати останній хід" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Позначити за допомогою стрілки" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Хід у одне клацання" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "Періодичні оновлення (у режимі аналізу)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "Грати ходи натиснутих PV (аналіз)" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Обдумати наступний хід" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Контекстні підказки щодо виходу" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Контекстні підказки з помилками щодо ходів" #: dialogs.c:382 msgid "Scores in Move List" msgstr "Оцінки у списку ходів" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Показувати координати" #: dialogs.c:384 msgid "Show Target Squares" msgstr "Показувати клітинки призначення" #: dialogs.c:385 msgid "Sticky Windows" msgstr "Липкі вікна" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Перевіряти коректність" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "Вікна верхнього рівня" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "Блимання під час ходів (0 = без блимання):" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "Частота блимання (висока = швидко):" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "Швидкість анімації (висока = повільно):" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "Масштаб графу оцінки позиції:" #: dialogs.c:400 msgid "General Options" msgstr "Загальні параметри" #: dialogs.c:410 msgid "normal" msgstr "звичайні" #: dialogs.c:411 msgid "makruk" msgstr "макрук" #: dialogs.c:412 msgid "FRC" msgstr "Фішера" #: dialogs.c:413 msgid "shatranj" msgstr "шатрандж" #: dialogs.c:414 msgid "wild castle" msgstr "дика тура" #: dialogs.c:415 msgid "knightmate" msgstr "мат коню" #: dialogs.c:416 msgid "no castle" msgstr "без тури" #: dialogs.c:417 msgid "cylinder *" msgstr "циліндричні *" #: dialogs.c:418 msgid "3-checks" msgstr "Три шахи" #: dialogs.c:419 msgid "berolina *" msgstr "бероліна *" #: dialogs.c:420 msgid "atomic" msgstr "атомні" #: dialogs.c:421 msgid "two kings" msgstr "два королі" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "Розмір дошки ( -1 = типовий для вибраного варіанта):" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "Кількість рангів дошки:" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "Кількість файлів дошки:" #: dialogs.c:425 msgid "Holdings Size:" msgstr "Розмір резерву:" #: dialogs.c:429 msgid "fairy" msgstr "казкові" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "Великий шатрандж (10x8)" #: dialogs.c:431 msgid "Seirawan" msgstr "Сейравана" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "сокіл (10x8)" #: dialogs.c:433 msgid "Superchess" msgstr "Супершахи" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "Капабланка (10x8)" #: dialogs.c:435 msgid "crazyhouse" msgstr "крейзіхаус" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "Готичні (10x8)" #: dialogs.c:437 msgid "bughouse" msgstr "шведські" #: dialogs.c:438 msgid "janus (10x8)" msgstr "Янус (10x8)" #: dialogs.c:439 msgid "suicide" msgstr "самовбивчі" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "Рівноправність (10x8)" #: dialogs.c:441 msgid "give-away" msgstr "піддавки" #: dialogs.c:442 msgid "grand (10x10)" msgstr "гранд-шахи (10x10)" #: dialogs.c:443 msgid "losers" msgstr "Антишахи" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "сьогі (9x9)" #: dialogs.c:445 msgid "Spartan" msgstr "спартанські" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "сянці (9x10)" #: dialogs.c:447 msgid " " msgstr " " #: dialogs.c:448 msgid "courier (12x8)" msgstr "кур’єр (12x8)" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "Попередження: ця можливість не підтримується другим рушієм (%s)!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "У режимі перегляду недоступні лише шведські шахи" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" "Всі варіанти, які не підтримуються першим рушієм\n" "(зараз це %s), вимкнено" #: dialogs.c:490 msgid "New Variant" msgstr "Новий варіант" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Максимальна кількість процесорів на рушій:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "Каталог бібліотек Polygot:" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Розмір таблиці хешів (у МБ):" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "Шлях до бази даних EGTB Налімова:" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "Розмір кешу EGTB (у МБ):" #: dialogs.c:520 msgid "Use GUI Book" msgstr "Використовувати книгу з графічним інтерфейсом" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "Назва файла даних дебютів:" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "Глибина книги (у ходах):" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "Компроміс між різноманітністю (0) і силою (100) книги:" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "Рушій 1 має власну книгу" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "Рушій 2 має власну книгу " #: dialogs.c:534 msgid "Common Engine Settings" msgstr "Загальні параметри рушіїв" #: dialogs.c:540 msgid "Detect all Mates" msgstr "Виявляти всі мати" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "Перевіряти вимоги до результатів рушія" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "Нічия, якщо недостатньо фігур для мату" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "Визначати тривіальні нічиї (трикратне повторення)" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "Правило N-го ходу:" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "N-кратне повторення:" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Нічия після N ходів загалом:" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Поріг виграшу/програшу:" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Негативна оцінка рушія 1" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Негативна оцінка рушія 2" #: dialogs.c:556 msgid "Adjudicate non-ICS Games" msgstr "Судити ігри, що не належать до класу ICS" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "Автопоради" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Автокоментарі" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Автоспостереження" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Автопідняття дошки" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "Автостворення скрипту входу" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Спостереження у тлі під час гри" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Подвійна дошка для ігор з фоновим спостереженням" #: dialogs.c:576 msgid "Get Move List" msgstr "Отримати список ходів" #: dialogs.c:577 msgid "Quiet Play" msgstr "Мовчазна гра" #: dialogs.c:578 msgid "Seek Graph" msgstr "Граф викликів" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "Автоматичне оновлення графу пошуків" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "Автоматичне вікно введення" #: dialogs.c:581 msgid "Premove" msgstr "Попередній хід" #: dialogs.c:582 msgid "Premove for White" msgstr "Попередній хід для білих" #: dialogs.c:583 msgid "First White Move:" msgstr "Перший хід білих:" #: dialogs.c:584 msgid "Premove for Black" msgstr "Попередній хід для чорних" #: dialogs.c:585 msgid "First Black Move:" msgstr "Перший хід чорних:" #: dialogs.c:587 msgid "Alarm" msgstr "Нагадування" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "Час нагадування (у мс):" #: dialogs.c:590 msgid "Colorize Messages" msgstr "Розфарбовувати повідомлення" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "Кольори тексту вигуків:" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "Колір тексту S-вигуків:" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "Кольори тексту каналу 1:" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "Кольори тексту інших каналів:" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "Кольори тексту порад:" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "Кольори тексту висловлювань:" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "Кольори тексту викликів:" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "Кольори тексту запитів:" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "Кольори тексту під час пошуку:" #: dialogs.c:606 msgid "ICS Options" msgstr "Параметри ICS" #: dialogs.c:611 msgid "Exact position match" msgstr "Точний збіг позицій" #: dialogs.c:611 msgid "Shown position is subset" msgstr "Показана позиція є підмножиною" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "Однаковий матеріал з однаковим ланцюжком пішаків" #: dialogs.c:612 msgid "Same material" msgstr "Однаковий матеріал" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "Діапазон матеріалу (верхня половина дошки, необов’язковий)" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "Відмінність матеріалів (з додатковим врівноваженням можливостей)" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "Автопоказ міток" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "Автопоказ коментарів" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" "Швидкість автогри у завантажених іграх\n" "(0 = негайний показ, -1 = вимкнути автогру):" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "Секунд на хід:" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" "\n" "Параметри режиму перегляду ігор:" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" "\n" "Порогові значення фільтрування позицій у списку ігор:" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "Рейтинг Ело для сильнішого гравця не нижче за:" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "Рейтинг Ело для слабшого гравця не нижче за:" #: dialogs.c:633 msgid "No games before year:" msgstr "Не показувати ігри до року:" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "Мінімальна к-ть послідовних позицій:" #: dialogs.c:635 msgid "Search mode:" msgstr "Режим пошуку:" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "Шукати у позиціях зворотних кольорів" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "Шукати у симетричних позиціях" #: dialogs.c:645 msgid "Load Game Options" msgstr "Параметри завантаження ігор" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "Автозбереження ігор" #: dialogs.c:658 msgid "Own Games Only" msgstr "Лише власні ігри" #: dialogs.c:659 msgid "Save Games on File:" msgstr "Зберігати ігри до файла:" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "Зберігати остаточні позиції до файла:" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "Обробник подій PGN:" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "Застарілий стиль збереження (на відміну від PGN)" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "Включити мітку номера до PGN турніру" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "Зберігати дані щодо рейтингу/глибини у PGN" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "Зберігати сторонні дані до PGN " #: dialogs.c:672 msgid "Save Game Options" msgstr "Параметри збереження ігор" #: dialogs.c:681 msgid "No Sound" msgstr "Без звуку" #: dialogs.c:682 msgid "Default Beep" msgstr "Типовий гудок" #: dialogs.c:683 msgid "Above WAV File" msgstr "Файл WAV вище" #: dialogs.c:684 msgid "Car Horn" msgstr "Автомобільний гудок" #: dialogs.c:685 msgid "Cymbal" msgstr "Цимбали" #: dialogs.c:686 msgid "Ding" msgstr "Дзвінок" #: dialogs.c:687 msgid "Gong" msgstr "Гонг" #: dialogs.c:688 msgid "Laser" msgstr "Лазер" #: dialogs.c:689 msgid "Penalty" msgstr "Штраф" #: dialogs.c:690 msgid "Phone" msgstr "Телефон" #: dialogs.c:691 msgid "Pop" msgstr "Плескання" #: dialogs.c:692 msgid "Slap" msgstr "Клацання" #: dialogs.c:693 msgid "Wood Thunk" msgstr "Удар об дерево" #: dialogs.c:695 msgid "User File" msgstr "Файл користувача" #: dialogs.c:717 msgid "User WAV File:" msgstr "Файл WAV користувача:" #: dialogs.c:718 msgid "Sound Program:" msgstr "Програма відтворення:" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "Тестовий звук:" #: dialogs.c:720 msgid "Play" msgstr "Пуск" #: dialogs.c:721 msgid "Move:" msgstr "Хід:" #: dialogs.c:722 msgid "Win:" msgstr "Виграшів:" #: dialogs.c:723 msgid "Lose:" msgstr "Програшів:" #: dialogs.c:724 msgid "Draw:" msgstr "Нічиїх:" #: dialogs.c:725 msgid "Unfinished:" msgstr "Незавершених:" #: dialogs.c:726 msgid "Alarm:" msgstr "Нагадування:" #: dialogs.c:727 msgid "Challenge:" msgstr "Виклик:" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "Каталог звуків:" #: dialogs.c:730 msgid "Shout:" msgstr "Вигук:" #: dialogs.c:731 msgid "S-Shout:" msgstr "S-вигук:" #: dialogs.c:732 msgid "Channel:" msgstr "Канал:" #: dialogs.c:733 msgid "Channel 1:" msgstr "Канал 1:" #: dialogs.c:734 msgid "Tell:" msgstr "Висловлення:" #: dialogs.c:735 msgid "Kibitz:" msgstr "Порада:" #: dialogs.c:736 msgid "Request:" msgstr "Запит:" #: dialogs.c:737 msgid "Seek:" msgstr "Пошук:" #: dialogs.c:753 msgid "Sound Options" msgstr "Параметри звуку" #: dialogs.c:774 msgid "White Piece Color:" msgstr "Колір фігур білих:" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "Ч" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "З" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "С" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "Т" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "Колір фігур чорних:" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Колір світлих клітинок:" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Колір темних клітинок:" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Колір позначення:" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "Колір підсвічування плану ходу:" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "Стиль обміну фігурами сьогі (Кольорові кнопки відновлюють типовий)" #: dialogs.c:816 msgid "Mono Mode" msgstr "Монорежим" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "Проміжок між рядами ( -1 = типовий для розмірів дошки):" #: dialogs.c:818 msgid "Use Board Textures" msgstr "Використовувати текстури дошки" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "Файл текстур світлих клітинок:" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "Файл текстур темних клітинок:" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "Зовнішні растрові зображення фігур з власними кольорами" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "Каталог з зображеннями фігур:" #: dialogs.c:872 msgid "Board Options" msgstr "Параметри дошки" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "Текстове меню ICS" #: dialogs.c:947 msgid "clear" msgstr "спорожнити" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "зберегти зміни" #: dialogs.c:1051 msgid "Edit book" msgstr "Змінити книгу" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Мітки" #: dialogs.c:1193 msgid "ICS input box" msgstr "Поле введення ICS" #: dialogs.c:1225 msgid "Type a move" msgstr "Введіть хід" #: dialogs.c:1251 msgid "Engine has no options" msgstr "Рушієві не передаються жодні параметри" #: dialogs.c:1253 msgid "Engine Settings" msgstr "Параметри рушія" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "Виберіть рушій зі списку:" #: dialogs.c:1281 msgid "or specify one below:" msgstr "або вкажіть його нижче:" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "Псевдонім (необов’язковий):" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "Використовувати псевдонім у мітках гравця PGN під час ігор між рушіями" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "Каталог рушія:" #: dialogs.c:1285 msgid "Engine Command:" msgstr "Команда рушія:" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" "(Каталог буде визначено на основі шляху до рушія, якщо каталог не вказано)" #: dialogs.c:1287 msgid "UCI" msgstr "UCI" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "Протокол WB версії 1 (не чекати на дані щодо можливостей)" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "Не повинен використовувати книгу з графічним інтерфейсом" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "Додати цей рушій до списку" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "Примусово визначити поточний варіант для рушія" #: dialogs.c:1341 msgid "Load first engine" msgstr "Завантажити перший рушій" #: dialogs.c:1347 msgid "Load second engine" msgstr "Завантажити другий рушій" #: dialogs.c:1370 msgid "shuffle" msgstr "перемішати" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Номер початкової позиції:" #: dialogs.c:1372 msgid "randomize" msgstr "випадково" #: dialogs.c:1373 msgid "pick fixed" msgstr "вибрати фіксовану" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Нова випадкова гра" #: dialogs.c:1409 msgid "classical" msgstr "класичні" #: dialogs.c:1410 msgid "incremental" msgstr "нарощувальний" #: dialogs.c:1411 msgid "fixed max" msgstr "фіксований максимум" #: dialogs.c:1412 msgid "Moves per session:" msgstr "Ходів за сеанс:" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "Початковий час (у хвилинах):" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "Збільшення або максимум (сек/хід):" #: dialogs.c:1415 msgid "Time-Odds factors:" msgstr "Коефіцієнти виправлення часу:" #: dialogs.c:1416 msgid "Engine #1" msgstr "Рушій 1" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "Рушій 2 / Людина" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "Не використовується" #: dialogs.c:1478 msgid "Time Control" msgstr "Керування часом" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Помилка під час спроби запису даних до шахової програми" #: dialogs.c:1574 msgid "Cancel" msgstr "Скасувати" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Король" #: dialogs.c:1582 msgid "Captain" msgstr "Капітан" #: dialogs.c:1583 msgid "Lieutenant" msgstr "Лейтенант" #: dialogs.c:1584 msgid "General" msgstr "Загальне" #: dialogs.c:1585 msgid "Warlord" msgstr "Полководець" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Кінь" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Слон" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Тура" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Архієпископ" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Канцлер" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Королева" #: dialogs.c:1600 msgid "Defer" msgstr "Зменшити пріоритет" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Підвищити" #: dialogs.c:1616 msgid "Chat partner:" msgstr "Співрозмовник:" #: dialogs.c:1701 msgid "Chat box" msgstr "Панель спілкування" #: dialogs.c:1742 msgid "factory" msgstr "типові" #: dialogs.c:1743 msgid "up" msgstr "вгору" #: dialogs.c:1744 msgid "down" msgstr "вниз" #: dialogs.c:1762 msgid "No tag selected" msgstr "Не вибрано жодної мітки" #: dialogs.c:1793 msgid "Game-list options" msgstr "Параметри списку гри" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Помилка" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Критична помилка" #: dialogs.c:1906 msgid "Exiting" msgstr "Вихід" #: dialogs.c:1917 msgid "Information" msgstr "Інформація" #: dialogs.c:1924 msgid "Note" msgstr "Нотатка" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Білі" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Пішак" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Слон" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Гармата" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "Розжалувати" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Порожня клітинка" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Спорожнити дошку" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Чорні" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Файл" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Зміни" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Перегляд" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Режим" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Дія" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Рушій" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Параметри" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Довідка" #: dialogs.c:2090 msgid "<<" msgstr "<<" #: dialogs.c:2091 msgid "<" msgstr "<" #: dialogs.c:2093 msgid ">" msgstr ">" #: dialogs.c:2094 msgid ">>" msgstr ">>" #: dialogs.c:2364 msgid "Directories:" msgstr "Каталоги:" #: dialogs.c:2365 msgid "Files:" msgstr "Файли:" #: dialogs.c:2366 msgid "by name" msgstr "за назвою" #: dialogs.c:2367 msgid "by type" msgstr "за типом" #: dialogs.c:2370 msgid "Filename:" msgstr "Назва файла:" #: dialogs.c:2371 msgid "New directory" msgstr "Новий каталог" #: dialogs.c:2372 msgid "File type:" msgstr "Тип файлів:" #: dialogs.c:2447 msgid "Contents of" msgstr "Вміст" #: dialogs.c:2473 #, fuzzy msgid " next page" msgstr " наступна сторінка" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "СПОЧАТКУ ВКАЖІТЬ ТУТ НАЗВУ КАТАЛОГУ" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "СПРОБУЙТЕ ІНШУ НАЗВУ" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" "Типових зображень фігур не встановлено.\n" "Вкажіть власні за допомогою параметра -pieceImageDirectory" #: engineoutput.c:107 menus.c:630 #, c-format msgid "Engine Output" msgstr "Вивід рушія" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "%s (з можливістю скасування %d ходу)" msgstr[1] "%s (з можливістю скасування %d ходів)" msgstr[2] "%s (з можливістю скасування %d ходів)" msgstr[3] "%s (з можливістю скасування %d ходу)" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "Читання файла гри (%d)" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "%s: не вдалося перейти до каталогу CHESSDIR: " #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "Не вдалося відкрити файл «%s»\n" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" "Для того, щоб скористатися підтримкою цього розміру, слід зібрати програму з " "більшими значеннями BOARD_RANKS або BOARD_FILES" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "%s: помилковий синтаксис boardSize %s\n" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "%s: невідома назва boardSize %s\n" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "%s: занадто мало кольорів; спробуємо монохромний режим\n" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "Не вдалося створити набір шрифтів для %s.\n" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "%s: взірцеві %s не відповідає жоден шрифт\n" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "Не вдалося відкрити тимчасовий файл даних" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "Не вдалося відкрити файл" #: menus.c:134 msgid "Load game file name?" msgstr "Назва файла гри для завантаження?" #: menus.c:179 msgid "Load position file name?" msgstr "Назва файла позиції для завантаження?" #: menus.c:185 msgid "Save game file name?" msgstr "Назва файли гри для збереження?" #: menus.c:194 msgid "Save position file name?" msgstr "Назва файла позиції для збереження?" #: menus.c:358 msgid " (with Zippy code)" msgstr " (з кодом Zippy)" #: menus.c:363 #, fuzzy, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" "%s%s\n" "\n" "© Digital Equipment Corporation, 1991\n" "© Free Software Foundation, 1992–2012\n" "© Alessandro Scotti, 2005\n" "\n" "%s є вільним програмним забезпеченням, його працездатність не гарантується. " "Докладніше про це у файлі COPYING.\n" "Збірка з GTK цієї версії є експериментальною і нестабільною\n" "\n" "Відвідайте сторінку XBoard у мережі за адресою: http://www.gnu.org/software/" "xboard/\n" "Ознайомтеся з найсвіжішими можливостями програми: http://www.gnu.org/" "software/xboard/whats_new.html\n" "\n" "Надішліть повідомлення про ваду на адресу: \n" "\n" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Про XBoard" #: menus.c:582 msgid "New Game" msgstr "Нова гра" #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Нова випадкова гра…" #: menus.c:584 msgid "New Variant ..." msgstr "Новий варіант…" #: menus.c:586 msgid "Load Game" msgstr "Завантажити гру" #: menus.c:587 msgid "Load Position" msgstr "Завантажити позицію" #: menus.c:588 msgid "Next Position" msgstr "Наступна позиція" #: menus.c:589 msgid "Prev Position" msgstr "Попередня позиція" #: menus.c:591 msgid "Save Game" msgstr "Зберегти гру" #: menus.c:592 msgid "Save Position" msgstr "Зберегти позицію" #: menus.c:593 msgid "Save Games as Book" msgstr "Зберегти ігри як книгу" #: menus.c:595 msgid "Mail Move" msgstr "Надіслати хід поштою" #: menus.c:596 msgid "Reload CMail Message" msgstr "Перезавантажити повідомлення CMail" #: menus.c:598 msgid "Quit " msgstr "Вийти " #: menus.c:603 msgid "Copy Game" msgstr "Копіювати гру" #: menus.c:604 msgid "Copy Position" msgstr "Копіювати позицію" #: menus.c:605 msgid "Copy Game List" msgstr "Копіювати список ігор" #: menus.c:607 msgid "Paste Game" msgstr "Вставити гру" #: menus.c:608 msgid "Paste Position" msgstr "Вставити позицію" #: menus.c:610 menus.c:652 msgid "Edit Game" msgstr "Редагувати гру" #: menus.c:611 menus.c:653 msgid "Edit Position" msgstr "Редагувати позицію" #: menus.c:612 msgid "Edit Tags" msgstr "Змінити мітки" #: menus.c:613 msgid "Edit Comment" msgstr "Змінити коментар" #: menus.c:614 msgid "Edit Book" msgstr "Змінити книгу" #: menus.c:616 msgid "Revert" msgstr "Повернути" #: menus.c:617 msgid "Annotate" msgstr "Анотувати" #: menus.c:618 msgid "Truncate Game" msgstr "Обрізати гру" #: menus.c:620 msgid "Backward" msgstr "Назад" #: menus.c:621 msgid "Forward" msgstr "Вперед" #: menus.c:622 msgid "Back to Start" msgstr "Повернутися до початку" #: menus.c:623 msgid "Forward to End" msgstr "Вперед до кінця" #: menus.c:628 msgid "Flip View" msgstr "Повернути дошку" #: menus.c:631 msgid "Move History" msgstr "Журнал ходів" #: menus.c:632 msgid "Evaluation Graph" msgstr "Граф оцінки позиції" #: menus.c:633 msgid "Game List" msgstr "Список ігор" #: menus.c:637 msgid "Comments" msgstr "Коментарі" #: menus.c:638 msgid "ICS Input Box" msgstr "Поле введення ICS" #: menus.c:639 msgid "Open Chat Window" msgstr "Відкрити вікно спілкування" #: menus.c:641 msgid "Board..." msgstr "Дошка…" #: menus.c:642 msgid "Game List Tags..." msgstr "Мітки списку ігор…" #: menus.c:647 msgid "Machine White" msgstr "Комп’ютер-білими" #: menus.c:648 msgid "Machine Black" msgstr "Матч ком’ютерів" #: menus.c:649 msgid "Two Machines" msgstr "Два комп’ютера" #: menus.c:650 msgid "Analysis Mode" msgstr "Режим аналізу" #: menus.c:651 msgid "Analyze Game" msgstr "Аналізувати гру" #: menus.c:654 msgid "Training" msgstr "Тренування" #: menus.c:655 msgid "ICS Client" msgstr "Клієнт ICS" #: menus.c:657 msgid "Machine Match" msgstr "Матч ком’ютерів" #: menus.c:658 msgid "Pause" msgstr "Пауза" #: menus.c:663 msgid "Accept" msgstr "Прийняти" #: menus.c:664 msgid "Decline" msgstr "Відхилити" #: menus.c:665 msgid "Rematch" msgstr "Перегравання" #: menus.c:667 msgid "Call Flag" msgstr "Погодитися з програшем" #: menus.c:668 msgid "Draw" msgstr "Нічия" #: menus.c:669 msgid "Adjourn" msgstr "Відкласти" #: menus.c:670 msgid "Abort" msgstr "Перервати" #: menus.c:671 msgid "Resign" msgstr "Здатись" #: menus.c:673 msgid "Stop Observing" msgstr "Припинити спостереження" #: menus.c:674 msgid "Stop Examining" msgstr "Припинити аналіз" #: menus.c:675 msgid "Upload to Examine" msgstr "Вивантажити для аналізу" #: menus.c:677 msgid "Adjudicate to White" msgstr "Визначити виграш білих" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Визначити виграш чорних" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Визначити нічию" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "Завантажити новий перший рушій…" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "Завантажити новий другий рушій…" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Параметри рушія 1…" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Параметри рушія 2…" #: menus.c:690 msgid "Hint" msgstr "Підказка" #: menus.c:691 msgid "Book" msgstr "Книга" #: menus.c:693 msgid "Move Now" msgstr "Ходити зараз" #: menus.c:694 msgid "Retract Move" msgstr "Відкликати хід" #: menus.c:700 msgid "General ..." msgstr "Загальне…" #: menus.c:702 msgid "Time Control ..." msgstr "Керування часом…" #: menus.c:703 msgid "Common Engine ..." msgstr "Загальний рушій…" #: menus.c:704 msgid "Adjudications ..." msgstr "Визначення…" #: menus.c:705 msgid "ICS ..." msgstr "ICS…" #: menus.c:706 msgid "Match ..." msgstr "Партія…" #: menus.c:707 msgid "Load Game ..." msgstr "Завантажити гру…" #: menus.c:708 msgid "Save Game ..." msgstr "Зберегти гру…" #: menus.c:709 msgid "Game List ..." msgstr "Список ігор…" #: menus.c:710 msgid "Sounds ..." msgstr "Звуки…" #: menus.c:713 msgid "Always Queen" msgstr "Завжди королева" #: menus.c:719 msgid "Flash Moves" msgstr "Підсвічування ходів" #: menus.c:721 msgid "Highlight Dragging" msgstr "Підсвічувати перетягування" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Позначити за допомогою стрілки" #: menus.c:725 msgid "Move Sound" msgstr "Звук ходу" #: menus.c:727 msgid "Periodic Updates" msgstr "Періодичні оновлення" #: menus.c:729 msgid "Popup Exit Message" msgstr "Показувати повідомлення щодо виходу" #: menus.c:731 msgid "Show Coords" msgstr "Показати координати" #: menus.c:732 msgid "Hide Thinking" msgstr "Приховувати обмірковування" #: menus.c:736 msgid "Save Settings Now" msgstr "Зберегти параметри зараз" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Зберегти параметри при виході" #: menus.c:742 msgid "Info XBoard" msgstr "Інформація з XBoard" #: menus.c:743 msgid "Man XBoard" msgstr "Підручник з XBoard" #: menus.c:745 msgid "XBoard Home Page" msgstr "Домашня сторінка XBoard" #: menus.c:746 msgid "On-line User Guide" msgstr "Підручник користувача у інтернеті" #: menus.c:747 msgid "Development News" msgstr "Новини щодо розробки" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "Надіслати звіт про ваду електронною поштою" #: nengineoutput.c:78 nengineoutput.c:85 msgid "engine name" msgstr "назва рушія" #: nengineoutput.c:80 nengineoutput.c:87 msgid "move" msgstr "хід" #: nengineoutput.c:153 msgid "Engine output" msgstr "Вивід рушія" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" "Невідповідність STRIDE у nengineoutput.c\n" "Змініть і зберіть програму знову!" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Граф оцінки позиції" #: nevalgraph.c:105 msgid "Eval" msgstr "Оцінка" #: ngamelist.c:87 msgid "find position" msgstr "знайти позицію" #: ngamelist.c:88 msgid "narrow" msgstr "звуження" #: ngamelist.c:89 msgid "thresholds" msgstr "порогові значення" #: ngamelist.c:90 msgid "tags" msgstr "мітки" #: ngamelist.c:91 msgid "next" msgstr "далі" #: ngamelist.c:92 msgid "close" msgstr "закрити" #: ngamelist.c:116 msgid "No game selected" msgstr "Не вибрано гри" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Подальший рух вперед списком неможливий" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "Сканування списку ігор (%d)" #: ngamelist.c:211 msgid "previous page" msgstr "попередня сторінка" #: ngamelist.c:214 msgid "next page" msgstr "наступна сторінка" #: ngamelist.c:217 msgid "no games matched your request" msgstr "вашому запиту не відповідає жодна гра" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "%s — %d з %d ігор (%d-%d-%d)" #: ngamelist.c:274 msgid "There is no game list" msgstr "Немає списку ходів гри" #: nhistory.c:109 msgid "Move list" msgstr "Список ходів" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "%s: нерозпізнаний колір %s\n" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "%s: не вдалося обробити колір тексту у «%s»\n" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "%s: не вдалося обробити назви кольорів; розфарбовування вимкнено\n" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "Помилка: невідомий користувач %s (шлях — %s)\n" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "Підтримку сокетів ще не налаштовано" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "вбудований rcmd ще не реалізовано для Unix" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "%s: не вдалося отримати доступ до каталогу XPM %s\n" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "Доступні розміри «%s»:\n" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "Помилка: немає файлів «%s»!\n" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" "Попередження: у системі не виявлено структури DIR —\n" " автоматична зміна розмірів фігур XPM/XIM неможлива.\n" " Будь ласка, повідомте про цю помилку на адресу %s.\n" " Включіть до повідомлення дані щодо типу та назви операційної системи.\n" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "білий піксель = 0x%lx, чорний піксель = 0x%lx\n" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "Помилка %d під час завантаження зображення піктограми\n" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "вибрати" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "Ctrl" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "Alt" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "Shift" #: xaw/xoptions.c:1270 msgid "OK" msgstr "Гаразд" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "скасувати" #~ msgid "recognized '%s' (%d) as variant %s\n" #~ msgstr "розпізнано «%s» (%d) як варіант %s\n" #~ msgid "Ratings from header: W %d, B %d\n" #~ msgstr "Рейтинги з заголовка: Б %d, Ч %d\n" #~ msgid "Parsing board: %s\n" #~ msgstr "Обробка дошки: %s\n" #~ msgid "Found unexpected active ICS engine analyze \n" #~ msgstr "Виявлено неочікуваний активний процес аналізу рушія ICS \n" #~ msgid "ICS engine analyze starting... \n" #~ msgstr "Розпочинаємо аналіз за допомогою рушія ICS… \n" #~ msgid "" #~ "resolved %s at pixel size %d\n" #~ " to %s\n" #~ msgstr "" #~ "визначено %s з розміром у пікселях %d\n" #~ " як %s\n" #~ msgid "New Game Ctrl+N" #~ msgstr "Нова гра Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Новий варіант… Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Завантажити гру Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Завантажити позицію Ctrl+Shift+O" #~ msgid "Prev Position Shift+PgUp" #~ msgstr "Попередня позиція Shift+PgUp" #~ msgid "Save Game Ctrl+S" #~ msgstr "Зберегти гру Ctrl+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Зберегти позицію Ctrl+Shift+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Вийти Ctr+Q" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Копіювати гру Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Редагувати гру Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Редагувати позицію Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "Скасувати Домівка" #~ msgid "Backward Alt+Left" #~ msgstr "Назад Alt+Ліворуч" #~ msgid "Forward Alt+Right" #~ msgstr "Вперед Alt+Праворуч" #~ msgid "Back to Start Alt+Home" #~ msgstr "Повернутися на початок Alt+Home" #~ msgid "Flip View F2" #~ msgstr "Розвернути F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Вивід рушія Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Журнал ходів Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "Граф оцінки позиції Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Список ігор Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Комп’ютер-чорними Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Редагувати гру Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Редагувати позицію Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "Призупинити Pause" #~ msgid "Accept F3" #~ msgstr "Прийняти F3" #~ msgid "Decline F4" #~ msgstr "Відхилити F4" #~ msgid "Rematch F12" #~ msgstr "Перегравання F12" #~ msgid "Draw F6" #~ msgstr "Нічия F6" #~ msgid "Adjourn F7" #~ msgstr "Відкласти F7" #~ msgid "Abort F8" #~ msgstr "Перервати F8" #~ msgid "Resign F9" #~ msgstr "Здатися F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Ходити Ctrl+M" #~ msgid "Time Control ... Alt+Shift+T" #~ msgstr "Керування часом… Alt+Shift+T" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Завжди королева Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Анімація ходів Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Автопрапорець Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Обдумати наступний хід Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Сховати обмірковування Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Перевірити коректність Ctrl+Shift+L" #~ msgid "Browse" #~ msgstr "Вибрати" #~ msgid "Filter on extensions:" #~ msgstr "Фільтр суфіксів:" #~ msgid "Pathname:" #~ msgstr "Назва шляху:" #~ msgid "XsraSelFile: can't get current directory" #~ msgstr "XsraSelFile: не вдалося отримати назву поточного каталогу" #~ msgid "%s: titleWidget geometry error %d %d %d %d %d\n" #~ msgstr "" #~ "%s: помилка у геометричних параметрах titleWidget — %d %d %d %d %d\n" #~ msgid "Error expanding path name \"%s\"\n" #~ msgstr "Помилка під час спроби розгортання адреси каталогу «%s»\n" #~ msgid "" #~ "XBoard square size (hint): %d\n" #~ "%s fulldir:%s:\n" #~ msgstr "" #~ "Розмір клітинки XBoard (hint): %d\n" #~ "%s fulldir:%s:\n" #~ msgid "Closest %s size: %d\n" #~ msgstr "Найближчий розмір %s: %d\n" #~ msgid "%s: messageWidget geometry error %d %d %d %d %d\n" #~ msgstr "" #~ "%s: помилка у геометричних параметрах messageWidget — %d %d %d %d %d\n" #~ msgid "%s: error loading XIM!\n" #~ msgstr "%s: помилка завантаження XIM!\n" #~ msgid "XIM pieces cannot be used in monochrome mode" #~ msgstr "У монохромному режимі не можна користуватися фігурами XIM" #~ msgid "" #~ "\n" #~ "Loading XIMs...\n" #~ msgstr "" #~ "\n" #~ "Завантаження XIM…\n" #~ msgid "(File:%s:) " #~ msgstr "(Файл:%s:) " #~ msgid "light square " #~ msgstr "світла клітинка " #~ msgid "dark square " #~ msgstr "темна клітинка " #~ msgid "Done.\n" #~ msgstr "Виконано.\n" #~ msgid "XPM pieces cannot be used in monochrome mode" #~ msgstr "У монохромному режимі не можна користуватися фігурами XPM" #~ msgid "No builtin XPM pieces of size %d\n" #~ msgstr "Немає вбудованих фігур XPM розміру %d\n" #~ msgid "Error %d loading XPM image \"%s\"\n" #~ msgstr "Помилка %d під час спроби завантаження зображення XPM «%s»\n" #~ msgid "" #~ "\n" #~ "Loading XPMs...\n" #~ msgstr "" #~ "\n" #~ "Завантаження XPM…\n" #~ msgid "(Replace by File:%s:) " #~ msgstr "(Замінено на File:%s:) " #~ msgid "Error %d loading XPM file \"%s\"\n" #~ msgstr "Помилка %d під час спроби завантаження файла XPM «%s»\n" #~ msgid "Can't open bitmap file %s" #~ msgstr "Не вдалося відкрити файл растрового зображення %s" #~ msgid "Invalid bitmap in file %s" #~ msgstr "Некоректне растрове зображення у файлі %s" #~ msgid "Ran out of memory reading bitmap file %s" #~ msgstr "" #~ "Під час читання растрового зображення %s було вичерпано обсяг пам’яті" #~ msgid "Unknown XReadBitmapFile error %d on file %s" #~ msgstr "Невідома помилка XReadBitmapFile %d під час обробки файла %s" #~ msgid "%s: %s...using built-in\n" #~ msgstr "%s: %s… використовуємо вбудоване\n" #~ msgid "%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n" #~ msgstr "" #~ "%s: розміри растрового зображення %s дорівнюють %dx%d, а не %dx%d… " #~ "використовуємо вбудоване\n" #~ msgid "----" #~ msgstr "----" #~ msgid "Drop" #~ msgstr "Викинути" #~ msgid "could not open: " #~ msgstr "Не вдалося відкрити:" #~ msgid "Can't open file" #~ msgstr "Не вдалося відкрити файл" #~ msgid "Promotion" #~ msgstr "Заміна" #~ msgid "Promote to what?" #~ msgstr "На що замінити?" #~ msgid "ok" #~ msgstr "гаразд" #~ msgid "AskQuestionProc needed 4 parameters, got %d\n" #~ msgstr "AskQuestionProc потребує 4 параметрів, отримано %d\n" #~ msgid "enter" #~ msgstr "увійти" #~ msgid "This feature is experimental" #~ msgstr "Цю можливість ще не перевірено" #~ msgid "Filter:" #~ msgstr "Фільтр:" #~ msgid "filtertext" #~ msgstr "текст фільтрування" #~ msgid "apply" #~ msgstr "застосувати" #~ msgid "load" #~ msgstr "завантажити" #~ msgid "prev" #~ msgstr "попер" #~ msgid "First Engine" #~ msgstr "Перший рушій" #~ msgid "Second Engine" #~ msgstr "Другий рушій" #~ msgid "" #~ "WARNING: variants with un-orthodox\n" #~ "pieces only have built-in bitmaps\n" #~ "for -boardSize middling, bulky and\n" #~ "petite, and substitute king or amazon\n" #~ "for missing bitmaps. (See manual.)" #~ msgstr "" #~ "УВАГА: для варіантів з неортодоксальними\n" #~ "фігурами використовуватимуться зображення\n" #~ "для -boardSize середнього, великого і\n" #~ "малого розмірів. Для фігур без зображень\n" #~ "буде використано зображення короля або\n" #~ "амазонки. (Див. підручник.)" #~ msgid "Directory with Bitmap Pieces:" #~ msgstr "Каталог bitmap фігур:" #~ msgid "AnimateMove: piece %d hops from %d,%d to %d,%d \n" #~ msgstr "Анімація ходів: фігура %d перестрибує з %d,%d до %d,%d \n" #~ msgid "AnimateMove: piece %d slides from %d,%d to %d,%d \n" #~ msgstr "Анімація ходів: фігура %d пересувається з %d,%d до %d,%d \n" #~ msgid "%s vs. %s" #~ msgstr "%s проти %s" #~ msgid "%s [%s] vs. %s [%s]" #~ msgstr "%s [%s] проти %s [%s]" #~ msgid "%s (%d) vs. %s (%d) {%d %d}" #~ msgstr "%s (%d) проти %s (%d) {%d %d}" #~ msgid "%s (%d) vs. %s (%d) {%d %d %s}" #~ msgstr "%s (%d) проти %s (%d) {%d %d %s}" #~ msgid "%s vs. %s (%d/%d%s)" #~ msgstr "%s проти %s (%d/%d%s)" #~ msgid "White " #~ msgstr "Білий " #~ msgid "Black " #~ msgstr "Чорний " #~ msgid "Close" #~ msgstr "Закрити" #~ msgid "off" #~ msgstr "вимкнено" #~ msgid "minutes for each" #~ msgstr "хвилин для кожного" #~ msgid " OK " #~ msgstr " Гаразд " #~ msgid "moves " #~ msgstr "ходів " xboard-4.7.3/po/insert-header.sin0000644000175000001440000000124012262415351013602 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } xboard-4.7.3/po/vi.gmo0000644000175000001440000001037312262562300011463 00000000000000JleP Q^n       /< A NX an   !6; CNS Zh z  ' - 2 @ R d z      _ K b r         ! . H N Q ` -k      / /* Z %o     &  . KW&^ !  !AGb'h'"   8#Qu    5 >@"<4*3J9/.1&E+2H= IA)G7(BC '# F;$8,-0%6?:D! About XBoardAdjudicate DrawAdjudicate to BlackAdjudicate to WhiteAnnotateArchbishopAuto FlagAuto Flip ViewAuto-Raise BoardBishopBlackBlindfoldBoard...BookCannonChancellorClear boardCommentsCopy Game ListDefault BeepEditEdit CommentEdit TagsElephantEmpty squareEngine #1 Settings ...Engine #2 Settings ...Game List ...Game List Tags...GeneralGeneral ...General OptionsHelpHighlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintICS ...ICS ClientKingKnightLoad Game ...Load Game OptionsMachine MatchNew Shuffle GameNew Shuffle Game ...No SoundOKOne-Click MovingPawnPeriodic UpdatesPlayPopup Exit MessagePopup Exit MessagesPopup Move ErrorsPromoteQueenRookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitShow CoordinatesShow CoordsSound OptionsSounds ...TagsTest LegalityTrainingUpload to ExamineWhitecancelProject-Id-Version: GNU xboard master-20110507 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: vi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thông Tin Về XBoardPhân Xử HòaPhân Xử Đen ThắngPhân Xử Trắng ThắngChú GiảiSĩTự Động Đặt CờTự Động Xoay Bàn CờTự Động Hiện Bàn CờTượngĐenMù QuángBàn Cờ...Cẩm Nang Khai Cuộc...PháoXeXóa Bàn CờBình ChúCopy Danh Sách Các Ván Cờ Vào ClipboardTiếng tút ngầm địnhSoạnSoạn Bình Chú...Soạn Các Thẻ...TượngÔ TrốngĐặt Tham Số Cho Chương Trình Chơi 1...Đặt Tham Số Cho Chương Trình Chơi 2...Danh Sách Ván CờCác Thẻ của Danh Sách Ván CờChung...Chung...Các Lựa Chọn ChungHướng DẫnĐánh Dấu Khi Đang Kéo Quân CờĐánh Dấu Nước CuốiĐánh Dấu Với Mũi TênĐánh Dấu Với Mũi TênGợi Ý...ICS...Kết Nối Chơi Với Máy Chủ ICSVuaMãTải Ván Cờ... Alt+Shift+LCác Lựa Chọn Tải Ván CờTrận Đấu Với MáyTráo Bên...Tráo Bên...Không âm thanhĐượcĐi Quân Với Chỉ Một BấmTốtCập Nhật Theo Chu KỳChơiBật Cửa Sổ Thoát Chương trìnhBật Cửa Sổ Thoát Chương trìnhBật Cửa Sổ Lỗi Nước ĐiPhong CấpHoàng HậuXeLưu Ván Cờ... Alt+Shift+SCác Lựa Chọn Lưu Ván CờLưu Các Tham Số NgayLưu Các Tham Số Khi Kết ThúcHiện Tọa ĐộHiện Tọa ĐộÂm thanhÂm ThanhCác ThẻKiểm Tra Hợp LệĐang Dậy MáyTải Để TrắngBỏxboard-4.7.3/po/zh_TW.po0000644000175000001440000015164612262562300011745 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110507\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "通訊協定版本 %d 不被支持" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "非法的\"timeControl\"(時間控制)選項 %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "非法的\"searchTime\"(搜尋時間)選項 %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "變體 %s 只在ICS模式下支持" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "未知的變體名 %s" #: backend.c:1375 msgid "Starting chess program" msgstr "啟動國際象棋程式" #: backend.c:1398 msgid "Bad game file" msgstr "棋局檔案錯誤" #: backend.c:1405 msgid "Bad position file" msgstr "盤面檔案錯誤" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "沒有象棋程式時無法進行比賽" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "無法打開通訊連接埠 %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "無法連接主機 %s 連接埠 %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "未知的\"initialMode\"(初始模式)選項 %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "\"AnalyzeFile\"(分析檔案)模式必須指定一個棋局檔案" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "\"Analysis\"(分析)模式必須啟動國際象棋引擎" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "\"Analysis\"(分析)模式無法在ICS模式下工作" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "\"MachineWhite\"(電腦執紅)模式必須啟動國際象棋引擎" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "\"MachineWhite\"(電腦執紅)模式無法在ICS模式下運行" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "\"MachineBlack\"(電腦執黑)模式必須啟動國際象棋引擎" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "\"MachineBlack\"(電腦執黑)模式無法在ICS模式下運行" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "\"TwoMachines\"(分析)模式必須啟動國際象棋引擎" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "\"TwoMachines\"(電腦對弈)模式無法在ICS模式下運行" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "\"Training\"(訓練)模式必須指定一個棋局檔案" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "發送訊息給ICS時出錯" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "讀取鍵盤時出錯" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "讀取鍵盤時遇到檔案尾" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "發送訊息給顯示器時出錯" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "讀取著法時出錯,出現兩個開頭" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "讀取著法時出錯,巢狀錯誤" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "連接被ICS關閉" #: backend.c:4167 msgid "Error reading from ICS" msgstr "讀取ICS訊息時出錯" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "棋局太長,需要增加\"MAX_MOVES\"並重新編譯" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "讀取著法時出錯,超出棋盤" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "無法解析從ICS讀到的著法\"%s\"" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say 內部錯誤,非法的\"moveType\"(著法類型) %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "你在執黑" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "你在執紅" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "輪到紅方走棋" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "輪到黑方走棋" #: backend.c:6552 msgid "Displayed position is not current" msgstr "顯示的盤面不是當前盤面" #: backend.c:6790 msgid "Illegal move" msgstr "著法錯誤" #: backend.c:6857 msgid "End of game" msgstr "棋局結束" #: backend.c:6860 msgid "Incorrect move" msgstr "著法錯誤" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "從%s機器讀到不合法著法\"%s\"" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s 不支持分析功能" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "不合法著法\"%s\" (%s國際象棋程式拒絕接受該著法)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "無法啟動%s國際象棋程式 %s(在主機 %s 上),%s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "提示 %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "電腦同意和棋" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "ICS輸出不明確的著法\"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "ICS輸出不明確的著法\"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "著法斷開" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "變體 %s 不被 %s 所支持" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "無法啟動'%s'" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "等待第一個國際象棋程式" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "等待第二個國際象棋程式" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 msgid "Bad tournament file" msgstr "" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "比賽 %s vs. %s: 最終比分 %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "不合法著法 %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "不明確的著法 %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "無法打開\"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "無法建立棋局列表" #: backend.c:11594 msgid "No more games in this message" msgstr "這條訊息不包含更多的棋局" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "尚未有棋局載入" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "無法再後退了" #: backend.c:12077 msgid "Game number out of range" msgstr "棋局數量超出範圍" #: backend.c:12088 msgid "Can't seek on game file" msgstr "無法搜尋棋局檔案" #: backend.c:12146 msgid "Game not found in file" msgstr "檔案中沒有找到棋局" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "檔案中的FEN盤面錯誤" #: backend.c:12426 msgid "No moves in game" msgstr "棋局中沒有著法" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "尚未有盤面載入" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "無法搜尋盤面檔案" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "檔案中沒有找到盤面" #: backend.c:12632 msgid "Black to play" msgstr "輪到黑方走棋" #: backend.c:12635 msgid "White to play" msgstr "輪到紅方走棋" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "你尚未走棋" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "不存在未完成棋局" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "呼叫cmail失敗" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "等待對手回應\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "本棋局仍需走棋\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "兩棋局皆仍需走棋\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "所有 %d 棋局皆仍需走棋\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "棋局 %s 仍需走棋\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "不存在未完成棋局\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "準備送信就緒\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "棋局 %s 仍需走棋\n" #: backend.c:13631 msgid "Edit comment" msgstr "編輯註解" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "編輯註解 %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "沒有輪到紅方走棋" #: backend.c:13877 msgid "It is not Black's turn" msgstr "沒有輪到黑方走棋" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "訓練模式已關閉" #: backend.c:14155 msgid "Training mode on" msgstr "訓練模式已打開" #: backend.c:14158 msgid "Already at end of game" msgstr "棋局已經結束" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "注意:你正在進行棋局" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "注意:你正在觀棋棋局" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "注意:你正在研究棋局" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "格子已有棋子" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "該著法沒有待定的提議" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "對手沒有超時" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "必須走完棋才能提和" #: backend.c:15109 msgid "You are not examining a game" msgstr "沒有分析棋局" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "暫停時不能復原棋局" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "輪到你走棋" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "等待對手走棋" #: backend.c:15237 msgid "No hint available" msgstr "沒有可用的提示" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "尚未有棋局載入" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "發送訊息到%s國際象棋程式時出錯" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "錯誤:%s國際象棋程式(%s)異常終止" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "從%s國際象棋程式(%s)接收訊息時出錯" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "顯示的著法不是當前著法" #: backend.c:16352 msgid "Could not parse move" msgstr "無法解析著法" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "雙方都超時了" #: backend.c:16479 msgid "White's flag fell" msgstr "紅方超時" #: backend.c:16501 msgid "Black's flag fell" msgstr "黑方超時" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "剪貼簿的FEN盤面錯誤" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "無法解析著法" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "封盤(J) F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "動畫拖曳(D)" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "動畫走棋(A)" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "自動超時判負(F) Ctrl+Shift+F" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "自動翻轉棋盤(V)" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "盲棋(B)" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "與人對弈時隱藏思考細節" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "標記上一著法(M)" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "用箭頭突出移動" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "單擊移動(M)" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "定期更新(分析模式)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "同步思考(N)" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "離開時提示(P)" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "提示錯誤著法(E)" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "取得著法列表(G)" #: dialogs.c:383 msgid "Show Coordinates" msgstr "顯示坐標(C)" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "檢查著法合理性(L) Cl+Sh+L" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "審局圖" #: dialogs.c:400 msgid "General Options" msgstr "一般選項" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "警告: 第二個引擎(%s) 不支持此!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "變種" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "最大CPU數" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "雜湊表大小(MB)" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "EGTB 路徑" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "EGTB 大小(MB)" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "庫著法深度" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "庫變例" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "引擎1有自用庫" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "通用引擎設定" #: dialogs.c:540 msgid "Detect all Mates" msgstr "檢測將殺(M)" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "驗證引擎聲明(V)" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "子力不足時判和(I)" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "簡易和棋判決(T)" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "幾著後判和" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "輸/贏判決門檻" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "引擎 #1 是絕對分數" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "引擎 #2 是絕對分數" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "裁決紅贏 (W)" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "自動\"kibitz\"(A)" #: dialogs.c:570 msgid "Auto-Comment" msgstr "自動註解(A)" #: dialogs.c:571 msgid "Auto-Observe" msgstr "自動觀棋(O)" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "自動改變棋盤大小(R)" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "背景觀察(v)" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "雙棋盤(D)" #: dialogs.c:576 msgid "Get Move List" msgstr "取得著法列表(G)" #: dialogs.c:577 msgid "Quiet Play" msgstr "落子無聲(Q)" #: dialogs.c:578 msgid "Seek Graph" msgstr "可選對手圖表(k)" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "自動刷新圖表(R)" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "預先走棋(P)" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "紅方先走(W)" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "黑方先走(B)" #: dialogs.c:587 msgid "Alarm" msgstr "提示" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "ICS設定" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "尚未有棋局載入" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "載入棋局選項" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "儲存棋局選項" #: dialogs.c:681 msgid "No Sound" msgstr "無聲" #: dialogs.c:682 msgid "Default Beep" msgstr "預設聲音" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "播放" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "聲音" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "黑子" #: dialogs.c:790 msgid "Light Square Color:" msgstr "白格" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "黑格" #: dialogs.c:802 msgid "Highlight Color:" msgstr "格子標記" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "預先走棋標記" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "黑白" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "棋盤選項" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "編輯(E)" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "編輯標籤(T)" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "啟動位置號碼(S)" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "隨機" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "洗牌遊戲(u)..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "時間倍數" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "引擎輸出" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "引擎1有自用庫" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "發送訊息給國際象棋程式時出錯" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "取消(C)" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "王" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "一般選項(G)..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "馬" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "象" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "車" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "國師" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "宰相" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "后" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "升變" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "向上" #: dialogs.c:1744 msgid "down" msgstr "向下" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "載入棋局選項" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "錯誤" #: dialogs.c:1906 msgid "Fatal Error" msgstr "嚴重錯誤" #: dialogs.c:1906 msgid "Exiting" msgstr "離開" #: dialogs.c:1917 msgid "Information" msgstr "資訊" #: dialogs.c:1924 msgid "Note" msgstr "註解" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "紅方" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "兵" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "象" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "炮" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "降級" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "清空格子" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "清空棋盤" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "黑方" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "檔案(F)" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "編輯(E)" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "模式(M)" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "行為(A)" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "選項(O)" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "說明(H)" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "檔案(F)" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "過濾器" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "過濾器" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "編輯註解(C) *.*" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "引擎輸出" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "棋局檔案錯誤" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "呼叫cmail失敗" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "關於XBoard(A)" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "洗牌遊戲(u)..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "洗牌遊戲(u)..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "變種" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "載入棋局選項(L)... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "盤面檔案錯誤" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "盤面檔案錯誤" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "升變" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "儲存局面(A)... Ctrl+Shift+S" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "複製遊戲列表到剪貼簿" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "複製局面到剪貼簿(Y) Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "複製遊戲列表到剪貼簿" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "貼上棋局自剪貼簿(P) Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "從剪貼簿貼上局面(T) Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "編輯註解" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "盤面檔案錯誤" #: menus.c:612 msgid "Edit Tags" msgstr "編輯標籤(T)" #: menus.c:613 msgid "Edit Comment" msgstr "編輯註解(C)..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "開局庫(B)..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "註解(A)" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "截斷後面的著法(T)" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "輪到黑方走棋" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "最後局面(E) Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "自動翻轉棋盤(V)" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "取得著法列表(G)" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "審局圖" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "遊戲列表..." #: menus.c:637 msgid "Comments" msgstr "編輯註解(C) *.*" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "棋盤選項(B)..." #: menus.c:642 msgid "Game List Tags..." msgstr "遊戲列表..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "電腦執紅(W) Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "電腦比賽(M)" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "電腦對弈(M) Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "分析模式(A) Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "分析檔案(F) Ctrl+F" #: menus.c:654 msgid "Training" msgstr "訓練(N)" #: menus.c:655 msgid "ICS Client" msgstr "ICS客戶端" #: menus.c:657 msgid "Machine Match" msgstr "電腦比賽(M)" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "超時判負(F) F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "停止觀棋(O) F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "停止研究(X) F11" #: menus.c:675 msgid "Upload to Examine" msgstr "上傳檢查(U)" #: menus.c:677 msgid "Adjudicate to White" msgstr "裁決紅贏 (W)" #: menus.c:678 msgid "Adjudicate to Black" msgstr "裁決黑贏 (B)" #: menus.c:679 msgid "Adjudicate Draw" msgstr "提請仲裁(D)" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "引擎 #1 設定" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "引擎 #2 設定" #: menus.c:690 msgid "Hint" msgstr "提示(H)..." #: menus.c:691 msgid "Book" msgstr "開局庫(B)..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "悔棋(R) Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "一般選項(G)..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "時間設定(T)... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "通用引擎設定(E)... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "判決(j)... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS選項..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "載入棋局選項(L)... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "遊戲列表..." #: menus.c:710 msgid "Sounds ..." msgstr "聲音選項(D)..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "拖曳醒目提示(H)" #: menus.c:724 msgid "Highlight With Arrow" msgstr "用箭頭突出移動" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "定期更新(U)" #: menus.c:729 msgid "Popup Exit Message" msgstr "離開時提示(P)" #: menus.c:731 msgid "Show Coords" msgstr "顯示坐標(C)" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "與人對弈時隱藏思考細節" #: menus.c:736 msgid "Save Settings Now" msgstr "立即儲存設定(N)" #: menus.c:737 msgid "Save Settings on Exit" msgstr "離開時儲存設定(X)" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "關於XBoard(A)" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "引擎輸出" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "著法" #: nengineoutput.c:153 msgid "Engine output" msgstr "引擎輸出" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "審局圖" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "盤面檔案錯誤" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "編輯標籤(T)" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "沒有選中棋局" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "無法再前進了" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "比賽 %s vs. %s: 最終比分 %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "沒有棋局列表" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "確定" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "取消(C)" #~ msgid "New Game Ctrl+N" #~ msgstr "開新棋局(N) Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "新變種(V)... Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "載入棋局(L)... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "載入局面(O)... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "儲存棋局(S)... Ctrl+S" #~ msgid "Quit Ctr+Q" #~ msgstr "離開(Q)" #~ msgid "Copy Game Ctrl+C" #~ msgstr "複製棋局到剪貼簿(C) Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "編輯棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "編輯局面(d) Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "恢復(V)" #~ msgid "Backward Alt+Left" #~ msgstr "下一著(B) Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "上一著(F) Alt+Right" #~ msgid "Back to Start Alt+Home" #~ msgstr "起始局面(S) Alt+Home" #~ msgid "Flip View F2" #~ msgstr "翻轉棋盤(V) F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "顯示引擎輸出 Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "顯示歷史著法 Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "顯示評價圖 Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "顯示棋局列表(L) Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "電腦執黑(B) Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "編輯棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "編輯局面(d) Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "暫停(P) Pause" #~ msgid "Accept F3" #~ msgstr "接受(A) F3" #~ msgid "Decline F4" #~ msgstr "拒絕(C) F4" #~ msgid "Rematch F12" #~ msgstr "重賽(M) F12" #~ msgid "Draw F6" #~ msgstr "提和(D) F6" #~ msgid "Adjourn F7" #~ msgstr "封盤(J) F7" #~ msgid "Abort F8" #~ msgstr "中止(B) F8" #~ msgid "Resign F9" #~ msgstr "認輸(R) F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "立即走棋(M) Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "總是升變為皇后(Q) Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "動畫走棋(A) Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "自動超時判負(F) Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "同步思考(N) Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "隱藏引擎思考 Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "檢查著法合理性(L) Cl+Sh+L" #~ msgid "Drop" #~ msgstr "取消" #, fuzzy #~ msgid "could not open: " #~ msgstr "無法解析著法" #~ msgid "ok" #~ msgstr "確定" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "拖曳醒目提示(H)" #~ msgid "White " #~ msgstr "紅方 " #~ msgid "Black " #~ msgstr "黑方 " #~ msgid "Close" #~ msgstr "關閉(C)" #~ msgid "sec/move" #~ msgstr "每走一步加" xboard-4.7.3/po/quot.sed0000644000175000001440000000023112262415351012021 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g xboard-4.7.3/po/de.gmo0000644000175000001440000010210412262562300011427 00000000000000|ep&q&s&&&&&&&"!'D'a'4|')''5'#0(T(o( u(((((((((()7 )D) [)"h))))%)%)***9* B* M*W* f*s* * ***** *+ +'+@+]+ f+t+++++ ++ + +++ ,* ,8,H,b,),,,,,- --'-/- 8-C- [-f- o-{-.- ---. . #./.%>.d.z...!.../ /// (/5/!S/Vu///'/$090 >0 H0 U0 _0 i0v00!00 0 00 011,1 C1Q1a1 w111&1!1&1(2A2X2!t2222023+3<3D3[3o3"3"3.3 3 4 44 54?4F4X4Xj484 455 5 525P5g5/5555 55 56#6;6Q6V6g6z666666 6 6 6 6 7,7 <70I7!z77 77#78 %8 18#=8a8t888888888 88 9 929J9b9t9999 9939-:)K:-u:): :%: : ;";8; =; H;R; X;e;i;;;; ; ;;;-<.<J<[<q<<<<<<<=!'=I=a=f=}=+======>!>!'>I>N> _>m>r>>>>>>>?$ ?/?5?7?N?5b?E???@ @@#@ ,@*:@e@ @@@@@@@ AA 7ACASAoA AAAAAAAA AB#B ?B MBXBoBBB&B!B*C(,C&UC|CCCCCCCCSCOD&eD DDD-DDEE"$EGE,VE(E E"E EEEF+F&DFkFrFF FF%FFF(F%GEGeG G GGG'H'H%H2H.I 4IBITIjIoIIIII*IJ50JKfJ)JJPvKOKL.4LCcLjL M 3MTMmMMMMMM MMMM MMM M N N&NBNGN LNVNtN {N!N N N1NNN OOO)O?OZOQ Q#Q6QSQ(qQ.Q#Q Q'R16R1hR3R?R'S6S SS ]SjSsS*zS SSSSSS THT[TtT0TT-T*U5,UbUsU U UUUU!U VV0-V^V|VV-VV,VV)WGWYWoWWWWWW&W W XX&X +X86X#oXX!X,XY#Y$?Y#dY YYYYYYYYY Y+YC*Z nZ |ZZ ZZ ZZKZF[*a[[.[&[[[ \\ \*\B\!Q\*s\v\]1]%7]-]] ] ]]]]]]^"^$<^ a^m^}^^!^^!^^_!/_Q_g_n_5_1_4_,*`W`q`+``(`%a1)a[ayaaaa#a$a3b4Ib~bb bb bbbbecNicc ccccdd$:d4_dddd ddd-d)eEeceieeeeee ee ee ff +f19fkf5{f*f!f&f%g,^j;jj(j kk*/kZk`kokxk}kk(k(kkk ll.l*7lAblllll*m1mJmimmmmmm nn&n9nSnVnnn ~nnnn&nnn oo$oBoXo)oooo o o-o-p6p8pNpFmp`pq2qIqRqWqhqoq3qqqqr"r?r]r{r r"rrrrs )s5sGsOs#fssssss+ss tt0tIt_t1zt2t3t1u-Eu#suuuu uu u v"vv7v vww+0w\wewxw+ww>w;xCx5[xxx xxx1y FyTyky y*y.yyy5z)Kzuzzz z zz){)|%@|=f|| |$|| |}}-}J}^}0p};}B}_ ~B~~uyj!Z7|Dz1t*с  $/ 8 B LW^r,Ƃ0@G&X 3Ӄۃ /,N}xYyn8n~g8|D6tu=]3PiID/Qq)A*_LCZ2l.m#7S4L)+T<i PE@@dG(ezR']7t!J0^c{bb$Ta ?+h0J\:E   =gfoO M5 1G[u.H2wxN` "5so:\,}H*WkVSv>& $Z[pzFF,C9;XkvIyf9-Y&hd|Bs'wAUr~1>Q3^O<c%%K_-jU4;# e!qM"{6r Rl/VpWm`jBa K(?X (with Zippy code)# no engines are installed%s - %d/%d games (%d-%d-%d)%s does not support analysis%s engine has too many options %s program exits in draw position (%s)%s: Can't access XPM directory %s %s: bad boardSize syntax %s %s: can't cd to CHESSDIR: %s: can't parse color names; disabling colorization %s: can't parse foreground color in `%s' %s: no fonts match pattern %s %s: too few colors available; trying monochrome mode %s: unrecognized boardSize name %s %s: unrecognized color %s AbortAbout XBoardAcceptActionAdd this engine to the listAdjournAdjudicate DrawAdjudicate to BlackAdjudicate to WhiteAlarmAlarm Time (msec):Alarm:All games in tourney '%s' are already played or playingAlready at end of gameAlways QueenAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-Create Logon ScriptAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Save GamesAvailable `%s' sizes: BBackground Observe while PlayingBackwardBad FEN position in clipboardBad FEN position in fileBad FEN received from engineBad SeekBad game fileBad integer value %sBad position fileBad tournament fileBishopBlackBlack to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook FaultBook file exists! Try again for overwrite.Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't open temp fileCan't seek on game fileCan't seek on position fileCancelCannonCannot build game listCaptainCar HornChancellorChannel #1 Text Colors:Channel 1:Channel:Clear boardClick clock to clear boardClock adjustment not allowed in auto-flag modeClone TourneyClose ICS engine analyze...Colorize MessagesCommentsConnection closed by ICSContents ofCopy Game ListCould not connect to host %s, port %sCould not create bookCould not open comm port %sCould not parse moveCould not write on tourney fileCouldn't parse move "%s" from ICSDDark Square Color:DeclineDeferDemoteDevelopment NewsDirectories:Displayed move is not currentDisplayed position is not currentDisplayed position is not current. Step forward to the correct position and try again.Draw after N Moves Total:Draw:Dual Board for Background-Observed GameERROR: Unknown user %s (in path %s) EditEdit BookEdit CommentEdit TagsEdit bookEdit commentEdit comment on %d.%s%sElephantElo of strongest player at least:Elo of weakest player at least:Empty squareEnd of gameEngineEngine #1Engine #1 Settings ...Engine #2 / HumanEngine #2 Settings ...Engine OutputEngine SettingsEngine has no optionsEngine outputErrorError %d loading icon image Error gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyError: No `%s' files! Evaluation graphExitingFailed to invoke cmailFailed to open fileFailed to open file '%s' Failed to open indirection file %sFailed to parse board string: "%s"Failed to start %s chess program %s on %s: %s Fatal ErrorFileFile type:File with Start Positions:Filename:Files:First Black Move:First White Move:First change an engine by editing the participants list of the Tournament Options dialogFirst you must specify an existing tourney file to cloneFlash MovesForwardGGame List ...Game List Tags...Game list not loaded or emptyGame not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGame-list optionsGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash keys are differentHash-Table Size (MB):HelpHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS Input BoxICS OptionsICS input boxICS text menuIllegal hint move "%s" from %s chess programIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move (rejected by ICS)Illegal move in ICS output: "%s"Illegal move: %d.%s%sIncomplete \ escape in value for %sIncorrect moveInfo XBoardInformationInvalid pairing from pairing engineIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKibitz Text Colors:Kibitz:KingKnightLaserLieutenantLight Square Color:Load Game ...Load Game OptionsLoad New 1st Engine ...Load New 2nd Engine ...Load first engineLoad game file name?Load position file name?Load second engineLose:Machine MatchMachine accepts your draw offerMachine offers a draw Select Action / Draw to agreeMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMail MoveMatch %s vs. %s: final score %d-%d-%dMatch ...Match OptionsMaximum Number of CPUs per Engine:ModeMove SoundMove listMove:N-Move Rule:NPSNegate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNew directoryNo SoundNo engine %s is installedNo engine with the name you gave is installedNo game has been loaded yetNo game selectedNo games before year:No hint availableNo more games in this messageNo moves in gameNo pairing engine specifiedNo position has been loaded yetNo tag selectedNo unfinished gamesNo unfinished games No value provided for argument %sNot enough participantsNoteNumber of Board Files:Number of Board Ranks:Number of tourney cycles (or Swiss rounds):OKOn-line User GuideOne-Click MovingOpening-Book Filename:OptionsOther Channel Text Colors:PausePause between Match Games (msec):PawnPeriodic UpdatesPick new gamePlayPolyglot book not validPolygot Directory:Ponder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePromotePull pawn backwards to under-promoteQueenRReading game file (%d)Ready to send mail Recompile to support this BOARD_RANKS or BOARD_FILES!Recompile with larger BOARD_RANKS or BOARD_FILES to support this sizeReload CMail MessageReplace EngineResignRookS-Shout Text Colors:S-Shout:Same materialSame material with exactly same Pawn chainSave Final Positions on File:Save Game ...Save Game OptionsSave Games as BookSave Games on File:Save Settings NowSave Settings on ExitSave Tourney Games on:Save game file name?Save position file name?Saving gameSaving positionScanning through games (%d)Scores in Move ListSearch mode:Seconds per Move:Seek:Select Engine:Select engine from list:Shout Text Colors:Shout:Show CoordinatesShow CoordsShow Target SquaresSocket support is not configured inSound OptionsSounds ...Start-position number:Starting %s chess programStarting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s Swiss tourney finishedSync after cycleSync after roundTRY ANOTHER NAMETagsTell Text Colors:Tell:That square is occupiedThe cmail message is not loaded. Use Reload CMail Message and make your move again.There is no game listThere is no pending offer on this moveTime ControlTournament file: Tourney participants:Tourney type (0 = round-robin, 1 = gauntlet):TrainingTraining mode offTraining mode onTraining mode requires a game fileTry-Out Sound:TwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineType a moveUnable to create font set for %s. Unfinished:Unknown initialMode %sUnknown variant name %sUnknown wild type %dUnrecognized argument %sUnrecognized boolean argument value %sUnusedUpgrade EngineUpload to ExamineUser FileVariant %s not supported by %sVariant %s supported only in ICS modeViewWait until your turnWait until your turn, or select Move NowWaiting for access to save fileWaiting for first chess programWaiting for other game(s)Waiting for reply from opponent Waiting for second chess programWarlordWarning: No DIR structure found on this system -- Unable to autosize for XPM/XIM pieces. Please report this error to %s. Include system type & operating system in message. Warning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:Win:XBoard Home PageYou are not examining a gameYou are not observing a gameYou are playing BlackYou are playing WhiteYou can only change one engine at the timeYou can't revert while pausingYou cannot do this while you are playing or observingYou cannot replace an engine while it is engaged! Terminate its game first.You did not specify the engine executableYou have already mailed a move. Wait until a move arrives from your opponent. To resend the same move, type "cmail -remail -game %s" on the command line.You have edited the game history. Use Reload Same Game and make your move again.You have entered too many moves. Back up to the correct position and try again.You have not made a move yetYou must make your move before offering a drawYou must supply a tournament file, for storing the tourney progressYou restarted an already completed tourney One more cycle will now be added to it Games commence in 10 secYour opponent is not out of timeZoom factor in Evaluation Graph:bad searchTime option %sbad timeControl option %sbrowsebughouseby nameby typecancelclassicalclosedowne-Mail Bug Reportengine namefactoryfailed writing PVfind positionfirstincrementalinternal rcmd not implemented for Unixmovenextnext pageno games matched your requestnormalprevious pageprotocol version %d not supportedrandomizesave changessay Internal error; bad moveType %d (%d,%d-%d,%d)secondshufflethresholdsupvs.white pixel = 0x%lx, black pixel = 0x%lx your opponent kibitzes: %sProject-Id-Version: xboard 4.6.0.20121211 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: 2013-01-20 18:51-0800 Last-Translator: Arun Persaud Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); (mit Zippy)# keine Schachprogramme installiert%s - %d/%d Spiele (%d-%d-%d)%s unterstützt keine AnalyseSchachprogramm %s hat zu viele Optionen %s Schachprogramm beendet in Remistellung (%s)%s: XPM-Ordner nicht erreichbar %s %s: falsche boardSize Syntax %s %s: cd zu CHESSDIR funktioniert nicht: %s: kann Farbname nicht parsen; deaktiere Farben %s: Kann Vordergrundfarbe in »%s« nicht parsen %s: keine Schriften stimmen mit Muster %s überein %s: nicht genügend Farben vorhanden; versuche monochrom Modus %s: unbekannter Name fuer boardSize %s %s: nicht erkannte Farbe %s AbbrechenÜber XBoardAnnehmenAktionFüge diese Schachprogramm zur Liste hinzuAussetzenRemi zuerkennenGewinn Schwartz zuerkennnenGewinn Weiß zuerkennenAlarmAlarmzeit (msek):Alarm:Alle Spiele im Turnier »%s« sind entweder beendet oder werden gespieltSchon am Ende der PartieImmer KöniginNicht eindeutiger Zug in der ICS-Ausgabe: »%s«Nicht eindeutiger Zug: %d.%s%sAnalyse-Modus funktioniert nicht im ICS-ModusAnalyse-Modus benötigt ein Schachprogramm»Analysiere Datei«-Modus benötigt eine PartiedateiZiehen animierenZiehen animierenAnnotierenErzbischofZeit automatisch reklamierenBrett automatisch drehenAutomatische KommentareAutomatisch Login-skript erzeugenAuto-KibitzAutomatisch BeobachtenAutomatisch das Brett in den Vordergrung bringenAutomatisch Partien speichernMögliche »%s« Größen: BBeobachte im Hintegrund während einer PartieZurückSchlechte FEN-Stellung in der ZwischenablageSchlechte FEN-Stellung in DateiSchlechte FEN vom Schachprogramm erhaltenFehlerhafte SucheFehler in PartiedateiFalscher Integer-wert %sFehler in PositionsdateiFehler in TurnierdateiLäuferSchwarzSchwarz am ZugSchwarz überschritt die ZeitkontrolleBlindschachBretteinstellungenBrett…BuchBuchfehlerBuchdatei existiert! Versuche erneut zum Überschreiben.Beide Zeitkontrollen überschrittenKann nicht weiter zurückgehenKann nicht weiter vorwärts gehenPartie ohne Schachprogram ist nicht möglichKann »%s« nicht öffnenKann temporäre Datei nicht öffnenKann nicht in der Partiedatei suchenKann nicht in Stellungsdatei suchenAbbrechenKanoneKann Zugliste nicht erstellenKapitänHupeKanlzerTextfarbe Kanal #1:Kanal 1:Kanal:Brett leerenKlicke auf eine Uhr, um das Brett zu leerenVeränderungen an der Uhr sind im »Auto-flag«-Modus nicht erlaubtKlone TurnierSchließe ICS Programmanalyse…Nachrichten kolorierenKommentareVerbindung zum ICS beendetInhalt vonPartieliste kopierenVerbindung zu Hostrechner %s, Portnummer %s konnte nicht hergestellt werdenKonnte Buch nicht erzeugenKonnte Kommunikationsport %s nicht öffnenKonnte Zug nicht parsenSchreibzugriff auf Turnierdatei nicht möglichKonnte Zug »%s« vom ICS nicht parsenDSchwarzes Feld:AblehnenvertagendegradierenEntwicklungsnachrichtenVerzeichnisse:Angezeigter Zug ist nicht aktuellAngezeigte Position ist nicht die AktuelleDie angezeigt Stellung ist nicht die aktuelle. Gehen Sie vorwärts zur richtigen Stellung und versuchen Sie es erneut.Remi nach N Zügen (total):Remi:Zweites Brett für beobachtetes SpielFEHLER: unbekannter Benutzer %s (im Pfad %s) BearbeitenEditiere BuchKommentar bearbeitenMarkierung bearbeitenBearbeite BuchEditiere KommentarEditiere Kommentar für %d.%s%sElefantMind. Elo des stärksten Spielers:Mind. Elo des schwächsten Spielers:Leeres FeldEnde des SpielsSchachprogrammSchachprogramm #1Schachprogram #1 Einstellungen…Schachprogram #2 / SpielerSchachprogram #2 Einstellungen…SchachprogrammausgabeSchachprogrammeinstellungenSchachprogramm hat keine OptionenSchachprogrammausgabeFehlerFehler %d beim Laden von Icon Fehler beim Erstellen der Zugliste: extra SchachbrettFehler beim Erstellen der Zugliste: verschachteltFehler beim Erstellen der Zugliste: zwei DateiköpfeFehler beim Lesen vom Schachprogramm %s (%s)Fehler beim Lesen vom ICSFehler beim Lesen der TastaturFehler beim Schreiben zum Schachprogramm %sFehler beim Schreiben zum ICSFehler beim Schreiben zum SchachprogrammFehler beim Schreiben auf dem DisplayFehler: %s Schachprogramm (%s) unerwartet beendetFehler: Keine »%s« Datein! AuswertungsgraphBeendeFehler beim Aufruf von cmailFehler beim Öffnen der DateiFehler beim Öffnen der Datei '%s' Fehler beim Öffnen der Datei »%s«Konnte Schachbrettzeichenkette nicht parsen: »%s«Konnte %s Schachprogram %s auf %s nicht starten: %s Schwerwiegender FehlerDateiDateientyp:Datei mit Startstellung:Dateinname:Dateien:Erster Zug von Schwarz:Erster Zug von Weiß:Ändern Sie ein Schachprogramm indem Sie die Liste der Teilnehmner im Turnieroptionendialog editierenBitte geben Sie zuerst eine existierende Turnierdatei, die geklont werden kannZüge aufblitzen lassenVorwärtsGPartieliste…Partie Markierungen…Noch keine Partie geladenSpiel in Datei nicht gefundenPartienummer außerhalb des BereichsPartie zu lang; erhöhe MAX_MOVES und kompiliere neuSpieleliste-optionenLücke in ZuglisteGeneralAllgemein…Allgemeine EinstellungenZugliste abholenHabe Ende-der-Datei von der Tastatur erhaltenHash-schlüssel verschiedenGröße der Hashtabelle (MB):HilfeFarbe zum Hervorheben:Züge hervorhebenLetzten Zug hervorhebenMit Pfeil hervorhebenHervorhebung mit PfeilHinweißHinweis: %sICS…ICS-clientICS EingabefeldICS OptionenICS EingabefeldICS-TextmenueIllegaler Zughinweis »%s« vom Schachprogramm %sUngültiger ZugIllegaler Zug »%s« (abgelehnt vom Schachprogram %s)Illegaler Zug »%s« vom Schachprogramm %sIllegaler Zug (abgelehnt vom ICS)Illegaler Zug in der ICS-Ausgabe: "%s"Illegaler Zug: %d.%s%sUnvollständiges \ escape im Wert von »%s«Ungültiger ZugInfo XBoardInformationUngültige Paarungen vom PaarungsprogrammSchwarz ist am ZugWeiß ist am ZugSchwarz ist nicht am ZugWeiß ist nicht am ZugSie sind am ZugTextfarbe Kibitz:Kibitz:KönigSpringerLaserLeutnantWeißes Feld:Partie laden…Spieleinstellungen ladenNeues erstes Schachprogramm laden…Neues zweites Schachprogramm laden…Lade erstes SchachprogrammLade Partiedatei mit Namen?Lade Stellungsdatei mit Namen?Lade zweites SchachprogrammVerloren:Schachprogramm PartieDas Schachprogramm akzeptiert dein RemiangebotDas Schachprogramm bietet Remi an Wähle Aktion/Remi, um anzunehmen»Schachprogramm Schwarz«-Modus funktioniert nicht im ICS-Modus»Schachprogramm Schwarz«-Modus benötigt ein Schachprogramm»Schachprogramm Weiß«-Modus funktioniert nicht im ICS-Modus»Schachprogramm Weiß«-Modus benötigt ein SchachprogrammVerschicke ZugPartie %s gegen %s: Endergebnis %d-%d-%dPartie…PartieeinstellungenMaximal Anzahl der CPUs pro Schachprogram:ModusKlang für ZugZuglisteZug:N-Züge Regel:NPSNegiere Bewertung des 1. SchachprogrammsNegiere Bewertung des 2. SchachprogrammsNeue Shuffle-PartieNeue Shuffle Partie… Neue VarianteNeues VerzeichnisKein TonDas Schachprogram %s ist nicht installiertEin Schachprogram mit dem angegebenen Namen ist nicht installiertNoch keine Partie geladenKeine Partie selektiertKeine Partie vor Jahr:Kein Hinweis erhältlichKeine weiteren Partien in dieser NachrichtKeine Züge in dem SpielKein Paarungsprogram angegebenNoch keine Stellung geladenKeine Markierung selektiertKeine laufenden PartienKeine laufenden Partien Fehlender Wert für Argument %sNicht genügend TeilnehmerNotizAnzahl der Linien:Anzahl der Reihen:Anzahl der Turnierrunden:OKOnline BenutzerhandbuchEin-Klick ZügeDateiname des Eröffnungsbuches:OptionenTextfarbe andere Kanäle:PausePause zwischen Tournierspielen (msek):BauerPeriodische UpdatesWähle neues SpielSpielenPolyglot-buch nicht zulässigPolyglot-verzeichnis:Nächsten Zug abwägenDialogfenster für Nachricht beim BeendenPopup Nachricht beim BeendenDialogfenster für ZugfehlerStellung in Datei nicht gefundenumwandlungBewege Bauern rückwärts zum UnterverwandelnKöniginRLese Partiedatei (%d)Bereit zum Versenden der Mail Kompiliere erneut mit Unterstützung von BOARD_RANKS oder BOARD_FILES!Kompiliere erneut mit größeren BOARD_RANKS oder BOARD_FILES, um diese Größe zu unterstützenCMail Nachricht erneut ladenErsetze SchachprogrammAufgebenTurmTextfarbe S-Ruf:S-Ruf:Gleiches MaterialGleiches Material mit genau gleicher BauernstrukturSpeichere Endstellung in Datei:Partie speichern…Spieleinstellungen speichernPartien speichern als Buch:Partien speichern als Datei:Einstellungen jetzt speichernEinstellung am Ende speichernSpeichere Turnierspiele:Speichere Partiedatei mit Namen?Speicher Stellungsdatei mit Namen?Speichere SpielSpeichere Stellung Durchsuche Spiele (%d)Bewertung in ZuglisteSuch-modus:Sekunden pro Zug:Gesuch:Wähle Schachprogramm:Wähle Schachprogram aus der Liste:Textfarbe Ruf:Ruf:Zeige KoordinatenZeige KoordinatenZeige ZielfeldSocketunterstützung ist nicht konfiguriertKlangeinstellungenKlang ...Startposition-Nummer:Starte %s SchachprogrammStarte SchachprogrammFehler beim Starten »%s«Sie müssen noch einen Zug für Partie %s machen Sie müssen noch einen Zug für die Partie machen Sie müssen noch Züge für alle %d Partien machen Sie müssen noch Züge für beide Partien machen Sie müssen noch Züge für Partie %s machen Turnier im Schweizer System beendetSync. nach ZyklusSync. nach der RundeVERSUCHE EINEN ANDEREN NAMENMarkierungenTextfarbe Mitteilung:Mitteilung:Dieses Feld ist besetztDie CMail-Nachricht wurde noch nicht geladen. Benutzen sie »CMail Nachricht erneut laden« und führen Sie ihren Zug erneut aus.Partieliste existiert nichtEs liegt kein unbeantwortes Angebot für diesen Zug vorZeitkontrolleTurnierdatei: Tunierteilnehmer:Turniertyp (0 = round-robin, 1 = gauntlet):TrainingTrainier-Modus ausTrainier-Modus einTrainieren-Modus benötigt eine PartiedateiTeste Geräusch:»Zwei Schachprogramme«-Modus funktioniert nicht im ICS-Modus»Zwei Schachprogramme«-Modus benötigt ein SchachprogrammGeben Sie einen Zug einNicht in der Lage Schriftsatz für %s zu generieren. Nicht beendet:Unbekannter initalMode %sUnbekannte Variante mit Namen %sUnbekannter wild-Variante %dNicht erkanntes Argument %sNicht anerkannter logischer Wert für Argument %sNicht benutztErsetze SchachprogrammHochladen zum UntersuchenBenutzerdateiVariante %s wird von %s nicht unterstütztVariante %s wird nur im ICS-Modus unterstütztAnzeigenWarten Sie bis Sie am Zug sindWarte bis Sie am Zug sind oder wähle »Ziehe jetzt«Warte auf Zugriff zur Datei zum SpeichernWarte auf erstes SchachprogrammWarte auf weiter SpieleWarte auf Antwort des Gegners Warte auf zweites SchachprogrammKriegsherrWarnung: Keine DIR-Struktur auf dem Rechner gefunden -- wählen einer automatischen Größe für XPM/XIM Figuren fehlgeschlagen. Bitte schicken Sie einen Bug-report and %s. Geben Sie dabei den Rechnertyp und das Betriebsystem an. Warnung: Sie untersuchen noch eine PartieWarnung: Sie schauen noch einer Partie zuWarnung: Sie spielen noch eine PartieWarnung: zweites Schachprogramm (%s) unterstützt dies nicht!WeißWeiß am ZugWeiß überschritt die ZeitkontrolleGewinn/Verlust Grenzwert:Gewonnen:XBoard HomepageSie untersuchen keine PartieSie schauen keiner Partie zuSie spielen SchwarzSie spielen WeißSie können immer nur ein Schachprogramm ändernSie können nicht zurücknehmen solange die Partie pausiertDies ist nicht möglich während oder beim Zuschauen eines SpielesErsetzen eines Schachprogramms während es läuft nicht möglich! Beenden Sie das Spiel zuerst.Das Computerprogramm für das Schachprogramm wurde nicht angegebenSie haben ihren Zug schon verschickt. Warten Sie bis der Zug ihres Gegners ankommt. Um denselben Zug erneut zu versenden, tippen Sie »cmail -remail -game %s« in die Kommandozeile.Sie haben die Partieentwicklung verändert. Benutzen Sie »Spiel erneut laden« und führen Sie ihren Zug erneut aus.Sie haben zu viele Züge eingegeben. Gehen Sie zur richtigen Stellung zurück und versuchen Sie es erneut.Sie haben noch keinen Zug gemachtSie müssem erst ziehen bevor Sie Remi anbieten könnenSie müssen eine Turnierdatei zum Speichern der Turnierdaten angebenEin schon beendetes Turnier wurde neu gestartet Eine neue Runde wird hinzugefügt Die Spiele werden in 10 Sekunden startenIhr Gegner hat die Zeit noch nicht überschrittenVergrößerungsfaktor in Auswertungsgraph:falsche searchTime-Option %sfalsche timeControl-Option %sdurchsucheTandemschachnach Namennach TypabbrechenklassischschließenrunterE-mail FehlerreportSchachprogrammFabrikschreiben des PV fehlgeschlagenSuche StellungerstesZuwachsInteres rcmd ist in UNIX nicht implementiertZugnächstenächste SeiteKeine Spiele stimmten mit ihrer Anfrage übereinNormalVorheriges SpielProtokollversion %d nicht unterstütztzufälligspeichere ÄnderungenInterner Fehler; falscher moveType %d (%d,%d-%d,%d)zweitesShuffleSchwellenwerthochgegenweißes Pixel = 0x%lx, schwarzes Pixel = 0x%lx Dein Gegner kibitzt: %sxboard-4.7.3/po/de.po0000644000175000001440000020131012262562300011262 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 2012 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # Arun Persaud , 2009,2012,2013 # msgid "" msgstr "" "Project-Id-Version: xboard 4.6.0.20121211\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: 2013-01-20 18:51-0800\n" "Last-Translator: Arun Persaud \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "Falscher Integer-wert %s" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "Nicht erkanntes Argument %s" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "Fehlender Wert für Argument %s" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "Unvollständiges \\ escape im Wert von »%s«" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "Fehler beim Öffnen der Datei »%s«" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "Nicht anerkannter logischer Wert für Argument %s" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "erstes" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "zweites" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "Protokollversion %d nicht unterstützt" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "Das Computerprogramm für das Schachprogramm wurde nicht angegeben" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "falsche timeControl-Option %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "falsche searchTime-Option %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "Variante %s wird nur im ICS-Modus unterstützt" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Unbekannte Variante mit Namen %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Starte Schachprogramm" #: backend.c:1398 msgid "Bad game file" msgstr "Fehler in Partiedatei" #: backend.c:1405 msgid "Bad position file" msgstr "Fehler in Positionsdatei" #: backend.c:1419 msgid "Pick new game" msgstr "Wähle neues Spiel" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" "Ein schon beendetes Turnier wurde neu gestartet\n" "Eine neue Runde wird hinzugefügt\n" "Die Spiele werden in 10 Sekunden starten" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "Alle Spiele im Turnier »%s« sind entweder beendet oder werden gespielt" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "Partie ohne Schachprogram ist nicht möglich" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "Konnte Kommunikationsport %s nicht öffnen" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "" "Verbindung zu Hostrechner %s, Portnummer %s konnte nicht hergestellt werden" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "Unbekannter initalMode %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "»Analysiere Datei«-Modus benötigt eine Partiedatei" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "Analyse-Modus benötigt ein Schachprogramm" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "Analyse-Modus funktioniert nicht im ICS-Modus" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "»Schachprogramm Weiß«-Modus benötigt ein Schachprogramm" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "»Schachprogramm Weiß«-Modus funktioniert nicht im ICS-Modus" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "»Schachprogramm Schwarz«-Modus benötigt ein Schachprogramm" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "»Schachprogramm Schwarz«-Modus funktioniert nicht im ICS-Modus" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "»Zwei Schachprogramme«-Modus benötigt ein Schachprogramm" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "»Zwei Schachprogramme«-Modus funktioniert nicht im ICS-Modus" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "Trainieren-Modus benötigt eine Partiedatei" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Fehler beim Schreiben zum ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Fehler beim Lesen der Tastatur" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Habe Ende-der-Datei von der Tastatur erhalten" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "Unbekannter wild-Variante %d" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Fehler beim Schreiben auf dem Display" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "Dein Gegner kibitzt: %s" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Fehler beim Erstellen der Zugliste: zwei Dateiköpfe" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Fehler beim Erstellen der Zugliste: verschachtelt" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "gegen" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "Illegaler Zug (abgelehnt vom ICS)" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "Verbindung zum ICS beendet" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Fehler beim Lesen vom ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" "Konnte Schachbrettzeichenkette nicht parsen:\n" "»%s«" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "Partie zu lang; erhöhe MAX_MOVES und kompiliere neu" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Fehler beim Erstellen der Zugliste: extra Schachbrett" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "Konnte Zug »%s« vom ICS nicht parsen" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "Interner Fehler; falscher moveType %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "Dies ist nicht möglich während oder beim Zuschauen eines Spieles" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "Kompiliere erneut mit Unterstützung von BOARD_RANKS oder BOARD_FILES!" #: backend.c:6491 msgid "You are playing Black" msgstr "Sie spielen Schwarz" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Sie spielen Weiß" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Weiß ist am Zug" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Schwarz ist am Zug" #: backend.c:6552 msgid "Displayed position is not current" msgstr "Angezeigte Position ist nicht die Aktuelle" #: backend.c:6790 msgid "Illegal move" msgstr "Ungültiger Zug" #: backend.c:6857 msgid "End of game" msgstr "Ende des Spiels" #: backend.c:6860 msgid "Incorrect move" msgstr "Ungültiger Zug" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "Bewege Bauern rückwärts zum Unterverwandeln" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "Turnier im Schweizer System beendet" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "Ungültige Paarungen vom Paarungsprogramm" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Illegaler Zug »%s« vom Schachprogramm %s" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "Schlechte FEN vom Schachprogramm erhalten" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s unterstützt keine Analyse" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "Illegaler Zug »%s« (abgelehnt vom Schachprogram %s)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Konnte %s Schachprogram %s auf %s nicht starten: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Hinweis: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" "Illegaler Zughinweis »%s«\n" "vom Schachprogramm %s" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "Das Schachprogramm akzeptiert dein Remiangebot" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" "Das Schachprogramm bietet Remi an\n" "Wähle Aktion/Remi, um anzunehmen" #: backend.c:8977 msgid "failed writing PV" msgstr "schreiben des PV fehlgeschlagen" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Nicht eindeutiger Zug in der ICS-Ausgabe: »%s«" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Illegaler Zug in der ICS-Ausgabe: \"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "Lücke in Zugliste" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "Variante %s wird von %s nicht unterstützt" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Fehler beim Starten »%s«" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "Warte auf erstes Schachprogramm" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "Warte auf zweites Schachprogramm" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "Schreibzugriff auf Turnierdatei nicht möglich" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" "Ersetzen eines Schachprogramms während es läuft nicht möglich!\n" "Beenden Sie das Spiel zuerst." #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "Ein Schachprogram mit dem angegebenen Namen ist nicht installiert" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" "Ändern Sie ein Schachprogramm indem Sie die Liste der Teilnehmner\n" "im Turnieroptionendialog editieren" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "Sie können immer nur ein Schachprogramm ändern" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "Das Schachprogram %s ist nicht installiert" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" "Sie müssen eine Turnierdatei zum Speichern\n" "der Turnierdaten angeben" #: backend.c:10259 msgid "Not enough participants" msgstr "Nicht genügend Teilnehmer" #: backend.c:10460 msgid "Bad tournament file" msgstr "Fehler in Turnierdatei" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "Warte auf weiter Spiele" #: backend.c:10485 msgid "No pairing engine specified" msgstr "Kein Paarungsprogram angegeben" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Partie %s gegen %s: Endergebnis %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Illegaler Zug: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Nicht eindeutiger Zug: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "Kann »%s« nicht öffnen" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "Kann Zugliste nicht erstellen" #: backend.c:11594 msgid "No more games in this message" msgstr "Keine weiteren Partien in dieser Nachricht" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Noch keine Partie geladen" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Kann nicht weiter zurückgehen" #: backend.c:12077 msgid "Game number out of range" msgstr "Partienummer außerhalb des Bereichs" #: backend.c:12088 msgid "Can't seek on game file" msgstr "Kann nicht in der Partiedatei suchen" #: backend.c:12146 msgid "Game not found in file" msgstr "Spiel in Datei nicht gefunden" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Schlechte FEN-Stellung in Datei" #: backend.c:12426 msgid "No moves in game" msgstr "Keine Züge in dem Spiel" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Noch keine Stellung geladen" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "Kann nicht in Stellungsdatei suchen" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "Stellung in Datei nicht gefunden" #: backend.c:12632 msgid "Black to play" msgstr "Schwarz am Zug" #: backend.c:12635 msgid "White to play" msgstr "Weiß am Zug" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "Warte auf Zugriff zur Datei zum Speichern" #: backend.c:12724 msgid "Saving game" msgstr "Speichere Spiel" #: backend.c:12725 msgid "Bad Seek" msgstr "Fehlerhafte Suche" #: backend.c:13085 msgid "Saving position" msgstr "Speichere Stellung " #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" "Sie haben die Partieentwicklung verändert.\n" "Benutzen Sie »Spiel erneut laden« und führen Sie ihren Zug erneut aus." #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" "Sie haben zu viele Züge eingegeben.\n" "Gehen Sie zur richtigen Stellung zurück und versuchen Sie es erneut." #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" "Die angezeigt Stellung ist nicht die aktuelle.\n" "Gehen Sie vorwärts zur richtigen Stellung und versuchen Sie es erneut." #: backend.c:13268 msgid "You have not made a move yet" msgstr "Sie haben noch keinen Zug gemacht" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" "Die CMail-Nachricht wurde noch nicht geladen.\n" "Benutzen sie »CMail Nachricht erneut laden« und führen Sie ihren Zug erneut " "aus." #: backend.c:13294 msgid "No unfinished games" msgstr "Keine laufenden Partien" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" "Sie haben ihren Zug schon verschickt.\n" "Warten Sie bis der Zug ihres Gegners ankommt.\n" "Um denselben Zug erneut zu versenden, tippen Sie\n" "»cmail -remail -game %s«\n" "in die Kommandozeile." #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Fehler beim Aufruf von cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Warte auf Antwort des Gegners\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Sie müssen noch einen Zug für die Partie machen\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Sie müssen noch Züge für beide Partien machen\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Sie müssen noch Züge für alle %d Partien machen\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Sie müssen noch einen Zug für Partie %s machen\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "Keine laufenden Partien\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Bereit zum Versenden der Mail\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Sie müssen noch Züge für Partie %s machen\n" #: backend.c:13631 msgid "Edit comment" msgstr "Editiere Kommentar" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Editiere Kommentar für %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "Sie schauen keiner Partie zu" #: backend.c:13796 msgid "It is not White's turn" msgstr "Weiß ist nicht am Zug" #: backend.c:13877 msgid "It is not Black's turn" msgstr "Schwarz ist nicht am Zug" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "Starte %s Schachprogramm" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" "Warte bis Sie am Zug sind\n" "oder wähle »Ziehe jetzt«" #: backend.c:14147 msgid "Training mode off" msgstr "Trainier-Modus aus" #: backend.c:14155 msgid "Training mode on" msgstr "Trainier-Modus ein" #: backend.c:14158 msgid "Already at end of game" msgstr "Schon am Ende der Partie" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Warnung: Sie spielen noch eine Partie" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Warnung: Sie schauen noch einer Partie zu" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Warnung: Sie untersuchen noch eine Partie" #: backend.c:14311 msgid "Click clock to clear board" msgstr "Klicke auf eine Uhr, um das Brett zu leeren" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "Schließe ICS Programmanalyse…" #: backend.c:14609 msgid "That square is occupied" msgstr "Dieses Feld ist besetzt" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "Es liegt kein unbeantwortes Angebot für diesen Zug vor" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "Ihr Gegner hat die Zeit noch nicht überschritten" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Sie müssem erst ziehen bevor Sie Remi anbieten können" #: backend.c:15109 msgid "You are not examining a game" msgstr "Sie untersuchen keine Partie" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "Sie können nicht zurücknehmen solange die Partie pausiert" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "Sie sind am Zug" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Warten Sie bis Sie am Zug sind" #: backend.c:15237 msgid "No hint available" msgstr "Kein Hinweis erhältlich" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "Noch keine Partie geladen" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "Buchdatei existiert! Versuche erneut zum Überschreiben." #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Fehler beim Schreiben zum Schachprogramm %s" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "%s Schachprogramm beendet in Remistellung (%s)" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Fehler: %s Schachprogramm (%s) unerwartet beendet" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Fehler beim Lesen vom Schachprogramm %s (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "Schachprogramm %s hat zu viele Optionen\n" #: backend.c:16343 msgid "Displayed move is not current" msgstr "Angezeigter Zug ist nicht aktuell" #: backend.c:16352 msgid "Could not parse move" msgstr "Konnte Zug nicht parsen" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Beide Zeitkontrollen überschritten" #: backend.c:16479 msgid "White's flag fell" msgstr "Weiß überschritt die Zeitkontrolle" #: backend.c:16501 msgid "Black's flag fell" msgstr "Schwarz überschritt die Zeitkontrolle" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "Veränderungen an der Uhr sind im »Auto-flag«-Modus nicht erlaubt" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Schlechte FEN-Stellung in der Zwischenablage" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "Polyglot-buch nicht zulässig" #: book.c:701 msgid "Book Fault" msgstr "Buchfehler" #: book.c:836 msgid "Hash keys are different" msgstr "Hash-schlüssel verschieden" #: book.c:1003 msgid "Could not create book" msgstr "Konnte Buch nicht erzeugen" #: dialogs.c:259 msgid "Tournament file: " msgstr "Turnierdatei: " #: dialogs.c:260 msgid "Sync after round" msgstr "Sync. nach der Runde" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "Sync. nach Zyklus" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "Tunierteilnehmer:" #: dialogs.c:265 msgid "Select Engine:" msgstr "Wähle Schachprogramm:" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "Turniertyp (0 = round-robin, 1 = gauntlet):" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "Anzahl der Turnierrunden:" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "Pause zwischen Tournierspielen (msek):" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "Speichere Turnierspiele:" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "Datei mit Startstellung:" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "Ersetze Schachprogramm" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "Ersetze Schachprogramm" #: dialogs.c:286 msgid "Clone Tourney" msgstr "Klone Turnier" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" "Bitte geben Sie zuerst eine existierende Turnierdatei, die geklont werden " "kann" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "# keine Schachprogramme installiert" #: dialogs.c:344 msgid "Match Options" msgstr "Partieeinstellungen" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Ziehen animieren" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Ziehen animieren" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Zeit automatisch reklamieren" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Brett automatisch drehen" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Blindschach" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Letzten Zug hervorheben" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Hervorhebung mit Pfeil" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Ein-Klick Züge" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Nächsten Zug abwägen" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Popup Nachricht beim Beenden" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Dialogfenster für Zugfehler" #: dialogs.c:382 msgid "Scores in Move List" msgstr "Bewertung in Zugliste" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Zeige Koordinaten" #: dialogs.c:384 msgid "Show Target Squares" msgstr "Zeige Zielfeld" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "Vergrößerungsfaktor in Auswertungsgraph:" #: dialogs.c:400 msgid "General Options" msgstr "Allgemeine Einstellungen" #: dialogs.c:410 msgid "normal" msgstr "Normal" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "Anzahl der Reihen:" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "Anzahl der Linien:" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "Tandemschach" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr " " #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "Warnung: zweites Schachprogramm (%s) unterstützt dies nicht!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "Neue Variante" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Maximal Anzahl der CPUs pro Schachprogram:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "Polyglot-verzeichnis:" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Größe der Hashtabelle (MB):" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "Dateiname des Eröffnungsbuches:" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "" #: dialogs.c:540 msgid "Detect all Mates" msgstr "" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "N-Züge Regel:" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Remi nach N Zügen (total):" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Gewinn/Verlust Grenzwert:" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Negiere Bewertung des 1. Schachprogramms" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Negiere Bewertung des 2. Schachprogramms" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Gewinn Weiß zuerkennen" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "Auto-Kibitz" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Automatische Kommentare" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Automatisch Beobachten" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Automatisch das Brett in den Vordergrung bringen" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "Automatisch Login-skript erzeugen" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Beobachte im Hintegrund während einer Partie" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Zweites Brett für beobachtetes Spiel" #: dialogs.c:576 msgid "Get Move List" msgstr "Zugliste abholen" #: dialogs.c:577 msgid "Quiet Play" msgstr "" #: dialogs.c:578 msgid "Seek Graph" msgstr "" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "Erster Zug von Weiß:" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "Erster Zug von Schwarz:" #: dialogs.c:587 msgid "Alarm" msgstr "Alarm" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "Alarmzeit (msek):" #: dialogs.c:590 msgid "Colorize Messages" msgstr "Nachrichten kolorieren" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "Textfarbe Ruf:" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "Textfarbe S-Ruf:" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "Textfarbe Kanal #1:" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "Textfarbe andere Kanäle:" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "Textfarbe Kibitz:" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "Textfarbe Mitteilung:" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "ICS Optionen" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "Gleiches Material mit genau gleicher Bauernstruktur" #: dialogs.c:612 msgid "Same material" msgstr "Gleiches Material" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "Sekunden pro Zug:" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "Mind. Elo des stärksten Spielers:" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "Mind. Elo des schwächsten Spielers:" #: dialogs.c:633 msgid "No games before year:" msgstr "Keine Partie vor Jahr:" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "Such-modus:" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "Spieleinstellungen laden" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "Automatisch Partien speichern" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "Partien speichern als Datei:" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "Speichere Endstellung in Datei:" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "Spieleinstellungen speichern" #: dialogs.c:681 msgid "No Sound" msgstr "Kein Ton" #: dialogs.c:682 msgid "Default Beep" msgstr "" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "Hupe" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "Laser" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "Benutzerdatei" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "Teste Geräusch:" #: dialogs.c:720 msgid "Play" msgstr "Spielen" #: dialogs.c:721 msgid "Move:" msgstr "Zug:" #: dialogs.c:722 msgid "Win:" msgstr "Gewonnen:" #: dialogs.c:723 msgid "Lose:" msgstr "Verloren:" #: dialogs.c:724 msgid "Draw:" msgstr "Remi:" #: dialogs.c:725 msgid "Unfinished:" msgstr "Nicht beendet:" #: dialogs.c:726 msgid "Alarm:" msgstr "Alarm:" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "Ruf:" #: dialogs.c:731 msgid "S-Shout:" msgstr "S-Ruf:" #: dialogs.c:732 msgid "Channel:" msgstr "Kanal:" #: dialogs.c:733 msgid "Channel 1:" msgstr "Kanal 1:" #: dialogs.c:734 msgid "Tell:" msgstr "Mitteilung:" #: dialogs.c:735 msgid "Kibitz:" msgstr "Kibitz:" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "Gesuch:" #: dialogs.c:753 msgid "Sound Options" msgstr "Klangeinstellungen" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "R" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "G" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "B" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "D" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Weißes Feld:" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Schwarzes Feld:" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Farbe zum Hervorheben:" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "Bretteinstellungen" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "ICS-Textmenue" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "speichere Änderungen" #: dialogs.c:1051 msgid "Edit book" msgstr "Bearbeite Buch" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Markierungen" #: dialogs.c:1193 msgid "ICS input box" msgstr "ICS Eingabefeld" #: dialogs.c:1225 msgid "Type a move" msgstr "Geben Sie einen Zug ein" #: dialogs.c:1251 msgid "Engine has no options" msgstr "Schachprogramm hat keine Optionen" #: dialogs.c:1253 msgid "Engine Settings" msgstr "Schachprogrammeinstellungen" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "Wähle Schachprogram aus der Liste:" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "Füge diese Schachprogramm zur Liste hinzu" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "Lade erstes Schachprogramm" #: dialogs.c:1347 msgid "Load second engine" msgstr "Lade zweites Schachprogramm" #: dialogs.c:1370 msgid "shuffle" msgstr "Shuffle" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Startposition-Nummer:" #: dialogs.c:1372 msgid "randomize" msgstr "zufällig" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Neue Shuffle-Partie" #: dialogs.c:1409 msgid "classical" msgstr "klassisch" #: dialogs.c:1410 msgid "incremental" msgstr "Zuwachs" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 msgid "Time-Odds factors:" msgstr "" #: dialogs.c:1416 msgid "Engine #1" msgstr "Schachprogramm #1" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "Schachprogram #2 / Spieler" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "Nicht benutzt" #: dialogs.c:1478 msgid "Time Control" msgstr "Zeitkontrolle" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Fehler beim Schreiben zum Schachprogramm" #: dialogs.c:1574 msgid "Cancel" msgstr "Abbrechen" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "König" #: dialogs.c:1582 msgid "Captain" msgstr "Kapitän" #: dialogs.c:1583 msgid "Lieutenant" msgstr "Leutnant" #: dialogs.c:1584 msgid "General" msgstr "General" #: dialogs.c:1585 msgid "Warlord" msgstr "Kriegsherr" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Springer" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Läufer" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Turm" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Erzbischof" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Kanlzer" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Königin" #: dialogs.c:1600 msgid "Defer" msgstr "vertagen" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "umwandlung" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "Fabrik" #: dialogs.c:1743 msgid "up" msgstr "hoch" #: dialogs.c:1744 msgid "down" msgstr "runter" #: dialogs.c:1762 msgid "No tag selected" msgstr "Keine Markierung selektiert" #: dialogs.c:1793 msgid "Game-list options" msgstr "Spieleliste-optionen" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Fehler" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Schwerwiegender Fehler" #: dialogs.c:1906 msgid "Exiting" msgstr "Beende" #: dialogs.c:1917 msgid "Information" msgstr "Information" #: dialogs.c:1924 msgid "Note" msgstr "Notiz" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Weiß" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Bauer" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Elefant" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Kanone" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "degradieren" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Leeres Feld" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Brett leeren" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Schwarz" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Datei" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Bearbeiten" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Anzeigen" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Modus" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Aktion" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Schachprogramm" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Optionen" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Hilfe" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "Verzeichnisse:" #: dialogs.c:2365 msgid "Files:" msgstr "Dateien:" #: dialogs.c:2366 msgid "by name" msgstr "nach Namen" #: dialogs.c:2367 msgid "by type" msgstr "nach Typ" #: dialogs.c:2370 msgid "Filename:" msgstr "Dateinname:" #: dialogs.c:2371 msgid "New directory" msgstr "Neues Verzeichnis" #: dialogs.c:2372 msgid "File type:" msgstr "Dateientyp:" #: dialogs.c:2447 msgid "Contents of" msgstr "Inhalt von" #: dialogs.c:2473 #, fuzzy msgid " next page" msgstr "nächste Seite" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "VERSUCHE EINEN ANDEREN NAMEN" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, c-format msgid "Engine Output" msgstr "Schachprogrammausgabe" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "Lese Partiedatei (%d)" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "%s: cd zu CHESSDIR funktioniert nicht: " #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "Fehler beim Öffnen der Datei '%s'\n" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" "Kompiliere erneut mit größeren BOARD_RANKS oder BOARD_FILES, um diese Größe " "zu unterstützen" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "%s: falsche boardSize Syntax %s\n" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "%s: unbekannter Name fuer boardSize %s\n" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "%s: nicht genügend Farben vorhanden; versuche monochrom Modus\n" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "Nicht in der Lage Schriftsatz für %s zu generieren.\n" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "%s: keine Schriften stimmen mit Muster %s überein\n" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "Kann temporäre Datei nicht öffnen" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "Fehler beim Öffnen der Datei" #: menus.c:134 msgid "Load game file name?" msgstr "Lade Partiedatei mit Namen?" #: menus.c:179 msgid "Load position file name?" msgstr "Lade Stellungsdatei mit Namen?" #: menus.c:185 msgid "Save game file name?" msgstr "Speichere Partiedatei mit Namen?" #: menus.c:194 msgid "Save position file name?" msgstr "Speicher Stellungsdatei mit Namen?" #: menus.c:358 msgid " (with Zippy code)" msgstr " (mit Zippy)" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Über XBoard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Neue Shuffle-Partie" #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Neue Shuffle Partie… " #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Neue Variante" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Partie laden…" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "Nächste Stellung laden" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "Nächste Stellung laden" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "Vorherige Stellung laden" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Partie speichern…" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "Speichere Stellung " #: menus.c:593 msgid "Save Games as Book" msgstr "Partien speichern als Buch:" #: menus.c:595 msgid "Mail Move" msgstr "Verschicke Zug" #: menus.c:596 msgid "Reload CMail Message" msgstr "CMail Nachricht erneut laden" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Partieliste kopieren" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Stellung kopieren Strg+Umschalt+C" #: menus.c:605 msgid "Copy Game List" msgstr "Partieliste kopieren" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Spiel zurücksetzen" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Nächste Stellung laden" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Editiere Kommentar" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "Nächste Stellung laden" #: menus.c:612 msgid "Edit Tags" msgstr "Markierung bearbeiten" #: menus.c:613 msgid "Edit Comment" msgstr "Kommentar bearbeiten" #: menus.c:614 msgid "Edit Book" msgstr "Editiere Buch" #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Annotieren" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Partie abbrechen End" #: menus.c:620 msgid "Backward" msgstr "Zurück" #: menus.c:621 msgid "Forward" msgstr "Vorwärts" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Schwarz am Zug" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "Vorwärts zum Ende Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Brett automatisch drehen" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Zugliste" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Auswertungsgraph" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Partieliste…" #: menus.c:637 msgid "Comments" msgstr "Kommentare" #: menus.c:638 msgid "ICS Input Box" msgstr "ICS Eingabefeld" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Brett…" #: menus.c:642 msgid "Game List Tags..." msgstr "Partie Markierungen…" #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Schachprogramm weiß Strg+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Schachprogramm Partie" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "Zwei Schachprogramme Strg+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Analyse-Modus Strg+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Spiel analysieren Strg+G" #: menus.c:654 msgid "Training" msgstr "Training" #: menus.c:655 msgid "ICS Client" msgstr "ICS-client" #: menus.c:657 msgid "Machine Match" msgstr "Schachprogramm Partie" #: menus.c:658 msgid "Pause" msgstr "Pause" #: menus.c:663 msgid "Accept" msgstr "Annehmen" #: menus.c:664 msgid "Decline" msgstr "Ablehnen" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Zeit reklamieren F5" #: menus.c:668 #, fuzzy msgid "Draw" msgstr "Remi:" #: menus.c:669 msgid "Adjourn" msgstr "Aussetzen" #: menus.c:670 msgid "Abort" msgstr "Abbrechen" #: menus.c:671 msgid "Resign" msgstr "Aufgeben" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Beobachtung beenden F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Untersuchen beenden F11" #: menus.c:675 msgid "Upload to Examine" msgstr "Hochladen zum Untersuchen" #: menus.c:677 msgid "Adjudicate to White" msgstr "Gewinn Weiß zuerkennen" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Gewinn Schwartz zuerkennnen" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Remi zuerkennen" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "Neues erstes Schachprogramm laden…" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "Neues zweites Schachprogramm laden…" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Schachprogram #1 Einstellungen…" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Schachprogram #2 Einstellungen…" #: menus.c:690 msgid "Hint" msgstr "Hinweiß" #: menus.c:691 msgid "Book" msgstr "Buch" #: menus.c:693 #, fuzzy msgid "Move Now" msgstr "Klang für Zug" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Zug zurücknehmen Strg+X" #: menus.c:700 msgid "General ..." msgstr "Allgemein…" #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Zeitkontrolle" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Allemein Schachprogramme… Alt+Umschalt+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Zuerkennung… Alt+Umschalt+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS…" #: menus.c:706 msgid "Match ..." msgstr "Partie…" #: menus.c:707 msgid "Load Game ..." msgstr "Partie laden…" #: menus.c:708 msgid "Save Game ..." msgstr "Partie speichern…" #: menus.c:709 msgid "Game List ..." msgstr "Partieliste…" #: menus.c:710 msgid "Sounds ..." msgstr "Klang ..." #: menus.c:713 msgid "Always Queen" msgstr "Immer Königin" #: menus.c:719 msgid "Flash Moves" msgstr "Züge aufblitzen lassen" #: menus.c:721 msgid "Highlight Dragging" msgstr "Züge hervorheben" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Mit Pfeil hervorheben" #: menus.c:725 msgid "Move Sound" msgstr "Klang für Zug" #: menus.c:727 msgid "Periodic Updates" msgstr "Periodische Updates" #: menus.c:729 msgid "Popup Exit Message" msgstr "Dialogfenster für Nachricht beim Beenden" #: menus.c:731 msgid "Show Coords" msgstr "Zeige Koordinaten" #: menus.c:732 msgid "Hide Thinking" msgstr "" #: menus.c:736 msgid "Save Settings Now" msgstr "Einstellungen jetzt speichern" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Einstellung am Ende speichern" #: menus.c:742 msgid "Info XBoard" msgstr "Info XBoard" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "Man XBoard F1" #: menus.c:745 msgid "XBoard Home Page" msgstr "XBoard Homepage" #: menus.c:746 msgid "On-line User Guide" msgstr "Online Benutzerhandbuch" #: menus.c:747 msgid "Development News" msgstr "Entwicklungsnachrichten" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "E-mail Fehlerreport" #: nengineoutput.c:78 nengineoutput.c:85 msgid "engine name" msgstr "Schachprogramm" #: nengineoutput.c:80 nengineoutput.c:87 msgid "move" msgstr "Zug" #: nengineoutput.c:153 msgid "Engine output" msgstr "Schachprogrammausgabe" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Auswertungsgraph" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 msgid "find position" msgstr "Suche Stellung" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "Schwellenwert" #: ngamelist.c:90 msgid "tags" msgstr "" #: ngamelist.c:91 msgid "next" msgstr "nächste" #: ngamelist.c:92 msgid "close" msgstr "schließen" #: ngamelist.c:116 msgid "No game selected" msgstr "Keine Partie selektiert" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Kann nicht weiter vorwärts gehen" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "Durchsuche Spiele (%d)" #: ngamelist.c:211 msgid "previous page" msgstr "Vorheriges Spiel" #: ngamelist.c:214 msgid "next page" msgstr "nächste Seite" #: ngamelist.c:217 msgid "no games matched your request" msgstr "Keine Spiele stimmten mit ihrer Anfrage überein" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "%s - %d/%d Spiele (%d-%d-%d)" #: ngamelist.c:274 msgid "There is no game list" msgstr "Partieliste existiert nicht" #: nhistory.c:109 msgid "Move list" msgstr "Zugliste" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "%s: nicht erkannte Farbe %s\n" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "%s: Kann Vordergrundfarbe in »%s« nicht parsen\n" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "%s: kann Farbname nicht parsen; deaktiere Farben\n" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "FEHLER: unbekannter Benutzer %s (im Pfad %s)\n" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "Socketunterstützung ist nicht konfiguriert" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "Interes rcmd ist in UNIX nicht implementiert" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "%s: XPM-Ordner nicht erreichbar %s\n" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "Mögliche »%s« Größen:\n" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "Fehler: Keine »%s« Datein!\n" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" "Warnung: Keine DIR-Struktur auf dem Rechner gefunden --\n" " wählen einer automatischen Größe für XPM/XIM Figuren " "fehlgeschlagen.\n" " Bitte schicken Sie einen Bug-report and %s.\n" " Geben Sie dabei den Rechnertyp und das Betriebsystem an.\n" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "weißes Pixel = 0x%lx, schwarzes Pixel = 0x%lx\n" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "Fehler %d beim Laden von Icon\n" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "durchsuche" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "OK" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "abbrechen" #~ msgid "recognized '%s' (%d) as variant %s\n" #~ msgstr "erkenne '%s' (%d) als Variante %s\n" #~ msgid "Ratings from header: W %d, B %d\n" #~ msgstr "Spielstärke vom Dateikopf: W %d, S %d\n" #~ msgid "Parsing board: %s\n" #~ msgstr "Parse Schachbrett: %s\n" #~ msgid "Found unexpected active ICS engine analyze \n" #~ msgstr "Habe unerwartete aktive ICS Analyse vom Schachprogramm gefunden\n" #~ msgid "ICS engine analyze starting... \n" #~ msgstr "Schachprogramm started ICS Analyse…\n" #~ msgid "" #~ "resolved %s at pixel size %d\n" #~ " to %s\n" #~ msgstr "" #~ "Für %s mit Pixelgröße %d\n" #~ " verwende %s\n" #~ msgid "New Game Ctrl+N" #~ msgstr "Neue Partie Strg+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Neue Variante… Alt+Umschalt+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Partie Laden Strg+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Stellung laden Strg+Umschalt+O" #~ msgid "Next Position Shift+PgDn" #~ msgstr "Nächste Stellung Umschalt+Pgdn" #~ msgid "Prev Position Shift+PgUp" #~ msgstr "Vorherige Stellung Umschalt+PgUp" #~ msgid "Save Game Ctrl+S" #~ msgstr "Partie speichern Strg+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Stellung speichern Strg+Shift+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Beenden Strg+Q" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Partie kopieren Strg+C" #~ msgid "Paste Game Ctrl+V" #~ msgstr "Partie einfügen Strg+V" #~ msgid "Paste Position Ctrl+Shift+V" #~ msgstr "Stellung einfügen Strg+Umschalt+V" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Partie bearbeiten Strg+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Stellung bearbeiten Strg+Umschalt+E" #~ msgid "Revert Home" #~ msgstr "Zurücksetzen Home" #~ msgid "Backward Alt+Left" #~ msgstr "Zurück Alt+links" #~ msgid "Forward Alt+Right" #~ msgstr "Vorwärts Alt+rechts" #~ msgid "Back to Start Alt+Home" #~ msgstr "Zurück zum Anfang Alt+Home" #~ msgid "Flip View F2" #~ msgstr "Brett drehen F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Schachprogramm-Ausgabe Alt+Umschalt+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Zugliste Alt+Umschalt+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "Auswertungsgraph Alt+Umschalt+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Partieliste Alt+Umschalt+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Schachprogramm schwarz Strg+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Partie editieren Strg+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Stellung editieren Strg+Umschalt+E" #~ msgid "Pause Pause" #~ msgstr "Pause Pause" #~ msgid "Accept F3" #~ msgstr "Annehmen F3" #~ msgid "Decline F4" #~ msgstr "Ablehnen F4" #~ msgid "Rematch F12" #~ msgstr "Revanche F12" #~ msgid "Draw F6" #~ msgstr "Remi F6" #~ msgid "Adjourn F7" #~ msgstr "Aussetzen F7" #~ msgid "Abort F8" #~ msgstr "Abbrechen F8" #~ msgid "Resign F9" #~ msgstr "Aufgeben F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Jetzt ziehen Strg+M" #~ msgid "Time Control ... Alt+Shift+T" #~ msgstr "Zeitkontrolle… Alt+Umschalt+T" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Immer Königin Strg+Umschalt+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Züge animieren Strg+Umschalt+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Automatische Zeitreklamation Strg+Umschalt+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Nächsten Zug abwägen Strg+Umschalt+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Blende Zugsuche aus Strg+Umschalt+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Gültigkeit testen Strg+Umschalt+L" #~ msgid "Browse" #~ msgstr "Durchsuchen" #~ msgid "Filter on extensions:" #~ msgstr "filtere nach Dateinendung:" #~ msgid "Pathname:" #~ msgstr "Pfadname:" #~ msgid "XsraSelFile: can't get current directory" #~ msgstr "XsraSelFile: kann aktuelles Verzeichnis nicht laden" #~ msgid "%s: titleWidget geometry error %d %d %d %d %d\n" #~ msgstr "%s: titleWidget Geometriefehler %d %d %d %d %d\n" #~ msgid "Error expanding path name \"%s\"\n" #~ msgstr "Fehler beim Expandieren des Pfadnamens \"%s\"\n" #~ msgid "" #~ "XBoard square size (hint): %d\n" #~ "%s fulldir:%s:\n" #~ msgstr "" #~ "XBoard Feldgröße (Hinweis): %d\n" #~ "%s voller Pfad: %s\n" #~ msgid "Closest %s size: %d\n" #~ msgstr "Nächste %s Größe: %d\n" #~ msgid "%s: messageWidget geometry error %d %d %d %d %d\n" #~ msgstr "%s: messageWidget Geometriefehler %d %d %d %d %d\n" #~ msgid "%s: error loading XIM!\n" #~ msgstr "%s: Fehler beim Laden von XIM!\n" #~ msgid "XIM pieces cannot be used in monochrome mode" #~ msgstr "XIM Figuren können nicht im Monochrom-modus benutzt werden" #~ msgid "" #~ "\n" #~ "Loading XIMs...\n" #~ msgstr "" #~ "\n" #~ "Lade XIMs…\n" #~ msgid "(File:%s:) " #~ msgstr "(Datei:%s) " #~ msgid "light square " #~ msgstr "weisses Feld " #~ msgid "dark square " #~ msgstr "schwarze Feld " #~ msgid "Done.\n" #~ msgstr "Fertig.\n" #~ msgid "XPM pieces cannot be used in monochrome mode" #~ msgstr "XPM Figuren können nicht im Monochrom-modus benutzt werden" #~ msgid "No builtin XPM pieces of size %d\n" #~ msgstr "Keine XPM-Figuren der Größe %d vorhanden\n" #~ msgid "Error %d loading XPM image \"%s\"\n" #~ msgstr "Fehler %d beim Laden von XPM-Bild »%s«\n" #~ msgid "" #~ "\n" #~ "Loading XPMs...\n" #~ msgstr "" #~ "\n" #~ "Lade XPMs…\n" #~ msgid "(Replace by File:%s:) " #~ msgstr "(Ersetze mit Datei:%s:) " #~ msgid "Error %d loading XPM file \"%s\"\n" #~ msgstr "Fehler %d beim Laden der XPM-Datei »%s«\n" #~ msgid "Can't open bitmap file %s" #~ msgstr "Bitmap file %s kann nicht geöffnet werden" #~ msgid "Invalid bitmap in file %s" #~ msgstr "Ungültiges Bitmap in Datei %s" #~ msgid "Ran out of memory reading bitmap file %s" #~ msgstr "Nicht genug Speicher, um Bitmapdatei %s zu laden" #~ msgid "Unknown XReadBitmapFile error %d on file %s" #~ msgstr "Unbekannter XReadBitmapFile-Fehler %d bei Datei %s" #~ msgid "%s: %s...using built-in\n" #~ msgstr "%s: %s… benutze integrierte\n" #~ msgid "%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n" #~ msgstr "%s: Bitmap %s ist %dx%d und nicht %dx%d... benutze integrierte\n" #~ msgid "----" #~ msgstr "----" #~ msgid "Drop" #~ msgstr "Absetzen" #~ msgid "could not open: " #~ msgstr "Konnte nicht öffnen: " #~ msgid "Can't open file" #~ msgstr "Datei kann nicht geöffnet werden" #~ msgid "Promotion" #~ msgstr "Umwandlung" #~ msgid "Promote to what?" #~ msgstr "In Was soll umgewandelt werden?" #~ msgid "ok" #~ msgstr "Ok" #~ msgid "AskQuestionProc needed 4 parameters, got %d\n" #~ msgstr "AskQuestionProc braucht 4 Parameter, habe %d erhlaten\n" #~ msgid "enter" #~ msgstr "Eingabe" #~ msgid "This feature is experimental" #~ msgstr "Dieses Feature is experimentell" #~ msgid "Filter:" #~ msgstr "Filter:" #~ msgid "filtertext" #~ msgstr "Filtertext" #~ msgid "apply" #~ msgstr "anwenden" #~ msgid "load" #~ msgstr "lade" #~ msgid "prev" #~ msgstr "vorh." #~ msgid "AnimateMove: piece %d hops from %d,%d to %d,%d \n" #~ msgstr "Animiere Züge: Figur %d hüpft von %d,%d zu %d,%d\n" #~ msgid "AnimateMove: piece %d slides from %d,%d to %d,%d \n" #~ msgstr "Animiere Züge: Figur %d gleitet von %d,%d zu %d,%d\n" #~ msgid "White " #~ msgstr "Weiss" #~ msgid "Black " #~ msgstr "Schwarz" #~ msgid "Close" #~ msgstr "Schließen" #~ msgid "off" #~ msgstr "aus" #~ msgid "minutes for each" #~ msgstr "Minuten pro" #~ msgid " " #~ msgstr " " #~ msgid "moves " #~ msgstr "Züge " #~ msgid "You can only start a match from the initial position." #~ msgstr "Sie können eine Partie nur von der Startaufstellunge starten." #~ msgid "Load Next Game" #~ msgstr "Nächstes Spiel laden" #~ msgid "Reload Same Game" #~ msgstr "Spiel erneut laden" #~ msgid "Reload Same Position" #~ msgstr "Stellung erneut laden" #~ msgid "Exit" #~ msgstr "Beenden" #~ msgid "Step" #~ msgstr "Züge" #~ msgid "P" #~ msgstr "P" #~ msgid "Analysis" #~ msgstr "Analyse" xboard-4.7.3/po/Rules-quot0000644000175000001440000000340012262415351012340 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header xboard-4.7.3/po/xboard.pot0000644000175000001440000012544012262562300012346 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard 4.7.3\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "" #: backend.c:1375 msgid "Starting chess program" msgstr "" #: backend.c:1398 msgid "Bad game file" msgstr "" #: backend.c:1405 msgid "Bad position file" msgstr "" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "" #: backend.c:4167 msgid "Error reading from ICS" msgstr "" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "" #: backend.c:6552 msgid "Displayed position is not current" msgstr "" #: backend.c:6790 msgid "Illegal move" msgstr "" #: backend.c:6857 msgid "End of game" msgstr "" #: backend.c:6860 msgid "Incorrect move" msgstr "" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "" #: backend.c:9296 msgid "Gap in move list" msgstr "" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 msgid "Bad tournament file" msgstr "" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "" #: backend.c:11594 msgid "No more games in this message" msgstr "" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "" #: backend.c:12077 msgid "Game number out of range" msgstr "" #: backend.c:12088 msgid "Can't seek on game file" msgstr "" #: backend.c:12146 msgid "Game not found in file" msgstr "" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "" #: backend.c:12426 msgid "No moves in game" msgstr "" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "" #: backend.c:12632 msgid "Black to play" msgstr "" #: backend.c:12635 msgid "White to play" msgstr "" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "" #: backend.c:13631 msgid "Edit comment" msgstr "" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "" #: backend.c:13877 msgid "It is not Black's turn" msgstr "" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "" #: backend.c:14155 msgid "Training mode on" msgstr "" #: backend.c:14158 msgid "Already at end of game" msgstr "" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "" #: backend.c:15109 msgid "You are not examining a game" msgstr "" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "" #: backend.c:15237 msgid "No hint available" msgstr "" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "" #: backend.c:16352 msgid "Could not parse move" msgstr "" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "" #: backend.c:16479 msgid "White's flag fell" msgstr "" #: backend.c:16501 msgid "Black's flag fell" msgstr "" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 msgid "Could not create book" msgstr "" #: dialogs.c:259 msgid "Tournament file: " msgstr "" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "" #: dialogs.c:382 msgid "Scores in Move List" msgstr "" #: dialogs.c:383 msgid "Show Coordinates" msgstr "" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "" #: dialogs.c:400 msgid "General Options" msgstr "" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "" #: dialogs.c:540 msgid "Detect all Mates" msgstr "" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "" #: dialogs.c:556 msgid "Adjudicate non-ICS Games" msgstr "" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "" #: dialogs.c:570 msgid "Auto-Comment" msgstr "" #: dialogs.c:571 msgid "Auto-Observe" msgstr "" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "" #: dialogs.c:576 msgid "Get Move List" msgstr "" #: dialogs.c:577 msgid "Quiet Play" msgstr "" #: dialogs.c:578 msgid "Seek Graph" msgstr "" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "" #: dialogs.c:587 msgid "Alarm" msgstr "" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 msgid "No games before year:" msgstr "" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "" #: dialogs.c:681 msgid "No Sound" msgstr "" #: dialogs.c:682 msgid "Default Beep" msgstr "" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "" #: dialogs.c:790 msgid "Light Square Color:" msgstr "" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "" #: dialogs.c:802 msgid "Highlight Color:" msgstr "" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 msgid "Edit book" msgstr "" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "" #: dialogs.c:1372 msgid "randomize" msgstr "" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "" #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 msgid "Time-Odds factors:" msgstr "" #: dialogs.c:1416 msgid "Engine #1" msgstr "" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "" #: dialogs.c:1574 msgid "Cancel" msgstr "" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "" #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "" #: dialogs.c:1744 msgid "down" msgstr "" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 msgid "Game-list options" msgstr "" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "" #: dialogs.c:1906 msgid "Fatal Error" msgstr "" #: dialogs.c:1906 msgid "Exiting" msgstr "" #: dialogs.c:1917 msgid "Information" msgstr "" #: dialogs.c:1924 msgid "Note" msgstr "" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 msgid "Files:" msgstr "" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 msgid "Filename:" msgstr "" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 msgid "File type:" msgstr "" #: dialogs.c:2447 msgid "Contents of" msgstr "" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, c-format msgid "Engine Output" msgstr "" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "" #: menus.c:582 msgid "New Game" msgstr "" #: menus.c:583 msgid "New Shuffle Game ..." msgstr "" #: menus.c:584 msgid "New Variant ..." msgstr "" #: menus.c:586 msgid "Load Game" msgstr "" #: menus.c:587 msgid "Load Position" msgstr "" #: menus.c:588 msgid "Next Position" msgstr "" #: menus.c:589 msgid "Prev Position" msgstr "" #: menus.c:591 msgid "Save Game" msgstr "" #: menus.c:592 msgid "Save Position" msgstr "" #: menus.c:593 msgid "Save Games as Book" msgstr "" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 msgid "Copy Game" msgstr "" #: menus.c:604 msgid "Copy Position" msgstr "" #: menus.c:605 msgid "Copy Game List" msgstr "" #: menus.c:607 msgid "Paste Game" msgstr "" #: menus.c:608 msgid "Paste Position" msgstr "" #: menus.c:610 menus.c:652 msgid "Edit Game" msgstr "" #: menus.c:611 menus.c:653 msgid "Edit Position" msgstr "" #: menus.c:612 msgid "Edit Tags" msgstr "" #: menus.c:613 msgid "Edit Comment" msgstr "" #: menus.c:614 msgid "Edit Book" msgstr "" #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "" #: menus.c:618 msgid "Truncate Game" msgstr "" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 msgid "Back to Start" msgstr "" #: menus.c:623 msgid "Forward to End" msgstr "" #: menus.c:628 msgid "Flip View" msgstr "" #: menus.c:631 msgid "Move History" msgstr "" #: menus.c:632 msgid "Evaluation Graph" msgstr "" #: menus.c:633 msgid "Game List" msgstr "" #: menus.c:637 msgid "Comments" msgstr "" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "" #: menus.c:642 msgid "Game List Tags..." msgstr "" #: menus.c:647 msgid "Machine White" msgstr "" #: menus.c:648 msgid "Machine Black" msgstr "" #: menus.c:649 msgid "Two Machines" msgstr "" #: menus.c:650 msgid "Analysis Mode" msgstr "" #: menus.c:651 msgid "Analyze Game" msgstr "" #: menus.c:654 msgid "Training" msgstr "" #: menus.c:655 msgid "ICS Client" msgstr "" #: menus.c:657 msgid "Machine Match" msgstr "" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 msgid "Call Flag" msgstr "" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 msgid "Stop Observing" msgstr "" #: menus.c:674 msgid "Stop Examining" msgstr "" #: menus.c:675 msgid "Upload to Examine" msgstr "" #: menus.c:677 msgid "Adjudicate to White" msgstr "" #: menus.c:678 msgid "Adjudicate to Black" msgstr "" #: menus.c:679 msgid "Adjudicate Draw" msgstr "" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "" #: menus.c:690 msgid "Hint" msgstr "" #: menus.c:691 msgid "Book" msgstr "" #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 msgid "Retract Move" msgstr "" #: menus.c:700 msgid "General ..." msgstr "" #: menus.c:702 msgid "Time Control ..." msgstr "" #: menus.c:703 msgid "Common Engine ..." msgstr "" #: menus.c:704 msgid "Adjudications ..." msgstr "" #: menus.c:705 msgid "ICS ..." msgstr "" #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "" #: menus.c:708 msgid "Save Game ..." msgstr "" #: menus.c:709 msgid "Game List ..." msgstr "" #: menus.c:710 msgid "Sounds ..." msgstr "" #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "" #: menus.c:724 msgid "Highlight With Arrow" msgstr "" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "" #: menus.c:729 msgid "Popup Exit Message" msgstr "" #: menus.c:731 msgid "Show Coords" msgstr "" #: menus.c:732 msgid "Hide Thinking" msgstr "" #: menus.c:736 msgid "Save Settings Now" msgstr "" #: menus.c:737 msgid "Save Settings on Exit" msgstr "" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 msgid "Man XBoard" msgstr "" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 msgid "engine name" msgstr "" #: nengineoutput.c:80 nengineoutput.c:87 msgid "move" msgstr "" #: nengineoutput.c:153 msgid "Engine output" msgstr "" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 msgid "find position" msgstr "" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 msgid "tags" msgstr "" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "" #: ngamelist.c:274 msgid "There is no game list" msgstr "" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "" xboard-4.7.3/po/LINGUAS0000755000175000001440000000027112262562252011373 00000000000000# whitespace separated list of translated languages goes below # note: zh translations are untested; xboard fails to create a fontset for them da de es it ru tr uk vi zh_CN zh_HK zh_TW xboard-4.7.3/po/boldquot.sed0000644000175000001440000000033112262415351012663 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g xboard-4.7.3/po/ru.gmo0000644000175000001440000005330012262562300011470 00000000000000,[< '&:@"Wz)%%( 1 <F U bo   0> P Zhqv$) 0Hdk  %#!8Z mz!$'9O T a kx    &!9&[(!40M~.  $6M/f   +<Ocx   0!  ; Q ` l         !!->!)l!-!)!%!""7" <"F"J"]"w""" """"" #)#:#Z#n############$$-$H$P$i$q$ w$$$ $$$$ $$$ % % "%-%D%[%&s%!%*%(%&&7& <&J&b&&x&&&&"&,&('D'['s''%''''( ( A('b('(%(2( ) ))1)G)d)z))).) )*#*<*V*_*f*k*s*z**!**_*: ,H,e,n,0,,,*, -8"-=[-*-G-P .K].-..&./1/#O/s/////^0H`000?01 #101J1%^111 1 11122.F2*u2O2*2T3Gp3 3<344+4,B46o4.4@4,5<C5A5555 6C'6bk6(656-7G7 ]7(j7"7#7.7 88;48 p8%}8$8$88 9J9R]9L9>9/<:!l:7:::L;-N;@|;; ;;!;F<%`<<<<<1<.=3==q=)> ,> :>H>.f>I>>>R ?_?4}?*?!?!?!@7@N@U@.f@@J@XA;YA(AAAAA%B#7B [B iBvBB!B#B$B7B\6CsCZDbbDKDE %E0EGE]E2qE2E2E2 F=FNF=`F/FFRF&;G,bG,G-GGG H#H 6H+AHLmHHH&H&I55I0kI%III II'J AJ%LJ'rJ2J9JK!K)4K)^K K KK<K:K/4LLdL<LPLH?MM9MM MTNfN%{NNsNN*OVyO1O(P<+P6hPOP4P$Q9+Q;eQ-Q;QJ RUVRTRbS dSoS#S:SOS"0T STTtT&TeT=VUU0U1U V V V)V:V TVaVDpV VfB`Fpd7CvhO?:6t\, N#X2zw"E=^V5< AM.'( o4GY}!D]LjaU; s{3m_n~ Sbc WeHPI>x1+ulQJ*)-k[y|/&@qir%R$T9g8Z0K%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngineEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFRCFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveInformationIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphSeirawanShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timeatomicbad searchTime option %sbad timeControl option %sbughousecanceldownfactorylosersmakruknormalprotocol version %d not supportedupProject-Id-Version: GNU xboard master-20110507 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s не поддерживает режим анализаО программе XBoardИграПрисудить ничьюНичья в технич. окончанияхПрисудить победу чернымПрисудить победу белымЗвонокСыграны все ходы данной партииНеоднозначный ход с сервера ICS: "%s"Неоднозначный ход: %d.%s%sРежим анализа не совместим с режимом ICSДля анализа необходима шахматная программаРежим анализа: не указан файл для анализаАнимация перетаскиванияАнимация ходовЗаписать и вернутьсяАрхиепископПроверять времяАвторазворот доскиКомментарииСледить за игройРаскрывать доскуАвтообновлениеСледить в фонеПозиция в буфере обмена не соответствует формату FENНеправильная позиция формата FEN в файлеНеправильный формат файлаНеправильный формат файла позицииСлонЧерныеЧерные фигурыХод черныхУ черных упал флажокНевидимые фигурыНастройки доскиДоска...Книга...Глубина книги:Варьирование:У обоих игроков время вышлоДостигнуто начало спискаДостигнут конец спискаНе подключено ни одной шахматной программыНе могу открыть файл "%s"Поиск в файлах записей партий не предусмотренПоиск в файлах позиций не предусмотренПушкаНе удалось создать список партийКанцлерОчистить доскуКомментарииОбщие настройки движковСервер ICS разорвал соединениеКопировать список партийНе могу установить связь с %s, порт %sНе могу открыть COM-порт %sНевозможно интерпретировать ходСтранный ход "%s" получен с сервера ICSЧерные поляПростой сигналРазжаловатьОпределять матПозиция не отвечает положению в игреПоказанная позиция не соответствует положению в игреПрисудить ничью послеНичья при нехватке материалаДвойная доскаКеш ЭБД (МБ):ПравкаПравить комментарий...Править описание...Правка комментарияПравка комментария к %d.%s%sСлон (стар.)Пустое полеСыгран последний записанный ходДвижокСвоя книга у движка 1Настройки движка 1...Настройки движка 2...Вывод движкаОшибкаОшибка чтения списка ходов: лишняя доскаОшибка чтения списка ходов: вложенные спискиОшибка чтения списка ходов: два заголовкаОшибка чтения с выхода движка %s (%s)Ошибка чтения с сервера ICSОшибка клавиатурыОшибка записи на вход движка %sОшибка записи на вход сервера ICSОшибка подключения к шахматной программеОшибка записи на дисплейОшибка: движок %s (%s) завершил работуОценка позицииВыходФишера (960)Ошибка запуска cmailНе удалось запустить %s движок %s на %s: %s Неисправимая ошибкаФайл1-й ход черных1-й ход белыхСписок партий...Содержание списка партий...Партия не найдена в файлеНомер партии - вне диапазонаСлишком длинная партия: увеличьте значение MAX_MOVES и перекомпилируйте программуПропуск в записи ходовОбщие...Общие...Общие настройкиЗапрашивать запись ходовПолучен символ конца файла с клавиатурыРазмер хеша (МБ):СправкаСкрывать вывод движка в игре против человекаВыделенное полеВыделять при перетаскиванииВыделять последний ходВыделять стрелкойВыделять стрелкойПодсказка...Подсказка: %sICS...Клиент ICSНастройки соединения с ICSНеправильный ходНеправильный ход "%s" (не принят движком %s)Неправильный ход "%s" пытается выполнить движок %sНеправильный ход с сервера ICS: "%s"Неправильный ход: %d.%s%sНеверный ходИнформацияХод черныхХод белыхСейчас не ход черныхСейчас не ход белыхВаш ходКорольКоньБелые поляЗагрузка... Alt+Shift+LПараметры загрузкиНачать матч движковКомпьютер согласился на ничьюРежим "Компьютер черными" не совместим с режимом ICSВ режиме "Компьютер черными" нужна шахматная программа (движок)Режим "Компьютер белыми" не совместим с режимом ICSВ режиме "Компьютер белыми" нужна шахматная программаМатч %s против %s: финальный результат %d-%d-%dMax число CPU:РежимМонохромнаяNPS (Узл./сек.)Путь к ЭБД:Оценка движка 1 - абсолютнаяОценка движка 2 - абсолютнаяНовая в смешанные шахматы...Новая в смешанные шахматы...ВариантыБез звукаНет загруженных шахматных партийВыберите партию из спискаПодсказок нетВ этом сообщении больше нет шахматных партийНет записанных ходовНет загруженных позицийНет неоконченных партийНет неоконченных партий ПримечаниеOKХод одним щелчкомНастройкиПешкаПериодически обновлятьПериодически обновлять (в режиме анализа)ПослушатьДумать всегдаСообщение при выходеСообщение при выходеСообщать о неправильном ходеПозиция не найдена в файлеПредварительный ходПредварит. ходПревратитьФерзьСпокойная играМожно отсылать почту ЛадьяСохранение... Alt+Shift+SНастройки сохраненияСохранить настройки сейчасСохранять настройки при выходеГрафик поискаСейраванаПоказывать координатыПоказывать координатыЗвукиЗвуки...Номер позиции:Запускается шахматная программаОшибка при запуске программы '%s'Все еще ваш ход в партии %s Все еще ваша очередь ходить в этой партии Все еще ваш ход во всех %d партиях Все еще ваша очередь ходить в обеих партиях Все еще ваша очередь ходить в партиях %s ОписаниеПроверять правильность хода CS+LЭто поле занятоНет списка партийК данному ходу никаких предложений не сделаноТренировкаТренировка оконченаТренировкаДля тренировки необходимо загрузить шахматную партию из файлаРежим "Два движка" не совместим с режимом ICSВ режиме "Два движка" нужна шахматная программаinitialMode: неизвестный режим %sНеизвестный вариант %sЗагрузить на сервер для изученияВариант %s не поддерживается %sВариант %s поддерживается только в режиме ICSПроверять требования движкаВидПодождите своей очереди ходитьЖдем первую шахматную программуОжидание ответного хода Ждем вторую шахматную программуПредупреждение: вы все еще изучаете игруПредупреждение: вы все еще наблюдаете за игройПредупреждение: вы все еще продолжаете игратьПредупреждение: второй движок (%s) не поддерживает это!БелыеХод белыхУ белых упал флажокПобеда/поражение при перевесе вНе включен режим изучения шахматных партийВы играете чернымиВы играете белымиНельзя вернуться к началу пока выбрана "Пауза"Вы еще не сделали ходВы должны сделать свой ход прежде, чем предлагать ничьюУ вашего соперника еще есть времяатомныеsearchTime: неверный параметр %stimeControl: неверный параметр %sшведкиОтменаВнизСтандартподдавки (мат)макрукобычныеверсия протокола %d не поддерживаетсяВверхxboard-4.7.3/po/uk.gmo0000644000175000001440000016673712262562300011504 00000000000000m,)606$777$97'^777/7788=8&R8"y88848) 9395R9#99799: : ::: :%:4:M:T:[:w::'::::: ;;#;7*;Fb;*;;&;<-< 1<"><a< y<)<%< <%< ==*=I= R= ]=g= v===== = =8=)>:>R>b>y> {> >>>>>? ??3?E?Y?`?f? y?? ? ?0???? @$@*4@_@ o@ z@@@)@@@ A"A>AEALAcAuA}AA A AA AAA A AB.B LBZBvBBBBB B BB B%C,CBC^CsC!CCCCCCC C.D5D;DBDSDdD iDvD#DD!DVDOETE$nEE E'EE$EF F F "F ,F :F DF NF[FsF!|FF FF FF FFG-G ?G`GwGG GGG GGG&G!%H&GH(nHHH!HHI I09IjIIIIIIIIIIJ"-J"PJ.sJ JJ JJ JJJJXK8gK KKK@K &L&0LWL_LnLpL L LL(LLLM//M_MqMM MM MMM MMMN)N .Nm Dm Nm Xm fm&rm m mmmmmm m mmn n n *n!8n Zn dn1qnnn nnnn n nnn)n o&o5oPodpq=qr4r8Jrr7rr#s0s]#t&t[tSu9XuGuvuKQvHvcv-Jw-xww-x=x?xBxDxGx Zxhx.~xxx0xx y\'yEy,y*y"z:z(Qzzz\zzep{ {7{D/|t|x|N|*|}M*}Ix}}J}++~W~Fs~~~~4~44O'2"5#ǀC%/(U~*9 B34Bh+$ׂ/,,,Y #(҃ Z( *2DŽ\qW(Ʌ#*TAJo+QM}4ˇ<=P>_%Ɉ- ++: f t#Pz1@̊5 C V0w6 ߋ(!-IO/5Ɍ+N+9zȍ)ˍ6,?7Y# ̎&#65Yl2Ə82 ֐2F [iZ%ڑM NYs#Ӓ%0-^TgP 2-` t +"۔5"-PkHc(j]`Un?%Nei?f^/řl0b $$Ś$ B ],j-5śO@KW 6"Y p!|}|%H >i(WF Ƞ9ˠ#4OX^3B;~&4&[l#(ͣK֣"&8/_13ФG L3m*9̥9@QfЦh uD8^J(@ EL= 2"jUԪ "'0 X fs |+8ƫ__ }4<Ӭ<%M.s=E.&Ui VȮyįf>yd&Jȱ#yCmO+C{v 6ATljҴ=$]8,,")%Lrö3)8ϷP4Y1۸^9V:?˹+ ,7-dA)Ժ+ +9Se Uƻ?#\Z2ۼ0?6R ɽ Q ^ i'tH :8Y**C;?O{W2#V:r/-! -W@ %Cz:=+ &2A]p) &#4[XE0-)^,@K.b709A4v#/''A7[ .+ 0)<%f<9BW(u //,@)m,)?<D2-N0d2& 50+H$t)fJ 7(R%{ K0#2TEH^Jb0/+(&TH{%,:1Vlh,$4Z&Hd%@Yf`S!BuGSTk; aH2sQ!Z|&+&!52W MRWkKN;;2\nq=A6P 340BRevO6 L'Y %F9 !EW*h!#Q+>1Z  ! & 1G<6)M:jr z/HB4uOC`_s@>82VQ5M3 <(1.iGqRo8X , ?'?"Z`!M6% }d#` CGIp@T,8w]|*J1DaEk"/W]nPQWY1y@\C0h A StL/)?xz E_+[>Uck6Wj|p:'UT&A+qdbaS% }vtye\qf} SGm0&K_N97Jr|F.P =[.wnKuA{EeVl=furNZd$L5IybX{ ^B~"!4l[,$jk* 23^O0LKs*bJ4Y;p'h=Ux>T$5)2<(DDv7F#a~R~H-gc&vfwgP-t9:i^ml!ohmc Xz9VN ogQ-Z;Rins +6OBH;<#\% e7x]IF3{Y( Thresholds for position filtering in game list: options to use in game-viewer mode: tourney with multiple XBoards) (for concurrent playing of a single (with Zippy code)# no engines are installed%s (%d reversible ply)%s (%d reversible plies)%s - %d/%d games (%d-%d-%d)%s does not support analysis%s engine has too many options %s in settings file %s program exits in draw position (%s)%s: Can't access XPM directory %s %s: bad boardSize syntax %s %s: can't cd to CHESSDIR: %s: can't parse color names; disabling colorization %s: can't parse foreground color in `%s' %s: no fonts match pattern %s %s: too few colors available; trying monochrome mode %s: unrecognized boardSize name %s %s: unrecognized color %s (Directory will be derived from engine path when empty)3-checks<<<>>>AbortAbout XBoardAbove WAV FileAbsolute Analysis ScoresAcceptActionAdd this engine to the listAdjournAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate non-ICS GamesAdjudicate to BlackAdjudicate to WhiteAdjudications ...AlarmAlarm Time (msec):Alarm:All games in tourney '%s' are already played or playingAll variants not supported by first engine (currently %s) are disabledAlmost Always Queen (Detour Under-Promote)Already at end of gameAlso match left-right flipped positionAlso match reversed colorsAltAlways QueenAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis ModeAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyze GameAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnimation Speed (high = slow):AnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-Create Logon ScriptAuto-Display CommentAuto-Display TagsAuto-InputBox PopUpAuto-KibitzAuto-ObserveAuto-Play speed of loaded games (0 = instant, -1 = off):Auto-Raise BoardAuto-Refresh Seek GraphAuto-Save GamesAvailable `%s' sizes: BBack to StartBackground Observe while PlayingBackwardBad FEN position in clipboardBad FEN position in fileBad FEN received from engineBad SeekBad game fileBad integer value %sBad position fileBad tournament fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard size ( -1 = default for selected variant):Board...BookBook Depth (moves):Book FaultBook Variety (0) vs. Strength (100):Book file exists! Try again for overwrite.Both flags fellCRC (10x8)Call FlagCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't open temp fileCan't seek on game fileCan't seek on position fileCancelCannonCannot build game listCapablanca (10x8)CaptainCar HornChallenge Text Colors:Challenge:ChancellorChannel #1 Text Colors:Channel 1:Channel:Chat boxChat partner:Clear boardClick clock to clear boardClock adjustment not allowed in auto-flag modeClone TourneyClose ICS engine analyze...Colorize MessagesCommentsCommon Engine ...Common Engine SettingsConnection closed by ICSContents ofCopy GameCopy Game ListCopy PositionCould not connect to host %s, port %sCould not create bookCould not open comm port %sCould not parse moveCould not write on tourney fileCouldn't parse move "%s" from ICSCtrlCymbalDDark Square Color:Dark-Squares Texture File:DeclineDefault BeepDefault Number of Games in Match (or Pairing):DeferDemoteDetect all MatesDevelopment NewsDingDirectories:Directory with Pieces Images:Disable own engine books by defaultDisplayed move is not currentDisplayed position is not currentDisplayed position is not current. Step forward to the correct position and try again.DrawDraw after N Moves Total:Draw if Insufficient Mating MaterialDraw:Drop MenuDual Board for Background-Observed GameEGTB Cache Size (MB):ERROR: Unknown user %s (in path %s) EditEdit BookEdit CommentEdit GameEdit PositionEdit TagsEdit bookEdit commentEdit comment on %d.%s%sElephantElo of strongest player at least:Elo of weakest player at least:Empty squareEnable Variation TreesEnd of gameEngineEngine #1Engine #1 Has Own BookEngine #1 Settings ...Engine #2 / HumanEngine #2 Has Own Book Engine #2 Settings ...Engine Command:Engine Directory:Engine OutputEngine SettingsEngine has no optionsEngine outputErrorError %d loading icon image Error gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyError: No `%s' files! EvalEvaluation GraphEvaluation graphExact position matchExitingFIRST TYPE DIRECTORY NAME HEREFRCFailed to invoke cmailFailed to open fileFailed to open file '%s' Failed to open indirection file %sFailed to parse board string: "%s"Failed to start %s chess program %s on %s: %s Fatal ErrorFileFile type:File with Start Positions:Filename:Files:First Black Move:First White Move:First change an engine by editing the participants list of the Tournament Options dialogFirst you must specify an existing tourney file to cloneFlash MovesFlash Moves (0 = no flashing):Flash Rate (high = fast):Flip Pieces Shogi Style (Colored buttons restore default)Flip ViewForce current variant with this engineForwardForward to EndGGame File with Opening Lines:Game ListGame List ...Game List Tags...Game Number (-1 or -2 = Auto-Increment):Game list not loaded or emptyGame not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGame-list optionsGap in move listGeneralGeneral ...General OptionsGet Move ListGongGot end of file from keyboardGothic (10x8)Great Shatranj (10x8)Hash keys are differentHash-Table Size (MB):HelpHide ThinkingHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sHoldings Size:ICS ...ICS ClientICS Input BoxICS OptionsICS input boxICS text menuIllegal hint move "%s" from %s chess programIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move (rejected by ICS)Illegal move in ICS output: "%s"Illegal move: %d.%s%sInclude Number Tag in tourney PGNIncomplete \ escape in value for %sIncorrect moveIncrement or max (sec/move):Info XBoardInformationInitial time (min):Invalid pairing from pairing engineIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKibitz Text Colors:Kibitz:KingKnightLaserLieutenantLight Square Color:Light-Squares Texture File:Line Gap ( -1 = default for board size):Load GameLoad Game ...Load Game OptionsLoad New 1st Engine ...Load New 2nd Engine ...Load PositionLoad first engineLoad game file name?Load position file name?Load second engineLose:Machine BlackMachine MatchMachine WhiteMachine accepts your draw offerMachine offers a draw Select Action / Draw to agreeMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMail MoveMan XBoardMatch %s vs. %s: final score %d-%d-%dMatch ...Match OptionsMaterial difference (optional stuff balanced)Material range (top board half optional)Maximum Number of CPUs per Engine:Minimum nr consecutive positions:Mismatch of STRIDE in nengineoutput.c Change and recompile!ModeMono ModeMove HistoryMove NowMove SoundMove listMove:Moves per session:Must not use GUI bookN-Move Rule:N-fold Repeats:NPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New GameNew Shuffle GameNew Shuffle Game ...New VariantNew Variant ...New directoryNext PositionNickname (optional):No SoundNo default pieces installed Select your own -pieceImageDirectoryNo engine %s is installedNo engine with the name you gave is installedNo game has been loaded yetNo game selectedNo games before year:No hint availableNo more games in this messageNo moves in gameNo pairing engine specifiedNo position has been loaded yetNo tag selectedNo unfinished gamesNo unfinished games No value provided for argument %sNot enough participantsNoteNumber of Board Files:Number of Board Ranks:Number of tourney cycles (or Swiss rounds):OKOld Save Style (as opposed to PGN)On-line User GuideOne-Click MovingOnly bughouse is not available in viewer modeOpen Chat WindowOpening-Book Filename:OptionsOther Channel Text Colors:Own Games OnlyPGN Event Header:Paste GamePaste PositionPausePause between Match Games (msec):PawnPenaltyPeriodic UpdatesPeriodic Updates (in Analysis Mode)PhonePick new gamePlayPlay Move(s) of Clicked PV (Analysis)Polyglot book not validPolygot Directory:Ponder Next MovePopPopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition Number (-1 or -2 = Auto-Increment):Position not found in filePremovePremove Highlight Color:Premove for BlackPremove for WhitePrev PositionPromotePull pawn backwards to under-promoteQueenQuiet PlayQuit RReading game file (%d)Ready to send mail Recompile to support this BOARD_RANKS or BOARD_FILES!Recompile with larger BOARD_RANKS or BOARD_FILES to support this sizeReload CMail MessageRematchReplace EngineRequest Text Colors:Request:ResignRetract MoveRevertRewind Index after this many Games (0 = never):RookS-Shout Text Colors:S-Shout:Same materialSame material with exactly same Pawn chainSave Final Positions on File:Save GameSave Game ...Save Game OptionsSave Games as BookSave Games on File:Save Out-of-Book Info in PGN Save PositionSave Score/Depth Info in PGNSave Settings NowSave Settings on ExitSave Tourney Games on:Save game file name?Save position file name?Saving gameSaving positionScanning through games (%d)Scores in Move ListSearch mode:Seconds per Move:Seek GraphSeek Text Colors:Seek:SeirawanSelect Engine:Select engine from list:ShiftShout Text Colors:Shout:Show CoordinatesShow CoordsShow Target SquaresShown position is subsetSlapSocket support is not configured inSound OptionsSound Program:Sounds ...Sounds Directory:SpartanStart-position number:Starting %s chess programStarting chess programStartup failure on '%s'Sticky WindowsStill need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s Stop ExaminingStop ObservingSuperchessSwiss tourney finishedSync after cycleSync after roundTRY ANOTHER NAMETagsTell Text Colors:Tell:Test LegalityThat square is occupiedThe cmail message is not loaded. Use Reload CMail Message and make your move again.There is no game listThere is no pending offer on this moveTime ControlTime Control ...Time-Odds factors:Top-Level DialogsTournament file: Tourney participants:Tourney type (0 = round-robin, 1 = gauntlet):TrainingTraining mode offTraining mode onTraining mode requires a game fileTruncate GameTry-Out Sound:Two MachinesTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineType a moveUCIUnable to create font set for %s. Unfinished:Unknown initialMode %sUnknown variant name %sUnknown wild type %dUnrecognized argument %sUnrecognized boolean argument value %sUnusedUpgrade EngineUpload to ExamineUse Board TexturesUse GUI BookUse external piece bitmaps with their own colorsUse nickname in PGN player tags of engine-engine gamesUser FileUser WAV File:Variant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWB protocol v1 (do not wait for engine features)Wait until your turnWait until your turn, or select Move NowWaiting for access to save fileWaiting for first chess programWaiting for other game(s)Waiting for reply from opponent Waiting for second chess programWarlordWarning: No DIR structure found on this system -- Unable to autosize for XPM/XIM pieces. Please report this error to %s. Include system type & operating system in message. Warning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite Piece Color:White to playWhite's flag fellWin / Loss Threshold:Win:Wood ThunkXBoard Home PageYou are not examining a gameYou are not observing a gameYou are playing BlackYou are playing WhiteYou can only change one engine at the timeYou can't revert while pausingYou cannot do this while you are playing or observingYou cannot replace an engine while it is engaged! Terminate its game first.You did not specify the engine executableYou have already mailed a move. Wait until a move arrives from your opponent. To resend the same move, type "cmail -remail -game %s" on the command line.You have edited the game history. Use Reload Same Game and make your move again.You have entered too many moves. Back up to the correct position and try again.You have not made a move yetYou must make your move before offering a drawYou must supply a tournament file, for storing the tourney progressYou restarted an already completed tourney One more cycle will now be added to it Games commence in 10 secYour opponent is not out of timeZoom factor in Evaluation Graph:atomicbad searchTime option %sbad timeControl option %sberolina *browsebughouseby nameby typecancelclassicalclearclosecourier (12x8)crazyhousecylinder *downe-Mail Bug Reportengine namefactoryfailed writing PVfairyfalcon (10x8)find positionfirstfixed maxgive-awaygrand (10x10)incrementalinternal rcmd not implemented for Unixjanus (10x8)knightmatelosersmakrukmovenarrownextnext pageno castleno games matched your requestnormalor specify one below:pick fixedprevious pageprotocol version %d not supportedrandomizesave changessay Internal error; bad moveType %d (%d,%d-%d,%d)secondshatranjshogi (9x9)shufflesuicidetagsthresholdstwo kingsupvs.white pixel = 0x%lx, black pixel = 0x%lx wild castlexiangqi (9x10)your opponent kibitzes: %sProject-Id-Version: GNU xboard-4.7.0.20130224 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: 2013-02-26 22:30+0200 Last-Translator: Yuri Chornoivan Language-Team: Ukrainian Language: uk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 1.5 Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; Порогові значення фільтрування позицій у списку ігор: Параметри режиму перегляду ігор: турніру з декількома XBoard) (для одночасної гри окремого (з кодом Zippy)# не встановлено жодного рушія%s (з можливістю скасування %d ходу)%s (з можливістю скасування %d ходів)%s (з можливістю скасування %d ходів)%s (з можливістю скасування %d ходу)%s — %d з %d ігор (%d-%d-%d)У %s не передбачено аналізуДля рушія %s передбачено занадто багато параметрів %s у файлі параметрів Програма %s завершила роботу у нічийній позиції (%s)%s: не вдалося отримати доступ до каталогу XPM %s %s: помилковий синтаксис boardSize %s %s: не вдалося перейти до каталогу CHESSDIR: %s: не вдалося обробити назви кольорів; розфарбовування вимкнено %s: не вдалося обробити колір тексту у «%s» %s: взірцеві %s не відповідає жоден шрифт %s: занадто мало кольорів; спробуємо монохромний режим %s: невідома назва boardSize %s %s: нерозпізнаний колір %s (Каталог буде визначено на основі шляху до рушія, якщо каталог не вказано)Три шахи<<<>>>ПерерватиПро XBoardФайл WAV вищеАбсолютні оцінки аналізуПрийнятиДіяДодати цей рушій до спискуВідкластиВизначити нічиюВизначати тривіальні нічиї (трикратне повторення)Судити ігри, що не належать до класу ICSВизначити виграш чорнихВизначити виграш білихВизначення…НагадуванняЧас нагадування (у мс):Нагадування:Всі ігри турніру «%s» вже зіграно або вже розпочатоВсі варіанти, які не підтримуються першим рушієм (зараз це %s), вимкненоМайже завжди королева (відхиляти неповні перетворення)Гру вже завершеноШукати у симетричних позиціяхШукати у позиціях зворотних кольорівAltЗавжди королеваНеоднозначний хід у виведених ICS даних: «%s»Неоднозначний хід: %d.%s%sРежим аналізуРобота режиму разом з режимом ICS неможливаУ режимі аналізу потрібен шаховий рушійАналізувати груУ режимі аналізу файла потрібен файл гриАнімація перетягуванняАнімація ходівШвидкість анімації (висока = повільно):АнотуватиАрхієпископАвтопрапорецьАвтоматичне обертання дошкиАвтокоментаріАвтостворення скрипту входуАвтопоказ коментарівАвтопоказ мітокАвтоматичне вікно введенняАвтопорадиАвтоспостереженняШвидкість автогри у завантажених іграх (0 = негайний показ, -1 = вимкнути автогру):Автопідняття дошкиАвтоматичне оновлення графу пошуківАвтозбереження ігорДоступні розміри «%s»: СПовернутися до початкуСпостереження у тлі під час гриНазадПомилкова позиція FEN у буфері обмінуПомилкова позиція FEN у файліОтримано помилкові дані FEN від рушіяПомилкове позиціюванняПомилковий файл гриПомилкове ціле значення %sПомилковий файл позиціїПомилковий файл турніруСлонЧорніКолір фігур чорних:Хід чорнихПрапорець чорних впавНаосліпПараметри дошкиРозмір дошки ( -1 = типовий для вибраного варіанта):Дошка…КнигаГлибина книги (у ходах):Помилка бібліотеки позиційКомпроміс між різноманітністю (0) і силою (100) книги:Файл книги вже існує! Повторіть спробу, щоб перезаписати його.Обидва прапорці впалиРівноправність (10x8)Погодитися з програшемПодальше створення резервних копій неможливеПодальший рух вперед списком неможливийНе можна розпочати матч, якщо не встановлено шахових програмНе вдалося відкрити «%s»Не вдалося відкрити тимчасовий файл данихПошук у файлі гри неможливийПошук у файлі позицій неможливийСкасуватиГарматаНе вдалося побудувати список ігорКапабланка (10x8)КапітанАвтомобільний гудокКольори тексту викликів:Виклик:КанцлерКольори тексту каналу 1:Канал 1:Канал:Панель спілкуванняСпіврозмовник:Спорожнити дошкуКлацніть на годиннику, щоб спорожнити дошкуКоригування годинника у режимі автоматичних прапорців забороненеКлонувати турнірЗавершити процес аналізу рушія ICS…Розфарбовувати повідомленняКоментаріЗагальний рушій…Загальні параметри рушіївЗ’єднання розірвано з боку ICSВмістКопіювати груКопіювати список ігорКопіювати позиціюНе вдалося з’єднатися з вузлом %s, порт %sНе вдалося створити книгуНе вдалося відкрити порт comm %sНе вдалося обробити хідНе вдалося виконати запис до файла турніруНе вдалося обробити хід «%s» з ICSCtrlЦимбалиТКолір темних клітинок:Файл текстур темних клітинок:ВідхилитиТиповий гудокТипова кількість ігор у матчі:Зменшити пріоритетРозжалуватиВиявляти всі матиНовини щодо розробкиДзвінокКаталоги:Каталог з зображеннями фігур:Типово вимкнути власні бібліотеки позицій рушіяПоказаний хід не є поточнимПоказана позиція не є поточноюПоказана позиція не є поточною. Продовжіть гру, щоб виправити позицію і повторіть спробу.НічияНічия після N ходів загалом:Нічия, якщо недостатньо фігур для матуНічиїх:Спадне менюПодвійна дошка для ігор з фоновим спостереженнямРозмір кешу EGTB (у МБ):Помилка: невідомий користувач %s (шлях — %s) ЗміниЗмінити книгуЗмінити коментарРедагувати груРедагувати позиціюЗмінити міткиЗмінити книгуРедагувати коментарЗмінити коментар щодо %d.%s%sСлонРейтинг Ело для сильнішого гравця не нижче за:Рейтинг Ело для слабшого гравця не нижче за:Порожня клітинкаУвімкнути дерево варіантівКінець гриРушійРушій 1Рушій 1 має власну книгуПараметри рушія 1…Рушій 2 / ЛюдинаРушій 2 має власну книгу Параметри рушія 2…Команда рушія:Каталог рушія:Вивід рушіяПараметри рушіяРушієві не передаються жодні параметриВивід рушіяПомилкаПомилка %d під час завантаження зображення піктограми Помилка під час збирання списку ходів: вихід за межі дошкиПомилка під час збирання списку ходів: вкладеністьПомилка під час збирання списку ходів: два заголовкиПомилка під час спроби читання даних з шахової програми %s (%s)Помилка під час спроби читання з ICSПомилка під час читання даних з клавіатуриПомилка під час спроби запису даних до шахової програми %sПомилка під час спроби запису до ICSПомилка під час спроби запису даних до шахової програмиПомилка запису на дисплейПомилка: шахова програма %s (%s) несподівано завершила роботуПомилка: немає файлів «%s»! ОцінкаГраф оцінки позиціїГраф оцінки позиціїТочний збіг позиційВихідСПОЧАТКУ ВКАЖІТЬ ТУТ НАЗВУ КАТАЛОГУФішераНе вдалося викликати cmailНе вдалося відкрити файлНе вдалося відкрити файл «%s» Не вдалося відкрити файл переспрямування %sНе вдалося обробити рядок дошки: "%s"Не вдалося запустити шахову програму %s %s на %s: %s Критична помилкаФайлТип файлів:Файл з початковими позиціями:Назва файла:Файли:Перший хід чорних:Перший хід білих:Спочатку змініть рушій редагуванням списку учасників турніру у діалоговому вікні «Параметри турніру»Спочатку вам слід вказати вже створений файл турніру для клонуванняПідсвічування ходівБлимання під час ходів (0 = без блимання):Частота блимання (висока = швидко):Стиль обміну фігурами сьогі (Кольорові кнопки відновлюють типовий)Повернути дошкуПримусово визначити поточний варіант для рушіяВпередВперед до кінцяЗФайл гри з початковими рядками:Список ігорСписок ігор…Мітки списку ігор…Номер гри (-1 або -2 = автоматичне збільшення):Список гри не завантажено або цей список є порожнімУ файлі немає даних щодо гриНомер гри поза доступним діапазономГра є занадто довгою. Збільшіть значення MAX_MOVES і перезберіть програму.Параметри списку гриПропущено хід у списку ходівЗагальнеЗагальне…Загальні параметриОтримати список ходівГонгОтримано символ кінця файла з клавіатуриГотичні (10x8)Великий шатрандж (10x8)Ключі хешів не збігаютьсяРозмір таблиці хешів (у МБ):ДовідкаПриховувати обмірковуванняПриховувати обмірковування від людиниКолір позначення:Підсвічувати перетягуванняПозначати останній хідПозначити за допомогою стрілкиПозначити за допомогою стрілкиПідказкаПідказка: %sРозмір резерву:ICS…Клієнт ICSПоле введення ICSПараметри ICSПоле введення ICSТекстове меню ICSНекоректна підказка щодо ходу «%s» від шахової програми %sНедозволений хідНедозволений хід «%s» (у реєстрації ходу відмовлено шаховою програмою %s)Некоректний хід «%s» від комп’ютера %sНекоректний хід (заборонено ICS)Некоректний хід у виведених даних ICS: «%s»Недозволений хід: %d.%s%sВключити мітку номера до PGN турніруНеповне екранування \ у значенні для %sНекоректний хідЗбільшення або максимум (сек/хід):Інформація з XBoardІнформаціяПочатковий час (у хвилинах):Рушієм визначення пар повернуто некоректне значення париХід чорнихХід білихЗараз хід білихЗараз хід чорнихВаш хідКольори тексту порад:Порада:КорольКіньЛазерЛейтенантКолір світлих клітинок:Файл текстур світлих клітинок:Проміжок між рядами ( -1 = типовий для розмірів дошки):Завантажити груЗавантажити гру…Параметри завантаження ігорЗавантажити новий перший рушій…Завантажити новий другий рушій…Завантажити позиціюЗавантажити перший рушійНазва файла гри для завантаження?Назва файла позиції для завантаження?Завантажити другий рушійПрограшів:Матч ком’ютерівМатч ком’ютерівКомп’ютер-білимиКом’ютер погодився з вашою пропозицією нічиєїКомп’ютером запропоновано нічию Скористайтеся пунктом меню «Дія->Нічия», щоб погодитисяРобота режиму гри комп’ютером білими разом з режимом ICS неможливаУ режимі гри комп’ютера чорними потрібен шаховий рушійРобота режиму гри комп’ютером білими разом з режимом ICS неможливаУ режимі гри комп’ютера білими потрібен шаховий рушійНадіслати хід поштоюПідручник з XBoardМатч між %s і %s: остаточний рахунок — %d-%d-%dПартія…Параметри партіїВідмінність матеріалів (з додатковим врівноваженням можливостей)Діапазон матеріалу (верхня половина дошки, необов’язковий)Максимальна кількість процесорів на рушій:Мінімальна к-ть послідовних позицій:Невідповідність STRIDE у nengineoutput.c Змініть і зберіть програму знову!РежимМонорежимЖурнал ходівХодити заразЗвук ходуСписок ходівХід:Ходів за сеанс:Не повинен використовувати книгу з графічним інтерфейсомПравило N-го ходу:N-кратне повторення:NPSШлях до бази даних EGTB Налімова:Негативна оцінка рушія 1Негативна оцінка рушія 2Нова граНова випадкова граНова випадкова гра…Новий варіантНовий варіант…Новий каталогНаступна позиціяПсевдонім (необов’язковий):Без звукуТипових зображень фігур не встановлено. Вкажіть власні за допомогою параметра -pieceImageDirectoryНе встановлено жодного рушія %sРушія з вказаною вами назвою не встановленоЩе не завантажено жодної гриНе вибрано гриНе показувати ігри до року:Немає підказкиУ цьому повідомленні більше немає результатів ігорУ записі гри немає жодного ходуНе вказано рушія визначення парЖодної з позицій ще не завантаженоНе вибрано жодної міткиНемає незавершених ігорНемає незавершених ігор Не вказано значення для аргументу %sНедостатньо учасниківНотаткаКількість файлів дошки:Кількість рангів дошки:Кількість кіл турніру (швейцарських раундів):ГараздЗастарілий стиль збереження (на відміну від PGN)Підручник користувача у інтернетіХід у одне клацанняУ режимі перегляду недоступні лише шведські шахиВідкрити вікно спілкуванняНазва файла даних дебютів:ПараметриКольори тексту інших каналів:Лише власні ігриОбробник подій PGN:Вставити груВставити позиціюПаузаПроміжок між іграми у матчі (у мілісекундах):ПішакШтрафПеріодичні оновленняПеріодичні оновлення (у режимі аналізу)ТелефонВиберіть нову груПускГрати ходи натиснутих PV (аналіз)Некоректна бібліотека позиційКаталог бібліотек Polygot:Обдумати наступний хідПлесканняПоказувати повідомлення щодо виходуКонтекстні підказки щодо виходуКонтекстні підказки з помилками щодо ходівНомер позиції (-1 або -2 = автоматичне збільшення):У файлі не знайдено позиціїПопередній хідКолір підсвічування плану ходу:Попередній хід для чорнихПопередній хід для білихПопередня позиціяПідвищитиПотягніть пішака назад, щоб знизити ранг фігуриКоролеваМовчазна граВийти ЧЧитання файла гри (%d)Програма готова до надсилання пошти Повторно зберіть програму з підтримкою цих значень BOARD_RANKS і BOARD_FILES!Для того, щоб скористатися підтримкою цього розміру, слід зібрати програму з більшими значеннями BOARD_RANKS або BOARD_FILESПерезавантажити повідомлення CMailПереграванняЗамінити рушійКольори тексту запитів:Запит:ЗдатисьВідкликати хідПовернутиВідновлювати початковий номер після вказаної кількості ігор (0=ніколи):ТураКолір тексту S-вигуків:S-вигук:Однаковий матеріалОднаковий матеріал з однаковим ланцюжком пішаківЗберігати остаточні позиції до файла:Зберегти груЗберегти гру…Параметри збереження ігорЗберегти ігри як книгуЗберігати ігри до файла:Зберігати сторонні дані до PGN Зберегти позиціюЗберігати дані щодо рейтингу/глибини у PGNЗберегти параметри заразЗберегти параметри при виходіЗберігати ігри турніру до:Назва файли гри для збереження?Назва файла позиції для збереження?Збереження гриЗбереження позиціїСканування списку ігор (%d)Оцінки у списку ходівРежим пошуку:Секунд на хід:Граф викликівКольори тексту під час пошуку:Пошук:СейраванаВиберіть рушій:Виберіть рушій зі списку:ShiftКольори тексту вигуків:Вигук:Показувати координатиПоказати координатиПоказувати клітинки призначенняПоказана позиція є підмножиноюКлацанняПідтримку сокетів ще не налаштованоПараметри звукуПрограма відтворення:Звуки…Каталог звуків:спартанськіНомер початкової позиції:Запуск шахової програми %sЗапуск шахової програмиПомилка запуску на «%s»Липкі вікнаСлід зробити хід у грі %s Слід зробити хід у грі Слід зробити ходити у всіх %d іграх Слід зробити ходити у обох іграх Слід зробити ходи у іграх %s Припинити аналізПрипинити спостереженняСупершахиТурнір за швейцарською системою завершеноСинхронізувати після колаСинхронізувати після раудуСПРОБУЙТЕ ІНШУ НАЗВУМіткиКольори тексту висловлювань:Висловлення:Перевіряти коректністьЦю клітинку зайнятоПовідомлення cmail не завантажено. Скористайтеся пунктом «Перезавантажити повідомлення CMail» і повторіть ваш хід.Немає списку ходів гриУ черзі немає пропозицій щодо цього ходуКерування часомКерування часом…Коефіцієнти виправлення часу:Вікна верхнього рівняФайл турніру: Учасники турніру:Система турніру (0 = кругова, 1 = почергова):ТренуванняРежим тренування вимкненоРежим тренування увімкненоУ режимі тренування потрібен файл гриОбрізати груТестовий звук:Два комп’ютераРобота режиму гри між двома комп’ютерами разом з режимом ICS неможливаРежимом гри між двома комп’ютерами можна скористатися, лише якщо встановлено шаховий рушійВведіть хідUCIНе вдалося створити набір шрифтів для %s. Незавершених:Невідоме значення initialMode %sНевідома назва варіанта %sНевідомий «дикий» тип %dНевідомий аргумент %sНевідоме значення булевого аргументу %sНе використовуєтьсяОновити рушійВивантажити для аналізуВикористовувати текстури дошкиВикористовувати книгу з графічним інтерфейсомЗовнішні растрові зображення фігур з власними кольорамиВикористовувати псевдонім у мітках гравця PGN під час ігор між рушіямиФайл користувачаФайл WAV користувача:Варіант %s не підтримується %sПідтримку варіанта %s передбачено лише у режимі ICSПеревіряти вимоги до результатів рушіяПереглядПротокол WB версії 1 (не чекати на дані щодо можливостей)Очікувати на ваш хідЗачекайте на ваш хід або виберіть пункт «Ходити»Очікування на доступ до можливості збереження файлаОчікування на запуск першої шахової програмиОчікування на результати інших ігорОчікування на відповідь від суперника Очікування на запуск другої шахової програмиПолководецьПопередження: у системі не виявлено структури DIR — автоматична зміна розмірів фігур XPM/XIM неможлива. Будь ласка, повідомте про цю помилку на адресу %s. Включіть до повідомлення дані щодо типу та назви операційної системи. Попередження: ви ще вивчаєте груПопередження: ви ще продовжуєте спостерігати за гроюПопередження: гра ще триваєПопередження: ця можливість не підтримується другим рушієм (%s)!БіліКолір фігур білих:Хід білихПрапорець білих впавПоріг виграшу/програшу:Виграшів:Удар об деревоДомашня сторінка XBoardВи не вивчаєте груВи не спостерігаєте за гроюВи граєте чорнимиВи граєте білимиОдночасно змінювати можна лише один рушійСкасовувати ходи у призупиненій грі не можнаЦя дія неможлива у режимі гри або спостереженняНе можна міняти рушій, який зараз використовується! Спочатку перервіть гру.Вами не вказано виконуваного файла рушіяВи вже надіслали хід поштою. Зачекайте, доки буде отримано хід від вашого суперника. Щоб повторно надіслати той самий хід, віддайте команду "cmail -remail -game %s" у командному рядку.Вами внесено зміни до журналу гри. Скористайтеся пунктом «Перезавантажити гру» і повторіть ваш хід.Вами введено занадто багато ходів. Поверніться до правильної позиції і повторіть спробу.Вами ще не зроблено жодного ходуПерш ніж запропонувати нічию, вам слід зробити хідДля запису результатів турніру вам слід вказати файл турніру.Вами перезапущено вже завершений турнір. Тепер до турніру буде додано ще одне коло. Ігри розпочнуться за 10 секунд.У вашого суперника ще залишився часМасштаб графу оцінки позиції:атомніпомилковий параметр searchTime %sпомилковий параметр timeControl %sбероліна *вибратишведськіза назвоюза типомскасуватикласичніспорожнитизакритикур’єр (12x8)крейзіхаусциліндричні *внизНадіслати звіт про ваду електронною поштоюназва рушіятиповіне вдалося записати PVказковісокіл (10x8)знайти позиціюпершийфіксований максимумпіддавкигранд-шахи (10x10)нарощувальнийвбудований rcmd ще не реалізовано для UnixЯнус (10x8)мат конюАнтишахимакрукхідзвуженнядалінаступна сторінкабез туривашому запиту не відповідає жодна гразвичайніабо вкажіть його нижче:вибрати фіксованупопередня сторінкапідтримки версії протоколу %d не передбаченовипадковозберегти зміниsay Internal error; bad moveType %d (%d,%d-%d,%d)другийшатранджсьогі (9x9)перемішатисамовбивчіміткипорогові значеннядва королівгорупротибілий піксель = 0x%lx, чорний піксель = 0x%lx дика турасянці (9x10)втручання вашого суперника: %sxboard-4.7.3/po/en@quot.header0000644000175000001440000000226312262415351013130 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # xboard-4.7.3/po/es.po0000644000175000001440000015526712262562300011324 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # Traducción por Óscar Toledo G., 2010 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110411\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "versión %d del protocolo no es admitida" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "opción timeControl incorrecta %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "opción searchTime incorrecta %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "La variante %s solo se admite en modo ICS" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Nombre de variante desconocido %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Iniciando programa de ajedrez" #: backend.c:1398 msgid "Bad game file" msgstr "archivo de partidas incorrecto" #: backend.c:1405 msgid "Bad position file" msgstr "archivo de posición incorrecto" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "No se puede tener una partida sin programas de ajedrez" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "No se pudo abrir la puerta de comunicaciones %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "No se pudo conectar al servidor %s, puerta %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "Modo inicial desconocido %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "El modo análisis de archivo requiere un archivo de partida" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "El modo de análisis requiere un motor de ajedrez" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "El modo de análisis no funciona con el modo ICS" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "El modo de máquina con blancas requiere un motor de ajedrez" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "El modo de máquina con blancas no funciona con el modo ICS" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "El modo de máquina con negras requiere un motor de ajedrez" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "El modo de máquina con negras no funciona con el modo ICS" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "El modo de dos máquinas requiere un motor de ajedrez" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "El modo de dos máquinas no funciona con el modo ICS" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "El modo de entrenamiento requiere un archivo de partidas" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Error al escribir a ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Error al leer el teclado" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Se obtuvo del teclado un fin de archivo" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Error al escribir a la pantalla" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Error al recolectar lista de jugadas: dos encabezados" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Error al recolectar lista de jugadas: anidado" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "Conexión cerrada por ICS" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Error al leer de ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "Juego demasiado largo; incremente MAX_MOVES y recompile" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Error al recolectar lista de jugadas: tablero extra" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "No se pudo analizar jugada \"%s\" de ICS" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say Error interno; moveType incorrecto %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "Usted juega negras" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Usted juega blancas" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Turno de las blancas" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Turno de las negras" #: backend.c:6552 msgid "Displayed position is not current" msgstr "La posición mostrada no es la actual" #: backend.c:6790 msgid "Illegal move" msgstr "Jugada ilegal" #: backend.c:6857 msgid "End of game" msgstr "Fin del juego" #: backend.c:6860 msgid "Incorrect move" msgstr "Jugada incorrecta" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Jugada ilegal \"%s\" del %s motor" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s no admite análisis" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "Jugada ilegal \"%s\" (rechazada por %s programa de ajedrez)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Falla al iniciar %s programa de ajedrez %s en %s: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Sugerencia: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "La máquina acepta su oferta de tablas" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Jugada ambigua en salida ICS: \"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Jugada ilegal en salida ICS: \"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "Hueco en lista de jugadas" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "La variante %s no es admitida por %s" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Falla al iniciar '%s'" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "Esperando al primer programa de ajedrez" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "Esperando al segundo programa de ajedrez" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 #, fuzzy msgid "Bad tournament file" msgstr "archivo de partidas incorrecto" #: backend.c:10472 #, fuzzy msgid "Waiting for other game(s)" msgstr "Esperando al primer programa de ajedrez" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Partida %s vs. %s: puntuación final %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Jugada ilegal: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Jugada ambigua: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "No se puede abrir \"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "No se pudo armar lista de partidas" #: backend.c:11594 msgid "No more games in this message" msgstr "No hay más partidas en este mensaje" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Ninguna partida se ha cargado aún" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Ya no se puede ir más atrás" #: backend.c:12077 msgid "Game number out of range" msgstr "Número de partida fuera de rango" #: backend.c:12088 msgid "Can't seek on game file" msgstr "No se puede buscar en archivo de partidas" #: backend.c:12146 msgid "Game not found in file" msgstr "Partida no hallada en archivo" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Posición FEN incorrecta en archivo" #: backend.c:12426 msgid "No moves in game" msgstr "Ninguna jugada en la partida" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Ninguna posición se ha cargado aún" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "No se puede buscar en archivo de partidas" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "No se halló la posición en el archivo" #: backend.c:12632 msgid "Black to play" msgstr "Las negras juegan" #: backend.c:12635 msgid "White to play" msgstr "Las blancas juegan" #: backend.c:12722 backend.c:13083 #, fuzzy msgid "Waiting for access to save file" msgstr "Esperando al segundo programa de ajedrez" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 #, fuzzy msgid "Saving position" msgstr "archivo de posición incorrecto" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "Usted todavía no hace una jugada" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "No hay partidas sin terminar" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Falla al invocar cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Esperando respuesta del oponente\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Todavía necesita hacer una jugada para la partida\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Todavía necesita hacer jugadas para ambas partidas\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Todavía necesita hacer jugadas para las %d partidas\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Todavía necesita hacer una jugada para la partida %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "No hay juegos sin terminar\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Listo para enviar correo\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Todavía necesita hacer jugadas para las partidas %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "Editar comentario" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Editar comentario en %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "No es turno de las blancas" #: backend.c:13877 msgid "It is not Black's turn" msgstr "No es turno de las negras" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "Modo de entrenamiento apagado" #: backend.c:14155 msgid "Training mode on" msgstr "Modo de entrenamiento activo" #: backend.c:14158 msgid "Already at end of game" msgstr "Ya se encuentra al final de la partida" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Advertencia: Usted todavía está jugando una partida" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Advertencia: Usted todavía está observando una partida" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Advertencia: Usted todavía está examinando una partida" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "Ese cuadro está ocupado" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "No hay oferta pendiente para esta jugada" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "Su oponente no está fuera de tiempo" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Debe hacer su jugada antes de ofrecer tablas" #: backend.c:15109 msgid "You are not examining a game" msgstr "Usted no está examinando una partida" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "No puede revertir si está en pausa" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "Es su turno" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Espero su turno" #: backend.c:15237 msgid "No hint available" msgstr "No hay sugerencia disponible" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "Ninguna partida se ha cargado aún" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Error al escribir al %s programa de ajedrez" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Error: el %s programa de ajedrez (%s) terminó inesperadamente" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Error al leer del %s programa de ajedrez (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "La jugada ilustrada no es la actual" #: backend.c:16352 msgid "Could not parse move" msgstr "No se pudo analizar la jugada" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Ambas banderas cayeron" #: backend.c:16479 msgid "White's flag fell" msgstr "La bandera blanca cayó" #: backend.c:16501 msgid "Black's flag fell" msgstr "La bandera negra cayó" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Posición FEN incorrecta en portapapeles" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "No se pudo analizar la jugada" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "Aplazamiento F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 #, fuzzy msgid "Select Engine:" msgstr "Motor" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 #, fuzzy msgid "Default Number of Games in Match (or Pairing):" msgstr "Partidas torneo p/def" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 #, fuzzy msgid "Save Tourney Games on:" msgstr "Opciones al salvar partida" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 #, fuzzy msgid "Replace Engine" msgstr "Motor" #: dialogs.c:285 #, fuzzy msgid "Upgrade Engine" msgstr "Motor" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Animar arrastre" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Animar movimiento" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Bandera automática" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Cambio de lado automático" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "A ciegas" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "Ocultar cogitaciones al jugar contra humano" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Iluminar última jugada" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Iluminar con flecha" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Moviemento de un click" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "Actualización periódica (en análisis)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Prever siguente jugada" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Ventana al salir" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Ventana si error en jugada" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "Leer lista jugadas" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Mostrar coordenadas" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Checar legalidad" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "Gráfica de evaluación" #: dialogs.c:400 msgid "General Options" msgstr "Opciones generales" #: dialogs.c:410 msgid "normal" msgstr "normal" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 #, fuzzy msgid "cylinder *" msgstr "cilindro" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "atómico" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "suicida" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "Advertencia: ¡el segundo motor (%s) no admite esto!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "Variantes" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Número max. CPUs:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Tamaño hash (MB):" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "Carpeta EGTB:" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "Tamaño EGTB (MB):" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "Profundo libro:" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "Variación libro:" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "Primero tiene libro propio" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "Configuración común de motor" #: dialogs.c:540 msgid "Detect all Mates" msgstr "Detectar mates" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "Verificar avisos del motor" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "Tablas si hay material insufficiente" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "Adjudicar tablas triviales" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Adjudicar mate después de:" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Límite para adjudicar juego:" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Puntuación motor #1 es absoluta" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Puntuación motor #2 es absoluta" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Adjudicar a blancas" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "Auto Kibitz" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Auto-comentario" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Auto-Observar" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Tablero al frente (automático)" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Mirar en el fondo" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Tablero dual" #: dialogs.c:576 msgid "Get Move List" msgstr "Leer lista jugadas" #: dialogs.c:577 msgid "Quiet Play" msgstr "Jugar en silencio" #: dialogs.c:578 msgid "Seek Graph" msgstr "Buscar gráfica" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "auto-Refresco" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "Pre-mov." #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "1er. mov. blancas" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "1er. mov. negras" #: dialogs.c:587 msgid "Alarm" msgstr "Alarma" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "Opciones ICS" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "Ninguna partida se ha cargado aún" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "Opciones al leer partida" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "Opciones al salvar partida" #: dialogs.c:681 msgid "No Sound" msgstr "Sin sonido" #: dialogs.c:682 msgid "Default Beep" msgstr "Bip por defecto" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "Reproducir" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "Sonidos" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "Piezas negras" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Cuadros claros" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Cuadros obscuros" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Cuadro iluminado" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "Iluminación pre.mov." #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "Monocromo" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "Opciones de tablero" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "Edición" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Circunstancias" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 #, fuzzy msgid "Engine has no options" msgstr "Primero tiene libro propio" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Núm. de pos. inicial:" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "Aleatorio" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Nueva partida revuelta..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "Factores de tiempo:" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "Motor" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "Primero tiene libro propio" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Error al escribir al programa de ajedrez" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "Cancelar" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Rey" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "Generales..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Caballo" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Alfil" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Torre" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Arzobispo" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Canciller" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Dama" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Coronar" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "De fábrica" #: dialogs.c:1743 msgid "up" msgstr "Arriba" #: dialogs.c:1744 msgid "down" msgstr "Abajo" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "Opciones al leer partida" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Error" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Error fatal" #: dialogs.c:1906 msgid "Exiting" msgstr "Saliendo" #: dialogs.c:1917 msgid "Information" msgstr "Información" #: dialogs.c:1924 msgid "Note" msgstr "Nota" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Blancas" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Peón" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Elefante" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Cañón" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "Degradar" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Vaciar el escaque" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Limpiar el tablero " #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Negras" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Archivo" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Edición" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Ver" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Modo" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Partida" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Motor" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Opciones" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Ayuda" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "Archivo" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Filtro" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Filtro" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "Comentarios" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "Salida de motores" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "archivo de partidas incorrecto" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "Falla al invocar cmail" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Acerca de XBoard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Nueva partida revuelta..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Nueva partida revuelta..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Variantes" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Para leer partida... Alt+Mayús+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "archivo de posición incorrecto" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "archivo de posición incorrecto" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "archivo de posición incorrecto" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Para guardar partida... Alt+Mayús+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "archivo de posición incorrecto" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Para guardar partida... Alt+Mayús+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Copiar lista de partidas" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Copiar posición Alt+Mayús+C" #: menus.c:605 msgid "Copy Game List" msgstr "Copiar lista de partidas" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Pegar partida Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Pegar posición Alt+Mayús+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Editar comentario" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "archivo de posición incorrecto" #: menus.c:612 msgid "Edit Tags" msgstr "Editar circunstancias" #: menus.c:613 msgid "Edit Comment" msgstr "Editar comentarios" #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "Repertorio de aperturas..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Anotar" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Truncar partida End" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Las negras juegan" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "Ultima jugada Alt+Fin" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Cambio de lado automático" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Leer lista jugadas" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Gráfica de evaluación" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Lista de partidas..." #: menus.c:637 msgid "Comments" msgstr "Comentarios" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Opciones del tablero..." #: menus.c:642 msgid "Game List Tags..." msgstr "Opciones de lista de partidas..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "El programa juega con blancas Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Torneo de dos programas" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "Juegan dos programas Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Análisis Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Analizar archivo Ctrl+F" #: menus.c:654 msgid "Training" msgstr "Entrenamiento" #: menus.c:655 msgid "ICS Client" msgstr "Conectado a un ICS" #: menus.c:657 msgid "Machine Match" msgstr "Torneo de dos programas" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Pedir la bandera F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Dejo de observar F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Dejo de examinar F11" #: menus.c:675 msgid "Upload to Examine" msgstr "Enviar para examinar" #: menus.c:677 msgid "Adjudicate to White" msgstr "Adjudicar a blancas" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Adjudicar a negras" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Adjudicar tablas" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Configuración motor #1..." #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Configuración motor #2..." #: menus.c:690 msgid "Hint" msgstr "Dame una pista..." #: menus.c:691 msgid "Book" msgstr "Repertorio de aperturas..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Revocar jugada Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "Generales..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Controles de tiempo..." #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Para los motores... Alt+Mayús+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Adjudicaciones... Alt+Mayús+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "Para leer partida... Alt+Mayús+L" #: menus.c:708 msgid "Save Game ..." msgstr "Para guardar partida... Alt+Mayús+S" #: menus.c:709 msgid "Game List ..." msgstr "Lista de partidas..." #: menus.c:710 msgid "Sounds ..." msgstr "Sonido..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "Iluminar arrastre" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Iluminar con flecha" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "Actualización periódica" #: menus.c:729 msgid "Popup Exit Message" msgstr "Ventana al salir" #: menus.c:731 msgid "Show Coords" msgstr "Mostrar coordenadas" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "Ocultar cogitaciones al jugar contra humano" #: menus.c:736 msgid "Save Settings Now" msgstr "Salvar config. ahora" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Salvar config. al salir del programa" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "Acerca de XBoard" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "Motor" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "jugadas" #: nengineoutput.c:153 msgid "Engine output" msgstr "Salida de motores" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Gráfica de evaluación" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "archivo de posición incorrecto" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "Circunstancias" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "Ninguna partida seleccionada" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Ya no se puede ir más adelante" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "Partida %s vs. %s: puntuación final %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "No hay lista de partidas" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "Aceptar" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "Cancelar" #~ msgid "New Game Ctrl+N" #~ msgstr "Nueva partida Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Nueva variante... Alt+Mayús+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Leer partida... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Leer posición... Ctrl+Mayús+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "Guardar partida... Ctrl+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Guardar posición... Ctrl+Mayús+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Salir" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Copiar partida Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Editar partida Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Editar posición Ctrl+Mayús+E" #~ msgid "Revert Home" #~ msgstr "Revertir Home" #~ msgid "Backward Alt+Left" #~ msgstr "Jugada anterior Alt+Izquierda" #~ msgid "Forward Alt+Right" #~ msgstr "Siguiente jugada Alt+Derecha" #~ msgid "Back to Start Alt+Home" #~ msgstr "Primera jugada Alt+Inicio" #~ msgid "Flip View F2" #~ msgstr "Tablero invertido F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Mostrar salida del motor Alt+Mayús+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Mostrar lista de jugadas Alt+Mayús+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "Mostrar gráfica de evaluación Alt+Mayús+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Mostrar lista de partidas Alt+Mayús+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "El programa juega con negras Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Editar partida Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Editar posición Ctrl+Mayús+E" #~ msgid "Pause Pause" #~ msgstr "Pausa Pausa" #~ msgid "Accept F3" #~ msgstr "Acepto F3" #~ msgid "Decline F4" #~ msgstr "Rehuso F4" #~ msgid "Rematch F12" #~ msgstr "Pido desquite F12" #~ msgid "Draw F6" #~ msgstr "Tablas F6" #~ msgid "Adjourn F7" #~ msgstr "Aplazamiento F7" #~ msgid "Abort F8" #~ msgstr "Anulación F8" #~ msgid "Resign F9" #~ msgstr "Me rindo F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Forzar jugada Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Siempre dama Ctrl+Mayús+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Animar movimiento Ctrl+Mayús+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Bandera automática Ctrl+Mayús+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Prever próx.jugada Ctrl+Mayús+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Ocultar cogitación Ctrl+Mayús+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Checar legalidad Ctrl+Mayús+L" #~ msgid "Drop" #~ msgstr "Soltar" #, fuzzy #~ msgid "could not open: " #~ msgstr "No se pudo analizar la jugada" #~ msgid "Promotion" #~ msgstr "Coronación" #~ msgid "ok" #~ msgstr "Aceptar" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "Iluminar arrastre" #~ msgid "White " #~ msgstr "Blancas " #~ msgid "Black " #~ msgstr "Negras " #~ msgid "Close" #~ msgstr "Cerrar" #~ msgid "sec/move" #~ msgstr "segundos por jugada" xboard-4.7.3/po/da.po0000644000175000001440000020704012262562300011264 00000000000000# Danish translation for xboard. # # Copyright (C) 2011, 2012 Free Software Foundation, Inc. # This file is distributed under the same license as the xboard package. # # Note: Jeg har foreløbig efterladt navne på varianter og uortodokse brikker mv. # uoversatte fordi jeg ikke kender dansk sprogbrug for dette om nogen. Byrial. # # Sprogbrug: # Chess engine, engine, chess program, chess machine: Disse bruges i flæng # i originalen. Er oversat til skakprogram. # Pairing engine: Paringsprogram # # Korrektur og gode forslag: # Morten Bo Johansen, dec. 2011 # Joe Dalton, feb. 2012 # # Oversætter: # Byrial Ole Jensen , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: GNU xboard 4.6.0.20120304\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: 2012-03-06 12:27+0100\n" "Last-Translator: Byrial Ole Jensen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "%s i indstillingsfil\n" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "Forkert heltalsværdi %s" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "Ikke genkendt argument %s" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "Ingen værdi givet for argumentet %s" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "Ukomplet \\-undvigesekvens i værdi for %s" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "Åbning af inkluderet fil \"%s\" mislykkedes" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "Ikke genkendt boolesk argumentværdi %s" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "første" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "det andet" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "protokolversion %d er ikke understøttet" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "Du angav ikke et kørbart skakprogram" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "forkert timeControl-tilvalg %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "forkert searchTime-tilvalg %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "Varianten %s er kun understøttet i ICS-tilstand" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Ukendt variantnavn %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Starter skakprogram" #: backend.c:1398 msgid "Bad game file" msgstr "Fejl i partifil" #: backend.c:1405 msgid "Bad position file" msgstr "Fejl i stillingsfil" #: backend.c:1419 msgid "Pick new game" msgstr "Vælg nyt spil" # cycle = runde? #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" "Du genstartede en allerede afsluttet turnering\n" "En mere cyklus vil nu blive tilføjet\n" "Partierne starter om 10 sekunder" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "Alle partier i turneringen \"%s\" er allerede færdige eller i gang" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "Kan ikke have en match uden skakprogrammer" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "Kunne ikke åbne seriel port %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "Kunne ikke forbinde til vært %s, port %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "Ukendt initialMode %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "AnalyzeFile-tilstand kræver en partifil" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "Analysetilstand kræver et skakprogram" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "Analysetilstand virker ikke sammen med ICS-tilstand" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "MachineWhite-tilstand kræver et skakprogram" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "MachineWhite-tilstand virker ikke sammen med ICS-tilstand" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "MachineBlack-tilstand kræver et skakprogram" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "MachineBlack-tilstand virker ikke sammen med ICS-tilstand" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "TwoMachines-tilstand kræver et skakprogram" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "TwoMachines-tilstand virker ikke sammen med ICS-tilstand" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "Træningstilstand kræver en partifil" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Fejl ved skrivning til ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Fejl ved læsning fra tastatur" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Fik filafslutning fra tastatur" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "Ukendt vild type %d" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Fejl ved skrivning til skærm" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "din modstander kommenterer: %s" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Fejl ved tolkning af trækliste: to teksthoveder" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Fejl ved tolkning af trækliste: indlejret" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "–" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "Ulovligt træk (afvist af ICS)" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "Forbindelse lukket af ICS" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Fejl ved læsning fra ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" "Fortolkning af brætstreng mislykkedes:\n" "\"%s\"" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "Parti for langt; forøg MAX_MOVES og genoversæt" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Fejl ved tolkning af trækliste: ekstra bræt" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "Kunne ikke fortolke \"%s\" fra ICS" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say Intern fejl; forkert moveType%d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "Du kan ikke gøre dette, mens du spiller eller observerer" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "Genoversæt for at understøtte denne BOARD_RANKS eller BOARD_FILES!" #: backend.c:6491 msgid "You are playing Black" msgstr "Du spiller sort" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Du spiller hvid" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Det er hvids tur" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Det er sorts tur" #: backend.c:6552 msgid "Displayed position is not current" msgstr "Den viste stilling er ikke den aktuelle" #: backend.c:6790 msgid "Illegal move" msgstr "Ulovligt træk" #: backend.c:6857 msgid "End of game" msgstr "Slutningen af partiet" #: backend.c:6860 msgid "Incorrect move" msgstr "Ukorrekt træk" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "Træk bonde baglæns for at underforvandle" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "Svejtserturnering afsluttet" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "Ikke tilladt parring fra parringsprogram" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Ulovligt træk \"%s\" fra %s skakprogram" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "Fejl i FEN modtaget fra skakprogram" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s understøtter ikke analyse" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "Ulovligt træk \"%s\" (afvist af %s skakprogram)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Fejl ved start af %s skakprogram %s på %s: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Tip: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" "Ulovligt tip om træk \"%s\"\n" "fra %s skakprogram" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "Skakprogrammet accepterer dit remistilbud" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" "Skakprogrammet tilbyder remis\n" "Vælg Handlinger / Remis for at acceptere" #: backend.c:8977 msgid "failed writing PV" msgstr "skrivning af analysevariant mislykkedes" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Flertydigt træk i ICS-output: \"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Ulovligt træk i ICS-output: \"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "Hul i trækliste" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "Variant %s understøttes ikke af %s" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Opstartsfejl på \"%s\"" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "Venter på første skakprogram" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "Venter på andet skakprogram" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "Kunne ikke skrive turneringsfil" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" "Du kan ikke udskifte et skakprogram, mens det bruges!\n" "Afslut dets parti først." #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "Der er ikke installeret et skakprogram med det angivne navn" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" "Ændr først skakprogram ved at redigere deltagerlisten\n" "i turneringsindstillingerne" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "Du kan kun ændre et skakprogram ad gangen" #: backend.c:10229 backend.c:10376 #, fuzzy, c-format msgid "No engine %s is installed" msgstr "Der er ikke installeret et skakprogram med det angivne navn" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" "Du skal angive en turneringsfil\n" "til at gemme turneringens afvikling" #: backend.c:10259 msgid "Not enough participants" msgstr "Der er ikke nok deltagere" #: backend.c:10460 msgid "Bad tournament file" msgstr "Fejl i turneringsfil" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "Venter på andet parti/andre partier" #: backend.c:10485 msgid "No pairing engine specified" msgstr "Der er ikke noget parringsprogram specificeret" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Match %s - %s: slutscore %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Ulovligt træk: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Flertydigt træk: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "Kan ikke åbne \"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "Kan ikke konstruere partiliste" #: backend.c:11594 msgid "No more games in this message" msgstr "Der er ikke flere partier i denne besked" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Der er endnu ingen indlæste partier" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Kan ikke gå længere tilbage" #: backend.c:12077 msgid "Game number out of range" msgstr "Partinummer findes ikke" #: backend.c:12088 msgid "Can't seek on game file" msgstr "Kan ikke spole i partifil" #: backend.c:12146 msgid "Game not found in file" msgstr "Parti ikke fundet i fil" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Fejl i FEN-stilling i fil" #: backend.c:12426 msgid "No moves in game" msgstr "Ingen træk i partiet" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Ingen stilling er endnu indlæst" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "Kan ikke spole i stillingsfil" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "Stilling er ikke fundet i fil" #: backend.c:12632 msgid "Black to play" msgstr "Sort i trækket" #: backend.c:12635 msgid "White to play" msgstr "Hvid i trækket" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "Venter på adgang til gemmefil" #: backend.c:12724 msgid "Saving game" msgstr "Gemmer parti" #: backend.c:12725 msgid "Bad Seek" msgstr "Søgning mislykkedes" #: backend.c:13085 msgid "Saving position" msgstr "Gemmer stilling" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" "Du har redigeret i parti-historikken.\n" "Genindlæs partiet og udfør trækket igen." #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" "Du har indtastet for mange træk.\n" "Gå tilbage til den aktuelle stilling og prøv igen." #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" "Den viste stilling er ikke den aktuelle.\n" "Gå fremad til den korrekte stilling og prøv igen." #: backend.c:13268 msgid "You have not made a move yet" msgstr "Du har ikke trukket endnu" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" "Cmail-beskeden er ikke indlæst.\n" "Brug Genindlæs CMail-besked og lav dit træk igen." #: backend.c:13294 msgid "No unfinished games" msgstr "Der er ingen uafsluttede partier" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" "Du har allerede sendt et træk.\n" "Vent indtil der kommer et træk fra din modstander.\n" "For at gensende det samme træk, tast\n" "\"cmail -remail -game %s\"\n" "på kommandolinjen." #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Start af cmail mislykkedes" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Venter på svar fra modstander\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Der er stadig nødvendigt at trække i partiet\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Der er stadig nødvendigt at trække i begge partier\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Der er stadig nødvendigt at trække i alle %d partier\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Der er stadig nødvendigt at trække i partiet %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "Der er ingen uafsluttede partier\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Klar til at sende e-mail\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Der er stadig nødvendigt at trække i partierne %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "Redigér kommentar" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Redigér kommentar til %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "Du observerer ikke et parti" #: backend.c:13796 msgid "It is not White's turn" msgstr "Hvid er ikke i trækket" #: backend.c:13877 msgid "It is not Black's turn" msgstr "Sort er ikke i trækket" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "Starter %s skakprogram" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" "Vent på din tur,\n" "eller vælg Træk nu" #: backend.c:14147 msgid "Training mode off" msgstr "Træningstilstand fra" #: backend.c:14155 msgid "Training mode on" msgstr "Træningstilstand til" #: backend.c:14158 msgid "Already at end of game" msgstr "Allerede ved slutningen af partiet" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Advarsel: Du spiller stadig et parti" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Advarsel: Du observerer stadig et parti" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Advarsel: Du undersøger stadig et parti" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "Lukker skakprogram til ICS-analyse ..." #: backend.c:14609 msgid "That square is occupied" msgstr "Det felt er besat" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "Der er ingen aktuelle tilbud ved dette træk" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "Din modstander har ikke overskredet tiden" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Du skal trække før du tilbyder remis" #: backend.c:15109 msgid "You are not examining a game" msgstr "Du undersøger ikke et parti" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "Du kan ikke annullere variantlinje under pause" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "Det er dig som er i trækket" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Vent til du kommer i trækket" #: backend.c:15237 msgid "No hint available" msgstr "Tip er ikke tilgængeligt" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "Partiliste ikke indlæst eller tom" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Fejl ved skrivning til %s skakprogram" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "%s program afslutter i remisstilling (%s)" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Fejl: %s skakprogram (%s) afsluttede uventet" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Fejl ved læsning fra %s skakprogram (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "%s skakprogram har for mange tilvalg\n" #: backend.c:16343 msgid "Displayed move is not current" msgstr "Det viste træk er ikke det aktuelle" #: backend.c:16352 msgid "Could not parse move" msgstr "Kunne ikke fortolke træk" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Begge flag er faldet" #: backend.c:16479 msgid "White's flag fell" msgstr "Hvids flag er faldet" #: backend.c:16501 msgid "Black's flag fell" msgstr "Sorts flag er faldet" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "Det er ikke tilladt er stille på uret i auto-flag-tilstand" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Fejl i FEN-stilling i udklipsholder" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "Fejl i polyglyt-åbningsbog" #: book.c:701 msgid "Book Fault" msgstr "Fejl i åbningsbog" #: book.c:836 msgid "Hash keys are different" msgstr "Hashnøgler er forskellige" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "Kunne ikke fortolke træk" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "Turneringsfil:" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 #, fuzzy msgid " (for concurrent playing of a single" msgstr "Synkronisér efter runde (for samtidig afvikling af en" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 #, fuzzy msgid " tourney with multiple XBoards)" msgstr "Synkronisér efter cyklus turnering med flere XBoard'er)" #: dialogs.c:264 msgid "Tourney participants:" msgstr "Turneringsdeltagere:" #: dialogs.c:265 msgid "Select Engine:" msgstr "Vælg skakprogram:" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "Turneringstype (0 = alle mod alle, 1 = en imod resten):" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "Antal cyklusser i turneringen (eller svejtserrunder):" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "Standard for antal partier i match (eller parring):" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "Pause imellem matchpartier (millisekunder):" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "Gem turneringspartier i:" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "Partifil med åbninger:" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "Partinummer (-1 eller -2 = automatisk forøgelse):" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "Fil med startstillinger:" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "Stillingsnummer (-1 eller -2 = automatisk forøgelse):" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "Genstart nummering efter dette antal partier (0 = aldrig):" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "Deaktivér skakprogrammets egen åbningsbog som standard" #: dialogs.c:284 msgid "Replace Engine" msgstr "Udskift skakprogram" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "Opgradér skakprogram" #: dialogs.c:286 msgid "Clone Tourney" msgstr "Kopiér turnering" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "Du skal angive en eksisterende turneringsfil til at kopiere" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "Matchindstillinger" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "Absolutte analysescorer" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "Næsten altid dronning (Omvejs-underforvandling)" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Animeret trækudførelse" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Animeret flytning" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Automatisk annoncering af tidsoverskridelse" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Automatisk vending af brættet" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Blindskak" # Menu til indsætning af brik på brættet i babyskak mv. #: dialogs.c:370 msgid "Drop Menu" msgstr "Placér brik-menu" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "Skjul tænkning fra menneske" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Fremhæv sidste træk" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Fremhæv med pil" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Ét-klikstræk" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "Periodisk opdatering (i analysetilstand)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" # ... mens modstanderen er i trækket #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Spekulér på næste træk" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Pop op med afslutningsbeskeder" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Pop op ved trækfejl" #: dialogs.c:382 msgid "Scores in Move List" msgstr "Scorer i trækliste" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Vis koordinater" #: dialogs.c:384 msgid "Show Target Squares" msgstr "Vis målfelter" #: dialogs.c:385 msgid "Sticky Windows" msgstr "Klæbrige vinduer" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Test lovlighed" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "Blink ved træk (0 = ingen blink):" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "Blinkhastighed (høj = hurtig):" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "Animeringshastighed (høj = langsom):" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "Zoomfaktor i evalueringsgraf:" #: dialogs.c:400 msgid "General Options" msgstr "Generelle indstillinger" #: dialogs.c:410 msgid "normal" msgstr "normal" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "skak960" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "Brætstørrelse (-1 = standard for valgt variant):" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "Antal brætrækker:" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "Antal brætlinjer:" #: dialogs.c:425 msgid "Holdings Size:" msgstr "Depotstørrelse:" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "Advarsel: det andet skakprogram (%s) understøtter ikke dette!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "Ny variant" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Maksimalt antal CPU'er pr. skakprogram:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "Polyglot-katalog:" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Hashtabel-størrelse (MB):" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "Sti til Nalimov-EGTB:" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "EGTB-cachestørrelse (MB):" #: dialogs.c:520 msgid "Use GUI Book" msgstr "Brug GUI's åbningsbog" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "Åbningsbogsfilnavn:" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "Åbningsbogsdybde (træk):" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "Åbningsbogvariation (0) vs. styrke (100):" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "Skakprogram nr. 1 har egen åbningsbog" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "Skakprogram nr. 2 har egen åbningsbog" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "Indstillinger for skakprogrammer" #: dialogs.c:540 msgid "Detect all Mates" msgstr "Find alle matter" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "Efterprøv resultatangivelser fra skakprogrammer" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "Remis ved utilstrækkeligt matsættende materiale" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "Døm trivielle remiser (3-træks forsinkelse)" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "N-træksregel:" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "N-gange gentagelser:" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Remis efter i alt N træk:" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Gevinst/tabs-tærskel:" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Negér skakprogram nr. 1's score" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Negér skakprogram nr. 2's score" #: dialogs.c:556 msgid "Adjudicate non-ICS Games" msgstr "Døm ikke-ICS partier" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "Send kommentarer fra skakprogram" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Gem kommentarer til træk" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Observér automatisk" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Bræt øverst ved partistart" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Obsevér i baggrunden når der spilles" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Andet bræt til baggrundsobservede partier" #: dialogs.c:576 msgid "Get Move List" msgstr "Hent trækliste" #: dialogs.c:577 msgid "Quiet Play" msgstr "Stille spil" #: dialogs.c:578 msgid "Seek Graph" msgstr "Søgegraf" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "Automatisk opdatering af søgegraf" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "Forhåndstræk" #: dialogs.c:582 msgid "Premove for White" msgstr "Forhåndstræk for hvid" #: dialogs.c:583 msgid "First White Move:" msgstr "Hvids første træk:" #: dialogs.c:584 msgid "Premove for Black" msgstr "Forhåndstræk for sort" #: dialogs.c:585 msgid "First Black Move:" msgstr "Sorts første træk:" #: dialogs.c:587 msgid "Alarm" msgstr "Alarm" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "Alarmtid (millisekunder):" #: dialogs.c:590 msgid "Colorize Messages" msgstr "Farv meddelelser" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "Tekstfarver for råb:" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "Tekstfarver for s-råb:" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "Tekstfarver for kanal nr. 1:" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "Tekstfarver for andre kanaler:" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "Tekstfarver for kommentar:" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "Tekstfarver for tale:" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "Tekstfarver for udfordring:" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "Tekstfarver for forespørgsel:" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "Tekstfarver for søgning:" #: dialogs.c:606 msgid "ICS Options" msgstr "ICS-indstillinger" #: dialogs.c:611 msgid "Exact position match" msgstr "Eksakt stilling" #: dialogs.c:611 msgid "Shown position is subset" msgstr "Viste stilling er en delmængde" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "Samme materiale med samme bondestruktur" #: dialogs.c:612 msgid "Same material" msgstr "Samme materiale" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "Materiale-interval (øverste halvdel af brættet valgfrit)" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "Materiale-forskel (balanceret valgfrit materiale)" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "Automatisk visning af partidata" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "Automatisk visning af kommentarer" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" "Hastighed af gennemspilning af indlæste partier\n" "(0 = øjeblikkeligt, -1 fra):" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "Sekunder pr. træk:" # Ingen grund til ikke at bruge stort begyndelsesbogstav her. #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" "\n" "Indstillinger til brug ved gennemkigning af partier:" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" "\n" "Grænseværdier for stillingsfiltrering i partiliste:" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "Stærkeste spillers rating er mindst:" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "Svageste spillers rating er mindst:" #: dialogs.c:633 msgid "No games before year:" msgstr "Ingen partier før år:" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "Mindste antal stillinger i følge ad gangen:" #: dialogs.c:635 msgid "Search mode:" msgstr "Søgemetode:" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "Match også omvendte farver" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "Match også spejlvendt stilling" #: dialogs.c:645 msgid "Load Game Options" msgstr "Indstillinger for indlæsning af parti" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "Gem partier automatisk" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "Gem partier i filen:" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "Gem slutstillinger i filen:" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "Event-tekst i PGN-fil:" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "Gammel gemmestil (i modsætning til PGN)" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "Brug partinumre i PGN-fil for turnering" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "Gem score/dybde-information i PGN" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "Gem ud af åbningsbog-info i PGN " #: dialogs.c:672 msgid "Save Game Options" msgstr "Indstillinger for gemning af parti" #: dialogs.c:681 msgid "No Sound" msgstr "Ingen lyd" #: dialogs.c:682 msgid "Default Beep" msgstr "Standard bip" #: dialogs.c:683 msgid "Above WAV File" msgstr "WAV-filen ovenfor" #: dialogs.c:684 msgid "Car Horn" msgstr "Bilhorn" #: dialogs.c:685 msgid "Cymbal" msgstr "Bækken" #: dialogs.c:686 msgid "Ding" msgstr "Ding" #: dialogs.c:687 msgid "Gong" msgstr "Gongon" #: dialogs.c:688 msgid "Laser" msgstr "Laser" #: dialogs.c:689 msgid "Penalty" msgstr "Straffe" #: dialogs.c:690 msgid "Phone" msgstr "Telefon" #: dialogs.c:691 msgid "Pop" msgstr "Plop" #: dialogs.c:692 msgid "Slap" msgstr "Slag" #: dialogs.c:693 msgid "Wood Thunk" msgstr "Dunk" #: dialogs.c:695 msgid "User File" msgstr "Brugerfil" #: dialogs.c:717 msgid "User WAV File:" msgstr "Bruger WAV-fil:" #: dialogs.c:718 msgid "Sound Program:" msgstr "Lydprogram:" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "Afprøv lyd:" #: dialogs.c:720 msgid "Play" msgstr "Afspil" #: dialogs.c:721 msgid "Move:" msgstr "Træk:" #: dialogs.c:722 msgid "Win:" msgstr "Gevinst:" #: dialogs.c:723 msgid "Lose:" msgstr "Tab:" #: dialogs.c:724 msgid "Draw:" msgstr "Remis:" #: dialogs.c:725 msgid "Unfinished:" msgstr "Uafsluttet:" #: dialogs.c:726 msgid "Alarm:" msgstr "Alarm:" #: dialogs.c:727 msgid "Challenge:" msgstr "Udfodring:" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "Lydkatalog:" #: dialogs.c:730 msgid "Shout:" msgstr "Råb:" #: dialogs.c:731 msgid "S-Shout:" msgstr "S-råb:" #: dialogs.c:732 msgid "Channel:" msgstr "Kanal:" #: dialogs.c:733 msgid "Channel 1:" msgstr "Kanal 1:" #: dialogs.c:734 msgid "Tell:" msgstr "Tale:" #: dialogs.c:735 msgid "Kibitz:" msgstr "Kommentar:" #: dialogs.c:736 msgid "Request:" msgstr "Forespøgsel:" #: dialogs.c:737 msgid "Seek:" msgstr "Søgning:" #: dialogs.c:753 msgid "Sound Options" msgstr "Lydindstillinger" #: dialogs.c:774 msgid "White Piece Color:" msgstr "Farve for hvide brikker:" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "R" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "G" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "B" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "M" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "Farve for sorte brikker:" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Farve for lyse felter:" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Farve for mørke felter:" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Farve til fremhævelse:" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "Farve til forhåndstræk:" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "Ombyt brikker som i shogi (Farvede knapper gendanner standard)" #: dialogs.c:816 msgid "Mono Mode" msgstr "Monokrom-tilstand" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "Mellemrum mellem felter (-1 = standard for brætstørrelsen):" #: dialogs.c:818 msgid "Use Board Textures" msgstr "Brug brætteksturer" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "Teksturfil for lyse felter:" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "Teksturfil for mørke felter:" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 #, fuzzy msgid "Directory with Pieces Images:" msgstr "Katalog med bitmap-brikker:" #: dialogs.c:872 msgid "Board Options" msgstr "Brætindstillinger" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "ICS-tekstmenu" #: dialogs.c:947 msgid "clear" msgstr "ryd" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "gem ændringer" #: dialogs.c:1051 msgid "Edit book" msgstr "Redigér åbningsbog" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Partidata" #: dialogs.c:1193 msgid "ICS input box" msgstr "ICS-inputboks" #: dialogs.c:1225 msgid "Type a move" msgstr "Tast et træk" #: dialogs.c:1251 msgid "Engine has no options" msgstr "Skakprogrammet har ingen tilvalg" #: dialogs.c:1253 msgid "Engine Settings" msgstr "Indstillinger for skakprogram" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "Vælg skakprogram fra liste:" #: dialogs.c:1281 msgid "or specify one below:" msgstr "eller specificér en herunder:" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "Kaldenavn (ikke nødvendigt):" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "Brug kaldenavnet som spillerbetegnelse i PGN-filer" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "Skakprogramkatalog:" #: dialogs.c:1285 msgid "Engine Command:" msgstr "Skakprogramkommando:" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "(Katalog vil blive udledt fra programstien hvis ikke udfyldt)" #: dialogs.c:1287 msgid "UCI" msgstr "UCI" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "WB-protokol v1 (brug ikke særlige skakprogramfunktioner)" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "Må ikke bruge GUI's åbningsbog" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "Tilføj dette skakprogram til listen" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "Brug aktuel variant med dette skakprogram" #: dialogs.c:1341 #, fuzzy msgid "Load first engine" msgstr "Indlæs skakprogram" #: dialogs.c:1347 #, fuzzy msgid "Load second engine" msgstr "Indlæs skakprogrammet som" #: dialogs.c:1370 msgid "shuffle" msgstr "bland brikker" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Startstillingsnummer:" #: dialogs.c:1372 msgid "randomize" msgstr "vælg tilfældigt" #: dialogs.c:1373 msgid "pick fixed" msgstr "vælg bestemt" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Nyt blandet parti" # Stort begyndelsesbogstav med vilje #: dialogs.c:1409 msgid "classical" msgstr "Klassisk" # Stort begyndelsesbogstav med vilje #: dialogs.c:1410 msgid "incremental" msgstr "Tillægstid" # Stort begyndelsesbogstav med vilje #: dialogs.c:1411 msgid "fixed max" msgstr "Maks. pr. træk" #: dialogs.c:1412 msgid "Moves per session:" msgstr "Træk pr. tidsperiode:" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "Tid fra start (minutter):" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "Tillægstid eller maks. pr. træk (sekunder):" #: dialogs.c:1415 msgid "Time-Odds factors:" msgstr "Tidsforkortelses-faktorer:" #: dialogs.c:1416 msgid "Engine #1" msgstr "Skakprogram nr. 1" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "Skakprogram nr. 2 / menneske" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "Ubrugt" #: dialogs.c:1478 msgid "Time Control" msgstr "Betænkningstid" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Fejl ved skrivning til skakprogram" #: dialogs.c:1574 msgid "Cancel" msgstr "Annullér" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Konge" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "" #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Springer" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Løber" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Tårn" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Dronning" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Bondeforvandling" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "standard" #: dialogs.c:1743 msgid "up" msgstr "op" #: dialogs.c:1744 msgid "down" msgstr "ned" #: dialogs.c:1762 msgid "No tag selected" msgstr "Ingen overskrift valgt" #: dialogs.c:1793 msgid "Game-list options" msgstr "Indstillinger for partiliste" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Fejl" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Fatal fejl" #: dialogs.c:1906 msgid "Exiting" msgstr "Afslutter" #: dialogs.c:1917 msgid "Information" msgstr "Meddelelse" #: dialogs.c:1924 msgid "Note" msgstr "Notits" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Hvid" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Bonde" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Tomt felt" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Ryd bræt" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Sort" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Fil" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Redigér" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Vis" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Tilstand" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Handlinger" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Skakprogram" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Indstillinger" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Hjælp" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 #, fuzzy msgid "Directories:" msgstr "Lydkatalog:" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "Fil" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Filter:" #: dialogs.c:2371 #, fuzzy msgid "New directory" msgstr "Skakprogramkatalog:" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Filter:" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "Kommentarer" #: dialogs.c:2473 #, fuzzy msgid " next page" msgstr "næste side" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, c-format msgid "Engine Output" msgstr "Output fra skakprogram" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "%s (%d reversibelt træk)" msgstr[1] "%s (%d reversible træk)" # NPS = Nodes pr. second # SPS = Stillinger pr. sekund (i motoranalyse) #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "SPS" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "Læser partifil (%d)" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "%s: kan ikke cd til CHESSDIR: " #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "Åbning af filen \"%s\" mislykkedes\n" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" "Genoversæt med større BOARD_RANKS eller BOARD_FILES for at understøtte denne " "størrelse" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "%s: forkert boardSize-syntaks %s\n" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "%s: ikke genkendt boardSize-navn %s\n" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "%s: for få farver tilgængelige; prøver monokrom tilstand\n" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "Kan ikke lave skrifttypegruppe for %s.\n" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "%s: Ingen skrifttyper matcher mønstret %s\n" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "Kan ikke åbne midlertidig fil" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "Åbning af fil mislykkedes" #: menus.c:134 msgid "Load game file name?" msgstr "Filnavn for indlæsning af parti?" #: menus.c:179 msgid "Load position file name?" msgstr "Filnavn for indlæsning af stilling?" #: menus.c:185 msgid "Save game file name?" msgstr "Filnavn for gemning af parti?" #: menus.c:194 msgid "Save position file name?" msgstr "Filnavn for gemning af stilling?" #: menus.c:358 msgid " (with Zippy code)" msgstr " (med Zippy-kode)" #: menus.c:363 #, fuzzy, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Ændringer Copyright 1992-2012 Free Software Foundation\n" "Ændringer Copyright 2005 Alessandro Scotti\n" "\n" "%s er frit programmel og er uden nogen form for garanti; se filen COPYING " "for mere information. \n" "Besøg XBoard på nettet på http://www.gnu.org/software/xboard/\n" "Se de nyeste funktioner på http://www.gnu.org/software/xboard/whats_new." "html\n" "\n" "Rapportér fejl via e-mail til \n" "Rapportér fejl i den danske oversættelse til \n" "\n" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Om Xboard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Nyt blandet parti" #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Nyt blandet parti ..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Ny variant" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Indlæs parti ..." #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "find stilling" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "Næste stilling Shift+PgDn" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "Gemmer stilling" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Gem parti ..." #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "Gemmer stilling" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Gem partier i filen:" #: menus.c:595 msgid "Mail Move" msgstr "Send træk med e-post" #: menus.c:596 msgid "Reload CMail Message" msgstr "Genindlæs CMail-besked" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Kopiér partiliste" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Kopiér stilling Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "Kopiér partiliste" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Indsæt parti Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Indsæt stilling Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Redigér kommentar" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "find stilling" # Partibeskrivelse i PGN-fil #: menus.c:612 msgid "Edit Tags" msgstr "Redigér partidata" #: menus.c:613 msgid "Edit Comment" msgstr "Redigér kommentar" #: menus.c:614 msgid "Edit Book" msgstr "Redigér åbningsbog" #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Kommentér" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Afkort partiet End" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Sort i trækket" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "Frem til enden Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Automatisk vending af brættet" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Trækliste" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Evalueringsgraf" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Partiliste ..." #: menus.c:637 msgid "Comments" msgstr "Kommentarer" #: menus.c:638 msgid "ICS Input Box" msgstr "ICS-inputboks" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Bræt..." #: menus.c:642 msgid "Game List Tags..." msgstr "Partidata-overskrifter ..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Skakprogram har hvid Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Skakprogrammatch" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "To skakprogrammer Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Analysetilstand Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Analysér parti Ctrl+G" #: menus.c:654 msgid "Training" msgstr "Træning" #: menus.c:655 msgid "ICS Client" msgstr "ICS-klient" #: menus.c:657 msgid "Machine Match" msgstr "Skakprogrammatch" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Annoncér tidsoverskridelse F5" #: menus.c:668 #, fuzzy msgid "Draw" msgstr "Remis:" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Stop observation F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Stop undersøgelse F11" #: menus.c:675 msgid "Upload to Examine" msgstr "Overfør til undersøgelse" #: menus.c:677 msgid "Adjudicate to White" msgstr "Døm hvid gevinst" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Døm sort gevinst" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Døm remis" #: menus.c:684 #, fuzzy msgid "Load New 1st Engine ..." msgstr "Indlæs nyt skakprogram ..." #: menus.c:685 #, fuzzy msgid "Load New 2nd Engine ..." msgstr "Indlæs nyt skakprogram ..." #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Indstillinger for skakprogram nr. 1 ..." #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Indstillinger for skakprogram nr. 2 ..." #: menus.c:690 msgid "Hint" msgstr "Tip" #: menus.c:691 msgid "Book" msgstr "Åbningsbog" #: menus.c:693 #, fuzzy msgid "Move Now" msgstr "Lyd ved træk" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Annullér træk Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "Generelle ..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Betænkningstid" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Skakprogram ... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Afgørelser ... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS ..." #: menus.c:706 msgid "Match ..." msgstr "Match ..." #: menus.c:707 msgid "Load Game ..." msgstr "Indlæs parti ..." #: menus.c:708 msgid "Save Game ..." msgstr "Gem parti ..." #: menus.c:709 msgid "Game List ..." msgstr "Partiliste ..." #: menus.c:710 msgid "Sounds ..." msgstr "Lyde ..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "Blink ved træk" #: menus.c:721 msgid "Highlight Dragging" msgstr "Fremhæv flytning" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Fremhæv med pil" #: menus.c:725 msgid "Move Sound" msgstr "Lyd ved træk" #: menus.c:727 msgid "Periodic Updates" msgstr "Periodisk opdatering" #: menus.c:729 msgid "Popup Exit Message" msgstr "Pop op med afslutningsbeskeder" #: menus.c:731 msgid "Show Coords" msgstr "Vis koordinater" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "Skjul tænkning fra menneske" #: menus.c:736 msgid "Save Settings Now" msgstr "Gem indstillinger nu" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Gem indstillinger ved afslutning" #: menus.c:742 msgid "Info XBoard" msgstr "Info XBoard" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "Man XBoard F1" #: menus.c:745 msgid "XBoard Home Page" msgstr "XBoards hjemmeside (engelsk)" #: menus.c:746 msgid "On-line User Guide" msgstr "Online brugervejledning (engelsk)" #: menus.c:747 msgid "Development News" msgstr "Nyheder i denne version (engelsk)" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "E-mail fejlrapport" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "Skakprogram nr. 1" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "Forhåndstræk" #: nengineoutput.c:153 msgid "Engine output" msgstr "Output fra skakprogram" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Evalueringsgraf" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 msgid "find position" msgstr "find stilling" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "grænseværdier" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "Partidata" #: ngamelist.c:91 msgid "next" msgstr "næste" #: ngamelist.c:92 msgid "close" msgstr "luk" #: ngamelist.c:116 msgid "No game selected" msgstr "Der er ikke valgt et parti" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Kan ikke gå længere fremad" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "Skanner gennem partier (%d)" #: ngamelist.c:211 msgid "previous page" msgstr "forrige side" #: ngamelist.c:214 msgid "next page" msgstr "næste side" #: ngamelist.c:217 msgid "no games matched your request" msgstr "ingen partier svarer til din forespørgsel" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "%s - %d/%d partier (%d-%d-%d)" #: ngamelist.c:274 msgid "There is no game list" msgstr "Der er ingen partiliste" #: nhistory.c:109 msgid "Move list" msgstr "Trækliste" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "%s: ikke genkendt farve %s\n" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "%s: kan ikke fortolke forgrundsfarve i \"%s\"\n" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "%s: kan ikke fortolke farvenavne; deaktiverer farvning\n" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "FEJL: Ukendt bruger %s (i stien %s)\n" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "Er ikke konfigureret med sokkelunderstøttelse" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "intern rcmd er ikke implementeret til Unix" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "%s: Har ikke adgang til XPM-katalog %s\n" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "Tilgængelige \"%s\"-størrelser:\n" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "Fejl: Ingen \"%s\"-filer!\n" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" "Advarsel: Ingen DIR-struktur fundet på dette system --\n" " Kan ikke vælge størrelse for XPM/XIM-brikker.\n" " Rappotér venligst denne fejl til %s.\n" " Inkludér systemtype og styresystem i beskeden.\n" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "hvid pixel = 0x%lx, sort pixel = 0x%lx\n" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "Fejl %d ved indlæsning af ikonbillede\n" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "gennemse" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "o.k." #: xaw/xoptions.c:1274 msgid "cancel" msgstr "annullér" #~ msgid "recognized '%s' (%d) as variant %s\n" #~ msgstr "genkendte \"%s\" (%d) som variant %s\n" #~ msgid "Ratings from header: W %d, B %d\n" #~ msgstr "Ratinger fra teksthovede: H %d, S %d\n" #~ msgid "Parsing board: %s\n" #~ msgstr "Fortolker bræt: %s\n" #~ msgid "Found unexpected active ICS engine analyze \n" #~ msgstr "Fandt uventet aktivt skakprogram til ICS-analyse\n" #~ msgid "ICS engine analyze starting... \n" #~ msgstr "Starter skakprogram til ICS-analyse ...\n" #~ msgid "" #~ "resolved %s at pixel size %d\n" #~ " to %s\n" #~ msgstr "" #~ "løste %s ved pixelstørrelse %d\n" #~ " til %s\n" #~ msgid "New Game Ctrl+N" #~ msgstr "Nyt parti Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Ny variant ... Alt-shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Indlæs parti Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Indlæs stilling Ctrl+Shift+O" #~ msgid "Prev Position Shift+PgUp" #~ msgstr "Forrige stilling Shift+PgUp" #~ msgid "Save Game Ctrl+S" #~ msgstr "Gem parti Ctrl+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Gem stilling Ctrl+Shift+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Afslut Ctrl+Q" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Kopiér parti Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Redigér parti Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Redigér stilling Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "Annullér variantlinje Home" #~ msgid "Backward Alt+Left" #~ msgstr "Tilbage Alt+Venstre" #~ msgid "Forward Alt+Right" #~ msgstr "Fremad Alt+Højre" #~ msgid "Back to Start Alt+Home" #~ msgstr "Tilbage til start Alt+Home" #~ msgid "Flip View F2" #~ msgstr "Vend brættet F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Output fra skakprogram Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Trækliste Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "Evalueringsgraf Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Partiliste Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Skakprogram har sort Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Redigér parti Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Redigér stilling Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "Pause Pause" #~ msgid "Accept F3" #~ msgstr "Godkend F3" #~ msgid "Decline F4" #~ msgstr "Afvis F4" #~ msgid "Rematch F12" #~ msgstr "Ny match F12" #~ msgid "Draw F6" #~ msgstr "Remis F6" #~ msgid "Adjourn F7" #~ msgstr "Udsæt partiet F7" #~ msgid "Abort F8" #~ msgstr "Annullér partiet F8" #~ msgid "Resign F9" #~ msgstr "Opgiv F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Træk nu Ctrl+M" #~ msgid "Time Control ... Alt+Shift+T" #~ msgstr "Betænkningstid ... Alt+Shift+T" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Altid dronning Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Animeret flytning Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Automatisk tidsoverskridelse Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Spekulér på næste træk Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Skjul tænkning Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Test lovlighed Ctrl+Shift+L" #~ msgid "" #~ "WARNING: variants with un-orthodox\n" #~ "pieces only have built-in bitmaps\n" #~ "for -boardSize middling, bulky and\n" #~ "petite, and substitute king or amazon\n" #~ "for missing bitmaps. (See manual.)" #~ msgstr "" #~ "ADVARSEL: varianter med uortodokse\n" #~ "brikker har kun indbyggede bitmaps\n" #~ "for -boardSize middling, bulky og\n" #~ "petite, og bruger konge eller amazone\n" #~ "for manglende bitmaps. (Se manualen.)" #~ msgid "Directory with Pixmap Pieces:" #~ msgstr "Katalog med pixmap-brikker:" #~ msgid "Error expanding path name \"%s\"\n" #~ msgstr "Fejl ved udfoldning af stinavn \"%s\"\n" #~ msgid "" #~ "XBoard square size (hint): %d\n" #~ "%s fulldir:%s:\n" #~ msgstr "" #~ "XBoard feltstørrelse (tip): %d\n" #~ "%s-fuldt katalog: %s:\n" #~ msgid "Closest %s size: %d\n" #~ msgstr "Nærmeste %s størrelse: %d\n" #~ msgid "%s: error loading XIM!\n" #~ msgstr "%s: fejl ved indlæsning af XIM!\n" #~ msgid "XIM pieces cannot be used in monochrome mode" #~ msgstr "XIM-brikker kan ikke bruges i monokrom-tilstand" #~ msgid "" #~ "\n" #~ "Loading XIMs...\n" #~ msgstr "" #~ "\n" #~ "Indlæser XIM'er ...\n" #~ msgid "(File:%s:) " #~ msgstr "(Fil:%s:) " #~ msgid "light square " #~ msgstr "lyst felt " #~ msgid "dark square " #~ msgstr "mørkt felt " #~ msgid "Done.\n" #~ msgstr "Udført.\n" #~ msgid "XPM pieces cannot be used in monochrome mode" #~ msgstr "XPM-brikker kan ikke bruges i monokrom-tilstand" #~ msgid "No builtin XPM pieces of size %d\n" #~ msgstr "Der er ingen indbyggede XPM-brikker af størrelse %d\n" #~ msgid "Error %d loading XPM image \"%s\"\n" #~ msgstr "Error %d ved indlæsning af XPM-billede \"%s\"\n" #~ msgid "" #~ "\n" #~ "Loading XPMs...\n" #~ msgstr "" #~ "\n" #~ "Indlæser XPM'er ...\n" #~ msgid "(Replace by File:%s:) " #~ msgstr "(Erstatter med fil: %s) " #~ msgid "Error %d loading XPM file \"%s\"\n" #~ msgstr "Error %d ved indlæsning af XPM-fil \"%s\"\n" #~ msgid "Can't open bitmap file %s" #~ msgstr "Kan ikke åbne bitmapfil %s" #~ msgid "Invalid bitmap in file %s" #~ msgstr "Ukorrekt bitmap i fil %s" #~ msgid "Ran out of memory reading bitmap file %s" #~ msgstr "Ikke nok hukommelse til at læse bitmapfil %s" #~ msgid "Unknown XReadBitmapFile error %d on file %s" #~ msgstr "Ukendt XReadBitmapFile-fejl %d på fil %s" #~ msgid "%s: %s...using built-in\n" #~ msgstr "%s: %s ... bruger indbygget\n" #~ msgid "%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n" #~ msgstr "%s: Bitmap %s er %dx%d, ikke %dx%d ... bruger indbygget\n" #~ msgid "Browse" #~ msgstr "Gennemse" #~ msgid "Filter on extensions:" #~ msgstr "Filter for filendelser:" #~ msgid "Pathname:" #~ msgstr "Stinavn:" #~ msgid "XsraSelFile: can't get current directory" #~ msgstr "XsraSelFile: Kan ikke hente det aktuelle katalog" #~ msgid "%s: titleWidget geometry error %d %d %d %d %d\n" #~ msgstr "%s: titleWidget-geometrifejl %d %d %d %d %d\n" #~ msgid "%s: messageWidget geometry error %d %d %d %d %d\n" #~ msgstr "%s: messageWidget-geometrifejl %d %d %d %d %d\n" #~ msgid "Drop" #~ msgstr "Placér" #~ msgid "could not open: " #~ msgstr "kunne ikke åbne: " #~ msgid "Can't open file" #~ msgstr "Kan ikke åbne fil" #~ msgid "Promotion" #~ msgstr "Bondeforvandling" #~ msgid "Promote to what?" #~ msgstr "Hvad skal bonden forvandles til?" #~ msgid "ok" #~ msgstr "o.k." #~ msgid "AskQuestionProc needed 4 parameters, got %d\n" #~ msgstr "AskQuestionProc skal have 4 parametre, men fik %d\n" #~ msgid "enter" #~ msgstr "udfør" #~ msgid "This feature is experimental" #~ msgstr "Denne funktion er eksperimental" #~ msgid "filtertext" #~ msgstr "filtertekst" #~ msgid "apply" #~ msgstr "anvend" #~ msgid "load" #~ msgstr "indlæs" #~ msgid "prev" #~ msgstr "forrige" #~ msgid "First Engine" #~ msgstr "Første skakprogram" #~ msgid "Second Engine" #~ msgstr "Andet skakprogram" #~ msgid "AnimateMove: piece %d hops from %d,%d to %d,%d \n" #~ msgstr "AnimateMove: brik %d hopper fra %d,%d til %d,%d\n" #~ msgid "AnimateMove: piece %d slides from %d,%d to %d,%d \n" #~ msgstr "AnimateMove: brik %d glider fra %d,%d til %d,%d\n" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "Fremhæv flytning (vis trækmål)" xboard-4.7.3/po/zh_HK.po0000644000175000001440000015240312262562300011705 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110411\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "通訊協定版本 %d 不被支持" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "非法的\"timeControl\"(時間控制)選項 %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "非法的\"searchTime\"(搜尋時間)選項 %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "變體 %s 只在ICS模式下支持" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "未知的變體名 %s" #: backend.c:1375 msgid "Starting chess program" msgstr "啟動國際象棋程式" #: backend.c:1398 msgid "Bad game file" msgstr "棋局檔案錯誤" #: backend.c:1405 msgid "Bad position file" msgstr "盤面檔案錯誤" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "沒有象棋程式時無法進行比賽" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "無法打開通訊連接埠 %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "無法連接主機 %s 連接埠 %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "未知的\"initialMode\"(初始模式)選項 %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "\"AnalyzeFile\"(分析檔案)模式必須指定一個棋局檔案" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "\"Analysis\"(分析)模式必須啟動國際象棋引擎" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "\"Analysis\"(分析)模式無法在ICS模式下工作" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "\"MachineWhite\"(電腦執紅)模式必須啟動國際象棋引擎" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "\"MachineWhite\"(電腦執紅)模式無法在ICS模式下運行" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "\"MachineBlack\"(電腦執黑)模式必須啟動國際象棋引擎" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "\"MachineBlack\"(電腦執黑)模式無法在ICS模式下運行" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "\"TwoMachines\"(分析)模式必須啟動國際象棋引擎" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "\"TwoMachines\"(電腦對弈)模式無法在ICS模式下運行" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "\"Training\"(訓練)模式必須指定一個棋局檔案" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "發送訊息給ICS時出錯" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "讀取鍵盤時出錯" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "讀取鍵盤時遇到檔案尾" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "發送訊息給顯示器時出錯" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "讀取著法時出錯,出現兩個開頭" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "讀取著法時出錯,巢狀錯誤" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "連接被ICS關閉" #: backend.c:4167 msgid "Error reading from ICS" msgstr "讀取ICS訊息時出錯" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "棋局太長,需要增加\"MAX_MOVES\"並重新編譯" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "讀取著法時出錯,超出棋盤" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "無法解析從ICS讀到的著法\"%s\"" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say 內部錯誤,非法的\"moveType\"(著法類型) %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "你在執黑" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "你在執紅" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "輪到紅方走棋" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "輪到黑方走棋" #: backend.c:6552 msgid "Displayed position is not current" msgstr "顯示的盤面不是當前盤面" #: backend.c:6790 msgid "Illegal move" msgstr "著法錯誤" #: backend.c:6857 msgid "End of game" msgstr "棋局結束" #: backend.c:6860 msgid "Incorrect move" msgstr "著法錯誤" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "從%s機器讀到不合法著法\"%s\"" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s 不支持分析功能" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "不合法著法\"%s\" (%s國際象棋程式拒絕接受該著法)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "無法啟動%s國際象棋程式 %s(在主機 %s 上),%s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "提示 %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "電腦同意和棋" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "ICS輸出不明確的著法\"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "ICS輸出不明確的著法\"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "著法斷開" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "變體 %s 不被 %s 所支持" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "無法啟動'%s'" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "等待第一個國際象棋程式" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "等待第二個國際象棋程式" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 #, fuzzy msgid "Bad tournament file" msgstr "棋局檔案錯誤" #: backend.c:10472 #, fuzzy msgid "Waiting for other game(s)" msgstr "等待第一個國際象棋程式" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "比賽 %s vs. %s: 最終比分 %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "不合法著法 %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "不明確的著法 %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "無法打開\"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "無法建立棋局列表" #: backend.c:11594 msgid "No more games in this message" msgstr "這條訊息不包含更多的棋局" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "尚未有棋局載入" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "無法再後退了" #: backend.c:12077 msgid "Game number out of range" msgstr "棋局數量超出範圍" #: backend.c:12088 msgid "Can't seek on game file" msgstr "無法搜尋棋局檔案" #: backend.c:12146 msgid "Game not found in file" msgstr "檔案中沒有找到棋局" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "檔案中的FEN盤面錯誤" #: backend.c:12426 msgid "No moves in game" msgstr "棋局中沒有著法" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "尚未有盤面載入" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "無法搜尋盤面檔案" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "檔案中沒有找到盤面" #: backend.c:12632 msgid "Black to play" msgstr "輪到黑方走棋" #: backend.c:12635 msgid "White to play" msgstr "輪到紅方走棋" #: backend.c:12722 backend.c:13083 #, fuzzy msgid "Waiting for access to save file" msgstr "等待第二個國際象棋程式" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 #, fuzzy msgid "Saving position" msgstr "盤面檔案錯誤" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "你尚未走棋" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "不存在未完成棋局" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "呼叫cmail失敗" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "等待對手回應\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "本棋局仍需走棋\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "兩棋局皆仍需走棋\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "所有 %d 棋局皆仍需走棋\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "棋局 %s 仍需走棋\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "不存在未完成棋局\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "準備送信就緒\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "棋局 %s 仍需走棋\n" #: backend.c:13631 msgid "Edit comment" msgstr "編輯註解" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "編輯註解 %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "沒有輪到紅方走棋" #: backend.c:13877 msgid "It is not Black's turn" msgstr "沒有輪到黑方走棋" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "訓練模式已關閉" #: backend.c:14155 msgid "Training mode on" msgstr "訓練模式已打開" #: backend.c:14158 msgid "Already at end of game" msgstr "棋局已經結束" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "注意:你正在進行棋局" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "注意:你正在觀棋棋局" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "注意:你正在研究棋局" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "格子已有棋子" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "該著法沒有待定的提議" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "對手沒有超時" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "必須走完棋才能提和" #: backend.c:15109 msgid "You are not examining a game" msgstr "沒有分析棋局" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "暫停時不能復原棋局" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "輪到你走棋" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "等待對手走棋" #: backend.c:15237 msgid "No hint available" msgstr "沒有可用的提示" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "尚未有棋局載入" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "發送訊息到%s國際象棋程式時出錯" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "錯誤:%s國際象棋程式(%s)異常終止" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "從%s國際象棋程式(%s)接收訊息時出錯" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "顯示的著法不是當前著法" #: backend.c:16352 msgid "Could not parse move" msgstr "無法解析著法" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "雙方都超時了" #: backend.c:16479 msgid "White's flag fell" msgstr "紅方超時" #: backend.c:16501 msgid "Black's flag fell" msgstr "黑方超時" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "剪貼簿的FEN盤面錯誤" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "無法解析著法" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "封盤(J) F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 #, fuzzy msgid "Default Number of Games in Match (or Pairing):" msgstr "預設比賽對局數" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 #, fuzzy msgid "Save Tourney Games on:" msgstr "儲存棋局選項" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "動畫拖曳(D)" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "動畫走棋(A)" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "自動超時判負(F) Ctrl+Shift+F" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "自動翻轉棋盤(V)" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "盲棋(B)" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "與人對弈時隱藏思考細節" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "標記上一著法(M)" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "用箭頭突出移動" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "單擊移動(M)" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "定期更新(分析模式)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "同步思考(N)" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "離開時提示(P)" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "提示錯誤著法(E)" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "取得著法列表(G)" #: dialogs.c:383 msgid "Show Coordinates" msgstr "顯示坐標(C)" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "檢查著法合理性(L) Cl+Sh+L" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "審局圖" #: dialogs.c:400 msgid "General Options" msgstr "一般選項" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "警告: 第二個引擎(%s) 不支持此!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "變種" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "最大CPU數" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "雜湊表大小(MB)" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "EGTB 路徑" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "EGTB 大小(MB)" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "庫著法深度" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "庫變例" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "引擎1有自用庫" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "通用引擎設定" #: dialogs.c:540 msgid "Detect all Mates" msgstr "檢測將殺(M)" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "驗證引擎聲明(V)" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "子力不足時判和(I)" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "簡易和棋判決(T)" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "幾著後判和" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "輸/贏判決門檻" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "引擎 #1 是絕對分數" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "引擎 #2 是絕對分數" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "裁決紅贏 (W)" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "自動\"kibitz\"(A)" #: dialogs.c:570 msgid "Auto-Comment" msgstr "自動註解(A)" #: dialogs.c:571 msgid "Auto-Observe" msgstr "自動觀棋(O)" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "自動改變棋盤大小(R)" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "背景觀察(v)" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "雙棋盤(D)" #: dialogs.c:576 msgid "Get Move List" msgstr "取得著法列表(G)" #: dialogs.c:577 msgid "Quiet Play" msgstr "落子無聲(Q)" #: dialogs.c:578 msgid "Seek Graph" msgstr "可選對手圖表(k)" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "自動刷新圖表(R)" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "預先走棋(P)" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "紅方先走(W)" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "黑方先走(B)" #: dialogs.c:587 msgid "Alarm" msgstr "提示" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "ICS設定" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "尚未有棋局載入" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "載入棋局選項" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "儲存棋局選項" #: dialogs.c:681 msgid "No Sound" msgstr "無聲" #: dialogs.c:682 msgid "Default Beep" msgstr "預設聲音" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "播放" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "聲音" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "黑子" #: dialogs.c:790 msgid "Light Square Color:" msgstr "白格" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "黑格" #: dialogs.c:802 msgid "Highlight Color:" msgstr "格子標記" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "預先走棋標記" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "黑白" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "棋盤選項" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "編輯(E)" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "編輯標籤(T)" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 #, fuzzy msgid "Engine has no options" msgstr "引擎1有自用庫" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "啟動位置號碼(S)" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "隨機" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "洗牌遊戲(u)..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "時間倍數" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "引擎輸出" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "引擎1有自用庫" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "發送訊息給國際象棋程式時出錯" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "取消(C)" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "王" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "一般選項(G)..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "馬" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "象" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "車" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "國師" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "宰相" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "后" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "升變" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "向上" #: dialogs.c:1744 msgid "down" msgstr "向下" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "載入棋局選項" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "錯誤" #: dialogs.c:1906 msgid "Fatal Error" msgstr "嚴重錯誤" #: dialogs.c:1906 msgid "Exiting" msgstr "離開" #: dialogs.c:1917 msgid "Information" msgstr "資訊" #: dialogs.c:1924 msgid "Note" msgstr "註解" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "紅方" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "兵" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "象" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "炮" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "降級" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "清空格子" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "清空棋盤" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "黑方" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "檔案(F)" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "編輯(E)" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "模式(M)" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "行為(A)" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "選項(O)" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "說明(H)" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "檔案(F)" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "過濾器" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "過濾器" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "編輯註解(C) *.*" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "引擎輸出" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "棋局檔案錯誤" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "呼叫cmail失敗" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "關於XBoard(A)" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "洗牌遊戲(u)..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "洗牌遊戲(u)..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "變種" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "載入棋局選項(L)... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "盤面檔案錯誤" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "盤面檔案錯誤" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "盤面檔案錯誤" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "盤面檔案錯誤" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "複製遊戲列表到剪貼簿" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "複製局面到剪貼簿(Y) Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "複製遊戲列表到剪貼簿" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "貼上棋局自剪貼簿(P) Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "從剪貼簿貼上局面(T) Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "編輯註解" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "盤面檔案錯誤" #: menus.c:612 msgid "Edit Tags" msgstr "編輯標籤(T)" #: menus.c:613 msgid "Edit Comment" msgstr "編輯註解(C)..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "開局庫(B)..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "註解(A)" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "截斷後面的著法(T)" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "輪到黑方走棋" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "最後局面(E) Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "自動翻轉棋盤(V)" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "取得著法列表(G)" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "審局圖" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "遊戲列表..." #: menus.c:637 msgid "Comments" msgstr "編輯註解(C) *.*" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "棋盤選項(B)..." #: menus.c:642 msgid "Game List Tags..." msgstr "遊戲列表..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "電腦執紅(W) Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "電腦比賽(M)" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "電腦對弈(M) Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "分析模式(A) Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "分析檔案(F) Ctrl+F" #: menus.c:654 msgid "Training" msgstr "訓練(N)" #: menus.c:655 msgid "ICS Client" msgstr "ICS客戶端" #: menus.c:657 msgid "Machine Match" msgstr "電腦比賽(M)" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "超時判負(F) F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "停止觀棋(O) F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "停止研究(X) F11" #: menus.c:675 msgid "Upload to Examine" msgstr "上傳檢查(U)" #: menus.c:677 msgid "Adjudicate to White" msgstr "裁決紅贏 (W)" #: menus.c:678 msgid "Adjudicate to Black" msgstr "裁決黑贏 (B)" #: menus.c:679 msgid "Adjudicate Draw" msgstr "提請仲裁(D)" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "引擎 #1 設定" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "引擎 #2 設定" #: menus.c:690 msgid "Hint" msgstr "提示(H)..." #: menus.c:691 msgid "Book" msgstr "開局庫(B)..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "悔棋(R) Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "一般選項(G)..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "時間設定(T)... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "通用引擎設定(E)... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "判決(j)... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS選項..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "載入棋局選項(L)... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "儲存棋局選項(S)... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "遊戲列表..." #: menus.c:710 msgid "Sounds ..." msgstr "聲音選項(D)..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "拖曳醒目提示(H)" #: menus.c:724 msgid "Highlight With Arrow" msgstr "用箭頭突出移動" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "定期更新(U)" #: menus.c:729 msgid "Popup Exit Message" msgstr "離開時提示(P)" #: menus.c:731 msgid "Show Coords" msgstr "顯示坐標(C)" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "與人對弈時隱藏思考細節" #: menus.c:736 msgid "Save Settings Now" msgstr "立即儲存設定(N)" #: menus.c:737 msgid "Save Settings on Exit" msgstr "離開時儲存設定(X)" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "關於XBoard(A)" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "引擎輸出" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "著法" #: nengineoutput.c:153 msgid "Engine output" msgstr "引擎輸出" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "審局圖" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "盤面檔案錯誤" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "編輯標籤(T)" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "沒有選中棋局" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "無法再前進了" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "比賽 %s vs. %s: 最終比分 %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "沒有棋局列表" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "確定" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "取消(C)" #~ msgid "New Game Ctrl+N" #~ msgstr "開新棋局(N) Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "新變種(V)... Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "載入棋局(L)... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "載入局面(O)... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "儲存棋局(S)... Ctrl+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "儲存局面(A)... Ctrl+Shift+S" #~ msgid "Quit Ctr+Q" #~ msgstr "離開(Q)" #~ msgid "Copy Game Ctrl+C" #~ msgstr "複製棋局到剪貼簿(C) Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "編輯棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "編輯局面(d) Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "恢復(V)" #~ msgid "Backward Alt+Left" #~ msgstr "下一著(B) Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "上一著(F) Alt+Right" #~ msgid "Back to Start Alt+Home" #~ msgstr "起始局面(S) Alt+Home" #~ msgid "Flip View F2" #~ msgstr "翻轉棋盤(V) F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "顯示引擎輸出 Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "顯示歷史著法 Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "顯示評價圖 Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "顯示棋局列表(L) Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "電腦執黑(B) Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "編輯棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "編輯局面(d) Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "暫停(P) Pause" #~ msgid "Accept F3" #~ msgstr "接受(A) F3" #~ msgid "Decline F4" #~ msgstr "拒絕(C) F4" #~ msgid "Rematch F12" #~ msgstr "重賽(M) F12" #~ msgid "Draw F6" #~ msgstr "提和(D) F6" #~ msgid "Adjourn F7" #~ msgstr "封盤(J) F7" #~ msgid "Abort F8" #~ msgstr "中止(B) F8" #~ msgid "Resign F9" #~ msgstr "認輸(R) F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "立即走棋(M) Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "總是升變為皇后(Q) Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "動畫走棋(A) Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "自動超時判負(F) Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "同步思考(N) Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "隱藏引擎思考 Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "檢查著法合理性(L) Cl+Sh+L" #~ msgid "Drop" #~ msgstr "取消" #, fuzzy #~ msgid "could not open: " #~ msgstr "無法解析著法" #~ msgid "Promotion" #~ msgstr "升變" #~ msgid "ok" #~ msgstr "確定" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "拖曳醒目提示(H)" #~ msgid "White " #~ msgstr "紅方 " #~ msgid "Black " #~ msgstr "黑方 " #~ msgid "Close" #~ msgstr "關閉(C)" #~ msgid "sec/move" #~ msgstr "每走一步加" xboard-4.7.3/po/POTFILES.in0000755000175000001440000000037012262415351012120 00000000000000args.h backend.c book.c dialogs.c draw.c engineoutput.c gamelist.c gtk/xboard.c gtk/xengineoutput.c gtk/xoptions.c menus.c nengineoutput.c nevalgraph.c ngamelist.c nhistory.c usystem.c xaw/xboard.c xaw/xengineoutput.c xaw/xhistory.c xaw/xoptions.c xboard-4.7.3/po/vi.po0000644000175000001440000014062712262562300011325 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # , 2010 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110507\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "" #: backend.c:1375 msgid "Starting chess program" msgstr "" #: backend.c:1398 msgid "Bad game file" msgstr "" #: backend.c:1405 msgid "Bad position file" msgstr "" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "" #: backend.c:4167 msgid "Error reading from ICS" msgstr "" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "" #: backend.c:6552 msgid "Displayed position is not current" msgstr "" #: backend.c:6790 msgid "Illegal move" msgstr "" #: backend.c:6857 msgid "End of game" msgstr "" #: backend.c:6860 msgid "Incorrect move" msgstr "" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "" #: backend.c:9296 msgid "Gap in move list" msgstr "" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 msgid "Bad tournament file" msgstr "" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "" #: backend.c:11594 msgid "No more games in this message" msgstr "" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "" #: backend.c:12077 msgid "Game number out of range" msgstr "" #: backend.c:12088 msgid "Can't seek on game file" msgstr "" #: backend.c:12146 msgid "Game not found in file" msgstr "" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "" #: backend.c:12426 msgid "No moves in game" msgstr "" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "" #: backend.c:12632 msgid "Black to play" msgstr "" #: backend.c:12635 msgid "White to play" msgstr "" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "" #: backend.c:13631 msgid "Edit comment" msgstr "" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "" #: backend.c:13877 msgid "It is not Black's turn" msgstr "" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "" #: backend.c:14155 msgid "Training mode on" msgstr "" #: backend.c:14158 msgid "Already at end of game" msgstr "" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "" #: backend.c:15109 msgid "You are not examining a game" msgstr "" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "" #: backend.c:15237 msgid "No hint available" msgstr "" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "" #: backend.c:16352 msgid "Could not parse move" msgstr "" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "" #: backend.c:16479 msgid "White's flag fell" msgstr "" #: backend.c:16501 msgid "Black's flag fell" msgstr "" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 msgid "Could not create book" msgstr "" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr " F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Tự Động Đặt Cờ" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Tự Động Xoay Bàn Cờ" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Mù Quáng" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Đánh Dấu Nước Cuối" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Đánh Dấu Với Mũi Tên" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Đi Quân Với Chỉ Một Bấm" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Bật Cửa Sổ Thoát Chương trình" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Bật Cửa Sổ Lỗi Nước Đi" #: dialogs.c:382 msgid "Scores in Move List" msgstr "" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Hiện Tọa Độ" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Kiểm Tra Hợp Lệ" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "" #: dialogs.c:400 msgid "General Options" msgstr "Các Lựa Chọn Chung" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "" #: dialogs.c:540 msgid "Detect all Mates" msgstr "" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Phân Xử Trắng Thắng" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "" #: dialogs.c:570 msgid "Auto-Comment" msgstr "" #: dialogs.c:571 msgid "Auto-Observe" msgstr "" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Tự Động Hiện Bàn Cờ" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "" #: dialogs.c:576 msgid "Get Move List" msgstr "" #: dialogs.c:577 msgid "Quiet Play" msgstr "" #: dialogs.c:578 msgid "Seek Graph" msgstr "" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "" #: dialogs.c:587 msgid "Alarm" msgstr "" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 msgid "No games before year:" msgstr "" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "Các Lựa Chọn Tải Ván Cờ" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "Các Lựa Chọn Lưu Ván Cờ" #: dialogs.c:681 msgid "No Sound" msgstr "Không âm thanh" #: dialogs.c:682 msgid "Default Beep" msgstr "Tiếng tút ngầm định" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "Chơi" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "Âm thanh" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "" #: dialogs.c:790 msgid "Light Square Color:" msgstr "" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "" #: dialogs.c:802 msgid "Highlight Color:" msgstr "" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "Soạn" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Các Thẻ" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "" #: dialogs.c:1372 msgid "randomize" msgstr "" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Tráo Bên..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "Hệ số thời gian lẻ" #: dialogs.c:1416 msgid "Engine #1" msgstr "" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "Bỏ" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Vua" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "Chung..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Mã" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Tượng" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Xe" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Sĩ" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Xe" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Hoàng Hậu" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Phong Cấp" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "" #: dialogs.c:1744 msgid "down" msgstr "" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "Các Lựa Chọn Tải Ván Cờ" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "" #: dialogs.c:1906 msgid "Fatal Error" msgstr "" #: dialogs.c:1906 msgid "Exiting" msgstr "" #: dialogs.c:1917 msgid "Information" msgstr "" #: dialogs.c:1924 msgid "Note" msgstr "" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Trắng" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Tốt" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Tượng" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Pháo" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Ô Trống" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Xóa Bàn Cờ" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Đen" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Soạn" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Hướng Dẫn" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "Lọc" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Lọc" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Lọc" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "Bình Chú" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "In Ra Của Các Chương Trình Cờ Alt+Shift+O" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Thông Tin Về XBoard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Tráo Bên..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Tráo Bên..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Biến Mới... Alt+Shift+V" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Tải Ván Cờ... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "Âm thanh" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "Âm thanh" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "Phong cấp" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Lưu Ván Cờ... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "Lưu Thế Cờ... Ctrl+Shift+S" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Lưu Ván Cờ... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Copy Danh Sách Các Ván Cờ Vào Clipboard" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Chép Thế Cờ Vào Clipboard Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "Copy Danh Sách Các Ván Cờ Vào Clipboard" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Dán Ván Cờ Từ Clipboard Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Dán Thế Cờ Từ Clipboard Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Soạn Các Thẻ..." #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "Âm thanh" #: menus.c:612 msgid "Edit Tags" msgstr "Soạn Các Thẻ..." #: menus.c:613 msgid "Edit Comment" msgstr "Soạn Bình Chú..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "Cẩm Nang Khai Cuộc..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Chú Giải" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Cắt Ngắn Ván Cờ End" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Quay Lại Đến Đầu Alt+Home" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "Đi Tiếp Tới Cuối Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Tự Động Xoay Bàn Cờ" #: menus.c:631 msgid "Move History" msgstr "" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Đồ Thị Lượng Giá Alt+Shift+E" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Danh Sách Ván Cờ" #: menus.c:637 msgid "Comments" msgstr "Bình Chú" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Bàn Cờ..." #: menus.c:642 msgid "Game List Tags..." msgstr "Các Thẻ của Danh Sách Ván Cờ" #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Máy Chơi Bên Trắng Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Trận Đấu Với Máy" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "Máy Chơi Cả Hai Bên Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Chế Độ Phân Tích Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Phân Tích File Ctrl+F" #: menus.c:654 msgid "Training" msgstr "Đang Dậy Máy" #: menus.c:655 msgid "ICS Client" msgstr "Kết Nối Chơi Với Máy Chủ ICS" #: menus.c:657 msgid "Machine Match" msgstr "Trận Đấu Với Máy" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Đặt Cờ F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Ngừng Xem" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Ngừng Thử" #: menus.c:675 msgid "Upload to Examine" msgstr "Tải Để " #: menus.c:677 msgid "Adjudicate to White" msgstr "Phân Xử Trắng Thắng" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Phân Xử Đen Thắng" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Phân Xử Hòa" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Đặt Tham Số Cho Chương Trình Chơi 1..." #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Đặt Tham Số Cho Chương Trình Chơi 2..." #: menus.c:690 msgid "Hint" msgstr "Gợi Ý..." #: menus.c:691 msgid "Book" msgstr "Cẩm Nang Khai Cuộc..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Hoãn Nước Đi Vừa Rồi Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "Chung..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Đặt Thời Gian... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Chương Trình Cờ Chung... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Phân Xử Kết Quả... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "Tải Ván Cờ... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "Lưu Ván Cờ... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "Danh Sách Ván Cờ" #: menus.c:710 msgid "Sounds ..." msgstr "Âm Thanh" #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "Đánh Dấu Khi Đang Kéo Quân Cờ" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Đánh Dấu Với Mũi Tên" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "Cập Nhật Theo Chu Kỳ" #: menus.c:729 msgid "Popup Exit Message" msgstr "Bật Cửa Sổ Thoát Chương trình" #: menus.c:731 msgid "Show Coords" msgstr "Hiện Tọa Độ" #: menus.c:732 msgid "Hide Thinking" msgstr "" #: menus.c:736 msgid "Save Settings Now" msgstr "Lưu Các Tham Số Ngay" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Lưu Các Tham Số Khi Kết Thúc" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "Thông Tin Về XBoard" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 msgid "engine name" msgstr "" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "số giây mỗi nước" #: nengineoutput.c:153 msgid "Engine output" msgstr "" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "Âm thanh" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "Các Thẻ" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "" #: ngamelist.c:274 msgid "There is no game list" msgstr "" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "Được" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "Bỏ" #~ msgid "New Game Ctrl+N" #~ msgstr "Ván Mới Ctrl+N" #~ msgid "Load Game Ctrl+O" #~ msgstr "Tải Ván Cờ... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Tải Thế Cờ... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "Lưu Ván Cờ... Ctrl+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Thoát" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Chép Ván Cờ Vào Clipboard Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Soạn Ván Cờ Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Soạn Thế Cờ Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "Ngược Lại Home" #~ msgid "Backward Alt+Left" #~ msgstr "Quay Trở Lại Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "Đi Tiếp Alt+Right" #~ msgid "Flip View F2" #~ msgstr "Lật Ngược Bàn Cờ F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "In Ra Của Các Chương Trình Cờ Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Các Nước Đi Alt+Shift+H" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Danh Sách Các Ván Cờ Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Máy Chơi Bên Đen Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Soạn Ván Cờ Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Soạn Thế Cờ Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "Tạm Dừng Pause" #~ msgid "Accept F3" #~ msgstr "Chấp Nhận F3" #~ msgid "Decline F4" #~ msgstr "Từ Chối F4" #~ msgid "Rematch F12" #~ msgstr "Chơi Ván Nữa F12" #~ msgid "Draw F6" #~ msgstr "Hòa F6" #~ msgid "Adjourn F7" #~ msgstr " F7" #~ msgid "Abort F8" #~ msgstr "Bỏ F8" #~ msgid "Resign F9" #~ msgstr "Nhận Thua F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Phải Đi Ngay Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Luôn Là Hoàng Hậu Ctrl+Shift+Q" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Tự Động Đặt Cờ" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Tiếp Tục Tính Trước" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Ẩn Suy Nghĩ" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Kiểm Tra Hợp Lệ" #~ msgid "Drop" #~ msgstr "Đứt" #~ msgid "ok" #~ msgstr "Được" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "Đánh Dấu Khi Đang Kéo Quân Cờ" #~ msgid "White " #~ msgstr " " #~ msgid "Black " #~ msgstr " " #~ msgid "Close" #~ msgstr "Đóng" xboard-4.7.3/po/ru.po0000644000175000001440000016744012262562300011337 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # Перевод: А.В.Сердюков (2003), Hr.Burunduk (2011), 2010 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110507\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "версия протокола %d не поддерживается" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "timeControl: неверный параметр %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "searchTime: неверный параметр %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "Вариант %s поддерживается только в режиме ICS" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Неизвестный вариант %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Запускается шахматная программа" #: backend.c:1398 msgid "Bad game file" msgstr "Неправильный формат файла" #: backend.c:1405 msgid "Bad position file" msgstr "Неправильный формат файла позиции" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "Не подключено ни одной шахматной программы" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "Не могу открыть COM-порт %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "Не могу установить связь с %s, порт %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "initialMode: неизвестный режим %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "Режим анализа: не указан файл для анализа" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "Для анализа необходима шахматная программа" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "Режим анализа не совместим с режимом ICS" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "В режиме \"Компьютер белыми\" нужна шахматная программа" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "Режим \"Компьютер белыми\" не совместим с режимом ICS" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "В режиме \"Компьютер черными\" нужна шахматная программа (движок)" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "Режим \"Компьютер черными\" не совместим с режимом ICS" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "В режиме \"Два движка\" нужна шахматная программа" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "Режим \"Два движка\" не совместим с режимом ICS" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "Для тренировки необходимо загрузить шахматную партию из файла" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Ошибка записи на вход сервера ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Ошибка клавиатуры" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Получен символ конца файла с клавиатуры" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Ошибка записи на дисплей" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Ошибка чтения списка ходов: два заголовка" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Ошибка чтения списка ходов: вложенные списки" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "Сервер ICS разорвал соединение" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Ошибка чтения с сервера ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" "Слишком длинная партия: увеличьте значение MAX_MOVES и перекомпилируйте " "программу" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Ошибка чтения списка ходов: лишняя доска" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "Странный ход \"%s\" получен с сервера ICS" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "Вы играете черными" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Вы играете белыми" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Ход белых" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Ход черных" #: backend.c:6552 msgid "Displayed position is not current" msgstr "Показанная позиция не соответствует положению в игре" #: backend.c:6790 msgid "Illegal move" msgstr "Неправильный ход" #: backend.c:6857 msgid "End of game" msgstr "Сыгран последний записанный ход" #: backend.c:6860 msgid "Incorrect move" msgstr "Неверный ход" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Неправильный ход \"%s\" пытается выполнить движок %s" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s не поддерживает режим анализа" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "Неправильный ход \"%s\" (не принят движком %s)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Не удалось запустить %s движок %s на %s: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Подсказка: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "Компьютер согласился на ничью" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Неоднозначный ход с сервера ICS: \"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Неправильный ход с сервера ICS: \"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "Пропуск в записи ходов" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "Вариант %s не поддерживается %s" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Ошибка при запуске программы '%s'" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "Ждем первую шахматную программу" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "Ждем вторую шахматную программу" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 msgid "Bad tournament file" msgstr "" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Матч %s против %s: финальный результат %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Неправильный ход: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Неоднозначный ход: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "Не могу открыть файл \"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "Не удалось создать список партий" #: backend.c:11594 msgid "No more games in this message" msgstr "В этом сообщении больше нет шахматных партий" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Нет загруженных шахматных партий" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Достигнуто начало списка" #: backend.c:12077 msgid "Game number out of range" msgstr "Номер партии - вне диапазона" #: backend.c:12088 msgid "Can't seek on game file" msgstr "Поиск в файлах записей партий не предусмотрен" #: backend.c:12146 msgid "Game not found in file" msgstr "Партия не найдена в файле" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Неправильная позиция формата FEN в файле" #: backend.c:12426 msgid "No moves in game" msgstr "Нет записанных ходов" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Нет загруженных позиций" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "Поиск в файлах позиций не предусмотрен" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "Позиция не найдена в файле" #: backend.c:12632 msgid "Black to play" msgstr "Ход черных" #: backend.c:12635 msgid "White to play" msgstr "Ход белых" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "Вы еще не сделали ход" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "Нет неоконченных партий" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Ошибка запуска cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Ожидание ответного хода\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Все еще ваша очередь ходить в этой партии\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Все еще ваша очередь ходить в обеих партиях\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Все еще ваш ход во всех %d партиях\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Все еще ваш ход в партии %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "Нет неоконченных партий\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Можно отсылать почту\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Все еще ваша очередь ходить в партиях %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "Правка комментария" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Правка комментария к %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "Сейчас не ход белых" #: backend.c:13877 msgid "It is not Black's turn" msgstr "Сейчас не ход черных" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "Тренировка окончена" #: backend.c:14155 msgid "Training mode on" msgstr "Тренировка" #: backend.c:14158 msgid "Already at end of game" msgstr "Сыграны все ходы данной партии" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Предупреждение: вы все еще продолжаете играть" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Предупреждение: вы все еще наблюдаете за игрой" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Предупреждение: вы все еще изучаете игру" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "Это поле занято" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "К данному ходу никаких предложений не сделано" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "У вашего соперника еще есть время" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Вы должны сделать свой ход прежде, чем предлагать ничью" #: backend.c:15109 msgid "You are not examining a game" msgstr "Не включен режим изучения шахматных партий" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "Нельзя вернуться к началу пока выбрана \"Пауза\"" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "Ваш ход" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Подождите своей очереди ходить" #: backend.c:15237 msgid "No hint available" msgstr "Подсказок нет" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "Нет загруженных шахматных партий" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Ошибка записи на вход движка %s" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Ошибка: движок %s (%s) завершил работу" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Ошибка чтения с выхода движка %s (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "Позиция не отвечает положению в игре" #: backend.c:16352 msgid "Could not parse move" msgstr "Невозможно интерпретировать ход" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "У обоих игроков время вышло" #: backend.c:16479 msgid "White's flag fell" msgstr "У белых упал флажок" #: backend.c:16501 msgid "Black's flag fell" msgstr "У черных упал флажок" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Позиция в буфере обмена не соответствует формату FEN" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "Невозможно интерпретировать ход" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "Отложить F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 #, fuzzy msgid "Replace Engine" msgstr "Движок" #: dialogs.c:285 #, fuzzy msgid "Upgrade Engine" msgstr "Движок" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Анимация перетаскивания" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Анимация ходов" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Проверять время" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Авторазворот доски" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Невидимые фигуры" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "Скрывать вывод движка в игре против человека" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Выделять последний ход" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Выделять стрелкой" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Ход одним щелчком" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "Периодически обновлять (в режиме анализа)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Думать всегда" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Сообщение при выходе" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Сообщать о неправильном ходе" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "Запрашивать запись ходов" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Показывать координаты" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Проверять правильность хода CS+L" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "Оценка позиции" #: dialogs.c:400 msgid "General Options" msgstr "Общие настройки" #: dialogs.c:410 msgid "normal" msgstr "обычные" #: dialogs.c:411 msgid "makruk" msgstr "макрук" #: dialogs.c:412 msgid "FRC" msgstr "Фишера (960)" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 #, fuzzy msgid "cylinder *" msgstr "цилиндрические" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "атомные" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "Сейравана" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "шведки" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "поддавки (мат)" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "Предупреждение: второй движок (%s) не поддерживает это!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "Варианты" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Max число CPU:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Размер хеша (МБ):" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "Путь к ЭБД:" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "Кеш ЭБД (МБ):" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "Глубина книги:" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "Варьирование:" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "Своя книга у движка 1" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "Общие настройки движков" #: dialogs.c:540 msgid "Detect all Mates" msgstr "Определять мат" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "Проверять требования движка" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "Ничья при нехватке материала" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "Ничья в технич. окончаниях" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Присудить ничью после" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Победа/поражение при перевесе в" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Оценка движка 1 - абсолютная" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Оценка движка 2 - абсолютная" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Присудить победу белым" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Комментарии" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Следить за игрой" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Раскрывать доску" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Следить в фоне" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Двойная доска" #: dialogs.c:576 msgid "Get Move List" msgstr "Запрашивать запись ходов" #: dialogs.c:577 msgid "Quiet Play" msgstr "Спокойная игра" #: dialogs.c:578 msgid "Seek Graph" msgstr "График поиска" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "Автообновление" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "Предварительный ход" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "1-й ход белых" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "1-й ход черных" #: dialogs.c:587 msgid "Alarm" msgstr "Звонок" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "Настройки соединения с ICS" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "Нет загруженных шахматных партий" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "Параметры загрузки" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "Настройки сохранения" #: dialogs.c:681 msgid "No Sound" msgstr "Без звука" #: dialogs.c:682 msgid "Default Beep" msgstr "Простой сигнал" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "Послушать" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "Звуки" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "Черные фигуры" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Белые поля" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Черные поля" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Выделенное поле" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "Предварит. ход" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "Монохромная" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "Настройки доски" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "Правка" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Описание" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Номер позиции:" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "Случайно" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Новая в смешанные шахматы..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "Фактор времени движков:" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "Движок" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "Своя книга у движка 1" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Ошибка подключения к шахматной программе" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "Отмена" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Король" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "Общие..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Конь" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Слон" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Ладья" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Архиепископ" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Канцлер" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Ферзь" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Превратить" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "Стандарт" #: dialogs.c:1743 msgid "up" msgstr "Вверх" #: dialogs.c:1744 msgid "down" msgstr "Вниз" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "Параметры загрузки" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Ошибка" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Неисправимая ошибка" #: dialogs.c:1906 msgid "Exiting" msgstr "Выход" #: dialogs.c:1917 msgid "Information" msgstr "Информация" #: dialogs.c:1924 msgid "Note" msgstr "Примечание" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Белые" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Пешка" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Слон (стар.)" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Пушка" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "Разжаловать" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Пустое поле" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Очистить доску" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Черные" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Файл" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Правка" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Вид" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Режим" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Игра" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Движок" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Настройки" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Справка" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "Файл" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Фильтр" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Фильтр" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "Комментарии" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "Вывод движка" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS (Узл./сек.)" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "Неправильный формат файла" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "Ошибка запуска cmail" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "О программе XBoard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Новая в смешанные шахматы..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Новая в смешанные шахматы..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Варианты" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Загрузка... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "Неправильный формат файла позиции" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "Неправильный формат файла позиции" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "Превращение" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Сохранение... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "Сохранить позицию... Ctrl+Shift+S" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Сохранение... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Копировать список партий" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Копировать позицию Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "Копировать список партий" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Вставить партию Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Вставить позицию Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Правка комментария" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "Неправильный формат файла позиции" #: menus.c:612 msgid "Edit Tags" msgstr "Править описание..." #: menus.c:613 msgid "Edit Comment" msgstr "Править комментарий..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "Книга..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Записать и вернуться" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Отбросить последующие ходы End" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Ход черных" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "В конец Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Авторазворот доски" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Запрашивать запись ходов" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Оценка позиции" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Список партий..." #: menus.c:637 msgid "Comments" msgstr "Комментарии" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Доска..." #: menus.c:642 msgid "Game List Tags..." msgstr "Содержание списка партий..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Компьютер белыми Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Начать матч движков" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "Два движка Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Анализ Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Анализировать файл Ctrl+F" #: menus.c:654 msgid "Training" msgstr "Тренировка" #: menus.c:655 msgid "ICS Client" msgstr "Клиент ICS" #: menus.c:657 msgid "Machine Match" msgstr "Начать матч движков" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Проверить время F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Прекратить наблюдение за игрой F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Прекратить изучение партии F11" #: menus.c:675 msgid "Upload to Examine" msgstr "Загрузить на сервер для изучения" #: menus.c:677 msgid "Adjudicate to White" msgstr "Присудить победу белым" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Присудить победу черным" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Присудить ничью" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Настройки движка 1..." #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Настройки движка 2..." #: menus.c:690 msgid "Hint" msgstr "Подсказка..." #: menus.c:691 msgid "Book" msgstr "Книга..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Взять ход назад Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "Общие..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Контроль времени... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Общие для движков... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Присуждение... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "Загрузка... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "Сохранение... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "Список партий..." #: menus.c:710 msgid "Sounds ..." msgstr "Звуки..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "Выделять при перетаскивании" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Выделять стрелкой" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "Периодически обновлять" #: menus.c:729 msgid "Popup Exit Message" msgstr "Сообщение при выходе" #: menus.c:731 msgid "Show Coords" msgstr "Показывать координаты" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "Скрывать вывод движка в игре против человека" #: menus.c:736 msgid "Save Settings Now" msgstr "Сохранить настройки сейчас" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Сохранять настройки при выходе" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "О программе XBoard" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "Движок" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "ходов" #: nengineoutput.c:153 msgid "Engine output" msgstr "Вывод движка" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Оценка позиции" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "Неправильный формат файла позиции" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "Описание" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "Выберите партию из списка" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Достигнут конец списка" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "Матч %s против %s: финальный результат %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "Нет списка партий" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "OK" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "Отмена" #~ msgid "New Game Ctrl+N" #~ msgstr "Новая партия Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Новый вариант... Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Загрузить партию... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Загрузить позицию... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "Сохранить партию... Ctrl+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Выход" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Копировать партию Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Править партию Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Править позицию Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "Вернуться Home" #~ msgid "Backward Alt+Left" #~ msgstr "Назад Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "Вперед Alt+Right" #~ msgid "Back to Start Alt+Home" #~ msgstr "В начало Alt+Home" #~ msgid "Flip View F2" #~ msgstr "Развернуть доску F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Вывод движка Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Список ходов Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "График оценки Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Список партий Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Компьютер черными Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Править партию Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Править позицию Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "Пауза" #~ msgid "Accept F3" #~ msgstr "Принять F3" #~ msgid "Decline F4" #~ msgstr "Отклонить F4" #~ msgid "Rematch F12" #~ msgstr "Переиграть F12" #~ msgid "Draw F6" #~ msgstr "Ничья F6" #~ msgid "Adjourn F7" #~ msgstr "Отложить F7" #~ msgid "Abort F8" #~ msgstr "Прервать F8" #~ msgid "Resign F9" #~ msgstr "Сдаться F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Делай ход! Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Всегда в ферзя CS+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Анимация ходов CS+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Проверять время CS+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Думать всегда CS+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Скрыть главный вариант CS+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Проверять правильность хода CS+L" #~ msgid "Drop" #~ msgstr "Выставить" #, fuzzy #~ msgid "could not open: " #~ msgstr "Невозможно интерпретировать ход" #~ msgid "ok" #~ msgstr "OK" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "Выделять при перетаскивании" #~ msgid "White " #~ msgstr "Белые " #~ msgid "Black " #~ msgstr "Черные " #~ msgid "Close" #~ msgstr "Закрыть" #~ msgid "sec/move" #~ msgstr "сек. на ход" xboard-4.7.3/po/stamp-po0000644000175000001440000000001212262562300012011 00000000000000timestamp xboard-4.7.3/po/Makevars0000755000175000001440000000341612262415351012043 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Free Software Foundation, Inc. # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = xboard-4.7.3/po/zh_HK.gmo0000644000175000001440000004037712262562300012057 00000000000000Q +2'Bj~")%%:`q      ; Tbt{   $#=)Z  6%Ek! !6$P'u     -D [i&o!&(!;]r0.  :FK] o}/  $2Pfk   0 !Q s   ) . 5 I W i w - ) - )!%G!"m!! !!!!!!! ""%"A"R"d""""""""""###7#<#M#`#t###### ### #$$&$ <$G$ X$ d$ r$}$$$&$!$* %(7%&`%% %%%&%%% &"&,>&(k&&&&&%&'6'K' k' '''''%'2#(V( \(j(|((((((.) F)g))))!)1))b)`+y+ ++++++++,30,6d,?,,, ,-" -/-E-U-g-w------...".). <. I. S.`.s.. ....'../(/A/E/^/ e/r////"// 0% 0F0 M0Z0a0!q0!000 00 011 (151J1 N1 [1h1|11 11$1$1*10'2X2q2,22*2!2-3 K3U3\3;n3 3 3333344564 l4y44 4444 4!4 !5.5D5Z5p5 5 5 5 5 5 5?5$636S6 k6x666666666&6707@7=S7@7=7@8'Q8 y8 888 88888999%989$N9s9999999 999:):0:@:S:f:|::::::::&:;(;>;W;m;};;;;;;;; <7<Q<i< y<<<< <<<6=<L=9=-==>>"5>X>n>!>>!>>>?)6?`?g? z??? ? ????@,#@-P@ ~@@"@E@@#%;V/3J(?}L7Y2T80\$'IM~mjtn!+ |.cB]Uz-@6{" xAg4h Ga=wCE F<sqRy>vb u9)fX_,*iW1D&QdloK^k5PprSOH[`: ZeN%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveInformationIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timebad searchTime option %sbad timeControl option %scanceldownprotocol version %d not supportedsay Internal error; bad moveType %d (%d,%d-%d,%d)upProject-Id-Version: GNU xboard master-20110411 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: zh_HK MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s 不支持分析功能關於XBoard(A)行為(A)提請仲裁(D)簡易和棋判決(T)裁決黑贏 (B)裁決紅贏 (W)提示棋局已經結束ICS輸出不明確的著法"%s"不明確的著法 %d.%s%s"Analysis"(分析)模式無法在ICS模式下工作"Analysis"(分析)模式必須啟動國際象棋引擎"AnalyzeFile"(分析檔案)模式必須指定一個棋局檔案動畫拖曳(D)動畫走棋(A)註解(A)國師自動超時判負(F) Ctrl+Shift+F自動翻轉棋盤(V)自動註解(A)自動"kibitz"(A)自動觀棋(O)自動改變棋盤大小(R)自動刷新圖表(R)背景觀察(v)剪貼簿的FEN盤面錯誤檔案中的FEN盤面錯誤棋局檔案錯誤盤面檔案錯誤象黑方黑子輪到黑方走棋黑方超時盲棋(B)棋盤選項棋盤選項(B)...開局庫(B)...庫著法深度庫變例雙方都超時了無法再後退了無法再前進了沒有象棋程式時無法進行比賽無法打開"%s"無法搜尋棋局檔案無法搜尋盤面檔案炮無法建立棋局列表宰相清空棋盤編輯註解(C) *.*通用引擎設定連接被ICS關閉複製遊戲列表到剪貼簿無法連接主機 %s 連接埠 %s無法打開通訊連接埠 %s無法解析著法無法解析從ICS讀到的著法"%s"黑格預設聲音降級檢測將殺(M)顯示的著法不是當前著法顯示的盤面不是當前盤面幾著後判和子力不足時判和(I)雙棋盤(D)EGTB 大小(MB)編輯(E)編輯註解(C)...編輯標籤(T)編輯註解編輯註解 %d.%s%s象清空格子棋局結束引擎1有自用庫引擎 #1 設定引擎 #2 設定引擎輸出錯誤讀取著法時出錯,超出棋盤讀取著法時出錯,巢狀錯誤讀取著法時出錯,出現兩個開頭從%s國際象棋程式(%s)接收訊息時出錯讀取ICS訊息時出錯讀取鍵盤時出錯發送訊息到%s國際象棋程式時出錯發送訊息給ICS時出錯發送訊息給國際象棋程式時出錯發送訊息給顯示器時出錯錯誤:%s國際象棋程式(%s)異常終止審局圖離開呼叫cmail失敗無法啟動%s國際象棋程式 %s(在主機 %s 上),%s 嚴重錯誤檔案(F)黑方先走(B)紅方先走(W)遊戲列表...遊戲列表...檔案中沒有找到棋局棋局數量超出範圍棋局太長,需要增加"MAX_MOVES"並重新編譯著法斷開一般選項(G)...一般選項(G)...一般選項取得著法列表(G)讀取鍵盤時遇到檔案尾雜湊表大小(MB)說明(H)與人對弈時隱藏思考細節格子標記拖曳醒目提示(H)標記上一著法(M)用箭頭突出移動用箭頭突出移動提示(H)...提示 %sICS選項...ICS客戶端ICS設定著法錯誤不合法著法"%s" (%s國際象棋程式拒絕接受該著法)從%s機器讀到不合法著法"%s"ICS輸出不明確的著法"%s"不合法著法 %d.%s%s著法錯誤資訊輪到黑方走棋輪到紅方走棋沒有輪到黑方走棋沒有輪到紅方走棋輪到你走棋王馬白格載入棋局選項(L)... Alt+Shift+L載入棋局選項電腦比賽(M)電腦同意和棋"MachineBlack"(電腦執黑)模式無法在ICS模式下運行"MachineBlack"(電腦執黑)模式必須啟動國際象棋引擎"MachineWhite"(電腦執紅)模式無法在ICS模式下運行"MachineWhite"(電腦執紅)模式必須啟動國際象棋引擎比賽 %s vs. %s: 最終比分 %d-%d-%d最大CPU數模式(M)黑白NPSEGTB 路徑引擎 #1 是絕對分數引擎 #2 是絕對分數洗牌遊戲(u)...洗牌遊戲(u)...變種無聲尚未有棋局載入沒有選中棋局沒有可用的提示這條訊息不包含更多的棋局棋局中沒有著法尚未有盤面載入不存在未完成棋局不存在未完成棋局 註解確定單擊移動(M)選項(O)兵定期更新(U)定期更新(分析模式)播放同步思考(N)離開時提示(P)離開時提示(P)提示錯誤著法(E)檔案中沒有找到盤面預先走棋(P)預先走棋標記升變后落子無聲(Q)準備送信就緒 車儲存棋局選項(S)... Alt+Shift+S儲存棋局選項立即儲存設定(N)離開時儲存設定(X)可選對手圖表(k)顯示坐標(C)顯示坐標(C)聲音聲音選項(D)...啟動位置號碼(S)啟動國際象棋程式無法啟動'%s'棋局 %s 仍需走棋 本棋局仍需走棋 所有 %d 棋局皆仍需走棋 兩棋局皆仍需走棋 棋局 %s 仍需走棋 編輯標籤(T)檢查著法合理性(L) Cl+Sh+L格子已有棋子沒有棋局列表該著法沒有待定的提議訓練(N)訓練模式已關閉訓練模式已打開"Training"(訓練)模式必須指定一個棋局檔案"TwoMachines"(電腦對弈)模式無法在ICS模式下運行"TwoMachines"(分析)模式必須啟動國際象棋引擎未知的"initialMode"(初始模式)選項 %s未知的變體名 %s上傳檢查(U)變體 %s 不被 %s 所支持變體 %s 只在ICS模式下支持驗證引擎聲明(V)等待對手走棋等待第一個國際象棋程式等待對手回應 等待第二個國際象棋程式注意:你正在研究棋局注意:你正在觀棋棋局注意:你正在進行棋局警告: 第二個引擎(%s) 不支持此!紅方輪到紅方走棋紅方超時輸/贏判決門檻沒有分析棋局你在執黑你在執紅暫停時不能復原棋局你尚未走棋必須走完棋才能提和對手沒有超時非法的"searchTime"(搜尋時間)選項 %s非法的"timeControl"(時間控制)選項 %s取消(C)向下通訊協定版本 %d 不被支持say 內部錯誤,非法的"moveType"(著法類型) %d (%d,%d-%d,%d)向上xboard-4.7.3/po/it.gmo0000644000175000001440000004436312262562300011467 00000000000000D]l  '"J^rx")%%@Q` i t~     4BT[a t  $ )(Rbz  %9U!j !$'Ck      0>&D!k&(!2Gf0. $6 HVh/   )?D]n   0!* L m       !!! "!0! B!P!-p!)!-!)!% ""F"i" n"x""""" """#'#9#W#h########### $$"$5$I$[$v$~$$$ $$$ $$$$ %% -% 9% G%R%i%%&%!%*%( &&5&\& a&o&&&&&&&"&,'(@'i''''%'' ((%( E( f('('(%(2(0) 6)D)V)l))))).) *A*H*a*{** **** ****!*1*+%+_(+,,,,,,---(;-d-:{-0-5-. 3.A. H.T.h.. ... ..0.+"/N/l/// // // //00%0!A0c0D~005071I1)Q1 {111111)1$2=20W2 2222(2,2 3!"3D3V3l3u3 3333 334 4%4;4Q4l4Hs464F4-:5h55*55'56F16x666'626 777%767G7e7%7G7 7 8 8)8?84S88848889959O9_9p9w99969*9) :6:N: a:n::::::: :!:;6;2R;I;@;K<B\<)<< < <<)=)*=T=m== =,===3 >@>.T>->.>>>> ? ??1+?]?e?y??????@@@?@]@$c@ @@@@@AA)A2AIAcA4yA0A6A6B0MB~BBBB0B C!C9C1XCHCHC+D HDiD&D2DD D E#E&CE%jE*E*E(EGFWF^FuF#F"FFF7G!GG4iG9GG#G$H(H1H :H EHOHXH ^HiHpHwH)H8HHHwqjOxL; "u6)$R!hF3pP .^vQbG}@*IS-sn%i'MB|0or~</?e1Vm5W 2Nt,A`[7Z_( 9:dK84X+ylCf {k>]H\U#zDacY E&J=Tg%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngineEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFRCFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveInformationIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timeatomicbad searchTime option %sbad timeControl option %sbughousecancelcrazyhousedownfactoryfairyknightmatelosersmakruknormalprotocol version %d not supportedsay Internal error; bad moveType %d (%d,%d-%d,%d)suicideupProject-Id-Version: GNU xboard master-20110411 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s non supporta l'analisiInformazioni su WinboardAzioniAggiudica come PattaAggiudica patte trivialiAggiudica al NeroAggiudica al BiancoAllarmeGià alla fine della partitaMossa ambigua nell'output dell'ICS: "%s"Mossa ambigua: %d.%s%sLa funzione di Analisi non è disponibile in modalità ICSLa modalità Analisi richiede un motore di giocoLa modalità 'Analizza file' richiede un file partitaTrascinamento animatoMosse animateAnnotaArcivescovoAggiudica sul tempoRuota vista automaticamenteCommenti automaticiAuto KibitzOsserva automaticamentePorta in primo pianoAuto aggiornaOsserva in bckgndStringa FEN di posizione scorretta negli AppuntiStringa FEN di posizione scorretta nel fileFile partita non riconosciutoFile posizione non riconosciutoAlfiereNeroPezzi neriIl tratto è al NeroAlla ciecaImpostazioni scacchieraScacchiera...Libro delle aperture...Profondità Libro:Varianti Libro:Tempo esaurito per entrambiImpossibile tornare più indietroImpossibile avanzare oltreImpossibile avviare un match senza specificare alcun motore di giocoImpossibile aprire "%s"Impossibile effettuare la ricerca nel file di partitaImpossibile effettuare la ricerca nel file di posizioneCannoneImpossibile costruire lista delle partiteCancelliereSvuota scacchieraCommentiImpostazioni motori di giocoConnessione chiusa dal'ICSCopia lista partiteConnessione all'host %s, porta %s fallitaApertura della porta comm %s fallitaImpossibile leggere mossaImpossibile interpretare la mossa dall'ICS: "%s"Case nereBeepDegradaIndividua scacco mattoLa mossa mostrata non è quella correnteLa posizione mostrata non è quella correnteAggiudica patta dopo:Patta per materiale insufficienteDoppia scacchieraDimensione EGTB [MB]:ModificaModifica commento...Modifica informazioni partita...Modifica commentoModifica commento a %d.%s%sElefanteCasa vuotaTermine della partitaMotoreLibro proprio per motore 1Impostazioni motore 1Impostazioni motore 2Output del motore di giocoErroreErrore nela lettura della lista mosse: è presente una posizione in piùErrore nella lettura della lista mosse: mosse annidateErrore nella lettura della lista mosse: sono presenti due intestazioniErrore in lettura dal %s motore di gioco (%s)Errore in lettura dall'ICSErrore in lettura da tastieraErrore in scrittura sul %s motore di giocoErrore in scrittura sull'ICSErrore in scrittura sul motore di giocoErrore in scrittura sul displayErrore: il %s motore di gioco (%s) è terminato in maniera inaspettataGrafico della valutazioneChiusura in corsoFRCImpossibile aprire l'applicazione cmailAvvio del %s motore di gioco %s su %s fallito: %s Errore fataleFile1° mossa Nero1° mossa BiancoLista partite...Impostazioni lista partite...Partita non trovata nel fileIndice superiore al numero di partitePartita troppo lunga; incrementare il valore di MAX_MOVES e ricompilareMosse mancanti nella lista mosseGenerali...Generali...Impostazioni generaliScarica lista mosseRicevuto carattere di Fine file (EOF) dalla tastieraDimensione Hash [MB]:AiutoNascondi l'output del motore se gioca contro un uomoCase evidenziateEvidenzia trascinamentoEvidenzia l'ultima mossaEvidenzia con una frecciaEvidenzia con una frecciaSuggerimento...Suggerimento: %sICS...Connetti ad un ICSImpostazioni ICSMossa illegaleMossa illegale "%s" (rifiutata dal %s motore di gioco)Mossa illegale "%s" dal %s motore di giocoMossa illegale nell'output dell'ICS: "%s"Mossa illegale: %d.%s%sMossa non correttaInformazioneIl tratto è al NeroIl tratto è al BiancoIl tratto non è al NeroIl tratto non è al BiancoE' il tuo turnoReCavalloCase biancheApertura partita... Alt+Shift+LImpostazioni apertura partitaMatch tra i motori di giocoIl motore di gioco accetta la tua offerta di pattaLa funzione 'Nero al motore di gioco' non è disponibile in modalità ICSLa modalità 'Nero al motore di gioco' richiede almeno un motoreLa funzione 'Bianco al motore di gioco' non è disponibile in modalità ICSLa modalità 'Bianco al motore di gioco' richiede almeno un motoreMatch %s vs %s: punteggio finale %d-%d-%dNum max di CPU:ModalitàMonocromaticoCartella EGTB:Output motore 1 sempre riferito al BiancoOutput motore 2 sempre riferito al BiancoNuova partita Shuffle...Nuova partita Shuffle...Varianti di giocoSilenziosoNon è ancora stata caricata nessuna partitaNessuna partita selezionataNessun suggerimento disponibileIn questo messaggio non sono presenti altre partitePartita senza mosseNon è ancora stata caricata nessuna posizioneNon è presente nessuna partita non terminataNon è presente nessuna partita non terminata NotaOKMuovi con click singoloImpostazioniPedoneAggiornamenti continuiAggiornamenti continui (per Modalità di analisi)AscoltaPensa sul mio tempoChiedi conferma alla chiusuraChiedi conferma alla chiusuraMostra popup per mosse erratePosizione non trovata nel filePremossaPremosse evidenziatePromuoviDonnaNon disturbare durante il giocoPronto all'invio della posta TorreSalvataggio partita... Alt+Shift+SImpostazioni salvataggio partitaSalva impostazioniSalva impostazioni all'uscitaGrafico delle richiesteMostra coordinateMostra coordinateImpostazioni suoniSuoni...Disposizione iniziale:Avvio del motore di giocoAvvio di '%s' fallitoOccorre ancora eseguire una mossa per la partita %s Occorre ancora eseguire la mossa per la partita Occorre ancora eseguire mosse per tutte le %d partite Occorre ancora eseguire mosse per entrambe le partite Occorre ancora eseguire mosse per le partite %s Informazioni partitaVerifica mosse illegaliLa casa è già occupataNessuna lista partiteNon vi è alcuna offerta pendente a questa mossaAllenamentoModalità Allenamento disattivataModalità Allenamento attivataLa modalità Allenamento richiede un file partitaLa funzione 'Motore di gioco 1 vs 2' non è disponibile in modalità ICSLa modalità 'Motore di gioco 1 vs 2' richiede almeno un motore di giocoValore per initialMode non riconosciuto: %sNome di variante sconosciuto: %sCarica su ICS per esaminareLa variante %s non è supportata da %sLa variante %s è supportata solo in modalità ICSVerifica gli annunci del motoreVisualizzaAttendi il tuo turnoIn attesa del primo motore di giocoIn attesa di risposta dall'avversario In attesa del secondo motore di giocoAvviso: Stai ancora esaminando una partitaAvviso: Stai ancora osservando una partitaAvviso: Stai ancora giocando una partitaAttenzione: il secondo motore di gioco (%s) non supporta questa azione!BiancoIl tratto è al BiancoTempo esaurito per il BiancoLimite per aggiudicare vinta/persa:Non stai esaminando alcuna partitaStai giocando con il NeroStai giocando con il BiancoNon è possibile ripristinare mentre la pausa è attivaNon hai ancora fatto alcuna mossaDevi eseguire la tua mossa prima di offrire la pattaIl tuo avversario non ha ancora esaurito il proprio tempoAtomicOpzione searchTime non corretta: %sOpzione timeControl non corretta: %sBughouseCancellaCrazyhouseMuovi giuFabbricaFairyKnightmateLosersMakrukNormaleVersione %d del protocollo non supportatasay Errore interno; moveType malformato %d (%d,%d-%d,%d)SuicideMuovi suxboard-4.7.3/po/it.po0000644000175000001440000015703312262562300011322 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # Traduzione di Giorgio Medeot, 2010 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110411\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "Versione %d del protocollo non supportata" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "Opzione timeControl non corretta: %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "Opzione searchTime non corretta: %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "La variante %s è supportata solo in modalità ICS" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "Nome di variante sconosciuto: %s" #: backend.c:1375 msgid "Starting chess program" msgstr "Avvio del motore di gioco" #: backend.c:1398 msgid "Bad game file" msgstr "File partita non riconosciuto" #: backend.c:1405 msgid "Bad position file" msgstr "File posizione non riconosciuto" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "Impossibile avviare un match senza specificare alcun motore di gioco" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "Apertura della porta comm %s fallita" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "Connessione all'host %s, porta %s fallita" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "Valore per initialMode non riconosciuto: %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "La modalità 'Analizza file' richiede un file partita" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "La modalità Analisi richiede un motore di gioco" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "La funzione di Analisi non è disponibile in modalità ICS" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "La modalità 'Bianco al motore di gioco' richiede almeno un motore" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "" "La funzione 'Bianco al motore di gioco' non è disponibile in modalità ICS" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "La modalità 'Nero al motore di gioco' richiede almeno un motore" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "" "La funzione 'Nero al motore di gioco' non è disponibile in modalità ICS" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "" "La modalità 'Motore di gioco 1 vs 2' richiede almeno un motore di gioco" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "La funzione 'Motore di gioco 1 vs 2' non è disponibile in modalità ICS" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "La modalità Allenamento richiede un file partita" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "Errore in scrittura sull'ICS" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "Errore in lettura da tastiera" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "Ricevuto carattere di Fine file (EOF) dalla tastiera" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "Errore in scrittura sul display" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "Errore nella lettura della lista mosse: sono presenti due intestazioni" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "Errore nella lettura della lista mosse: mosse annidate" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "Connessione chiusa dal'ICS" #: backend.c:4167 msgid "Error reading from ICS" msgstr "Errore in lettura dall'ICS" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" "Partita troppo lunga; incrementare il valore di MAX_MOVES e ricompilare" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "Errore nela lettura della lista mosse: è presente una posizione in più" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "Impossibile interpretare la mossa dall'ICS: \"%s\"" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say Errore interno; moveType malformato %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "Stai giocando con il Nero" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Stai giocando con il Bianco" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Il tratto è al Bianco" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Il tratto è al Nero" #: backend.c:6552 msgid "Displayed position is not current" msgstr "La posizione mostrata non è quella corrente" #: backend.c:6790 msgid "Illegal move" msgstr "Mossa illegale" #: backend.c:6857 msgid "End of game" msgstr "Termine della partita" #: backend.c:6860 msgid "Incorrect move" msgstr "Mossa non corretta" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "Mossa illegale \"%s\" dal %s motore di gioco" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s non supporta l'analisi" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "Mossa illegale \"%s\" (rifiutata dal %s motore di gioco)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "Avvio del %s motore di gioco %s su %s fallito: %s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "Suggerimento: %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "Il motore di gioco accetta la tua offerta di patta" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "Mossa ambigua nell'output dell'ICS: \"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "Mossa illegale nell'output dell'ICS: \"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "Mosse mancanti nella lista mosse" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "La variante %s non è supportata da %s" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "Avvio di '%s' fallito" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "In attesa del primo motore di gioco" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "In attesa del secondo motore di gioco" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 #, fuzzy msgid "Bad tournament file" msgstr "File partita non riconosciuto" #: backend.c:10472 #, fuzzy msgid "Waiting for other game(s)" msgstr "In attesa del primo motore di gioco" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "Match %s vs %s: punteggio finale %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "Mossa illegale: %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "Mossa ambigua: %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "Impossibile aprire \"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "Impossibile costruire lista delle partite" #: backend.c:11594 msgid "No more games in this message" msgstr "In questo messaggio non sono presenti altre partite" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "Non è ancora stata caricata nessuna partita" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "Impossibile tornare più indietro" #: backend.c:12077 msgid "Game number out of range" msgstr "Indice superiore al numero di partite" #: backend.c:12088 msgid "Can't seek on game file" msgstr "Impossibile effettuare la ricerca nel file di partita" #: backend.c:12146 msgid "Game not found in file" msgstr "Partita non trovata nel file" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "Stringa FEN di posizione scorretta nel file" #: backend.c:12426 msgid "No moves in game" msgstr "Partita senza mosse" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "Non è ancora stata caricata nessuna posizione" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "Impossibile effettuare la ricerca nel file di posizione" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "Posizione non trovata nel file" #: backend.c:12632 msgid "Black to play" msgstr "Il tratto è al Nero" #: backend.c:12635 msgid "White to play" msgstr "Il tratto è al Bianco" #: backend.c:12722 backend.c:13083 #, fuzzy msgid "Waiting for access to save file" msgstr "In attesa del secondo motore di gioco" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 #, fuzzy msgid "Saving position" msgstr "File posizione non riconosciuto" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "Non hai ancora fatto alcuna mossa" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "Non è presente nessuna partita non terminata" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Impossibile aprire l'applicazione cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "In attesa di risposta dall'avversario\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Occorre ancora eseguire la mossa per la partita\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Occorre ancora eseguire mosse per entrambe le partite\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Occorre ancora eseguire mosse per tutte le %d partite\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Occorre ancora eseguire una mossa per la partita %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "Non è presente nessuna partita non terminata\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Pronto all'invio della posta\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Occorre ancora eseguire mosse per le partite %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "Modifica commento" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "Modifica commento a %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "Il tratto non è al Bianco" #: backend.c:13877 msgid "It is not Black's turn" msgstr "Il tratto non è al Nero" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "Modalità Allenamento disattivata" #: backend.c:14155 msgid "Training mode on" msgstr "Modalità Allenamento attivata" #: backend.c:14158 msgid "Already at end of game" msgstr "Già alla fine della partita" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "Avviso: Stai ancora giocando una partita" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "Avviso: Stai ancora osservando una partita" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "Avviso: Stai ancora esaminando una partita" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "La casa è già occupata" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "Non vi è alcuna offerta pendente a questa mossa" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "Il tuo avversario non ha ancora esaurito il proprio tempo" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "Devi eseguire la tua mossa prima di offrire la patta" #: backend.c:15109 msgid "You are not examining a game" msgstr "Non stai esaminando alcuna partita" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "Non è possibile ripristinare mentre la pausa è attiva" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "E' il tuo turno" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "Attendi il tuo turno" #: backend.c:15237 msgid "No hint available" msgstr "Nessun suggerimento disponibile" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "Non è ancora stata caricata nessuna partita" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "Errore in scrittura sul %s motore di gioco" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "Errore: il %s motore di gioco (%s) è terminato in maniera inaspettata" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "Errore in lettura dal %s motore di gioco (%s)" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "La mossa mostrata non è quella corrente" #: backend.c:16352 msgid "Could not parse move" msgstr "Impossibile leggere mossa" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Tempo esaurito per entrambi" #: backend.c:16479 msgid "White's flag fell" msgstr "Tempo esaurito per il Bianco" #: backend.c:16501 msgid "Black's flag fell" msgstr "" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "Stringa FEN di posizione scorretta negli Appunti" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "Impossibile leggere mossa" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "Aggiorna F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 #, fuzzy msgid "Select Engine:" msgstr "Motore" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 #, fuzzy msgid "Default Number of Games in Match (or Pairing):" msgstr "Partite per match:" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 #, fuzzy msgid "Save Tourney Games on:" msgstr "Impostazioni salvataggio partita" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 #, fuzzy msgid "Replace Engine" msgstr "Motore" #: dialogs.c:285 #, fuzzy msgid "Upgrade Engine" msgstr "Motore" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "Trascinamento animato" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "Mosse animate" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "Aggiudica sul tempo" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "Ruota vista automaticamente" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Alla cieca" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "Nascondi l'output del motore se gioca contro un uomo" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "Evidenzia l'ultima mossa" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "Evidenzia con una freccia" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "Muovi con click singolo" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "Aggiornamenti continui (per Modalità di analisi)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "Pensa sul mio tempo" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "Chiedi conferma alla chiusura" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "Mostra popup per mosse errate" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "Scarica lista mosse" #: dialogs.c:383 msgid "Show Coordinates" msgstr "Mostra coordinate" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "Verifica mosse illegali" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "Grafico della valutazione" #: dialogs.c:400 msgid "General Options" msgstr "Impostazioni generali" #: dialogs.c:410 msgid "normal" msgstr "Normale" #: dialogs.c:411 msgid "makruk" msgstr "Makruk" #: dialogs.c:412 msgid "FRC" msgstr "FRC" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "Knightmate" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 #, fuzzy msgid "cylinder *" msgstr "Cilindrici" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "Atomic" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "Fairy" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "Crazyhouse" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "Bughouse" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "Suicide" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "Losers" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "" "Attenzione: il secondo motore di gioco (%s) non supporta questa azione!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "Varianti di gioco" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "Num max di CPU:" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Dimensione Hash [MB]:" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "Cartella EGTB:" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "Dimensione EGTB [MB]:" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "Profondità Libro:" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "Varianti Libro:" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "Libro proprio per motore 1" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "Impostazioni motori di gioco" #: dialogs.c:540 msgid "Detect all Mates" msgstr "Individua scacco matto" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "Verifica gli annunci del motore" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "Patta per materiale insufficiente" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "Aggiudica patte triviali" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "Aggiudica patta dopo:" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "Limite per aggiudicare vinta/persa:" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "Output motore 1 sempre riferito al Bianco" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "Output motore 2 sempre riferito al Bianco" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Aggiudica al Bianco" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "Auto Kibitz" #: dialogs.c:570 msgid "Auto-Comment" msgstr "Commenti automatici" #: dialogs.c:571 msgid "Auto-Observe" msgstr "Osserva automaticamente" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "Porta in primo piano" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "Osserva in bckgnd" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "Doppia scacchiera" #: dialogs.c:576 msgid "Get Move List" msgstr "Scarica lista mosse" #: dialogs.c:577 msgid "Quiet Play" msgstr "Non disturbare durante il gioco" #: dialogs.c:578 msgid "Seek Graph" msgstr "Grafico delle richieste" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "Auto aggiorna" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "Premossa" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "1° mossa Bianco" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "1° mossa Nero" #: dialogs.c:587 msgid "Alarm" msgstr "Allarme" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "Impostazioni ICS" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "Non è ancora stata caricata nessuna partita" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "Impostazioni apertura partita" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "Impostazioni salvataggio partita" #: dialogs.c:681 msgid "No Sound" msgstr "Silenzioso" #: dialogs.c:682 msgid "Default Beep" msgstr "Beep" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "Ascolta" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "Impostazioni suoni" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "Pezzi neri" #: dialogs.c:790 msgid "Light Square Color:" msgstr "Case bianche" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "Case nere" #: dialogs.c:802 msgid "Highlight Color:" msgstr "Case evidenziate" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "Premosse evidenziate" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "Monocromatico" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "Impostazioni scacchiera" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "Modifica" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "Informazioni partita" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 #, fuzzy msgid "Engine has no options" msgstr "Libro proprio per motore 1" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "Disposizione iniziale:" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "Casuale" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "Nuova partita Shuffle..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "Riduci il tempo di un fattore:" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "Motore" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "Libro proprio per motore 1" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "Errore in scrittura sul motore di gioco" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "Cancella" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "Re" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "Generali..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "Cavallo" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Alfiere" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Torre" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "Arcivescovo" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "Cancelliere" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Donna" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "Promuovi" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "Fabbrica" #: dialogs.c:1743 msgid "up" msgstr "Muovi su" #: dialogs.c:1744 msgid "down" msgstr "Muovi giu" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "Impostazioni apertura partita" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Errore" #: dialogs.c:1906 msgid "Fatal Error" msgstr "Errore fatale" #: dialogs.c:1906 msgid "Exiting" msgstr "Chiusura in corso" #: dialogs.c:1917 msgid "Information" msgstr "Informazione" #: dialogs.c:1924 msgid "Note" msgstr "Nota" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Bianco" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Pedone" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "Elefante" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "Cannone" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "Degrada" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Casa vuota" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Svuota scacchiera" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Nero" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "File" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "Modifica" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "Visualizza" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Modalità" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Azioni" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "Motore" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Impostazioni" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Aiuto" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "File" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Filtro" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Filtro" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "Commenti" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "Output del motore di gioco" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "File partita non riconosciuto" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "Impossibile aprire l'applicazione cmail" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "Informazioni su Winboard" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Nuova partita Shuffle..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "Nuova partita Shuffle..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "Varianti di gioco" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Apertura partita... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "File posizione non riconosciuto" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "File posizione non riconosciuto" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "File posizione non riconosciuto" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Salvataggio partita... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "File posizione non riconosciuto" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Salvataggio partita... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Copia lista partite" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Copia posizione Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "Copia lista partite" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Incolla partita Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Incolla posizione Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Modifica commento" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "File posizione non riconosciuto" #: menus.c:612 msgid "Edit Tags" msgstr "Modifica informazioni partita..." #: menus.c:613 msgid "Edit Comment" msgstr "Modifica commento..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "Libro delle aperture..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "Annota" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "Tronca la partita End" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "Il tratto è al Nero" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "Vai alla fine Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "Ruota vista automaticamente" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Scarica lista mosse" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "Grafico della valutazione" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Lista partite..." #: menus.c:637 msgid "Comments" msgstr "Commenti" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "Scacchiera..." #: menus.c:642 msgid "Game List Tags..." msgstr "Impostazioni lista partite..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Bianco al motore di gioco Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Match tra i motori di gioco" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "Motore di gioco 1 vs 2 Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Avvia analisi Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Analizza file Ctrl+F" #: menus.c:654 msgid "Training" msgstr "Allenamento" #: menus.c:655 msgid "ICS Client" msgstr "Connetti ad un ICS" #: menus.c:657 msgid "Machine Match" msgstr "Match tra i motori di gioco" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Chiama il Tempo F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "Smetti di osservare F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "Smetti di esaminare F11" #: menus.c:675 msgid "Upload to Examine" msgstr "Carica su ICS per esaminare" #: menus.c:677 msgid "Adjudicate to White" msgstr "Aggiudica al Bianco" #: menus.c:678 msgid "Adjudicate to Black" msgstr "Aggiudica al Nero" #: menus.c:679 msgid "Adjudicate Draw" msgstr "Aggiudica come Patta" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "Impostazioni motore 1" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "Impostazioni motore 2" #: menus.c:690 msgid "Hint" msgstr "Suggerimento..." #: menus.c:691 msgid "Book" msgstr "Libro delle aperture..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Annulla mossa Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "Generali..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "Controllo Tempo... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "Motori di gioco... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "Aggiudicazioni... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "Apertura partita... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "Salvataggio partita... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "Lista partite..." #: menus.c:710 msgid "Sounds ..." msgstr "Suoni..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "Evidenzia trascinamento" #: menus.c:724 msgid "Highlight With Arrow" msgstr "Evidenzia con una freccia" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "Aggiornamenti continui" #: menus.c:729 msgid "Popup Exit Message" msgstr "Chiedi conferma alla chiusura" #: menus.c:731 msgid "Show Coords" msgstr "Mostra coordinate" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "Nascondi l'output del motore se gioca contro un uomo" #: menus.c:736 msgid "Save Settings Now" msgstr "Salva impostazioni" #: menus.c:737 msgid "Save Settings on Exit" msgstr "Salva impostazioni all'uscita" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "Informazioni su Winboard" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "Motore" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "mosse" #: nengineoutput.c:153 msgid "Engine output" msgstr "Output del motore di gioco" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "Grafico della valutazione" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "File posizione non riconosciuto" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "Informazioni partita" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "Nessuna partita selezionata" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "Impossibile avanzare oltre" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "Match %s vs %s: punteggio finale %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "Nessuna lista partite" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "OK" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "Cancella" #~ msgid "New Game Ctrl+N" #~ msgstr "Nuova partita Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "Nuova variante... Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "Apri partita da file... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Apri posizione da file... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "Salva partita... Ctrl+S" #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Salva posizione... Ctrl+Shift+S" #~ msgid "Quit Ctr+Q" #~ msgstr "Esci" #~ msgid "Copy Game Ctrl+C" #~ msgstr "Copia partita Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Modifica partita Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Modifica posizione Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "Ripristina Home" #~ msgid "Backward Alt+Left" #~ msgstr "Indietro Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "Avanti Alt+Right" #~ msgid "Back to Start Alt+Home" #~ msgstr "Torna all'inizio Alt+Home" #~ msgid "Flip View F2" #~ msgstr "Ruota la scacchiera F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "Output del motore di gioco Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "Lista mosse Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "Grafico della valutazione Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "Lista partite Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "Nero al motore di gioco Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "Modifica partita Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Modifica posizione Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "Pausa Pause" #~ msgid "Accept F3" #~ msgstr "Accetta F3" #~ msgid "Decline F4" #~ msgstr "Declina F4" #~ msgid "Rematch F12" #~ msgstr "Rigioca F12" #~ msgid "Draw F6" #~ msgstr "Offri Patta F6" #~ msgid "Adjourn F7" #~ msgstr "Aggiorna F7" #~ msgid "Abort F8" #~ msgstr "Interrompi F8" #~ msgid "Resign F9" #~ msgstr "Abbandona F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "Muovi subito Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "Promuovi a Donna Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "Mosse animate Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "Aggiudica sul tempo Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "Pensa sul mio tempo Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "Nascondi analisi Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "Verifica mosse illegali Ctrl+Shift+L" #~ msgid "Drop" #~ msgstr "Paracadutaggio" #, fuzzy #~ msgid "could not open: " #~ msgstr "Impossibile leggere mossa" #~ msgid "Promotion" #~ msgstr "Promozione" #~ msgid "ok" #~ msgstr "OK" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "Evidenzia trascinamento" #~ msgid "You can only start a match from the initial position." #~ msgstr "Un match può essere avviato solo dalla posizione iniziale." #~ msgid "White " #~ msgstr "Bianco " #~ msgid "Black " #~ msgstr "Nero " #~ msgid "Close" #~ msgstr "Chiudi" #~ msgid "sec/move" #~ msgstr "secondi per mossa" xboard-4.7.3/po/tr.po0000644000175000001440000013430712262562300011332 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # A. Alper Atc , 2003. # msgid "" msgstr "" "Project-Id-Version: XBoard 4.2.7\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: 2003-12-26 16:38+0200\n" "Last-Translator: A. Alper Atc \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-9\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, fuzzy, c-format msgid "Failed to open indirection file %s" msgstr "Dosya alamad" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "" #: backend.c:1375 msgid "Starting chess program" msgstr "" #: backend.c:1398 msgid "Bad game file" msgstr "" #: backend.c:1405 msgid "Bad position file" msgstr "" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "" #: backend.c:4167 msgid "Error reading from ICS" msgstr "" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "Siz Siyah'snz" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "Siz Beyaz'snz" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "Sra Beyaz'da" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "Sra Siyah'ta" #: backend.c:6552 msgid "Displayed position is not current" msgstr "" #: backend.c:6790 msgid "Illegal move" msgstr "Geersiz hamle" #: backend.c:6857 msgid "End of game" msgstr "Oyun sonu" #: backend.c:6860 msgid "Incorrect move" msgstr "Yanl hamle" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "" #: backend.c:8715 #, fuzzy, c-format msgid "Hint: %s" msgstr "pucu" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr "" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "" #: backend.c:9296 msgid "Gap in move list" msgstr "" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 #, fuzzy msgid "Bad tournament file" msgstr "Dosya alamad" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "" #: backend.c:11594 msgid "No more games in this message" msgstr "" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "" #: backend.c:12077 msgid "Game number out of range" msgstr "" #: backend.c:12088 msgid "Can't seek on game file" msgstr "" #: backend.c:12146 msgid "Game not found in file" msgstr "" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "" #: backend.c:12426 msgid "No moves in game" msgstr "" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "" #: backend.c:12632 msgid "Black to play" msgstr "" #: backend.c:12635 msgid "White to play" msgstr "" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "" #: backend.c:13631 msgid "Edit comment" msgstr "" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "" #: backend.c:13877 msgid "It is not Black's turn" msgstr "" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "" #: backend.c:14155 msgid "Training mode on" msgstr "" #: backend.c:14158 msgid "Already at end of game" msgstr "" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "" #: backend.c:15109 msgid "You are not examining a game" msgstr "" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "" #: backend.c:15237 msgid "No hint available" msgstr "" #: backend.c:15253 ngamelist.c:355 msgid "Game list not loaded or empty" msgstr "" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "" #: backend.c:16352 msgid "Could not parse move" msgstr "" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "Berabere" #: backend.c:16479 msgid "White's flag fell" msgstr "Beyaz ah mat" #: backend.c:16501 msgid "Black's flag fell" msgstr "Siyah ah mat" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 msgid "Could not create book" msgstr "" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "Dosya alamad" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 #, fuzzy msgid "Save Tourney Games on:" msgstr "Oyunu Kaydet" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 msgid "Replace Engine" msgstr "" #: dialogs.c:285 msgid "Upgrade Engine" msgstr "" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 #, fuzzy msgid "Match Options" msgstr "Seenekler" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "Tahtay Grmeden" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 #, fuzzy msgid "Ponder Next Move" msgstr "Sonraki Oyunu Ykle" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "Hamle Listesini Gster" #: dialogs.c:383 msgid "Show Coordinates" msgstr "" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 msgid "Zoom factor in Evaluation Graph:" msgstr "" #: dialogs.c:400 #, fuzzy msgid "General Options" msgstr "Seenekler" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 #, fuzzy msgid "knightmate" msgstr "At" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 #, fuzzy msgid "losers" msgstr "kapat" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "" #: dialogs.c:540 msgid "Detect all Mates" msgstr "" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "Oyunu Kaydet" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "" #: dialogs.c:570 msgid "Auto-Comment" msgstr "" #: dialogs.c:571 msgid "Auto-Observe" msgstr "" #: dialogs.c:572 #, fuzzy msgid "Auto-Raise Board" msgstr "XBoard Hakknda" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "" #: dialogs.c:576 #, fuzzy msgid "Get Move List" msgstr "Hamle Listesini Gster" #: dialogs.c:577 msgid "Quiet Play" msgstr "" #: dialogs.c:578 msgid "Seek Graph" msgstr "" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "" #: dialogs.c:587 msgid "Alarm" msgstr "" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 #, fuzzy msgid "ICS Options" msgstr "Seenekler" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 msgid "No games before year:" msgstr "" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 #, fuzzy msgid "Load Game Options" msgstr "Oyun Ykle" #: dialogs.c:657 #, fuzzy msgid "Auto-Save Games" msgstr "Oyunu Kaydet" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 #, fuzzy msgid "Save Games on File:" msgstr "Oyunu Kaydet" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 #, fuzzy msgid "Save Game Options" msgstr "Oyunu Kaydet" #: dialogs.c:681 msgid "No Sound" msgstr "" #: dialogs.c:682 msgid "Default Beep" msgstr "" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 #, fuzzy msgid "User File" msgstr "Dosya" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 #, fuzzy msgid "Draw:" msgstr "Berabere" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 #, fuzzy msgid "Channel:" msgstr "iptal" #: dialogs.c:733 #, fuzzy msgid "Channel 1:" msgstr "iptal" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 #, fuzzy msgid "Sound Options" msgstr "Seenekler" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "" #: dialogs.c:790 msgid "Light Square Color:" msgstr "" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "" #: dialogs.c:802 msgid "Highlight Color:" msgstr "" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 #, fuzzy msgid "Mono Mode" msgstr "Kip" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 #, fuzzy msgid "Board Options" msgstr "Seenekler" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "temizle" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "Oyunu Dzenle" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "" #: dialogs.c:1193 #, fuzzy msgid "ICS input box" msgstr "ICS stemcisi" #: dialogs.c:1225 #, fuzzy msgid "Type a move" msgstr "Geersiz hamle" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "" #: dialogs.c:1372 msgid "randomize" msgstr "" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "" #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 msgid "Time-Odds factors:" msgstr "" #: dialogs.c:1416 msgid "Engine #1" msgstr "" #: dialogs.c:1417 msgid "Engine #2 / Human" msgstr "" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "iptal" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "ah" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "" #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "At" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "Fil" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "Kale" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 #, fuzzy msgid "Archbishop" msgstr "Fil" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 #, fuzzy msgid "Chancellor" msgstr "iptal" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "Vezir" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 #, fuzzy msgid "Promote" msgstr "Terfi" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "" #: dialogs.c:1744 msgid "down" msgstr "" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "Oyun Ykle" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "Hata" #: dialogs.c:1906 msgid "Fatal Error" msgstr "" #: dialogs.c:1906 msgid "Exiting" msgstr "" #: dialogs.c:1917 msgid "Information" msgstr "Bilgi" #: dialogs.c:1924 msgid "Note" msgstr "Not" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "Beyaz" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "Piyon" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "Kareyi Boalt" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "Tahtay Temizle" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "Siyah" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "Dosya" #: dialogs.c:2074 menus.c:788 #, fuzzy msgid "Edit" msgstr "Oyunu Dzenle" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "Kip" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "Eylem" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "Seenekler" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "Yardm" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "Dosya" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "Dosya ad girii" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "Analiz edilecek dosya" #: dialogs.c:2447 msgid "Contents of" msgstr "" #: dialogs.c:2473 #, fuzzy msgid " next page" msgstr "sonraki" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, c-format msgid "Engine Output" msgstr "" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "" #: gamelist.c:375 #, c-format msgid "Reading game file (%d)" msgstr "" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, fuzzy, c-format msgid "Failed to open file '%s'\n" msgstr "Dosya alamad" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 msgid "Failed to open file" msgstr "Dosya alamad" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "XBoard Hakknda" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "Oyunu Sfrla" #: menus.c:583 msgid "New Shuffle Game ..." msgstr "" #: menus.c:584 msgid "New Variant ..." msgstr "" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "Oyun Ykle" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "Sonraki Pozisyonu Ykle" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "Sonraki Pozisyonu Ykle" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "nceki Pozisyonu Ykle" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "Oyunu Kaydet" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "Ayn Pozisyonu Tekrar Ykle" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "Oyunu Kaydet" #: menus.c:595 msgid "Mail Move" msgstr "Hamleyi Postala" #: menus.c:596 msgid "Reload CMail Message" msgstr "CMail letisini Tekrar Ykle" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "Oyun Listesini Gster" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "Pozisyonu Kopyala" #: menus.c:605 #, fuzzy msgid "Copy Game List" msgstr "Oyun Listesini Gster" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "Oyunu Sfrla" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "Sonraki Pozisyonu Ykle" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "Oyunu Sfrla" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "Sonraki Pozisyonu Ykle" #: menus.c:612 msgid "Edit Tags" msgstr "" #: menus.c:613 msgid "Edit Comment" msgstr "" #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "Kitap" #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "" #: menus.c:618 msgid "Truncate Game" msgstr "" #: menus.c:620 msgid "Backward" msgstr "Geri" #: menus.c:621 msgid "Forward" msgstr "leri" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "En Baa" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "En Sona" #: menus.c:628 msgid "Flip View" msgstr "" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "Hamle listesi" #: menus.c:632 msgid "Evaluation Graph" msgstr "" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "Oyun Listesini Gster" #: menus.c:637 msgid "Comments" msgstr "" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "" #: menus.c:642 msgid "Game List Tags..." msgstr "" #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "Bilgisayar Beyaz" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "Bilgisayar Siyah" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "kisi de Bilgisayar" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "Analiz Kipi" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "Analiz Dosyas" #: menus.c:654 msgid "Training" msgstr "Eitim" #: menus.c:655 msgid "ICS Client" msgstr "ICS stemcisi" #: menus.c:657 #, fuzzy msgid "Machine Match" msgstr "Bilgisayar Siyah" #: menus.c:658 msgid "Pause" msgstr "Duraklat" #: menus.c:663 msgid "Accept" msgstr "Kabul et" #: menus.c:664 msgid "Decline" msgstr "Red et" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "Terk et" #: menus.c:668 #, fuzzy msgid "Draw" msgstr "Berabere" #: menus.c:669 msgid "Adjourn" msgstr "Ertele" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 msgid "Stop Observing" msgstr "" #: menus.c:674 msgid "Stop Examining" msgstr "" #: menus.c:675 msgid "Upload to Examine" msgstr "" #: menus.c:677 msgid "Adjudicate to White" msgstr "" #: menus.c:678 msgid "Adjudicate to Black" msgstr "" #: menus.c:679 msgid "Adjudicate Draw" msgstr "" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "" #: menus.c:690 msgid "Hint" msgstr "pucu" #: menus.c:691 msgid "Book" msgstr "Kitap" #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "Hamleyi Geri Al" #: menus.c:700 msgid "General ..." msgstr "" #: menus.c:702 msgid "Time Control ..." msgstr "" #: menus.c:703 msgid "Common Engine ..." msgstr "" #: menus.c:704 msgid "Adjudications ..." msgstr "" #: menus.c:705 msgid "ICS ..." msgstr "" #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 #, fuzzy msgid "Load Game ..." msgstr "Oyun Ykle" #: menus.c:708 #, fuzzy msgid "Save Game ..." msgstr "Oyunu Kaydet" #: menus.c:709 #, fuzzy msgid "Game List ..." msgstr "Oyun Listesini Gster" #: menus.c:710 msgid "Sounds ..." msgstr "" #: menus.c:713 msgid "Always Queen" msgstr "Hep Vezir Olsun" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "" #: menus.c:724 msgid "Highlight With Arrow" msgstr "" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "" #: menus.c:729 msgid "Popup Exit Message" msgstr "" #: menus.c:731 msgid "Show Coords" msgstr "" #: menus.c:732 msgid "Hide Thinking" msgstr "" #: menus.c:736 msgid "Save Settings Now" msgstr "" #: menus.c:737 msgid "Save Settings on Exit" msgstr "" #: menus.c:742 msgid "Info XBoard" msgstr "XBoard Info Sayfas" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "XBoard Man Sayfas" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 msgid "engine name" msgstr "" #: nengineoutput.c:80 nengineoutput.c:87 msgid "move" msgstr "" #: nengineoutput.c:153 msgid "Engine output" msgstr "" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "Seenekler" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 msgid "tags" msgstr "" #: ngamelist.c:91 msgid "next" msgstr "sonraki" #: ngamelist.c:92 msgid "close" msgstr "kapat" #: ngamelist.c:116 msgid "No game selected" msgstr "" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 #, fuzzy msgid "previous page" msgstr "nceki Oyunu Ykle" #: ngamelist.c:214 #, fuzzy msgid "next page" msgstr "sonraki" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "" #: ngamelist.c:274 msgid "There is no game list" msgstr "" #: nhistory.c:109 msgid "Move list" msgstr "Hamle listesi" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "iptal" #, fuzzy #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "Pozisyon Ykle" #, fuzzy #~ msgid "Save Position Ctrl+Shift+S" #~ msgstr "Pozisyonu Kaydet" #, fuzzy #~ msgid "Copy Game Ctrl+C" #~ msgstr "Oyunu Kopyala" #, fuzzy #~ msgid "Paste Game Ctrl+V" #~ msgstr "Oyunu Yaptr" #, fuzzy #~ msgid "Paste Position Ctrl+Shift+V" #~ msgstr "Pozisyonu Yaptr" #, fuzzy #~ msgid "Edit Game Ctrl+E" #~ msgstr "Oyunu Dzenle" #, fuzzy #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "Pozisyonu Dzenle" #, fuzzy #~ msgid "Machine Black Ctrl+B" #~ msgstr "Bilgisayar Siyah" #~ msgid "Can't open file" #~ msgstr "Dosya alamyor" #~ msgid "Promotion" #~ msgstr "Terfi" #, fuzzy #~ msgid "Promote to what?" #~ msgstr "Piyon hangi taa terfi edilsin?" #~ msgid "ok" #~ msgstr "tamam" #~ msgid "enter" #~ msgstr "gir" #~ msgid "load" #~ msgstr "ykle" #~ msgid "prev" #~ msgstr "nceki" #~ msgid "White " #~ msgstr "Beyaz " #~ msgid "Black " #~ msgstr "Siyah " #~ msgid "Close" #~ msgstr "Kapat" #, fuzzy #~ msgid " " #~ msgstr "Terk et" #~ msgid "Reload Same Game" #~ msgstr "Ayn Oyunu Tekrar Ykle" #~ msgid "Exit" #~ msgstr "k" #~ msgid "Step" #~ msgstr "Adm" #~ msgid "P" #~ msgstr "D" #~ msgid "edit" #~ msgstr "dzenle" xboard-4.7.3/po/zh_CN.po0000644000175000001440000015200712262562300011703 00000000000000# XBoard -- a graphical chessboard for X # Copyright (C) 1991 by Digital Equipment Corporation, Maynard, Massachusetts. # Enhancements Copyright (C) 1992-98 Free Software Foundation, Inc. # This file is distributed under the same license as the XBoard package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: GNU xboard master-20110507\n" "Report-Msgid-Bugs-To: bug-xboard@gnu.org\n" "POT-Creation-Date: 2014-01-06 09:15-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: args.h:820 #, c-format msgid "%s in settings file\n" msgstr "" #: args.h:830 #, c-format msgid "Bad integer value %s" msgstr "" #: args.h:923 args.h:1170 #, c-format msgid "Unrecognized argument %s" msgstr "" #: args.h:954 #, c-format msgid "No value provided for argument %s" msgstr "" #: args.h:1014 #, c-format msgid "Incomplete \\ escape in value for %s" msgstr "" #: args.h:1125 #, c-format msgid "Failed to open indirection file %s" msgstr "" #: args.h:1142 #, c-format msgid "Unrecognized boolean argument value %s" msgstr "" #. TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:744 msgid "first" msgstr "" #. TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings #. such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing #: backend.c:747 msgid "second" msgstr "" #: backend.c:827 #, c-format msgid "protocol version %d not supported" msgstr "协议版本 %d 不被支持" #: backend.c:933 msgid "You did not specify the engine executable" msgstr "" #: backend.c:989 #, c-format msgid "bad timeControl option %s" msgstr "非法的\"timeControl\"(时间控制)选项 %s" #: backend.c:1004 #, c-format msgid "bad searchTime option %s" msgstr "非法的\"searchTime\"(搜索时间)选项 %s" #: backend.c:1110 #, c-format msgid "Variant %s supported only in ICS mode" msgstr "变体 %s 只在ICS模式下支持" #: backend.c:1128 #, c-format msgid "Unknown variant name %s" msgstr "未知的变体名 %s" #: backend.c:1375 msgid "Starting chess program" msgstr "启动国际象棋程序" #: backend.c:1398 msgid "Bad game file" msgstr "棋局文件错误" #: backend.c:1405 msgid "Bad position file" msgstr "局面文件错误" #: backend.c:1419 msgid "Pick new game" msgstr "" #: backend.c:1488 msgid "" "You restarted an already completed tourney\n" "One more cycle will now be added to it\n" "Games commence in 10 sec" msgstr "" #: backend.c:1495 #, c-format msgid "All games in tourney '%s' are already played or playing" msgstr "" #: backend.c:1502 msgid "Can't have a match with no chess programs" msgstr "没有象棋程序时无法进行比赛" #: backend.c:1539 #, c-format msgid "Could not open comm port %s" msgstr "无法打开通讯端口 %s" #: backend.c:1542 #, c-format msgid "Could not connect to host %s, port %s" msgstr "无法连接主机 %s 端口 %s" #: backend.c:1598 #, c-format msgid "Unknown initialMode %s" msgstr "未知的\"initialMode\"(初始模式)选项 %s" #: backend.c:1624 msgid "AnalyzeFile mode requires a game file" msgstr "\"AnalyzeFile\"(分析文件)模式必须指定一个棋局文件" #: backend.c:1651 msgid "Analysis mode requires a chess engine" msgstr "\"Analysis\"(分析)模式必须启动国际象棋引擎" #: backend.c:1655 msgid "Analysis mode does not work with ICS mode" msgstr "\"Analysis\"(分析)模式无法在ICS模式下工作" #: backend.c:1666 msgid "MachineWhite mode requires a chess engine" msgstr "\"MachineWhite\"(电脑执白)模式必须启动国际象棋引擎" #: backend.c:1671 msgid "MachineWhite mode does not work with ICS mode" msgstr "\"MachineWhite\"(电脑执白)模式无法在ICS模式下运行" #: backend.c:1678 msgid "MachineBlack mode requires a chess engine" msgstr "\"MachineBlack\"(电脑执黑)模式必须启动国际象棋引擎" #: backend.c:1683 msgid "MachineBlack mode does not work with ICS mode" msgstr "\"MachineBlack\"(电脑执黑)模式无法在ICS模式下运行" #: backend.c:1690 msgid "TwoMachines mode requires a chess engine" msgstr "\"TwoMachines\"(分析)模式必须启动国际象棋引擎" #: backend.c:1695 msgid "TwoMachines mode does not work with ICS mode" msgstr "\"TwoMachines\"(电脑对弈)模式无法在ICS模式下运行" #: backend.c:1706 msgid "Training mode requires a game file" msgstr "\"Training\"(训练)模式必须指定一个棋局文件" #: backend.c:1869 backend.c:1924 backend.c:1947 backend.c:2346 msgid "Error writing to ICS" msgstr "发送信息给ICS时出错" #: backend.c:1884 msgid "Error reading from keyboard" msgstr "读取键盘时出错" #: backend.c:1887 msgid "Got end of file from keyboard" msgstr "读取键盘时遇到文件尾" #: backend.c:2192 #, c-format msgid "Unknown wild type %d" msgstr "" #: backend.c:2263 usystem.c:329 msgid "Error writing to display" msgstr "发送信息给显示器时出错" #: backend.c:3019 #, c-format msgid "your opponent kibitzes: %s" msgstr "" #: backend.c:3548 msgid "Error gathering move list: two headers" msgstr "读取着法时出错,出现两个开头" #: backend.c:3595 msgid "Error gathering move list: nested" msgstr "读取着法时出错,嵌套错误" #: backend.c:3699 backend.c:4117 backend.c:4321 backend.c:4880 backend.c:4884 #: backend.c:6900 backend.c:12101 backend.c:13816 backend.c:13893 #: backend.c:13939 backend.c:13945 backend.c:13950 backend.c:13955 msgid "vs." msgstr "" #: backend.c:3827 msgid "Illegal move (rejected by ICS)" msgstr "" #: backend.c:4165 msgid "Connection closed by ICS" msgstr "连接被ICS关闭" #: backend.c:4167 msgid "Error reading from ICS" msgstr "读取ICS信息时出错" #: backend.c:4244 #, c-format msgid "" "Failed to parse board string:\n" "\"%s\"" msgstr "" #: backend.c:4253 backend.c:9756 msgid "Game too long; increase MAX_MOVES and recompile" msgstr "棋局太长,需要增加\"MAX_MOVES\"并重新编译" #: backend.c:4372 msgid "Error gathering move list: extra board" msgstr "读取着法时出错,超出棋盘" #: backend.c:4804 backend.c:4826 #, c-format msgid "Couldn't parse move \"%s\" from ICS" msgstr "无法解析从ICS读到的着法\"%s\"" #: backend.c:5063 #, c-format msgid "say Internal error; bad moveType %d (%d,%d-%d,%d)" msgstr "say 内部错误,非法的\"moveType\"(着法类型) %d (%d,%d-%d,%d)" #: backend.c:5133 msgid "You cannot do this while you are playing or observing" msgstr "" #: backend.c:6029 msgid "Recompile to support this BOARD_RANKS or BOARD_FILES!" msgstr "" #: backend.c:6491 msgid "You are playing Black" msgstr "你在执黑" #: backend.c:6500 backend.c:6527 msgid "You are playing White" msgstr "你在执白" #: backend.c:6509 backend.c:6535 backend.c:6655 backend.c:6680 backend.c:6696 #: backend.c:14592 msgid "It is White's turn" msgstr "轮到白方走棋" #: backend.c:6513 backend.c:6539 backend.c:6663 backend.c:6686 backend.c:6717 #: backend.c:14584 msgid "It is Black's turn" msgstr "轮到黑方走棋" #: backend.c:6552 msgid "Displayed position is not current" msgstr "显示的局面不是当前局面" #: backend.c:6790 msgid "Illegal move" msgstr "着法错误" #: backend.c:6857 msgid "End of game" msgstr "棋局结束" #: backend.c:6860 msgid "Incorrect move" msgstr "着法错误" #: backend.c:7169 backend.c:7296 msgid "Pull pawn backwards to under-promote" msgstr "" #: backend.c:7527 msgid "Swiss tourney finished" msgstr "" #: backend.c:8103 msgid "Invalid pairing from pairing engine" msgstr "" #: backend.c:8236 #, c-format msgid "Illegal move \"%s\" from %s machine" msgstr "从%s机器读到不合理着法\"%s\"" #: backend.c:8457 msgid "Bad FEN received from engine" msgstr "" #: backend.c:8601 backend.c:13681 backend.c:13746 #, c-format msgid "%s does not support analysis" msgstr "%s 不支持分析功能" #: backend.c:8667 #, c-format msgid "Illegal move \"%s\" (rejected by %s chess program)" msgstr "不合理着法\"%s\" (%s国际象棋程序拒绝接受该着法)" #: backend.c:8694 #, c-format msgid "Failed to start %s chess program %s on %s: %s\n" msgstr "无法启动%s国际象棋程序 %s(在主机 %s 上),%s\n" #: backend.c:8715 #, c-format msgid "Hint: %s" msgstr "提示 %s" #: backend.c:8720 #, c-format msgid "" "Illegal hint move \"%s\"\n" "from %s chess program" msgstr "" #: backend.c:8895 msgid "Machine accepts your draw offer" msgstr " *.*" #: backend.c:8898 msgid "" "Machine offers a draw\n" "Select Action / Draw to agree" msgstr "" #: backend.c:8977 msgid "failed writing PV" msgstr "" #: backend.c:9275 #, c-format msgid "Ambiguous move in ICS output: \"%s\"" msgstr "ICS输出不明确的着法\"%s\"" #: backend.c:9285 #, c-format msgid "Illegal move in ICS output: \"%s\"" msgstr "ICS输出不明确的着法\"%s\"" #: backend.c:9296 msgid "Gap in move list" msgstr "着法断开" #: backend.c:9917 dialogs.c:460 #, c-format msgid "Variant %s not supported by %s" msgstr "变体 %s 不被 %s 所支持" #: backend.c:10038 #, c-format msgid "Startup failure on '%s'" msgstr "无法启动'%s'" #: backend.c:10069 msgid "Waiting for first chess program" msgstr "等待第一个国际象棋程序" #: backend.c:10074 backend.c:13964 msgid "Waiting for second chess program" msgstr "等待第二个国际象棋程序" #: backend.c:10123 msgid "Could not write on tourney file" msgstr "" #: backend.c:10197 msgid "" "You cannot replace an engine while it is engaged!\n" "Terminate its game first." msgstr "" #: backend.c:10211 msgid "No engine with the name you gave is installed" msgstr "" #: backend.c:10213 msgid "" "First change an engine by editing the participants list\n" "of the Tournament Options dialog" msgstr "" #: backend.c:10214 msgid "You can only change one engine at the time" msgstr "" #: backend.c:10229 backend.c:10376 #, c-format msgid "No engine %s is installed" msgstr "" #: backend.c:10249 msgid "" "You must supply a tournament file,\n" "for storing the tourney progress" msgstr "" #: backend.c:10259 msgid "Not enough participants" msgstr "" #: backend.c:10460 msgid "Bad tournament file" msgstr "" #: backend.c:10472 msgid "Waiting for other game(s)" msgstr "" #: backend.c:10485 msgid "No pairing engine specified" msgstr "" #: backend.c:10962 #, c-format msgid "Match %s vs. %s: final score %d-%d-%d" msgstr "比赛 %s vs. %s: 最终比分 %d-%d-%d" #: backend.c:11424 backend.c:11455 #, c-format msgid "Illegal move: %d.%s%s" msgstr "不合理着法 %d.%s%s" #: backend.c:11444 #, c-format msgid "Ambiguous move: %d.%s%s" msgstr "不明确的着法 %d.%s%s" #: backend.c:11497 backend.c:12524 backend.c:12717 backend.c:13078 #, c-format msgid "Can't open \"%s\"" msgstr "无法打开\"%s\"" #: backend.c:11509 menus.c:116 msgid "Cannot build game list" msgstr "无法建立棋局列表" #: backend.c:11594 msgid "No more games in this message" msgstr "这条信息不包含更多的棋局" #: backend.c:11634 msgid "No game has been loaded yet" msgstr "尚未有棋局载入" #: backend.c:11638 backend.c:12505 ngamelist.c:129 msgid "Can't back up any further" msgstr "无法再后退了" #: backend.c:12077 msgid "Game number out of range" msgstr "棋局数量超出范围" #: backend.c:12088 msgid "Can't seek on game file" msgstr "无法搜索棋局文件" #: backend.c:12146 msgid "Game not found in file" msgstr "文件中没有找到棋局" #: backend.c:12274 backend.c:12601 msgid "Bad FEN position in file" msgstr "文件中的FEN局面错误" #: backend.c:12426 msgid "No moves in game" msgstr "棋局中没有着法" #: backend.c:12501 msgid "No position has been loaded yet" msgstr "尚未有局面载入" #: backend.c:12562 backend.c:12573 msgid "Can't seek on position file" msgstr "无法搜索局面文件" #: backend.c:12580 backend.c:12592 msgid "Position not found in file" msgstr "文件中没有着到局面" #: backend.c:12632 msgid "Black to play" msgstr "轮到黑方走棋" #: backend.c:12635 msgid "White to play" msgstr "轮到白方走棋" #: backend.c:12722 backend.c:13083 msgid "Waiting for access to save file" msgstr "" #: backend.c:12724 msgid "Saving game" msgstr "" #: backend.c:12725 msgid "Bad Seek" msgstr "" #: backend.c:13085 msgid "Saving position" msgstr "" #: backend.c:13211 msgid "" "You have edited the game history.\n" "Use Reload Same Game and make your move again." msgstr "" #: backend.c:13216 msgid "" "You have entered too many moves.\n" "Back up to the correct position and try again." msgstr "" #: backend.c:13221 msgid "" "Displayed position is not current.\n" "Step forward to the correct position and try again." msgstr "" #: backend.c:13268 msgid "You have not made a move yet" msgstr "一步棋也没走过" #: backend.c:13289 msgid "" "The cmail message is not loaded.\n" "Use Reload CMail Message and make your move again." msgstr "" #: backend.c:13294 msgid "No unfinished games" msgstr "No unfinished games" #: backend.c:13300 #, c-format msgid "" "You have already mailed a move.\n" "Wait until a move arrives from your opponent.\n" "To resend the same move, type\n" "\"cmail -remail -game %s\"\n" "on the command line." msgstr "" #: backend.c:13315 msgid "Failed to invoke cmail" msgstr "Failed to invoke cmail" #: backend.c:13377 #, c-format msgid "Waiting for reply from opponent\n" msgstr "Waiting for reply from opponent\n" #: backend.c:13399 #, c-format msgid "Still need to make move for game\n" msgstr "Still need to make move for game\n" #: backend.c:13403 #, c-format msgid "Still need to make moves for both games\n" msgstr "Still need to make moves for both games\n" #: backend.c:13407 #, c-format msgid "Still need to make moves for all %d games\n" msgstr "Still need to make moves for all %d games\n" #: backend.c:13414 #, c-format msgid "Still need to make a move for game %s\n" msgstr "Still need to make a move for game %s\n" #: backend.c:13420 #, c-format msgid "No unfinished games\n" msgstr "No unfinished games\n" #: backend.c:13422 #, c-format msgid "Ready to send mail\n" msgstr "Ready to send mail\n" #: backend.c:13427 #, c-format msgid "Still need to make moves for games %s\n" msgstr "Still need to make moves for games %s\n" #: backend.c:13631 msgid "Edit comment" msgstr "编辑注释" #: backend.c:13633 #, c-format msgid "Edit comment on %d.%s%s" msgstr "编辑注释 %d.%s%s" #: backend.c:13688 #, c-format msgid "You are not observing a game" msgstr "" #: backend.c:13796 msgid "It is not White's turn" msgstr "没有轮到白方走棋" #: backend.c:13877 msgid "It is not Black's turn" msgstr "没有轮到黑方走棋" #: backend.c:13985 #, c-format msgid "Starting %s chess program" msgstr "" #: backend.c:14013 backend.c:15127 msgid "" "Wait until your turn,\n" "or select Move Now" msgstr "" #: backend.c:14147 msgid "Training mode off" msgstr "训练模式已关闭" #: backend.c:14155 msgid "Training mode on" msgstr "训练模式已打开" #: backend.c:14158 msgid "Already at end of game" msgstr "棋局已经结束" #: backend.c:14238 msgid "Warning: You are still playing a game" msgstr "注意:你正在进行棋局" #: backend.c:14241 msgid "Warning: You are still observing a game" msgstr "注意:你正在旁观棋局" #: backend.c:14244 msgid "Warning: You are still examining a game" msgstr "注意:你正在研究棋局" #: backend.c:14311 msgid "Click clock to clear board" msgstr "" #: backend.c:14321 msgid "Close ICS engine analyze..." msgstr "" #: backend.c:14609 msgid "That square is occupied" msgstr "格子已放棋子" #: backend.c:14633 backend.c:14659 msgid "There is no pending offer on this move" msgstr "该着法没有待定的提议" #: backend.c:14695 backend.c:14706 msgid "Your opponent is not out of time" msgstr "对手没有超时" #: backend.c:14772 msgid "You must make your move before offering a draw" msgstr "必须走完棋才能提和" #: backend.c:15109 msgid "You are not examining a game" msgstr "没有分析棋局" #: backend.c:15113 msgid "You can't revert while pausing" msgstr "暂停时不能复原棋局" #: backend.c:15167 backend.c:15174 msgid "It is your turn" msgstr "轮到你走棋" #: backend.c:15225 backend.c:15232 backend.c:15285 backend.c:15292 msgid "Wait until your turn" msgstr "等待对手走棋" #: backend.c:15237 msgid "No hint available" msgstr "没有可用的提示" #: backend.c:15253 ngamelist.c:355 #, fuzzy msgid "Game list not loaded or empty" msgstr "尚未有棋局载入" #: backend.c:15260 msgid "Book file exists! Try again for overwrite." msgstr "" #: backend.c:15738 #, c-format msgid "Error writing to %s chess program" msgstr "发送信息到%s国际象棋程序时出错" #: backend.c:15741 backend.c:15772 #, c-format msgid "%s program exits in draw position (%s)" msgstr "" #: backend.c:15767 #, c-format msgid "Error: %s chess program (%s) exited unexpectedly" msgstr "错误:%s国际象棋程序(%s)突然退出了" #: backend.c:15785 #, c-format msgid "Error reading from %s chess program (%s)" msgstr "从%s国际象棋程序(%s)接收信息时出错" #: backend.c:16187 #, c-format msgid "%s engine has too many options\n" msgstr "" #: backend.c:16343 msgid "Displayed move is not current" msgstr "显示的着法不是当前着法" #: backend.c:16352 msgid "Could not parse move" msgstr "无法解析着法" #: backend.c:16477 backend.c:16499 msgid "Both flags fell" msgstr "双方都超时了" #: backend.c:16479 msgid "White's flag fell" msgstr "白方超时" #: backend.c:16501 msgid "Black's flag fell" msgstr "黑方超时" #: backend.c:16632 msgid "Clock adjustment not allowed in auto-flag mode" msgstr "" #: backend.c:17467 msgid "Bad FEN position in clipboard" msgstr "剪贴板的FEN局面错误" #: book.c:577 book.c:833 msgid "Polyglot book not valid" msgstr "" #: book.c:701 msgid "Book Fault" msgstr "" #: book.c:836 msgid "Hash keys are different" msgstr "" #: book.c:1003 #, fuzzy msgid "Could not create book" msgstr "无法解析着法" #: dialogs.c:259 #, fuzzy msgid "Tournament file: " msgstr "封盘(J) F7" #: dialogs.c:260 msgid "Sync after round" msgstr "" #: dialogs.c:261 msgid " (for concurrent playing of a single" msgstr "" #: dialogs.c:262 msgid "Sync after cycle" msgstr "" #: dialogs.c:263 msgid " tourney with multiple XBoards)" msgstr "" #: dialogs.c:264 msgid "Tourney participants:" msgstr "" #: dialogs.c:265 msgid "Select Engine:" msgstr "" #: dialogs.c:273 msgid "Tourney type (0 = round-robin, 1 = gauntlet):" msgstr "" #: dialogs.c:274 msgid "Number of tourney cycles (or Swiss rounds):" msgstr "" #: dialogs.c:275 msgid "Default Number of Games in Match (or Pairing):" msgstr "" #: dialogs.c:276 msgid "Pause between Match Games (msec):" msgstr "" #: dialogs.c:277 msgid "Save Tourney Games on:" msgstr "" #: dialogs.c:278 msgid "Game File with Opening Lines:" msgstr "" #: dialogs.c:279 msgid "Game Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:280 msgid "File with Start Positions:" msgstr "" #: dialogs.c:281 msgid "Position Number (-1 or -2 = Auto-Increment):" msgstr "" #: dialogs.c:282 msgid "Rewind Index after this many Games (0 = never):" msgstr "" #: dialogs.c:283 msgid "Disable own engine books by default" msgstr "" #: dialogs.c:284 #, fuzzy msgid "Replace Engine" msgstr "引擎(N)" #: dialogs.c:285 #, fuzzy msgid "Upgrade Engine" msgstr "引擎(N)" #: dialogs.c:286 msgid "Clone Tourney" msgstr "" #: dialogs.c:316 msgid "First you must specify an existing tourney file to clone" msgstr "" #: dialogs.c:332 dialogs.c:1320 msgid "# no engines are installed" msgstr "" #: dialogs.c:344 msgid "Match Options" msgstr "" #: dialogs.c:363 msgid "Absolute Analysis Scores" msgstr "" #: dialogs.c:364 msgid "Almost Always Queen (Detour Under-Promote)" msgstr "" #: dialogs.c:365 menus.c:714 msgid "Animate Dragging" msgstr "动画拖拽(D)" #: dialogs.c:366 menus.c:715 msgid "Animate Moving" msgstr "动画走棋(A)" #: dialogs.c:367 menus.c:716 msgid "Auto Flag" msgstr "自动超时判负(F) Ctrl+Shift+F" #: dialogs.c:368 menus.c:717 msgid "Auto Flip View" msgstr "自动翻转棋盘(V)" #: dialogs.c:369 menus.c:718 msgid "Blindfold" msgstr "盲棋(B)" #: dialogs.c:370 msgid "Drop Menu" msgstr "" #: dialogs.c:371 msgid "Enable Variation Trees" msgstr "" #: dialogs.c:372 msgid "Hide Thinking from Human" msgstr "与人对弈时隐藏思考细节" #: dialogs.c:373 menus.c:723 msgid "Highlight Last Move" msgstr "醒目提示上一着法(M)" #: dialogs.c:374 msgid "Highlight with Arrow" msgstr "用箭头突出移动" #: dialogs.c:375 menus.c:726 msgid "One-Click Moving" msgstr "单击移动(M)" #: dialogs.c:376 msgid "Periodic Updates (in Analysis Mode)" msgstr "定期更新(分析模式)" #: dialogs.c:378 msgid "Play Move(s) of Clicked PV (Analysis)" msgstr "" #: dialogs.c:379 dialogs.c:514 menus.c:728 msgid "Ponder Next Move" msgstr "同步思考(N)" #: dialogs.c:380 msgid "Popup Exit Messages" msgstr "退出时提示(P)" #: dialogs.c:381 menus.c:730 msgid "Popup Move Errors" msgstr "提示错误着法(E)" #: dialogs.c:382 #, fuzzy msgid "Scores in Move List" msgstr "获取着法列表(G)" #: dialogs.c:383 msgid "Show Coordinates" msgstr "显示坐标(C)" #: dialogs.c:384 msgid "Show Target Squares" msgstr "" #: dialogs.c:385 msgid "Sticky Windows" msgstr "" #: dialogs.c:386 menus.c:733 msgid "Test Legality" msgstr "检查着法合理性(L) Cl+Sh+L" #: dialogs.c:387 msgid "Top-Level Dialogs" msgstr "" #: dialogs.c:388 msgid "Flash Moves (0 = no flashing):" msgstr "" #: dialogs.c:389 msgid "Flash Rate (high = fast):" msgstr "" #: dialogs.c:390 msgid "Animation Speed (high = slow):" msgstr "" #: dialogs.c:391 #, fuzzy msgid "Zoom factor in Evaluation Graph:" msgstr "评价图" #: dialogs.c:400 msgid "General Options" msgstr "常规选项" #: dialogs.c:410 msgid "normal" msgstr "" #: dialogs.c:411 msgid "makruk" msgstr "" #: dialogs.c:412 msgid "FRC" msgstr "" #: dialogs.c:413 msgid "shatranj" msgstr "" #: dialogs.c:414 msgid "wild castle" msgstr "" #: dialogs.c:415 msgid "knightmate" msgstr "" #: dialogs.c:416 msgid "no castle" msgstr "" #: dialogs.c:417 msgid "cylinder *" msgstr "" #: dialogs.c:418 msgid "3-checks" msgstr "" #: dialogs.c:419 msgid "berolina *" msgstr "" #: dialogs.c:420 msgid "atomic" msgstr "" #: dialogs.c:421 msgid "two kings" msgstr "" #: dialogs.c:422 msgid "Board size ( -1 = default for selected variant):" msgstr "" #: dialogs.c:423 msgid "Number of Board Ranks:" msgstr "" #: dialogs.c:424 msgid "Number of Board Files:" msgstr "" #: dialogs.c:425 msgid "Holdings Size:" msgstr "" #: dialogs.c:429 msgid "fairy" msgstr "" #: dialogs.c:430 msgid "Great Shatranj (10x8)" msgstr "" #: dialogs.c:431 msgid "Seirawan" msgstr "" #: dialogs.c:432 msgid "falcon (10x8)" msgstr "" #: dialogs.c:433 msgid "Superchess" msgstr "" #: dialogs.c:434 msgid "Capablanca (10x8)" msgstr "" #: dialogs.c:435 msgid "crazyhouse" msgstr "" #: dialogs.c:436 msgid "Gothic (10x8)" msgstr "" #: dialogs.c:437 msgid "bughouse" msgstr "" #: dialogs.c:438 msgid "janus (10x8)" msgstr "" #: dialogs.c:439 msgid "suicide" msgstr "" #: dialogs.c:440 msgid "CRC (10x8)" msgstr "" #: dialogs.c:441 msgid "give-away" msgstr "" #: dialogs.c:442 msgid "grand (10x10)" msgstr "" #: dialogs.c:443 msgid "losers" msgstr "" #: dialogs.c:444 msgid "shogi (9x9)" msgstr "" #: dialogs.c:445 msgid "Spartan" msgstr "" #: dialogs.c:446 msgid "xiangqi (9x10)" msgstr "" #: dialogs.c:447 msgid " " msgstr "" #: dialogs.c:448 msgid "courier (12x8)" msgstr "" #: dialogs.c:465 #, c-format msgid "Warning: second engine (%s) does not support this!" msgstr "警告: 第二个引擎(%s) 不支持此!" #: dialogs.c:488 #, c-format msgid "Only bughouse is not available in viewer mode" msgstr "" #: dialogs.c:489 #, c-format msgid "" "All variants not supported by first engine\n" "(currently %s) are disabled" msgstr "" #: dialogs.c:490 msgid "New Variant" msgstr "变种" #: dialogs.c:515 msgid "Maximum Number of CPUs per Engine:" msgstr "最大CPU数" #: dialogs.c:516 msgid "Polygot Directory:" msgstr "" #: dialogs.c:517 msgid "Hash-Table Size (MB):" msgstr "Hash 大小(MB)" #: dialogs.c:518 msgid "Nalimov EGTB Path:" msgstr "EGTB 路径" #: dialogs.c:519 msgid "EGTB Cache Size (MB):" msgstr "EGTB 大小(MB)" #: dialogs.c:520 msgid "Use GUI Book" msgstr "" #: dialogs.c:521 msgid "Opening-Book Filename:" msgstr "" #: dialogs.c:522 msgid "Book Depth (moves):" msgstr "库着法深度" #: dialogs.c:523 msgid "Book Variety (0) vs. Strength (100):" msgstr "库变例" #: dialogs.c:524 msgid "Engine #1 Has Own Book" msgstr "引擎1有自用库" #: dialogs.c:525 msgid "Engine #2 Has Own Book " msgstr "" #: dialogs.c:534 msgid "Common Engine Settings" msgstr "通用引擎设置" #: dialogs.c:540 msgid "Detect all Mates" msgstr "检测将杀(M)" #: dialogs.c:541 msgid "Verify Engine Result Claims" msgstr "验证引擎声明(V)" #: dialogs.c:542 msgid "Draw if Insufficient Mating Material" msgstr "子力不足时判和(I)" #: dialogs.c:543 msgid "Adjudicate Trivial Draws (3-Move Delay)" msgstr "一般和棋判决(T)" #: dialogs.c:544 msgid "N-Move Rule:" msgstr "" #: dialogs.c:545 msgid "N-fold Repeats:" msgstr "" #: dialogs.c:546 msgid "Draw after N Moves Total:" msgstr "几着后判决" #: dialogs.c:547 msgid "Win / Loss Threshold:" msgstr "输/赢判决阈值" #: dialogs.c:548 msgid "Negate Score of Engine #1" msgstr "引擎 #1 是绝对分数" #: dialogs.c:549 msgid "Negate Score of Engine #2" msgstr "引擎 #2 是绝对分数" #: dialogs.c:556 #, fuzzy msgid "Adjudicate non-ICS Games" msgstr "裁决白赢 (W)" #: dialogs.c:569 msgid "Auto-Kibitz" msgstr "自动\"kibitz\"(A)" #: dialogs.c:570 msgid "Auto-Comment" msgstr "自动注释(A)" #: dialogs.c:571 msgid "Auto-Observe" msgstr "自动旁观(O)" #: dialogs.c:572 msgid "Auto-Raise Board" msgstr "自动改变棋盘大小(R)" #: dialogs.c:573 msgid "Auto-Create Logon Script" msgstr "" #: dialogs.c:574 msgid "Background Observe while Playing" msgstr "后台观察(v)" #: dialogs.c:575 msgid "Dual Board for Background-Observed Game" msgstr "双棋盘(D)" #: dialogs.c:576 msgid "Get Move List" msgstr "获取着法列表(G)" #: dialogs.c:577 msgid "Quiet Play" msgstr "落子无声(Q)" #: dialogs.c:578 msgid "Seek Graph" msgstr "可选对手图表(k)" #: dialogs.c:579 msgid "Auto-Refresh Seek Graph" msgstr "自动刷新图表(R)" #: dialogs.c:580 msgid "Auto-InputBox PopUp" msgstr "" #: dialogs.c:581 msgid "Premove" msgstr "预先走棋(P)" #: dialogs.c:582 msgid "Premove for White" msgstr "" #: dialogs.c:583 msgid "First White Move:" msgstr "白方先行(W)" #: dialogs.c:584 msgid "Premove for Black" msgstr "" #: dialogs.c:585 msgid "First Black Move:" msgstr "黑方先行(B)" #: dialogs.c:587 msgid "Alarm" msgstr "提示" #: dialogs.c:588 msgid "Alarm Time (msec):" msgstr "" #: dialogs.c:590 msgid "Colorize Messages" msgstr "" #: dialogs.c:591 msgid "Shout Text Colors:" msgstr "" #: dialogs.c:592 msgid "S-Shout Text Colors:" msgstr "" #: dialogs.c:593 msgid "Channel #1 Text Colors:" msgstr "" #: dialogs.c:594 msgid "Other Channel Text Colors:" msgstr "" #: dialogs.c:595 msgid "Kibitz Text Colors:" msgstr "" #: dialogs.c:596 msgid "Tell Text Colors:" msgstr "" #: dialogs.c:597 msgid "Challenge Text Colors:" msgstr "" #: dialogs.c:598 msgid "Request Text Colors:" msgstr "" #: dialogs.c:599 msgid "Seek Text Colors:" msgstr "" #: dialogs.c:606 msgid "ICS Options" msgstr "ICS设置" #: dialogs.c:611 msgid "Exact position match" msgstr "" #: dialogs.c:611 msgid "Shown position is subset" msgstr "" #: dialogs.c:611 msgid "Same material with exactly same Pawn chain" msgstr "" #: dialogs.c:612 msgid "Same material" msgstr "" #: dialogs.c:612 msgid "Material range (top board half optional)" msgstr "" #: dialogs.c:612 msgid "Material difference (optional stuff balanced)" msgstr "" #: dialogs.c:624 msgid "Auto-Display Tags" msgstr "" #: dialogs.c:625 msgid "Auto-Display Comment" msgstr "" #: dialogs.c:626 msgid "" "Auto-Play speed of loaded games\n" "(0 = instant, -1 = off):" msgstr "" #: dialogs.c:627 msgid "Seconds per Move:" msgstr "" #: dialogs.c:628 msgid "" "\n" "options to use in game-viewer mode:" msgstr "" #: dialogs.c:630 msgid "" "\n" "Thresholds for position filtering in game list:" msgstr "" #: dialogs.c:631 msgid "Elo of strongest player at least:" msgstr "" #: dialogs.c:632 msgid "Elo of weakest player at least:" msgstr "" #: dialogs.c:633 #, fuzzy msgid "No games before year:" msgstr "尚未有棋局载入" #: dialogs.c:634 msgid "Minimum nr consecutive positions:" msgstr "" #: dialogs.c:635 msgid "Search mode:" msgstr "" #: dialogs.c:636 msgid "Also match reversed colors" msgstr "" #: dialogs.c:637 msgid "Also match left-right flipped position" msgstr "" #: dialogs.c:645 msgid "Load Game Options" msgstr "载入棋局选项" #: dialogs.c:657 msgid "Auto-Save Games" msgstr "" #: dialogs.c:658 msgid "Own Games Only" msgstr "" #: dialogs.c:659 msgid "Save Games on File:" msgstr "" #: dialogs.c:660 msgid "Save Final Positions on File:" msgstr "" #: dialogs.c:661 msgid "PGN Event Header:" msgstr "" #: dialogs.c:662 msgid "Old Save Style (as opposed to PGN)" msgstr "" #: dialogs.c:663 msgid "Include Number Tag in tourney PGN" msgstr "" #: dialogs.c:664 msgid "Save Score/Depth Info in PGN" msgstr "" #: dialogs.c:665 msgid "Save Out-of-Book Info in PGN " msgstr "" #: dialogs.c:672 msgid "Save Game Options" msgstr "保存棋局选项" #: dialogs.c:681 msgid "No Sound" msgstr "无声" #: dialogs.c:682 msgid "Default Beep" msgstr "默认声音" #: dialogs.c:683 msgid "Above WAV File" msgstr "" #: dialogs.c:684 msgid "Car Horn" msgstr "" #: dialogs.c:685 msgid "Cymbal" msgstr "" #: dialogs.c:686 msgid "Ding" msgstr "" #: dialogs.c:687 msgid "Gong" msgstr "" #: dialogs.c:688 msgid "Laser" msgstr "" #: dialogs.c:689 msgid "Penalty" msgstr "" #: dialogs.c:690 msgid "Phone" msgstr "" #: dialogs.c:691 msgid "Pop" msgstr "" #: dialogs.c:692 msgid "Slap" msgstr "" #: dialogs.c:693 msgid "Wood Thunk" msgstr "" #: dialogs.c:695 msgid "User File" msgstr "" #: dialogs.c:717 msgid "User WAV File:" msgstr "" #: dialogs.c:718 msgid "Sound Program:" msgstr "" #: dialogs.c:719 msgid "Try-Out Sound:" msgstr "" #: dialogs.c:720 msgid "Play" msgstr "播放" #: dialogs.c:721 msgid "Move:" msgstr "" #: dialogs.c:722 msgid "Win:" msgstr "" #: dialogs.c:723 msgid "Lose:" msgstr "" #: dialogs.c:724 msgid "Draw:" msgstr "" #: dialogs.c:725 msgid "Unfinished:" msgstr "" #: dialogs.c:726 msgid "Alarm:" msgstr "" #: dialogs.c:727 msgid "Challenge:" msgstr "" #: dialogs.c:729 msgid "Sounds Directory:" msgstr "" #: dialogs.c:730 msgid "Shout:" msgstr "" #: dialogs.c:731 msgid "S-Shout:" msgstr "" #: dialogs.c:732 msgid "Channel:" msgstr "" #: dialogs.c:733 msgid "Channel 1:" msgstr "" #: dialogs.c:734 msgid "Tell:" msgstr "" #: dialogs.c:735 msgid "Kibitz:" msgstr "" #: dialogs.c:736 msgid "Request:" msgstr "" #: dialogs.c:737 msgid "Seek:" msgstr "" #: dialogs.c:753 msgid "Sound Options" msgstr "声音" #: dialogs.c:774 msgid "White Piece Color:" msgstr "" #. TRANSLATORS: R = single letter for the color red #: dialogs.c:777 dialogs.c:786 dialogs.c:792 dialogs.c:798 dialogs.c:804 #: dialogs.c:810 msgid "R" msgstr "" #. TRANSLATORS: G = single letter for the color green #: dialogs.c:779 dialogs.c:787 dialogs.c:793 dialogs.c:799 dialogs.c:805 #: dialogs.c:811 msgid "G" msgstr "" #. TRANSLATORS: B = single letter for the color blue #: dialogs.c:781 dialogs.c:788 dialogs.c:794 dialogs.c:800 dialogs.c:806 #: dialogs.c:812 msgid "B" msgstr "" #. TRANSLATORS: D = single letter to make a color darker #: dialogs.c:783 dialogs.c:789 dialogs.c:795 dialogs.c:801 dialogs.c:807 #: dialogs.c:813 msgid "D" msgstr "" #: dialogs.c:784 msgid "Black Piece Color:" msgstr "黑子" #: dialogs.c:790 msgid "Light Square Color:" msgstr "白格" #: dialogs.c:796 msgid "Dark Square Color:" msgstr "黑格" #: dialogs.c:802 msgid "Highlight Color:" msgstr "格子标记" #: dialogs.c:808 msgid "Premove Highlight Color:" msgstr "预先走棋标记" #: dialogs.c:814 msgid "Flip Pieces Shogi Style (Colored buttons restore default)" msgstr "" #: dialogs.c:816 msgid "Mono Mode" msgstr "黑白" #: dialogs.c:817 msgid "Line Gap ( -1 = default for board size):" msgstr "" #: dialogs.c:818 msgid "Use Board Textures" msgstr "" #: dialogs.c:819 msgid "Light-Squares Texture File:" msgstr "" #: dialogs.c:820 msgid "Dark-Squares Texture File:" msgstr "" #: dialogs.c:821 msgid "Use external piece bitmaps with their own colors" msgstr "" #: dialogs.c:822 msgid "Directory with Pieces Images:" msgstr "" #: dialogs.c:872 msgid "Board Options" msgstr "棋盘选项" #: dialogs.c:925 menus.c:634 msgid "ICS text menu" msgstr "" #: dialogs.c:947 msgid "clear" msgstr "" #: dialogs.c:948 dialogs.c:1036 msgid "save changes" msgstr "" #: dialogs.c:1051 #, fuzzy msgid "Edit book" msgstr "编辑(E)" #: dialogs.c:1051 menus.c:636 msgid "Tags" msgstr "编辑标签(T)" #: dialogs.c:1193 msgid "ICS input box" msgstr "" #: dialogs.c:1225 msgid "Type a move" msgstr "" #: dialogs.c:1251 msgid "Engine has no options" msgstr "" #: dialogs.c:1253 msgid "Engine Settings" msgstr "" #: dialogs.c:1278 msgid "Select engine from list:" msgstr "" #: dialogs.c:1281 msgid "or specify one below:" msgstr "" #: dialogs.c:1282 msgid "Nickname (optional):" msgstr "" #: dialogs.c:1283 msgid "Use nickname in PGN player tags of engine-engine games" msgstr "" #: dialogs.c:1284 msgid "Engine Directory:" msgstr "" #: dialogs.c:1285 msgid "Engine Command:" msgstr "" #: dialogs.c:1286 msgid "(Directory will be derived from engine path when empty)" msgstr "" #: dialogs.c:1287 msgid "UCI" msgstr "" #: dialogs.c:1288 msgid "WB protocol v1 (do not wait for engine features)" msgstr "" #: dialogs.c:1289 msgid "Must not use GUI book" msgstr "" #: dialogs.c:1290 msgid "Add this engine to the list" msgstr "" #: dialogs.c:1291 msgid "Force current variant with this engine" msgstr "" #: dialogs.c:1341 msgid "Load first engine" msgstr "" #: dialogs.c:1347 msgid "Load second engine" msgstr "" #: dialogs.c:1370 msgid "shuffle" msgstr "" #: dialogs.c:1371 msgid "Start-position number:" msgstr "启动位置号码(S)" #: dialogs.c:1372 #, fuzzy msgid "randomize" msgstr "随机" #: dialogs.c:1373 msgid "pick fixed" msgstr "" #: dialogs.c:1390 msgid "New Shuffle Game" msgstr "洗牌游戏(u)..." #: dialogs.c:1409 msgid "classical" msgstr "" #: dialogs.c:1410 msgid "incremental" msgstr "" #: dialogs.c:1411 msgid "fixed max" msgstr "" #: dialogs.c:1412 msgid "Moves per session:" msgstr "" #: dialogs.c:1413 msgid "Initial time (min):" msgstr "" #: dialogs.c:1414 msgid "Increment or max (sec/move):" msgstr "" #: dialogs.c:1415 #, fuzzy msgid "Time-Odds factors:" msgstr "时间倍数" #: dialogs.c:1416 #, fuzzy msgid "Engine #1" msgstr "引擎(N)" #: dialogs.c:1417 #, fuzzy msgid "Engine #2 / Human" msgstr "引擎1有自用库" #: dialogs.c:1457 dialogs.c:1460 dialogs.c:1465 dialogs.c:1466 #: gtk/xoptions.c:194 msgid "Unused" msgstr "" #: dialogs.c:1478 msgid "Time Control" msgstr "" #: dialogs.c:1507 msgid "Error writing to chess program" msgstr "发送信息给国际象棋程序时出错" #: dialogs.c:1574 #, fuzzy msgid "Cancel" msgstr "取消(C)" #: dialogs.c:1579 dialogs.c:1971 dialogs.c:1975 msgid "King" msgstr "王" #: dialogs.c:1582 msgid "Captain" msgstr "" #: dialogs.c:1583 msgid "Lieutenant" msgstr "" #: dialogs.c:1584 msgid "General" msgstr "常规选项(G)..." #: dialogs.c:1585 msgid "Warlord" msgstr "" #: dialogs.c:1587 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Knight" msgstr "马" #: dialogs.c:1588 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Bishop" msgstr "象" #: dialogs.c:1589 dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Rook" msgstr "车" #: dialogs.c:1593 dialogs.c:1972 dialogs.c:1976 msgid "Archbishop" msgstr "国师" #: dialogs.c:1594 dialogs.c:1972 dialogs.c:1976 msgid "Chancellor" msgstr "宰相" #: dialogs.c:1596 dialogs.c:1971 dialogs.c:1975 dialogs.c:1993 msgid "Queen" msgstr "后" #: dialogs.c:1600 msgid "Defer" msgstr "" #: dialogs.c:1601 dialogs.c:1972 dialogs.c:1976 msgid "Promote" msgstr "升变" #: dialogs.c:1616 msgid "Chat partner:" msgstr "" #: dialogs.c:1701 msgid "Chat box" msgstr "" #: dialogs.c:1742 msgid "factory" msgstr "" #: dialogs.c:1743 msgid "up" msgstr "向上" #: dialogs.c:1744 msgid "down" msgstr "向下" #: dialogs.c:1762 msgid "No tag selected" msgstr "" #: dialogs.c:1793 #, fuzzy msgid "Game-list options" msgstr "载入棋局选项" #: dialogs.c:1869 dialogs.c:1883 msgid "Error" msgstr "错误" #: dialogs.c:1906 msgid "Fatal Error" msgstr "严重错误" #: dialogs.c:1906 msgid "Exiting" msgstr "退出" #: dialogs.c:1917 msgid "Information" msgstr "" #: dialogs.c:1924 msgid "Note" msgstr "注释" #: dialogs.c:1970 dialogs.c:2245 dialogs.c:2248 msgid "White" msgstr "白方" #: dialogs.c:1970 dialogs.c:1974 dialogs.c:1993 msgid "Pawn" msgstr "兵" #: dialogs.c:1971 dialogs.c:1975 msgid "Elephant" msgstr "象" #: dialogs.c:1971 dialogs.c:1975 msgid "Cannon" msgstr "炮" #: dialogs.c:1972 dialogs.c:1976 msgid "Demote" msgstr "降级" #: dialogs.c:1973 dialogs.c:1977 msgid "Empty square" msgstr "清空格子" #: dialogs.c:1973 dialogs.c:1977 msgid "Clear board" msgstr "清空棋盘" #: dialogs.c:1974 dialogs.c:2257 dialogs.c:2260 msgid "Black" msgstr "黑方" #: dialogs.c:2073 menus.c:787 msgid "File" msgstr "文件(F)" #: dialogs.c:2074 menus.c:788 msgid "Edit" msgstr "编辑(E)" #: dialogs.c:2075 menus.c:789 msgid "View" msgstr "外观(V)" #: dialogs.c:2076 menus.c:790 msgid "Mode" msgstr "模式(M)" #: dialogs.c:2077 menus.c:791 msgid "Action" msgstr "行为(A)" #: dialogs.c:2078 menus.c:792 msgid "Engine" msgstr "引擎(N)" #: dialogs.c:2079 menus.c:793 msgid "Options" msgstr "选项(O)" #: dialogs.c:2080 menus.c:794 msgid "Help" msgstr "帮助(H)" #: dialogs.c:2090 msgid "<<" msgstr "" #: dialogs.c:2091 msgid "<" msgstr "" #: dialogs.c:2093 msgid ">" msgstr "" #: dialogs.c:2094 msgid ">>" msgstr "" #: dialogs.c:2364 msgid "Directories:" msgstr "" #: dialogs.c:2365 #, fuzzy msgid "Files:" msgstr "文件(F)" #: dialogs.c:2366 msgid "by name" msgstr "" #: dialogs.c:2367 msgid "by type" msgstr "" #: dialogs.c:2370 #, fuzzy msgid "Filename:" msgstr "过滤器" #: dialogs.c:2371 msgid "New directory" msgstr "" #: dialogs.c:2372 #, fuzzy msgid "File type:" msgstr "过滤器" #: dialogs.c:2447 #, fuzzy msgid "Contents of" msgstr "编辑注释(C) *.*" #: dialogs.c:2473 msgid " next page" msgstr "" #: dialogs.c:2490 msgid "FIRST TYPE DIRECTORY NAME HERE" msgstr "" #: dialogs.c:2491 msgid "TRY ANOTHER NAME" msgstr "" #: draw.c:293 msgid "" "No default pieces installed\n" "Select your own -pieceImageDirectory" msgstr "" #: engineoutput.c:107 menus.c:630 #, fuzzy, c-format msgid "Engine Output" msgstr "引擎输出" #: engineoutput.c:117 #, c-format msgid "%s (%d reversible ply)" msgid_plural "%s (%d reversible plies)" msgstr[0] "" msgstr[1] "" #: engineoutput.c:509 engineoutput.c:512 nengineoutput.c:81 nengineoutput.c:88 msgid "NPS" msgstr "NPS" #: gamelist.c:375 #, fuzzy, c-format msgid "Reading game file (%d)" msgstr "棋局文件错误" #: gtk/xboard.c:844 xaw/xboard.c:1163 #, c-format msgid "%s: can't cd to CHESSDIR: " msgstr "" #: gtk/xboard.c:853 xaw/xboard.c:1172 #, c-format msgid "Failed to open file '%s'\n" msgstr "" #: gtk/xboard.c:868 xaw/xboard.c:1181 msgid "Recompile with larger BOARD_RANKS or BOARD_FILES to support this size" msgstr "" #: gtk/xboard.c:887 xaw/xboard.c:1213 #, c-format msgid "%s: bad boardSize syntax %s\n" msgstr "" #: gtk/xboard.c:927 xaw/xboard.c:1250 #, c-format msgid "%s: unrecognized boardSize name %s\n" msgstr "" #: gtk/xboard.c:968 xaw/xboard.c:1287 #, c-format msgid "%s: too few colors available; trying monochrome mode\n" msgstr "" #: gtk/xboard.c:1258 xaw/xboard.c:1569 #, c-format msgid "Unable to create font set for %s.\n" msgstr "" #: gtk/xboard.c:1283 xaw/xboard.c:1592 #, c-format msgid "%s: no fonts match pattern %s\n" msgstr "" #: gtk/xboard.c:1722 xaw/xboard.c:2082 msgid "Can't open temp file" msgstr "" #: gtk/xboard.c:2174 #, fuzzy msgid "Failed to open file" msgstr "Failed to invoke cmail" #: menus.c:134 msgid "Load game file name?" msgstr "" #: menus.c:179 msgid "Load position file name?" msgstr "" #: menus.c:185 msgid "Save game file name?" msgstr "" #: menus.c:194 msgid "Save position file name?" msgstr "" #: menus.c:358 msgid " (with Zippy code)" msgstr "" #: menus.c:363 #, c-format msgid "" "%s%s\n" "\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n" "\n" "%s is free software and carries NO WARRANTY;see the file COPYING for more " "information.\n" "The GTK build of this version is experimental and unstable\n" "\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/" "whats_new.html\n" "\n" "Report bugs via email at: \n" "\n" msgstr "" #: menus.c:375 menus.c:750 msgid "About XBoard" msgstr "关于XBoard(A)" #: menus.c:582 #, fuzzy msgid "New Game" msgstr "洗牌游戏(u)..." #: menus.c:583 msgid "New Shuffle Game ..." msgstr "洗牌游戏(u)..." #: menus.c:584 #, fuzzy msgid "New Variant ..." msgstr "变种" #: menus.c:586 #, fuzzy msgid "Load Game" msgstr "载入棋局选项(L)... Alt+Shift+L" #: menus.c:587 #, fuzzy msgid "Load Position" msgstr "局面文件错误" #: menus.c:588 #, fuzzy msgid "Next Position" msgstr "局面文件错误" #: menus.c:589 #, fuzzy msgid "Prev Position" msgstr "升变" #: menus.c:591 #, fuzzy msgid "Save Game" msgstr "保存棋局选项(S)... Alt+Shift+S" #: menus.c:592 #, fuzzy msgid "Save Position" msgstr "保存局面(A)... Ctrl+Shift+S" #: menus.c:593 #, fuzzy msgid "Save Games as Book" msgstr "保存棋局选项(S)... Alt+Shift+S" #: menus.c:595 msgid "Mail Move" msgstr "" #: menus.c:596 msgid "Reload CMail Message" msgstr "" #: menus.c:598 msgid "Quit " msgstr "" #: menus.c:603 #, fuzzy msgid "Copy Game" msgstr "复制游戏列表到剪贴板" #: menus.c:604 #, fuzzy msgid "Copy Position" msgstr "复制局面到剪贴板(Y) Ctrl+Shift+C" #: menus.c:605 msgid "Copy Game List" msgstr "复制游戏列表到剪贴板" #: menus.c:607 #, fuzzy msgid "Paste Game" msgstr "粘贴棋局自剪贴板(P) Ctrl+V" #: menus.c:608 #, fuzzy msgid "Paste Position" msgstr "从剪贴板粘贴局面(T) Ctrl+Shift+V" #: menus.c:610 menus.c:652 #, fuzzy msgid "Edit Game" msgstr "编辑注释" #: menus.c:611 menus.c:653 #, fuzzy msgid "Edit Position" msgstr "局面文件错误" #: menus.c:612 msgid "Edit Tags" msgstr "编辑标签(T)" #: menus.c:613 msgid "Edit Comment" msgstr "编辑注释(C)..." #: menus.c:614 #, fuzzy msgid "Edit Book" msgstr "开局库(B)..." #: menus.c:616 msgid "Revert" msgstr "" #: menus.c:617 msgid "Annotate" msgstr "注释(A)" #: menus.c:618 #, fuzzy msgid "Truncate Game" msgstr "截断后面的着法(T)" #: menus.c:620 msgid "Backward" msgstr "" #: menus.c:621 msgid "Forward" msgstr "" #: menus.c:622 #, fuzzy msgid "Back to Start" msgstr "轮到黑方走棋" #: menus.c:623 #, fuzzy msgid "Forward to End" msgstr "最后局面(E) Alt+End" #: menus.c:628 #, fuzzy msgid "Flip View" msgstr "自动翻转棋盘(V)" #: menus.c:631 #, fuzzy msgid "Move History" msgstr "获取着法列表(G)" #: menus.c:632 #, fuzzy msgid "Evaluation Graph" msgstr "评价图" #: menus.c:633 #, fuzzy msgid "Game List" msgstr "游戏列表..." #: menus.c:637 msgid "Comments" msgstr "编辑注释(C) *.*" #: menus.c:638 msgid "ICS Input Box" msgstr "" #: menus.c:639 msgid "Open Chat Window" msgstr "" #: menus.c:641 msgid "Board..." msgstr "棋盘选项(B)..." #: menus.c:642 msgid "Game List Tags..." msgstr "游戏列表..." #: menus.c:647 #, fuzzy msgid "Machine White" msgstr "电脑执白(W) Ctrl+W" #: menus.c:648 #, fuzzy msgid "Machine Black" msgstr "引擎比赛(M)" #: menus.c:649 #, fuzzy msgid "Two Machines" msgstr "电脑对弈(M) Ctrl+T" #: menus.c:650 #, fuzzy msgid "Analysis Mode" msgstr "分析模式(A) Ctrl+A" #: menus.c:651 #, fuzzy msgid "Analyze Game" msgstr "分析文件(F) Ctrl+F" #: menus.c:654 msgid "Training" msgstr "训练(N)" #: menus.c:655 msgid "ICS Client" msgstr "ICS客户端" #: menus.c:657 msgid "Machine Match" msgstr "引擎比赛(M)" #: menus.c:658 msgid "Pause" msgstr "" #: menus.c:663 msgid "Accept" msgstr "" #: menus.c:664 msgid "Decline" msgstr "" #: menus.c:665 msgid "Rematch" msgstr "" #: menus.c:667 #, fuzzy msgid "Call Flag" msgstr "超时判负(F) F5" #: menus.c:668 msgid "Draw" msgstr "" #: menus.c:669 msgid "Adjourn" msgstr "" #: menus.c:670 msgid "Abort" msgstr "" #: menus.c:671 msgid "Resign" msgstr "" #: menus.c:673 #, fuzzy msgid "Stop Observing" msgstr "停止旁观(O) F10" #: menus.c:674 #, fuzzy msgid "Stop Examining" msgstr "停止研究(X) F11" #: menus.c:675 msgid "Upload to Examine" msgstr "上传检查(U)" #: menus.c:677 msgid "Adjudicate to White" msgstr "裁决白赢 (W)" #: menus.c:678 msgid "Adjudicate to Black" msgstr "裁决黑赢 (B)" #: menus.c:679 msgid "Adjudicate Draw" msgstr "提请仲裁(D)" #: menus.c:684 msgid "Load New 1st Engine ..." msgstr "" #: menus.c:685 msgid "Load New 2nd Engine ..." msgstr "" #: menus.c:687 msgid "Engine #1 Settings ..." msgstr "引擎 #1 设置" #: menus.c:688 msgid "Engine #2 Settings ..." msgstr "引擎 #2 设置" #: menus.c:690 msgid "Hint" msgstr "提示(H)..." #: menus.c:691 msgid "Book" msgstr "开局库(B)..." #: menus.c:693 msgid "Move Now" msgstr "" #: menus.c:694 #, fuzzy msgid "Retract Move" msgstr "悔棋(R) Ctrl+X" #: menus.c:700 msgid "General ..." msgstr "常规选项(G)..." #: menus.c:702 #, fuzzy msgid "Time Control ..." msgstr "时限设置(T)... Alt+Shift+T" #: menus.c:703 #, fuzzy msgid "Common Engine ..." msgstr "通用引擎设置(E)... Alt+Shift+U" #: menus.c:704 #, fuzzy msgid "Adjudications ..." msgstr "判决(j)... Alt+Shift+J" #: menus.c:705 msgid "ICS ..." msgstr "ICS选项..." #: menus.c:706 msgid "Match ..." msgstr "" #: menus.c:707 msgid "Load Game ..." msgstr "载入棋局选项(L)... Alt+Shift+L" #: menus.c:708 msgid "Save Game ..." msgstr "保存棋局选项(S)... Alt+Shift+S" #: menus.c:709 msgid "Game List ..." msgstr "游戏列表..." #: menus.c:710 msgid "Sounds ..." msgstr "声音选项(D)..." #: menus.c:713 msgid "Always Queen" msgstr "" #: menus.c:719 msgid "Flash Moves" msgstr "" #: menus.c:721 msgid "Highlight Dragging" msgstr "拖拽醒目提示(H)" #: menus.c:724 msgid "Highlight With Arrow" msgstr "用箭头突出移动" #: menus.c:725 msgid "Move Sound" msgstr "" #: menus.c:727 msgid "Periodic Updates" msgstr "定期更新(U)" #: menus.c:729 msgid "Popup Exit Message" msgstr "退出时提示(P)" #: menus.c:731 msgid "Show Coords" msgstr "显示坐标(C)" #: menus.c:732 #, fuzzy msgid "Hide Thinking" msgstr "与人对弈时隐藏思考细节" #: menus.c:736 msgid "Save Settings Now" msgstr "立即保存设置(N)" #: menus.c:737 msgid "Save Settings on Exit" msgstr "退出时保存设置(X)" #: menus.c:742 msgid "Info XBoard" msgstr "" #: menus.c:743 #, fuzzy msgid "Man XBoard" msgstr "关于XBoard(A)" #: menus.c:745 msgid "XBoard Home Page" msgstr "" #: menus.c:746 msgid "On-line User Guide" msgstr "" #: menus.c:747 msgid "Development News" msgstr "" #: menus.c:748 msgid "e-Mail Bug Report" msgstr "" #: nengineoutput.c:78 nengineoutput.c:85 #, fuzzy msgid "engine name" msgstr "引擎(N)" #: nengineoutput.c:80 nengineoutput.c:87 #, fuzzy msgid "move" msgstr "着法" #: nengineoutput.c:153 msgid "Engine output" msgstr "引擎输出" #: nengineoutput.c:157 msgid "" "Mismatch of STRIDE in nengineoutput.c\n" "Change and recompile!" msgstr "" #: nevalgraph.c:68 msgid "Evaluation graph" msgstr "评价图" #: nevalgraph.c:105 msgid "Eval" msgstr "" #: ngamelist.c:87 #, fuzzy msgid "find position" msgstr "局面文件错误" #: ngamelist.c:88 msgid "narrow" msgstr "" #: ngamelist.c:89 msgid "thresholds" msgstr "" #: ngamelist.c:90 #, fuzzy msgid "tags" msgstr "编辑标签(T)" #: ngamelist.c:91 msgid "next" msgstr "" #: ngamelist.c:92 msgid "close" msgstr "" #: ngamelist.c:116 msgid "No game selected" msgstr "没有选中棋局" #: ngamelist.c:122 msgid "Can't go forward any further" msgstr "无法再前进了" #: ngamelist.c:192 #, c-format msgid "Scanning through games (%d)" msgstr "" #: ngamelist.c:211 msgid "previous page" msgstr "" #: ngamelist.c:214 msgid "next page" msgstr "" #: ngamelist.c:217 msgid "no games matched your request" msgstr "" #: ngamelist.c:219 #, fuzzy, c-format msgid "%s - %d/%d games (%d-%d-%d)" msgstr "比赛 %s vs. %s: 最终比分 %d-%d-%d" #: ngamelist.c:274 msgid "There is no game list" msgstr "没有棋局列表" #: nhistory.c:109 msgid "Move list" msgstr "" #: usystem.c:222 #, c-format msgid "%s: unrecognized color %s\n" msgstr "" #: usystem.c:230 #, c-format msgid "%s: can't parse foreground color in `%s'\n" msgstr "" #: usystem.c:259 #, c-format msgid "%s: can't parse color names; disabling colorization\n" msgstr "" #: usystem.c:371 #, c-format msgid "ERROR: Unknown user %s (in path %s)\n" msgstr "" #: usystem.c:556 msgid "Socket support is not configured in" msgstr "" #: usystem.c:645 msgid "internal rcmd not implemented for Unix" msgstr "" #: xaw/xboard.c:479 #, c-format msgid "%s: Can't access XPM directory %s\n" msgstr "" #: xaw/xboard.c:500 #, c-format msgid "Available `%s' sizes:\n" msgstr "" #: xaw/xboard.c:533 #, c-format msgid "Error: No `%s' files!\n" msgstr "" #: xaw/xboard.c:546 #, c-format msgid "" "Warning: No DIR structure found on this system --\n" " Unable to autosize for XPM/XIM pieces.\n" " Please report this error to %s.\n" " Include system type & operating system in message.\n" msgstr "" #: xaw/xboard.c:1293 #, c-format msgid "white pixel = 0x%lx, black pixel = 0x%lx\n" msgstr "" #: xaw/xengineoutput.c:115 #, c-format msgid "Error %d loading icon image\n" msgstr "" #: xaw/xoptions.c:321 xaw/xoptions.c:1023 msgid "browse" msgstr "" #: xaw/xoptions.c:387 xaw/xoptions.c:388 msgid "Ctrl" msgstr "" #: xaw/xoptions.c:393 xaw/xoptions.c:394 msgid "Alt" msgstr "" #: xaw/xoptions.c:399 xaw/xoptions.c:400 msgid "Shift" msgstr "" #: xaw/xoptions.c:1270 msgid "OK" msgstr "确定" #: xaw/xoptions.c:1274 msgid "cancel" msgstr "取消(C)" #~ msgid "New Game Ctrl+N" #~ msgstr "重置棋局(N) Ctrl+N" #~ msgid "New Variant ... Alt+Shift+V" #~ msgstr "新变种(V)... Alt+Shift+V" #~ msgid "Load Game Ctrl+O" #~ msgstr "载入棋局(L)... Ctrl+O" #~ msgid "Load Position Ctrl+Shift+O" #~ msgstr "载入局面(O)... Ctrl+Shift+O" #~ msgid "Save Game Ctrl+S" #~ msgstr "保存棋局(S)... Ctrl+S" #~ msgid "Quit Ctr+Q" #~ msgstr "退出(Q)" #~ msgid "Copy Game Ctrl+C" #~ msgstr "复制棋局到剪贴板(C) Ctrl+C" #~ msgid "Edit Game Ctrl+E" #~ msgstr "编辑棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "编辑局面(d) Ctrl+Shift+E" #~ msgid "Revert Home" #~ msgstr "恢复(V)" #~ msgid "Backward Alt+Left" #~ msgstr "下一着(B) Alt+Left" #~ msgid "Forward Alt+Right" #~ msgstr "上一着(F) Alt+Right" #~ msgid "Back to Start Alt+Home" #~ msgstr "起始局面(S) Alt+Home" #~ msgid "Flip View F2" #~ msgstr "翻转棋盘(V) F2" #~ msgid "Engine Output Alt+Shift+O" #~ msgstr "显示引擎输出 Alt+Shift+O" #~ msgid "Move History Alt+Shift+H" #~ msgstr "显示着法 Alt+Shift+H" #~ msgid "Evaluation Graph Alt+Shift+E" #~ msgstr "显示评价图 Alt+Shift+E" #~ msgid "Game List Alt+Shift+G" #~ msgstr "显示棋局列表(L) Alt+Shift+G" #~ msgid "Machine Black Ctrl+B" #~ msgstr "电脑执黑(B) Ctrl+B" #~ msgid "Edit Game Ctrl+E" #~ msgstr "编辑棋局(E) Ctrl+E" #~ msgid "Edit Position Ctrl+Shift+E" #~ msgstr "编辑局面(d) Ctrl+Shift+E" #~ msgid "Pause Pause" #~ msgstr "暂停(P) Pause" #~ msgid "Accept F3" #~ msgstr "接受(A) F3" #~ msgid "Decline F4" #~ msgstr "拒绝(C) F4" #~ msgid "Rematch F12" #~ msgstr "重赛(M) F12" #~ msgid "Draw F6" #~ msgstr "提和(D) F6" #~ msgid "Adjourn F7" #~ msgstr "封盘(J) F7" #~ msgid "Abort F8" #~ msgstr "中止(B) F8" #~ msgid "Resign F9" #~ msgstr "认输(R) F9" #~ msgid "Move Now Ctrl+M" #~ msgstr "立即走棋(M) Ctrl+M" #~ msgid "Always Queen Ctrl+Shift+Q" #~ msgstr "总是升变为后(Q) Ctrl+Shift+Q" #~ msgid "Animate Moving Ctrl+Shift+A" #~ msgstr "动画走棋(A) Ctrl+Shift+A" #~ msgid "Auto Flag Ctrl+Shift+F" #~ msgstr "自动超时判负(F) Ctrl+Shift+F" #~ msgid "Ponder Next Move Ctrl+Shift+P" #~ msgstr "同步思考(N) Ctrl+Shift+P" #~ msgid "Hide Thinking Ctrl+Shift+H" #~ msgstr "隐藏引擎思考 Ctrl+Shift+H" #~ msgid "Test Legality Ctrl+Shift+L" #~ msgstr "检查着法合理性(L) Cl+Sh+L" #~ msgid "Drop" #~ msgstr "取消" #, fuzzy #~ msgid "could not open: " #~ msgstr "无法解析着法" #~ msgid "ok" #~ msgstr "确定" #~ msgid "Highlight Dragging (Show Move Targets)" #~ msgstr "拖拽醒目提示(H)" #~ msgid "White " #~ msgstr "白方 " #~ msgid "Black " #~ msgstr "黑方 " #~ msgid "Close" #~ msgstr "关闭(C)" #~ msgid "sec/move" #~ msgstr "每走一步加" xboard-4.7.3/po/tr.gmo0000644000175000001440000000477212262562300011500 000000000000003GLh iv}      ',49 > IV e q}   !7MTZ`e#*:?C IWhnw      & 4 8 ; K O ] a l u {           ($"/% 2 '0!&#,3+. )1*-About XBoardAcceptActionAdjournAlways QueenBackwardBishopBlackBlack's flag fellBlindfoldBookBoth flags fellClear boardDeclineEmpty squareEnd of gameErrorFailed to open fileFileForwardHelpHintICS ClientIllegal moveIncorrect moveInfo XBoardInformationIt is Black's turnIt is White's turnKingKnightMail MoveModeMove listNoteOptionsPausePawnQueenReload CMail MessageRookTrainingWhiteWhite's flag fellYou are playing BlackYou are playing WhitecancelclearclosenextProject-Id-Version: XBoard 4.2.7 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: 2003-12-26 16:38+0200 Last-Translator: A. Alper Atc Language-Team: Turkish Language: tr MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-9 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; XBoard HakkndaKabul etEylemErteleHep Vezir OlsunGeriFilSiyahSiyah ah matTahtay GrmedenKitapBerabereTahtay TemizleRed etKareyi BoaltOyun sonuHataDosya alamadDosyaleriYardmpucuICS stemcisiGeersiz hamleYanl hamleXBoard Info SayfasBilgiSra Siyah'taSra Beyaz'daahAtHamleyi PostalaKipHamle listesiNotSeeneklerDuraklatPiyonVezirCMail letisini Tekrar YkleKaleEitimBeyazBeyaz ah matSiz Siyah'snzSiz Beyaz'snziptaltemizlekapatsonrakixboard-4.7.3/po/remove-potcdate.sin0000644000175000001440000000066012262415351014153 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } xboard-4.7.3/po/en@boldquot.header0000644000175000001440000000247112262415351013772 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # xboard-4.7.3/po/da.gmo0000644000175000001440000011303612262562300011431 00000000000000<\ (+0)+$Z++/++++,&0,"W,z,,4,),-50-#f--7- ---..5.'E.m......7.*/1/&H/o/"//)/%/%0;0L0[0z0 00 000 0 080"131K1[1r1 t11111 122'2;2B2H2 [2i2 {2 202222 2$23&3@3)]333333334 4)4 A4L4 U4.a4 4444445%5:5V5k5!55555 5.5 616B6#G6k6!6V67$7A7 G7'Q7y7$77 7 7 7 7 77! 8+8 K8 X8d8 k8u888 8888 99-9 C9Q9W9&t9!9&9(9 :$:!@:b:w::0:::;;%;);@;T;"n;";.; ;;;<!<X3<8< <<<@ =&K=r=t= ==(===>/)>Y>k> |>> >>>>>>>?&?9?M?b?w?|??? ? ? ? ? ?,? @0@!H@j@ @@!@#@AA 2A >AJA#^AAAAAAAABBBB(B(DB mB{BBBB BB3B-#C)QC-{C)C C%C D D-D(ID"rD!DD D D DDDD EE'E+E>EXErEE EEE-EE FF3FEFcFtFFFFF!F G#G(G?G+VGG"GGGGGGH!H:H?HGH#XH|H HHHHHHHHH,I;IVI^IwIII$II IIII5JEU QU_UqUU UUUUUU*V9V5XVKV)VWPWOW?X.\XCXjX :Y [Y|YYYY YYYYYYY ZZ Z "Z&.ZUZ ZZdZZZ Z Z!Z Z Z1Z#[*[ 2[=[@[)D[n[[6J]5]]2]]^%8^^^)t^'^!^^7_,?_+l_<_$__=` T`^`p` `$` `-``aa+a1aKaARa0a"aab#$bHb3bb&b(bbb%c 7c+Bcncc!cc c dNdnd"dd dd&d#e3e#Meqeeeeeeeee f "f,f2?frf {fff*fffg*0g[goggg gggg hh;hDh Kh;Uhh&hh h hi"i)5i_iii iiiii j3(j\j!mjj8j$j'j\kwk1kkk*kl$#lHlQlflyllll%l#l m'm =mIm&[m'mm&m'mn+n?nVn tnnn'n-n*o02o)cooo%oo"p*p,Hpuppp pppp"p*q,Dq/qq qqqqqSq;Grr"rrAr)sBsDs\sks2s"sss0 t=tZt ktytttttttu!u9uKuauruuuuu u uu u u-uv.,v&[vv!vv'v)w-w-,1JZoΏ* .59dO%QV d&~Cu)_œ  '( P^f v* *  (,Ug1v Еӕ'ו'p2;dw"V-kOL}2Abi<>r@wlC3XDiUK+eG0RZ%n~!u(684N-,^a,j?6pTxeM/{`W N^B)m.{8$Hq G='gPhX)_xE 5]o_:j39\skCuOH:l1=Y nKE<%*BAIcU|#9`W rR @&  t q}J(QhDVyM\?ySov!~ fYcF[TFg[P *+Jz4"5sz&Z71vm d/tLIb]|Q>a0.$;S7#f Thresholds for position filtering in game list: options to use in game-viewer mode: (with Zippy code)%s (%d reversible ply)%s (%d reversible plies)%s - %d/%d games (%d-%d-%d)%s does not support analysis%s engine has too many options %s in settings file %s program exits in draw position (%s)%s: Can't access XPM directory %s %s: bad boardSize syntax %s %s: can't cd to CHESSDIR: %s: can't parse color names; disabling colorization %s: can't parse foreground color in `%s' %s: no fonts match pattern %s %s: too few colors available; trying monochrome mode %s: unrecognized boardSize name %s %s: unrecognized color %s (Directory will be derived from engine path when empty)About XBoardAbove WAV FileAbsolute Analysis ScoresActionAdd this engine to the listAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate non-ICS GamesAdjudicate to BlackAdjudicate to WhiteAlarmAlarm Time (msec):Alarm:All games in tourney '%s' are already played or playingAlmost Always Queen (Detour Under-Promote)Already at end of gameAlso match left-right flipped positionAlso match reversed colorsAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnimation Speed (high = slow):AnnotateAuto FlagAuto Flip ViewAuto-CommentAuto-Display CommentAuto-Display TagsAuto-KibitzAuto-ObserveAuto-Play speed of loaded games (0 = instant, -1 = off):Auto-Raise BoardAuto-Refresh Seek GraphAuto-Save GamesAvailable `%s' sizes: BBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad FEN received from engineBad SeekBad game fileBad integer value %sBad position fileBad tournament fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard size ( -1 = default for selected variant):Board...BookBook Depth (moves):Book FaultBook Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't open temp fileCan't seek on game fileCan't seek on position fileCancelCannot build game listCar HornChallenge Text Colors:Challenge:Channel #1 Text Colors:Channel 1:Channel:Clear boardClock adjustment not allowed in auto-flag modeClone TourneyClose ICS engine analyze...Colorize MessagesCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCould not write on tourney fileCouldn't parse move "%s" from ICSCymbalDDark Square Color:Dark-Squares Texture File:Default BeepDefault Number of Games in Match (or Pairing):Detect all MatesDevelopment NewsDingDisable own engine books by defaultDisplayed move is not currentDisplayed position is not currentDisplayed position is not current. Step forward to the correct position and try again.Draw after N Moves Total:Draw if Insufficient Mating MaterialDraw:Drop MenuDual Board for Background-Observed GameEGTB Cache Size (MB):ERROR: Unknown user %s (in path %s) EditEdit BookEdit CommentEdit TagsEdit bookEdit commentEdit comment on %d.%s%sElo of strongest player at least:Elo of weakest player at least:Empty squareEnd of gameEngineEngine #1Engine #1 Has Own BookEngine #1 Settings ...Engine #2 / HumanEngine #2 Has Own Book Engine #2 Settings ...Engine Command:Engine Directory:Engine OutputEngine SettingsEngine has no optionsEngine outputErrorError %d loading icon image Error gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyError: No `%s' files! Evaluation graphExact position matchExitingFRCFailed to invoke cmailFailed to open fileFailed to open file '%s' Failed to open indirection file %sFailed to parse board string: "%s"Failed to start %s chess program %s on %s: %s Fatal ErrorFileFile with Start Positions:First Black Move:First White Move:First change an engine by editing the participants list of the Tournament Options dialogFirst you must specify an existing tourney file to cloneFlash MovesFlash Moves (0 = no flashing):Flash Rate (high = fast):Flip Pieces Shogi Style (Colored buttons restore default)Force current variant with this engineGGame File with Opening Lines:Game List ...Game List Tags...Game Number (-1 or -2 = Auto-Increment):Game list not loaded or emptyGame not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGame-list optionsGap in move listGeneral ...General OptionsGet Move ListGongGot end of file from keyboardHash keys are differentHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sHoldings Size:ICS ...ICS ClientICS Input BoxICS OptionsICS input boxICS text menuIllegal hint move "%s" from %s chess programIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move (rejected by ICS)Illegal move in ICS output: "%s"Illegal move: %d.%s%sInclude Number Tag in tourney PGNIncomplete \ escape in value for %sIncorrect moveIncrement or max (sec/move):Info XBoardInformationInitial time (min):Invalid pairing from pairing engineIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKibitz Text Colors:Kibitz:KingKnightLaserLight Square Color:Light-Squares Texture File:Line Gap ( -1 = default for board size):Load Game ...Load Game OptionsLoad game file name?Load position file name?Lose:Machine MatchMachine accepts your draw offerMachine offers a draw Select Action / Draw to agreeMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMail MoveMatch %s vs. %s: final score %d-%d-%dMatch ...Match OptionsMaterial difference (optional stuff balanced)Material range (top board half optional)Maximum Number of CPUs per Engine:Minimum nr consecutive positions:ModeMono ModeMove SoundMove listMove:Moves per session:Must not use GUI bookN-Move Rule:N-fold Repeats:NPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNickname (optional):No SoundNo engine with the name you gave is installedNo game has been loaded yetNo game selectedNo games before year:No hint availableNo more games in this messageNo moves in gameNo pairing engine specifiedNo position has been loaded yetNo tag selectedNo unfinished gamesNo unfinished games No value provided for argument %sNot enough participantsNoteNumber of Board Files:Number of Board Ranks:Number of tourney cycles (or Swiss rounds):OKOld Save Style (as opposed to PGN)On-line User GuideOne-Click MovingOpening-Book Filename:OptionsOther Channel Text Colors:PGN Event Header:Pause between Match Games (msec):PawnPenaltyPeriodic UpdatesPeriodic Updates (in Analysis Mode)PhonePick new gamePlayPolyglot book not validPolygot Directory:Ponder Next MovePopPopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition Number (-1 or -2 = Auto-Increment):Position not found in filePremovePremove Highlight Color:Premove for BlackPremove for WhitePromotePull pawn backwards to under-promoteQueenQuiet PlayRReading game file (%d)Ready to send mail Recompile to support this BOARD_RANKS or BOARD_FILES!Recompile with larger BOARD_RANKS or BOARD_FILES to support this sizeReload CMail MessageReplace EngineRequest Text Colors:Request:Rewind Index after this many Games (0 = never):RookS-Shout Text Colors:S-Shout:Same materialSame material with exactly same Pawn chainSave Final Positions on File:Save Game ...Save Game OptionsSave Games on File:Save Out-of-Book Info in PGN Save Score/Depth Info in PGNSave Settings NowSave Settings on ExitSave Tourney Games on:Save game file name?Save position file name?Saving gameSaving positionScanning through games (%d)Scores in Move ListSearch mode:Seconds per Move:Seek GraphSeek Text Colors:Seek:Select Engine:Select engine from list:Shout Text Colors:Shout:Show CoordinatesShow CoordsShow Target SquaresShown position is subsetSlapSocket support is not configured inSound OptionsSound Program:Sounds ...Sounds Directory:Start-position number:Starting %s chess programStarting chess programStartup failure on '%s'Sticky WindowsStill need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s Swiss tourney finishedTagsTell Text Colors:Tell:Test LegalityThat square is occupiedThe cmail message is not loaded. Use Reload CMail Message and make your move again.There is no game listThere is no pending offer on this moveTime ControlTime-Odds factors:Tourney participants:Tourney type (0 = round-robin, 1 = gauntlet):TrainingTraining mode offTraining mode onTraining mode requires a game fileTry-Out Sound:TwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineType a moveUCIUnable to create font set for %s. Unfinished:Unknown initialMode %sUnknown variant name %sUnknown wild type %dUnrecognized argument %sUnrecognized boolean argument value %sUnusedUpgrade EngineUpload to ExamineUse Board TexturesUse GUI BookUse nickname in PGN player tags of engine-engine gamesUser FileUser WAV File:Variant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWB protocol v1 (do not wait for engine features)Wait until your turnWait until your turn, or select Move NowWaiting for access to save fileWaiting for first chess programWaiting for other game(s)Waiting for reply from opponent Waiting for second chess programWarning: No DIR structure found on this system -- Unable to autosize for XPM/XIM pieces. Please report this error to %s. Include system type & operating system in message. Warning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite Piece Color:White to playWhite's flag fellWin / Loss Threshold:Win:Wood ThunkXBoard Home PageYou are not examining a gameYou are not observing a gameYou are playing BlackYou are playing WhiteYou can only change one engine at the timeYou can't revert while pausingYou cannot do this while you are playing or observingYou cannot replace an engine while it is engaged! Terminate its game first.You did not specify the engine executableYou have already mailed a move. Wait until a move arrives from your opponent. To resend the same move, type "cmail -remail -game %s" on the command line.You have edited the game history. Use Reload Same Game and make your move again.You have entered too many moves. Back up to the correct position and try again.You have not made a move yetYou must make your move before offering a drawYou must supply a tournament file, for storing the tourney progressYou restarted an already completed tourney One more cycle will now be added to it Games commence in 10 secYour opponent is not out of timeZoom factor in Evaluation Graph:bad searchTime option %sbad timeControl option %sbrowsecancelclassicalclearclosedowne-Mail Bug Reportfactoryfailed writing PVfind positionfirstfixed maxincrementalinternal rcmd not implemented for Unixnextnext pageno games matched your requestnormalor specify one below:pick fixedprevious pageprotocol version %d not supportedrandomizesave changessay Internal error; bad moveType %d (%d,%d-%d,%d)secondshufflethresholdsupvs.white pixel = 0x%lx, black pixel = 0x%lx your opponent kibitzes: %sProject-Id-Version: GNU xboard 4.6.0.20120304 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: 2012-03-06 12:27+0100 Last-Translator: Byrial Ole Jensen Language-Team: Danish Language: da MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Lokalize 1.2 Plural-Forms: nplurals=2; plural=(n != 1); Grænseværdier for stillingsfiltrering i partiliste: Indstillinger til brug ved gennemkigning af partier: (med Zippy-kode)%s (%d reversibelt træk)%s (%d reversible træk)%s - %d/%d partier (%d-%d-%d)%s understøtter ikke analyse%s skakprogram har for mange tilvalg %s i indstillingsfil %s program afslutter i remisstilling (%s)%s: Har ikke adgang til XPM-katalog %s %s: forkert boardSize-syntaks %s %s: kan ikke cd til CHESSDIR: %s: kan ikke fortolke farvenavne; deaktiverer farvning %s: kan ikke fortolke forgrundsfarve i "%s" %s: Ingen skrifttyper matcher mønstret %s %s: for få farver tilgængelige; prøver monokrom tilstand %s: ikke genkendt boardSize-navn %s %s: ikke genkendt farve %s (Katalog vil blive udledt fra programstien hvis ikke udfyldt)Om XboardWAV-filen ovenforAbsolutte analysescorerHandlingerTilføj dette skakprogram til listenDøm remisDøm trivielle remiser (3-træks forsinkelse)Døm ikke-ICS partierDøm sort gevinstDøm hvid gevinstAlarmAlarmtid (millisekunder):Alarm:Alle partier i turneringen "%s" er allerede færdige eller i gangNæsten altid dronning (Omvejs-underforvandling)Allerede ved slutningen af partietMatch også spejlvendt stillingMatch også omvendte farverFlertydigt træk i ICS-output: "%s"Flertydigt træk: %d.%s%sAnalysetilstand virker ikke sammen med ICS-tilstandAnalysetilstand kræver et skakprogramAnalyzeFile-tilstand kræver en partifilAnimeret trækudførelseAnimeret flytningAnimeringshastighed (høj = langsom):KommentérAutomatisk annoncering af tidsoverskridelseAutomatisk vending af brættetGem kommentarer til trækAutomatisk visning af kommentarerAutomatisk visning af partidataSend kommentarer fra skakprogramObservér automatiskHastighed af gennemspilning af indlæste partier (0 = øjeblikkeligt, -1 fra):Bræt øverst ved partistartAutomatisk opdatering af søgegrafGem partier automatiskTilgængelige "%s"-størrelser: BObsevér i baggrunden når der spillesFejl i FEN-stilling i udklipsholderFejl i FEN-stilling i filFejl i FEN modtaget fra skakprogramSøgning mislykkedesFejl i partifilForkert heltalsværdi %sFejl i stillingsfilFejl i turneringsfilLøberSortFarve for sorte brikker:Sort i trækketSorts flag er faldetBlindskakBrætindstillingerBrætstørrelse (-1 = standard for valgt variant):Bræt...ÅbningsbogÅbningsbogsdybde (træk):Fejl i åbningsbogÅbningsbogvariation (0) vs. styrke (100):Begge flag er faldetKan ikke gå længere tilbageKan ikke gå længere fremadKan ikke have en match uden skakprogrammerKan ikke åbne "%s"Kan ikke åbne midlertidig filKan ikke spole i partifilKan ikke spole i stillingsfilAnnullérKan ikke konstruere partilisteBilhornTekstfarver for udfordring:Udfodring:Tekstfarver for kanal nr. 1:Kanal 1:Kanal:Ryd brætDet er ikke tilladt er stille på uret i auto-flag-tilstandKopiér turneringLukker skakprogram til ICS-analyse ...Farv meddelelserKommentarerIndstillinger for skakprogrammerForbindelse lukket af ICSKopiér partilisteKunne ikke forbinde til vært %s, port %sKunne ikke åbne seriel port %sKunne ikke fortolke trækKunne ikke skrive turneringsfilKunne ikke fortolke "%s" fra ICSBækkenMFarve for mørke felter:Teksturfil for mørke felter:Standard bipStandard for antal partier i match (eller parring):Find alle matterNyheder i denne version (engelsk)DingDeaktivér skakprogrammets egen åbningsbog som standardDet viste træk er ikke det aktuelleDen viste stilling er ikke den aktuelleDen viste stilling er ikke den aktuelle. Gå fremad til den korrekte stilling og prøv igen.Remis efter i alt N træk:Remis ved utilstrækkeligt matsættende materialeRemis:Placér brik-menuAndet bræt til baggrundsobservede partierEGTB-cachestørrelse (MB):FEJL: Ukendt bruger %s (i stien %s) RedigérRedigér åbningsbogRedigér kommentarRedigér partidataRedigér åbningsbogRedigér kommentarRedigér kommentar til %d.%s%sStærkeste spillers rating er mindst:Svageste spillers rating er mindst:Tomt feltSlutningen af partietSkakprogramSkakprogram nr. 1Skakprogram nr. 1 har egen åbningsbogIndstillinger for skakprogram nr. 1 ...Skakprogram nr. 2 / menneskeSkakprogram nr. 2 har egen åbningsbogIndstillinger for skakprogram nr. 2 ...Skakprogramkommando:Skakprogramkatalog:Output fra skakprogramIndstillinger for skakprogramSkakprogrammet har ingen tilvalgOutput fra skakprogramFejlFejl %d ved indlæsning af ikonbillede Fejl ved tolkning af trækliste: ekstra brætFejl ved tolkning af trækliste: indlejretFejl ved tolkning af trækliste: to teksthovederFejl ved læsning fra %s skakprogram (%s)Fejl ved læsning fra ICSFejl ved læsning fra tastaturFejl ved skrivning til %s skakprogramFejl ved skrivning til ICSFejl ved skrivning til skakprogramFejl ved skrivning til skærmFejl: %s skakprogram (%s) afsluttede uventetFejl: Ingen "%s"-filer! EvalueringsgrafEksakt stillingAfslutterskak960Start af cmail mislykkedesÅbning af fil mislykkedesÅbning af filen "%s" mislykkedes Åbning af inkluderet fil "%s" mislykkedesFortolkning af brætstreng mislykkedes: "%s"Fejl ved start af %s skakprogram %s på %s: %s Fatal fejlFilFil med startstillinger:Sorts første træk:Hvids første træk:Ændr først skakprogram ved at redigere deltagerlisten i turneringsindstillingerneDu skal angive en eksisterende turneringsfil til at kopiereBlink ved trækBlink ved træk (0 = ingen blink):Blinkhastighed (høj = hurtig):Ombyt brikker som i shogi (Farvede knapper gendanner standard)Brug aktuel variant med dette skakprogramGPartifil med åbninger:Partiliste ...Partidata-overskrifter ...Partinummer (-1 eller -2 = automatisk forøgelse):Partiliste ikke indlæst eller tomParti ikke fundet i filPartinummer findes ikkeParti for langt; forøg MAX_MOVES og genoversætIndstillinger for partilisteHul i træklisteGenerelle ...Generelle indstillingerHent træklisteGongonFik filafslutning fra tastaturHashnøgler er forskelligeHashtabel-størrelse (MB):HjælpSkjul tænkning fra menneskeFarve til fremhævelse:Fremhæv flytningFremhæv sidste trækFremhæv med pilFremhæv med pilTipTip: %sDepotstørrelse:ICS ...ICS-klientICS-inputboksICS-indstillingerICS-inputboksICS-tekstmenuUlovligt tip om træk "%s" fra %s skakprogramUlovligt trækUlovligt træk "%s" (afvist af %s skakprogram)Ulovligt træk "%s" fra %s skakprogramUlovligt træk (afvist af ICS)Ulovligt træk i ICS-output: "%s"Ulovligt træk: %d.%s%sBrug partinumre i PGN-fil for turneringUkomplet \-undvigesekvens i værdi for %sUkorrekt trækTillægstid eller maks. pr. træk (sekunder):Info XBoardMeddelelseTid fra start (minutter):Ikke tilladt parring fra parringsprogramDet er sorts turDet er hvids turSort er ikke i trækketHvid er ikke i trækketDet er dig som er i trækketTekstfarver for kommentar:Kommentar:KongeSpringerLaserFarve for lyse felter:Teksturfil for lyse felter:Mellemrum mellem felter (-1 = standard for brætstørrelsen):Indlæs parti ...Indstillinger for indlæsning af partiFilnavn for indlæsning af parti?Filnavn for indlæsning af stilling?Tab:SkakprogrammatchSkakprogrammet accepterer dit remistilbudSkakprogrammet tilbyder remis Vælg Handlinger / Remis for at acceptereMachineBlack-tilstand virker ikke sammen med ICS-tilstandMachineBlack-tilstand kræver et skakprogramMachineWhite-tilstand virker ikke sammen med ICS-tilstandMachineWhite-tilstand kræver et skakprogramSend træk med e-postMatch %s - %s: slutscore %d-%d-%dMatch ...MatchindstillingerMateriale-forskel (balanceret valgfrit materiale)Materiale-interval (øverste halvdel af brættet valgfrit)Maksimalt antal CPU'er pr. skakprogram:Mindste antal stillinger i følge ad gangen:TilstandMonokrom-tilstandLyd ved trækTræklisteTræk:Træk pr. tidsperiode:Må ikke bruge GUI's åbningsbogN-træksregel:N-gange gentagelser:SPSSti til Nalimov-EGTB:Negér skakprogram nr. 1's scoreNegér skakprogram nr. 2's scoreNyt blandet partiNyt blandet parti ...Ny variantKaldenavn (ikke nødvendigt):Ingen lydDer er ikke installeret et skakprogram med det angivne navnDer er endnu ingen indlæste partierDer er ikke valgt et partiIngen partier før år:Tip er ikke tilgængeligtDer er ikke flere partier i denne beskedIngen træk i partietDer er ikke noget parringsprogram specificeretIngen stilling er endnu indlæstIngen overskrift valgtDer er ingen uafsluttede partierDer er ingen uafsluttede partier Ingen værdi givet for argumentet %sDer er ikke nok deltagereNotitsAntal brætlinjer:Antal brætrækker:Antal cyklusser i turneringen (eller svejtserrunder):o.k.Gammel gemmestil (i modsætning til PGN)Online brugervejledning (engelsk)Ét-klikstrækÅbningsbogsfilnavn:IndstillingerTekstfarver for andre kanaler:Event-tekst i PGN-fil:Pause imellem matchpartier (millisekunder):BondeStraffePeriodisk opdateringPeriodisk opdatering (i analysetilstand)TelefonVælg nyt spilAfspilFejl i polyglyt-åbningsbogPolyglot-katalog:Spekulér på næste trækPlopPop op med afslutningsbeskederPop op med afslutningsbeskederPop op ved trækfejlStillingsnummer (-1 eller -2 = automatisk forøgelse):Stilling er ikke fundet i filForhåndstrækFarve til forhåndstræk:Forhåndstræk for sortForhåndstræk for hvidBondeforvandlingTræk bonde baglæns for at underforvandleDronningStille spilRLæser partifil (%d)Klar til at sende e-mail Genoversæt for at understøtte denne BOARD_RANKS eller BOARD_FILES!Genoversæt med større BOARD_RANKS eller BOARD_FILES for at understøtte denne størrelseGenindlæs CMail-beskedUdskift skakprogramTekstfarver for forespørgsel:Forespøgsel:Genstart nummering efter dette antal partier (0 = aldrig):TårnTekstfarver for s-råb:S-råb:Samme materialeSamme materiale med samme bondestrukturGem slutstillinger i filen:Gem parti ...Indstillinger for gemning af partiGem partier i filen:Gem ud af åbningsbog-info i PGN Gem score/dybde-information i PGNGem indstillinger nuGem indstillinger ved afslutningGem turneringspartier i:Filnavn for gemning af parti?Filnavn for gemning af stilling?Gemmer partiGemmer stillingSkanner gennem partier (%d)Scorer i træklisteSøgemetode:Sekunder pr. træk:SøgegrafTekstfarver for søgning:Søgning:Vælg skakprogram:Vælg skakprogram fra liste:Tekstfarver for råb:Råb:Vis koordinaterVis koordinaterVis målfelterViste stilling er en delmængdeSlagEr ikke konfigureret med sokkelunderstøttelseLydindstillingerLydprogram:Lyde ...Lydkatalog:Startstillingsnummer:Starter %s skakprogramStarter skakprogramOpstartsfejl på "%s"Klæbrige vinduerDer er stadig nødvendigt at trække i partiet %s Der er stadig nødvendigt at trække i partiet Der er stadig nødvendigt at trække i alle %d partier Der er stadig nødvendigt at trække i begge partier Der er stadig nødvendigt at trække i partierne %s Svejtserturnering afsluttetPartidataTekstfarver for tale:Tale:Test lovlighedDet felt er besatCmail-beskeden er ikke indlæst. Brug Genindlæs CMail-besked og lav dit træk igen.Der er ingen partilisteDer er ingen aktuelle tilbud ved dette trækBetænkningstidTidsforkortelses-faktorer:Turneringsdeltagere:Turneringstype (0 = alle mod alle, 1 = en imod resten):TræningTræningstilstand fraTræningstilstand tilTræningstilstand kræver en partifilAfprøv lyd:TwoMachines-tilstand virker ikke sammen med ICS-tilstandTwoMachines-tilstand kræver et skakprogramTast et trækUCIKan ikke lave skrifttypegruppe for %s. Uafsluttet:Ukendt initialMode %sUkendt variantnavn %sUkendt vild type %dIkke genkendt argument %sIkke genkendt boolesk argumentværdi %sUbrugtOpgradér skakprogramOverfør til undersøgelseBrug brætteksturerBrug GUI's åbningsbogBrug kaldenavnet som spillerbetegnelse i PGN-filerBrugerfilBruger WAV-fil:Variant %s understøttes ikke af %sVarianten %s er kun understøttet i ICS-tilstandEfterprøv resultatangivelser fra skakprogrammerVisWB-protokol v1 (brug ikke særlige skakprogramfunktioner)Vent til du kommer i trækketVent på din tur, eller vælg Træk nuVenter på adgang til gemmefilVenter på første skakprogramVenter på andet parti/andre partierVenter på svar fra modstander Venter på andet skakprogramAdvarsel: Ingen DIR-struktur fundet på dette system -- Kan ikke vælge størrelse for XPM/XIM-brikker. Rappotér venligst denne fejl til %s. Inkludér systemtype og styresystem i beskeden. Advarsel: Du undersøger stadig et partiAdvarsel: Du observerer stadig et partiAdvarsel: Du spiller stadig et partiAdvarsel: det andet skakprogram (%s) understøtter ikke dette!HvidFarve for hvide brikker:Hvid i trækketHvids flag er faldetGevinst/tabs-tærskel:Gevinst:DunkXBoards hjemmeside (engelsk)Du undersøger ikke et partiDu observerer ikke et partiDu spiller sortDu spiller hvidDu kan kun ændre et skakprogram ad gangenDu kan ikke annullere variantlinje under pauseDu kan ikke gøre dette, mens du spiller eller observererDu kan ikke udskifte et skakprogram, mens det bruges! Afslut dets parti først.Du angav ikke et kørbart skakprogramDu har allerede sendt et træk. Vent indtil der kommer et træk fra din modstander. For at gensende det samme træk, tast "cmail -remail -game %s" på kommandolinjen.Du har redigeret i parti-historikken. Genindlæs partiet og udfør trækket igen.Du har indtastet for mange træk. Gå tilbage til den aktuelle stilling og prøv igen.Du har ikke trukket endnuDu skal trække før du tilbyder remisDu skal angive en turneringsfil til at gemme turneringens afviklingDu genstartede en allerede afsluttet turnering En mere cyklus vil nu blive tilføjet Partierne starter om 10 sekunderDin modstander har ikke overskredet tidenZoomfaktor i evalueringsgraf:forkert searchTime-tilvalg %sforkert timeControl-tilvalg %sgennemseannullérKlassiskrydluknedE-mail fejlrapportstandardskrivning af analysevariant mislykkedesfind stillingførsteMaks. pr. trækTillægstidintern rcmd er ikke implementeret til Unixnæstenæste sideingen partier svarer til din forespørgselnormaleller specificér en herunder:vælg bestemtforrige sideprotokolversion %d er ikke understøttetvælg tilfældigtgem ændringersay Intern fejl; forkert moveType%d (%d,%d-%d,%d)det andetbland brikkergrænseværdierop–hvid pixel = 0x%lx, sort pixel = 0x%lx din modstander kommenterer: %sxboard-4.7.3/po/es.gmo0000644000175000001440000004277612262562300011470 00000000000000[ ' "7Z)r%%  & 5 B N[l    * < FT]b$v) 4PW n y%!$F Yfm~!$'%; @ M Wd|   &!%&G(n! 09j{.   5/N~  $7K`uz   0!  # 9 H T g z       !-&!)T!-~!)!%!"!" $"."2"E"_"y"" """"""#"#B#V#k#p#s##########$$0$8$Q$Y$ _$j$~$ $$$$ $$ $ $ % %#%:%&R%!y%*%(%&%& &)&A&&W&~&&&"&,&(&#':'R'd'%''''' ' ('A('i(%(2(( (()&)C)Y)o)).) ))**5*<*A*I*!P*1r***_*,&,7,?,P,k,~,,&,",,0,1,-;^---- ---- . .&. F.T.(f.#..... . //6/?/S/k//////6/40)K0)u00"0 00 00101-I1/w11&111 22#%2%I2o2$2 222223313:3 L3Z3`3{333333-35+4-a444+44(5*5>J555555 56 66.6 C6d6!6766 6 77#7'67^7q7+w77777788'8.8 A8 N89\88!888 99"979Q9 l9x9|99#999&9::;J:;:<:-:-;@; E;O; S; a; ;;; ; ;";<,<$I<n<$<<<<<< ===(6= _=j===='===> >>$>>>&D>k>>$>>>>> ? ?!???6U?3?5?4?5+@a@p@@@(@ @@A8%A4^A5AA!AB$B)ABkBBB'B!B(B8 C8FC5C4CCCDD%;DaDtD#D!D,D$D E )E!JElEuE {EE(E7EEEfCaGpd8DvhP@;7t]- O$Y3zw#F>_W6=!BN /() o5HZ}E^MjbV< s{4m`Sn~ Tc XeIQJ?x2,ulRK+*.k\y|0'Aqir&"%U:g9[1L%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngineEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveInformationIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timeatomicbad searchTime option %sbad timeControl option %scanceldownfactorynormalprotocol version %d not supportedsay Internal error; bad moveType %d (%d,%d-%d,%d)suicideupProject-Id-Version: GNU xboard master-20110411 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s no admite análisisAcerca de XBoardPartidaAdjudicar tablasAdjudicar tablas trivialesAdjudicar a negrasAdjudicar a blancasAlarmaYa se encuentra al final de la partidaJugada ambigua en salida ICS: "%s"Jugada ambigua: %d.%s%sEl modo de análisis no funciona con el modo ICSEl modo de análisis requiere un motor de ajedrezEl modo análisis de archivo requiere un archivo de partidaAnimar arrastreAnimar movimientoAnotarArzobispoBandera automáticaCambio de lado automáticoAuto-comentarioAuto KibitzAuto-ObservarTablero al frente (automático)auto-RefrescoMirar en el fondoPosición FEN incorrecta en portapapelesPosición FEN incorrecta en archivoarchivo de partidas incorrectoarchivo de posición incorrectoAlfilNegrasPiezas negrasLas negras jueganLa bandera negra cayóA ciegasOpciones de tableroOpciones del tablero...Repertorio de aperturas...Profundo libro:Variación libro:Ambas banderas cayeronYa no se puede ir más atrásYa no se puede ir más adelanteNo se puede tener una partida sin programas de ajedrezNo se puede abrir "%s"No se puede buscar en archivo de partidasNo se puede buscar en archivo de partidasCañónNo se pudo armar lista de partidasCancillerLimpiar el tablero ComentariosConfiguración común de motorConexión cerrada por ICSCopiar lista de partidasNo se pudo conectar al servidor %s, puerta %sNo se pudo abrir la puerta de comunicaciones %sNo se pudo analizar la jugadaNo se pudo analizar jugada "%s" de ICSCuadros obscurosBip por defectoDegradarDetectar matesLa jugada ilustrada no es la actualLa posición mostrada no es la actualAdjudicar mate después de:Tablas si hay material insufficienteTablero dualTamaño EGTB (MB):EdiciónEditar comentariosEditar circunstanciasEditar comentarioEditar comentario en %d.%s%sElefanteVaciar el escaqueFin del juegoMotorPrimero tiene libro propioConfiguración motor #1...Configuración motor #2...Salida de motoresErrorError al recolectar lista de jugadas: tablero extraError al recolectar lista de jugadas: anidadoError al recolectar lista de jugadas: dos encabezadosError al leer del %s programa de ajedrez (%s)Error al leer de ICSError al leer el tecladoError al escribir al %s programa de ajedrezError al escribir a ICSError al escribir al programa de ajedrezError al escribir a la pantallaError: el %s programa de ajedrez (%s) terminó inesperadamenteGráfica de evaluaciónSaliendoFalla al invocar cmailFalla al iniciar %s programa de ajedrez %s en %s: %s Error fatalArchivo1er. mov. negras1er. mov. blancasLista de partidas...Opciones de lista de partidas...Partida no hallada en archivoNúmero de partida fuera de rangoJuego demasiado largo; incremente MAX_MOVES y recompileHueco en lista de jugadasGenerales...Generales...Opciones generalesLeer lista jugadasSe obtuvo del teclado un fin de archivoTamaño hash (MB):AyudaOcultar cogitaciones al jugar contra humanoCuadro iluminadoIluminar arrastreIluminar última jugadaIluminar con flechaIluminar con flechaDame una pista...Sugerencia: %sICS...Conectado a un ICSOpciones ICSJugada ilegalJugada ilegal "%s" (rechazada por %s programa de ajedrez)Jugada ilegal "%s" del %s motorJugada ilegal en salida ICS: "%s"Jugada ilegal: %d.%s%sJugada incorrectaInformaciónTurno de las negrasTurno de las blancasNo es turno de las negrasNo es turno de las blancasEs su turnoReyCaballoCuadros clarosPara leer partida... Alt+Mayús+LOpciones al leer partidaTorneo de dos programasLa máquina acepta su oferta de tablasEl modo de máquina con negras no funciona con el modo ICSEl modo de máquina con negras requiere un motor de ajedrezEl modo de máquina con blancas no funciona con el modo ICSEl modo de máquina con blancas requiere un motor de ajedrezPartida %s vs. %s: puntuación final %d-%d-%dNúmero max. CPUs:ModoMonocromoNPSCarpeta EGTB:Puntuación motor #1 es absolutaPuntuación motor #2 es absolutaNueva partida revuelta...Nueva partida revuelta...VariantesSin sonidoNinguna partida se ha cargado aúnNinguna partida seleccionadaNo hay sugerencia disponibleNo hay más partidas en este mensajeNinguna jugada en la partidaNinguna posición se ha cargado aúnNo hay partidas sin terminarNo hay juegos sin terminar NotaAceptarMoviemento de un clickOpcionesPeónActualización periódicaActualización periódica (en análisis)ReproducirPrever siguente jugadaVentana al salirVentana al salirVentana si error en jugadaNo se halló la posición en el archivoPre-mov.Iluminación pre.mov.CoronarDamaJugar en silencioListo para enviar correo TorrePara guardar partida... Alt+Mayús+SOpciones al salvar partidaSalvar config. ahoraSalvar config. al salir del programaBuscar gráficaMostrar coordenadasMostrar coordenadasSonidosSonido...Núm. de pos. inicial:Iniciando programa de ajedrezFalla al iniciar '%s'Todavía necesita hacer una jugada para la partida %s Todavía necesita hacer una jugada para la partida Todavía necesita hacer jugadas para las %d partidas Todavía necesita hacer jugadas para ambas partidas Todavía necesita hacer jugadas para las partidas %s CircunstanciasChecar legalidadEse cuadro está ocupadoNo hay lista de partidasNo hay oferta pendiente para esta jugadaEntrenamientoModo de entrenamiento apagadoModo de entrenamiento activoEl modo de entrenamiento requiere un archivo de partidasEl modo de dos máquinas no funciona con el modo ICSEl modo de dos máquinas requiere un motor de ajedrezModo inicial desconocido %sNombre de variante desconocido %sEnviar para examinarLa variante %s no es admitida por %sLa variante %s solo se admite en modo ICSVerificar avisos del motorVerEspero su turnoEsperando al primer programa de ajedrezEsperando respuesta del oponente Esperando al segundo programa de ajedrezAdvertencia: Usted todavía está examinando una partidaAdvertencia: Usted todavía está observando una partidaAdvertencia: Usted todavía está jugando una partidaAdvertencia: ¡el segundo motor (%s) no admite esto!BlancasLas blancas jueganLa bandera blanca cayóLímite para adjudicar juego:Usted no está examinando una partidaUsted juega negrasUsted juega blancasNo puede revertir si está en pausaUsted todavía no hace una jugadaDebe hacer su jugada antes de ofrecer tablasSu oponente no está fuera de tiempoatómicoopción searchTime incorrecta %sopción timeControl incorrecta %sCancelarAbajoDe fábricanormalversión %d del protocolo no es admitidasay Error interno; moveType incorrecto %d (%d,%d-%d,%d)suicidaArribaxboard-4.7.3/po/zh_TW.gmo0000644000175000001440000004037712262562300012107 00000000000000Q +2'Bj~")%%:`q      ; Tbt{   $#=)Z  6%Ek! !6$P'u     -D [i&o!&(!;]r0.  :FK] o}/  $2Pfk   0 !Q s   ) . 5 I W i w - ) - )!%G!"m!! !!!!!!! ""%"A"R"d""""""""""###7#<#M#`#t###### ### #$$&$ <$G$ X$ d$ r$}$$$&$!$* %(7%&`%% %%%&%%% &"&,>&(k&&&&&%&'6'K' k' '''''%'2#(V( \(j(|((((((.) F)g))))!)1))b)`+y+ ++++++++,30,6d,?,,, ,-" -/-E-U-g-w------...".). <. I. S.`.s.. ....'../(/A/E/^/ e/r////"// 0% 0F0 M0Z0a0!q0!000 00 011 (151J1 N1 [1h1|11 11$1$1*10'2X2q2,22*2!2-3 K3U3\3;n3 3 3333344564 l4y44 4444 4!4 !5.5D5Z5p5 5 5 5 5 5 5?5$636S6 k6x666666666&6707@7=S7@7=7@8'Q8 y8 888 88888999%989$N9s9999999 999:):0:@:S:f:|::::::::&:;(;>;W;m;};;;;;;;; <7<Q<i< y<<<< <<<6=<L=9=-==>>"5>X>n>!>>!>>>?)6?`?g? z??? ? ????@,#@-P@ ~@@"@E@@#%;V/3J(?}L7Y2T80\$'IM~mjtn!+ |.cB]Uz-@6{" xAg4h Ga=wCE F<sqRy>vb u9)fX_,*iW1D&QdloK^k5PprSOH[`: ZeN%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveInformationIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timebad searchTime option %sbad timeControl option %scanceldownprotocol version %d not supportedsay Internal error; bad moveType %d (%d,%d-%d,%d)upProject-Id-Version: GNU xboard master-20110507 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: zh_TW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s 不支持分析功能關於XBoard(A)行為(A)提請仲裁(D)簡易和棋判決(T)裁決黑贏 (B)裁決紅贏 (W)提示棋局已經結束ICS輸出不明確的著法"%s"不明確的著法 %d.%s%s"Analysis"(分析)模式無法在ICS模式下工作"Analysis"(分析)模式必須啟動國際象棋引擎"AnalyzeFile"(分析檔案)模式必須指定一個棋局檔案動畫拖曳(D)動畫走棋(A)註解(A)國師自動超時判負(F) Ctrl+Shift+F自動翻轉棋盤(V)自動註解(A)自動"kibitz"(A)自動觀棋(O)自動改變棋盤大小(R)自動刷新圖表(R)背景觀察(v)剪貼簿的FEN盤面錯誤檔案中的FEN盤面錯誤棋局檔案錯誤盤面檔案錯誤象黑方黑子輪到黑方走棋黑方超時盲棋(B)棋盤選項棋盤選項(B)...開局庫(B)...庫著法深度庫變例雙方都超時了無法再後退了無法再前進了沒有象棋程式時無法進行比賽無法打開"%s"無法搜尋棋局檔案無法搜尋盤面檔案炮無法建立棋局列表宰相清空棋盤編輯註解(C) *.*通用引擎設定連接被ICS關閉複製遊戲列表到剪貼簿無法連接主機 %s 連接埠 %s無法打開通訊連接埠 %s無法解析著法無法解析從ICS讀到的著法"%s"黑格預設聲音降級檢測將殺(M)顯示的著法不是當前著法顯示的盤面不是當前盤面幾著後判和子力不足時判和(I)雙棋盤(D)EGTB 大小(MB)編輯(E)編輯註解(C)...編輯標籤(T)編輯註解編輯註解 %d.%s%s象清空格子棋局結束引擎1有自用庫引擎 #1 設定引擎 #2 設定引擎輸出錯誤讀取著法時出錯,超出棋盤讀取著法時出錯,巢狀錯誤讀取著法時出錯,出現兩個開頭從%s國際象棋程式(%s)接收訊息時出錯讀取ICS訊息時出錯讀取鍵盤時出錯發送訊息到%s國際象棋程式時出錯發送訊息給ICS時出錯發送訊息給國際象棋程式時出錯發送訊息給顯示器時出錯錯誤:%s國際象棋程式(%s)異常終止審局圖離開呼叫cmail失敗無法啟動%s國際象棋程式 %s(在主機 %s 上),%s 嚴重錯誤檔案(F)黑方先走(B)紅方先走(W)遊戲列表...遊戲列表...檔案中沒有找到棋局棋局數量超出範圍棋局太長,需要增加"MAX_MOVES"並重新編譯著法斷開一般選項(G)...一般選項(G)...一般選項取得著法列表(G)讀取鍵盤時遇到檔案尾雜湊表大小(MB)說明(H)與人對弈時隱藏思考細節格子標記拖曳醒目提示(H)標記上一著法(M)用箭頭突出移動用箭頭突出移動提示(H)...提示 %sICS選項...ICS客戶端ICS設定著法錯誤不合法著法"%s" (%s國際象棋程式拒絕接受該著法)從%s機器讀到不合法著法"%s"ICS輸出不明確的著法"%s"不合法著法 %d.%s%s著法錯誤資訊輪到黑方走棋輪到紅方走棋沒有輪到黑方走棋沒有輪到紅方走棋輪到你走棋王馬白格載入棋局選項(L)... Alt+Shift+L載入棋局選項電腦比賽(M)電腦同意和棋"MachineBlack"(電腦執黑)模式無法在ICS模式下運行"MachineBlack"(電腦執黑)模式必須啟動國際象棋引擎"MachineWhite"(電腦執紅)模式無法在ICS模式下運行"MachineWhite"(電腦執紅)模式必須啟動國際象棋引擎比賽 %s vs. %s: 最終比分 %d-%d-%d最大CPU數模式(M)黑白NPSEGTB 路徑引擎 #1 是絕對分數引擎 #2 是絕對分數洗牌遊戲(u)...洗牌遊戲(u)...變種無聲尚未有棋局載入沒有選中棋局沒有可用的提示這條訊息不包含更多的棋局棋局中沒有著法尚未有盤面載入不存在未完成棋局不存在未完成棋局 註解確定單擊移動(M)選項(O)兵定期更新(U)定期更新(分析模式)播放同步思考(N)離開時提示(P)離開時提示(P)提示錯誤著法(E)檔案中沒有找到盤面預先走棋(P)預先走棋標記升變后落子無聲(Q)準備送信就緒 車儲存棋局選項(S)... Alt+Shift+S儲存棋局選項立即儲存設定(N)離開時儲存設定(X)可選對手圖表(k)顯示坐標(C)顯示坐標(C)聲音聲音選項(D)...啟動位置號碼(S)啟動國際象棋程式無法啟動'%s'棋局 %s 仍需走棋 本棋局仍需走棋 所有 %d 棋局皆仍需走棋 兩棋局皆仍需走棋 棋局 %s 仍需走棋 編輯標籤(T)檢查著法合理性(L) Cl+Sh+L格子已有棋子沒有棋局列表該著法沒有待定的提議訓練(N)訓練模式已關閉訓練模式已打開"Training"(訓練)模式必須指定一個棋局檔案"TwoMachines"(電腦對弈)模式無法在ICS模式下運行"TwoMachines"(分析)模式必須啟動國際象棋引擎未知的"initialMode"(初始模式)選項 %s未知的變體名 %s上傳檢查(U)變體 %s 不被 %s 所支持變體 %s 只在ICS模式下支持驗證引擎聲明(V)等待對手走棋等待第一個國際象棋程式等待對手回應 等待第二個國際象棋程式注意:你正在研究棋局注意:你正在觀棋棋局注意:你正在進行棋局警告: 第二個引擎(%s) 不支持此!紅方輪到紅方走棋紅方超時輸/贏判決門檻沒有分析棋局你在執黑你在執紅暫停時不能復原棋局你尚未走棋必須走完棋才能提和對手沒有超時非法的"searchTime"(搜尋時間)選項 %s非法的"timeControl"(時間控制)選項 %s取消(C)向下通訊協定版本 %d 不被支持say 內部錯誤,非法的"moveType"(著法類型) %d (%d,%d-%d,%d)向上xboard-4.7.3/po/Makefile.in.in0000644000175000001440000003754112262415351013024 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.18 GETTEXT_MACRO_VERSION = 0.18 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) \ && { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \ esac; \ }; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install install-info install-dvi install-ps install-pdf install-html: installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ *) \ $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \ esac; \ }; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: # Recreate Makefile by invoking config.status. Explicitly invoke the shell, # because execution permission bits may not work on the current file system. # Use @SHELL@, which is the shell determined by autoconf for the use by its # scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient. Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && @SHELL@ ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: xboard-4.7.3/po/zh_CN.gmo0000644000175000001440000004052712262562300012052 00000000000000Q .;B'Rz")%$%Jp      -K dr   $#3M)j   -F%U{! !$F$`'     &-D[ r&!&(6!Rt0 ." Q]bt / + ;Ig}    *07!h  $ 4 9 @ T b t  - ) - )(!%R!"x!! !!!!!!" "'"0"L"]"o""""""""## ###B#G#X#k####### ### # $$1$ G$R$ c$ o$ }$$$$&$!$*%(B%&k%% %%%&%%&&"&&,I&(v&&&&&%&%'A'F'[' {' '''''% (23(f( l(z(((((( ).') V)w))))!)1) *b *p++ +++++++,%,3@,6t,?,,, --"-?-U-e-w------..'.+.2.9. L. Y. c.p... ....'.//8/Q/U/n/ u///////0%*0P0 W0d0k0!{0!000 00 11"1 21?1T1 X1 e1 r1|111 11$1$1*20;2l22,22*2!3013 b3l3s3;3 3 3333 44945R4 444 4444 5!5 95F5\5x55 5 5 5 5 5 5?5$,6Q6q6 666666677& 747G7W7=\7@7=7@8'Z8 8 888 88888 999.9A9$W9|9999999 999 :(:/:?:R:e:{::::::::&:;';=;V;l;|;;;;;;&;! <*/<(Z<&<< <<<= =*=@=6V=<=9=->2>H>X>"v>> >>!> >!?1?P?o?)??? ??? @ @ @<@R@n@,@-@ @@@E APA#%;W/3J(?~L7Z2U80]$'IMnkuo!+ }P.dB^V{-@6|" yAh4i Gb=xCE F<trSz>wc v9)gY`,*jX1D&RempK_l5QqsTOH\a: [fN%s does not support analysisAbout XBoardActionAdjudicate DrawAdjudicate Trivial Draws (3-Move Delay)Adjudicate to BlackAdjudicate to WhiteAlarmAlready at end of gameAmbiguous move in ICS output: "%s"Ambiguous move: %d.%s%sAnalysis mode does not work with ICS modeAnalysis mode requires a chess engineAnalyzeFile mode requires a game fileAnimate DraggingAnimate MovingAnnotateArchbishopAuto FlagAuto Flip ViewAuto-CommentAuto-KibitzAuto-ObserveAuto-Raise BoardAuto-Refresh Seek GraphBackground Observe while PlayingBad FEN position in clipboardBad FEN position in fileBad game fileBad position fileBishopBlackBlack Piece Color:Black to playBlack's flag fellBlindfoldBoard OptionsBoard...BookBook Depth (moves):Book Variety (0) vs. Strength (100):Both flags fellCan't back up any furtherCan't go forward any furtherCan't have a match with no chess programsCan't open "%s"Can't seek on game fileCan't seek on position fileCannonCannot build game listChancellorClear boardCommentsCommon Engine SettingsConnection closed by ICSCopy Game ListCould not connect to host %s, port %sCould not open comm port %sCould not parse moveCouldn't parse move "%s" from ICSDark Square Color:Default BeepDemoteDetect all MatesDisplayed move is not currentDisplayed position is not currentDraw after N Moves Total:Draw if Insufficient Mating MaterialDual Board for Background-Observed GameEGTB Cache Size (MB):EditEdit CommentEdit TagsEdit commentEdit comment on %d.%s%sElephantEmpty squareEnd of gameEngineEngine #1 Has Own BookEngine #1 Settings ...Engine #2 Settings ...Engine outputErrorError gathering move list: extra boardError gathering move list: nestedError gathering move list: two headersError reading from %s chess program (%s)Error reading from ICSError reading from keyboardError writing to %s chess programError writing to ICSError writing to chess programError writing to displayError: %s chess program (%s) exited unexpectedlyEvaluation graphExitingFailed to invoke cmailFailed to start %s chess program %s on %s: %s Fatal ErrorFileFirst Black Move:First White Move:Game List ...Game List Tags...Game not found in fileGame number out of rangeGame too long; increase MAX_MOVES and recompileGap in move listGeneralGeneral ...General OptionsGet Move ListGot end of file from keyboardHash-Table Size (MB):HelpHide Thinking from HumanHighlight Color:Highlight DraggingHighlight Last MoveHighlight With ArrowHighlight with ArrowHintHint: %sICS ...ICS ClientICS OptionsIllegal moveIllegal move "%s" (rejected by %s chess program)Illegal move "%s" from %s machineIllegal move in ICS output: "%s"Illegal move: %d.%s%sIncorrect moveIt is Black's turnIt is White's turnIt is not Black's turnIt is not White's turnIt is your turnKingKnightLight Square Color:Load Game ...Load Game OptionsMachine MatchMachine accepts your draw offerMachineBlack mode does not work with ICS modeMachineBlack mode requires a chess engineMachineWhite mode does not work with ICS modeMachineWhite mode requires a chess engineMatch %s vs. %s: final score %d-%d-%dMaximum Number of CPUs per Engine:ModeMono ModeNPSNalimov EGTB Path:Negate Score of Engine #1Negate Score of Engine #2New Shuffle GameNew Shuffle Game ...New VariantNo SoundNo game has been loaded yetNo game selectedNo hint availableNo more games in this messageNo moves in gameNo position has been loaded yetNo unfinished gamesNo unfinished games NoteOKOne-Click MovingOptionsPawnPeriodic UpdatesPeriodic Updates (in Analysis Mode)PlayPonder Next MovePopup Exit MessagePopup Exit MessagesPopup Move ErrorsPosition not found in filePremovePremove Highlight Color:PromoteQueenQuiet PlayReady to send mail RookSave Game ...Save Game OptionsSave Settings NowSave Settings on ExitSeek GraphShow CoordinatesShow CoordsSound OptionsSounds ...Start-position number:Starting chess programStartup failure on '%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s TagsTest LegalityThat square is occupiedThere is no game listThere is no pending offer on this moveTrainingTraining mode offTraining mode onTraining mode requires a game fileTwoMachines mode does not work with ICS modeTwoMachines mode requires a chess engineUnknown initialMode %sUnknown variant name %sUpload to ExamineVariant %s not supported by %sVariant %s supported only in ICS modeVerify Engine Result ClaimsViewWait until your turnWaiting for first chess programWaiting for reply from opponent Waiting for second chess programWarning: You are still examining a gameWarning: You are still observing a gameWarning: You are still playing a gameWarning: second engine (%s) does not support this!WhiteWhite to playWhite's flag fellWin / Loss Threshold:You are not examining a gameYou are playing BlackYou are playing WhiteYou can't revert while pausingYou have not made a move yetYou must make your move before offering a drawYour opponent is not out of timebad searchTime option %sbad timeControl option %scanceldownprotocol version %d not supportedsay Internal error; bad moveType %d (%d,%d-%d,%d)upProject-Id-Version: GNU xboard master-20110507 Report-Msgid-Bugs-To: bug-xboard@gnu.org POT-Creation-Date: 2014-01-06 09:15-0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE Language: zh_CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %s 不支持分析功能关于XBoard(A)行为(A)提请仲裁(D)一般和棋判决(T)裁决黑赢 (B)裁决白赢 (W)提示棋局已经结束ICS输出不明确的着法"%s"不明确的着法 %d.%s%s"Analysis"(分析)模式无法在ICS模式下工作"Analysis"(分析)模式必须启动国际象棋引擎"AnalyzeFile"(分析文件)模式必须指定一个棋局文件动画拖拽(D)动画走棋(A)注释(A)国师自动超时判负(F) Ctrl+Shift+F自动翻转棋盘(V)自动注释(A)自动"kibitz"(A)自动旁观(O)自动改变棋盘大小(R)自动刷新图表(R)后台观察(v)剪贴板的FEN局面错误文件中的FEN局面错误棋局文件错误局面文件错误象黑方黑子轮到黑方走棋黑方超时盲棋(B)棋盘选项棋盘选项(B)...开局库(B)...库着法深度库变例双方都超时了无法再后退了无法再前进了没有象棋程序时无法进行比赛无法打开"%s"无法搜索棋局文件无法搜索局面文件炮无法建立棋局列表宰相清空棋盘编辑注释(C) *.*通用引擎设置连接被ICS关闭复制游戏列表到剪贴板无法连接主机 %s 端口 %s无法打开通讯端口 %s无法解析着法无法解析从ICS读到的着法"%s"黑格默认声音降级检测将杀(M)显示的着法不是当前着法显示的局面不是当前局面几着后判决子力不足时判和(I)双棋盘(D)EGTB 大小(MB)编辑(E)编辑注释(C)...编辑标签(T)编辑注释编辑注释 %d.%s%s象清空格子棋局结束引擎(N)引擎1有自用库引擎 #1 设置引擎 #2 设置引擎输出错误读取着法时出错,超出棋盘读取着法时出错,嵌套错误读取着法时出错,出现两个开头从%s国际象棋程序(%s)接收信息时出错读取ICS信息时出错读取键盘时出错发送信息到%s国际象棋程序时出错发送信息给ICS时出错发送信息给国际象棋程序时出错发送信息给显示器时出错错误:%s国际象棋程序(%s)突然退出了评价图退出Failed to invoke cmail无法启动%s国际象棋程序 %s(在主机 %s 上),%s 严重错误文件(F)黑方先行(B)白方先行(W)游戏列表...游戏列表...文件中没有找到棋局棋局数量超出范围棋局太长,需要增加"MAX_MOVES"并重新编译着法断开常规选项(G)...常规选项(G)...常规选项获取着法列表(G)读取键盘时遇到文件尾Hash 大小(MB)帮助(H)与人对弈时隐藏思考细节格子标记拖拽醒目提示(H)醒目提示上一着法(M)用箭头突出移动用箭头突出移动提示(H)...提示 %sICS选项...ICS客户端ICS设置着法错误不合理着法"%s" (%s国际象棋程序拒绝接受该着法)从%s机器读到不合理着法"%s"ICS输出不明确的着法"%s"不合理着法 %d.%s%s着法错误轮到黑方走棋轮到白方走棋没有轮到黑方走棋没有轮到白方走棋轮到你走棋王马白格载入棋局选项(L)... Alt+Shift+L载入棋局选项引擎比赛(M) *.*"MachineBlack"(电脑执黑)模式无法在ICS模式下运行"MachineBlack"(电脑执黑)模式必须启动国际象棋引擎"MachineWhite"(电脑执白)模式无法在ICS模式下运行"MachineWhite"(电脑执白)模式必须启动国际象棋引擎比赛 %s vs. %s: 最终比分 %d-%d-%d最大CPU数模式(M)黑白NPSEGTB 路径引擎 #1 是绝对分数引擎 #2 是绝对分数洗牌游戏(u)...洗牌游戏(u)...变种无声尚未有棋局载入没有选中棋局没有可用的提示这条信息不包含更多的棋局棋局中没有着法尚未有局面载入No unfinished gamesNo unfinished games 注释确定单击移动(M)选项(O)兵定期更新(U)定期更新(分析模式)播放同步思考(N)退出时提示(P)退出时提示(P)提示错误着法(E)文件中没有着到局面预先走棋(P)预先走棋标记升变后落子无声(Q)Ready to send mail 车保存棋局选项(S)... Alt+Shift+S保存棋局选项立即保存设置(N)退出时保存设置(X)可选对手图表(k)显示坐标(C)显示坐标(C)声音声音选项(D)...启动位置号码(S)启动国际象棋程序无法启动'%s'Still need to make a move for game %s Still need to make move for game Still need to make moves for all %d games Still need to make moves for both games Still need to make moves for games %s 编辑标签(T)检查着法合理性(L) Cl+Sh+L格子已放棋子没有棋局列表该着法没有待定的提议训练(N)训练模式已关闭训练模式已打开"Training"(训练)模式必须指定一个棋局文件"TwoMachines"(电脑对弈)模式无法在ICS模式下运行"TwoMachines"(分析)模式必须启动国际象棋引擎未知的"initialMode"(初始模式)选项 %s未知的变体名 %s上传检查(U)变体 %s 不被 %s 所支持变体 %s 只在ICS模式下支持验证引擎声明(V)外观(V)等待对手走棋等待第一个国际象棋程序Waiting for reply from opponent 等待第二个国际象棋程序注意:你正在研究棋局注意:你正在旁观棋局注意:你正在进行棋局警告: 第二个引擎(%s) 不支持此!白方轮到白方走棋白方超时输/赢判决阈值没有分析棋局你在执黑你在执白暂停时不能复原棋局一步棋也没走过必须走完棋才能提和对手没有超时非法的"searchTime"(搜索时间)选项 %s非法的"timeControl"(时间控制)选项 %s取消(C)向下协议版本 %d 不被支持say 内部错误,非法的"moveType"(着法类型) %d (%d,%d-%d,%d)向上xboard-4.7.3/COPYRIGHT0000644000175000001440000000501012262415351011211 00000000000000XBoard -- a graphical chessboard for X Original authors: Dan Sears and Chris Sears Enhancements (Version 2.0 and later): Tim Mann Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. Enhancements Copyright 2005 Alessandro Scotti XBoard's alternative piece bitmaps (bitmaps.xchess) are derived from the bitmaps in the XChess program, which was written and is copyrighted by Wayne Christopher. The following terms apply to Digital Equipment Corporation's copyright interest in XBoard: ------------------------------------------------------------------------ All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ------------------------------------------------------------------------ The following terms apply to the enhanced version of XBoard distributed by the Free Software Foundation: ------------------------------------------------------------------------ GNU XBoard is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNU XBoard is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. * ------------------------------------------------------------------------ xboard-4.7.3/history.c0000644000175000001440000001626412262415351011600 00000000000000/* * Move history for WinBoard * * Author: Alessandro Scotti (Dec 2005) * back-end part split off by HGM * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" /* templates for low-level front-end tasks (requiring platform-dependent implementation) */ void ClearHistoryMemo P((void)); // essential int AppendToHistoryMemo P(( char * text, int bold, int colorNr )); // essential (coloring / styling optional) void HighlightMove P(( int from, int to, Boolean highlight )); // optional (can be dummy) void ScrollToCurrent P((int caretPos)); // optional (can be dummy) /* templates for front-end entry point to allow inquiring about front-end state */ Boolean MoveHistoryDialogExists P((void)); Boolean MoveHistoryIsUp P((void)); /* Module globals */ typedef char MoveHistoryString[ MOVE_LEN*2 ]; static int lastFirst = 0; static int lastLast = 0; static int lastCurrent = -1; static int lastGames; static char lastLastMove[ MOVE_LEN ]; static MoveHistoryString * currMovelist; static ChessProgramStats_Move * currPvInfo; static int currFirst = 0; static int currLast = 0; static int currCurrent = -1; typedef struct { int memoOffset; int memoLength; } HistoryMove; static HistoryMove histMoves[ MAX_MOVES ]; /* Note: in the following code a "Memo" is a Rich Edit control (it's Delphi lingo) */ // back-end after replacing Windows data-types by equivalents static Boolean OnlyCurrentPositionChanged () { Boolean result = FALSE; if( lastFirst >= 0 && lastLast >= lastFirst && lastCurrent >= lastFirst && currFirst == lastFirst && currLast == lastLast && currCurrent >= 0 && lastGames == storedGames ) { result = TRUE; /* Special case: last move changed */ if( currCurrent == currLast-1 ) { if( strcmp( currMovelist[currCurrent], lastLastMove ) != 0 ) { result = FALSE; } } } return result; } // back-end, after replacing Windows data types static Boolean OneMoveAppended () { Boolean result = FALSE; if( lastCurrent >= 0 && lastCurrent >= lastFirst && lastLast >= lastFirst && currCurrent >= 0 && currCurrent >= currFirst && currLast >= currFirst && lastFirst == currFirst && lastLast == (currLast-1) && lastCurrent == (currCurrent-1) && currCurrent == (currLast-1) && lastGames == storedGames ) { result = TRUE; } return result; } // back-end, now that color and font-style are passed as numbers static void AppendMoveToMemo (int index) { char buf[64]; if( index < 0 || index >= MAX_MOVES ) { return; } buf[0] = '\0'; /* Move number */ if( (index % 2) == 0 ) { sprintf( buf, "%d.%s ", (index / 2)+1, index & 1 ? ".." : "" ); AppendToHistoryMemo( buf, 1, 0 ); // [HGM] 1 means bold, 0 default color } /* Move text */ safeStrCpy( buf, SavePart( currMovelist[index]) , sizeof( buf)/sizeof( buf[0]) ); strcat( buf, " " ); histMoves[index].memoOffset = AppendToHistoryMemo( buf, 0, 0 ); histMoves[index].memoLength = strlen(buf)-1; /* PV info (if any) */ if( appData.showEvalInMoveHistory && currPvInfo[index].depth > 0 ) { sprintf( buf, "{%s%.2f/%d} ", currPvInfo[index].score >= 0 ? "+" : "", currPvInfo[index].score / 100.0, currPvInfo[index].depth ); AppendToHistoryMemo( buf, 0, 1); // [HGM] 1 means gray } } // back-end void RefreshMemoContent () { int i; ClearHistoryMemo(); for( i=currFirst; i= 0 && index < MAX_MOVES ) { HighlightMove( histMoves[index].memoOffset, histMoves[index].memoOffset + histMoves[index].memoLength, onoff ); } } // back-end, now that a wrapper is provided for the front-end code to do the actual scrolling void MemoContentUpdated () { int caretPos; if(lastCurrent <= currLast) DoHighlight( lastCurrent, FALSE ); lastFirst = currFirst; lastLast = currLast; lastCurrent = currCurrent; lastGames = storedGames; lastLastMove[0] = '\0'; if( lastLast > 0 ) { safeStrCpy( lastLastMove, SavePart( currMovelist[lastLast-1] ) , sizeof( lastLastMove)/sizeof( lastLastMove[0]) ); } /* Deselect any text, move caret to end of memo */ if( currCurrent >= 0 ) { caretPos = histMoves[currCurrent].memoOffset + histMoves[currCurrent].memoLength; } else { caretPos = -1; } ScrollToCurrent(caretPos); DoHighlight( currCurrent, TRUE ); // [HGM] moved last, because in X some scrolling methods spoil highlighting } // back-end. Must be called as double-click call-back on move-history text edit void FindMoveByCharIndex (int char_index) { int index; for( index=currFirst; index= histMoves[index].memoOffset && char_index < (histMoves[index].memoOffset + histMoves[index].memoLength) ) { ToNrEvent( index + 1 ); // moved here from call-back } } } // back-end. In WinBoard called by call-back, but could be called directly by SetIfExists? void UpdateMoveHistory () { /* Update the GUI */ if( OnlyCurrentPositionChanged() ) { /* Only "cursor" changed, no need to update memo content */ } else if( OneMoveAppended() ) { AppendMoveToMemo( currCurrent ); } else { RefreshMemoContent(); } MemoContentUpdated(); } // back-end void MoveHistorySet (char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo) { /* [AS] Danger! For now we rely on the movelist parameter being a static variable! */ currMovelist = movelist; currFirst = first; currLast = last; currCurrent = current; currPvInfo = pvInfo; if(MoveHistoryDialogExists()) UpdateMoveHistory(); // [HGM] call this directly, in stead of through call-back } xboard-4.7.3/pgntags.c0000644000175000001440000002115512262415351011535 00000000000000/* * pgntags.c -- Functions to manage PGN tags * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * * ------------------------------------------------------------------------ * * This file could well be a part of backend.c, but I prefer it this * way. */ #include "config.h" #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #include "common.h" #include "frontend.h" #include "backend.h" #include "parser.h" /* Parse PGN tags; returns 0 for success or error number */ int ParsePGNTag (char *tag, GameInfo *gameInfo) { char *name, *value, *p, *oldTags; int len; int success; name = tag; while (!isalpha(*name) && !isdigit(*name)) { name++; } p = name; while (*p != ' ' && *p != '\t' && *p != '\n') { p++; } *p = NULLCHAR; value = strchr(p + 1, '"') + 1; p = strrchr(value, '"'); *p = NULLCHAR; if (StrCaseCmp(name, "Event") == 0) { success = StrSavePtr(value, &gameInfo->event) != NULL; } else if (StrCaseCmp(name, "Site") == 0) { success = StrSavePtr(value, &gameInfo->site) != NULL; } else if (StrCaseCmp(name, "Date") == 0) { success = StrSavePtr(value, &gameInfo->date) != NULL; } else if (StrCaseCmp(name, "Round") == 0) { success = StrSavePtr(value, &gameInfo->round) != NULL; } else if (StrCaseCmp(name, "White") == 0) { success = StrSavePtr(value, &gameInfo->white) != NULL; } else if (StrCaseCmp(name, "Black") == 0) { success = StrSavePtr(value, &gameInfo->black) != NULL; } /* Fold together the various ways of denoting White/Black rating */ else if ((StrCaseCmp(name, "WhiteElo")==0) || (StrCaseCmp(name, "WhiteUSCF")==0) ) { success = TRUE; gameInfo->whiteRating = atoi( value ); } else if ((StrCaseCmp(name, "BlackElo")==0) || (StrCaseCmp(name, "BlackUSCF")==0)) { success = TRUE; gameInfo->blackRating = atoi( value ); } else if (StrCaseCmp(name, "Result") == 0) { if (strcmp(value, "1-0") == 0) gameInfo->result = WhiteWins; else if (strcmp(value, "0-1") == 0) gameInfo->result = BlackWins; else if (strcmp(value, "1/2-1/2") == 0) gameInfo->result = GameIsDrawn; else gameInfo->result = GameUnfinished; success = TRUE; } else if (StrCaseCmp(name, "TimeControl") == 0) { // int tc, mps, inc = -1; // if(sscanf(value, "%d/%d", &mps, &tc) == 2 || ) success = StrSavePtr(value, &gameInfo->timeControl) != NULL; } else if (StrCaseCmp(name, "FEN") == 0) { success = StrSavePtr(value, &gameInfo->fen) != NULL; } else if (StrCaseCmp(name, "SetUp") == 0) { /* ignore on input; presence of FEN governs */ success = TRUE; } else if (StrCaseCmp(name, "Variant") == 0) { /* xboard-defined extension */ gameInfo->variant = StringToVariant(value); success = TRUE; } else if (StrCaseCmp(name, PGN_OUT_OF_BOOK) == 0) { /* [AS] Out of book annotation */ success = StrSavePtr(value, &gameInfo->outOfBook) != NULL; } else { if (gameInfo->extraTags == NULL) { oldTags = ""; } else { oldTags = gameInfo->extraTags; } /* Buffer size includes 7 bytes of space for [ ""]\n\0 */ len = strlen(oldTags) + strlen(value) + strlen(name) + 7; if ((p = (char *) malloc(len)) != NULL) { sprintf(p, "%s[%s \"%s\"]\n", oldTags, name, value); if (gameInfo->extraTags != NULL) free(gameInfo->extraTags); gameInfo->extraTags = p; success = TRUE; } else { success = FALSE; } } return(success ? 0 : ENOMEM); } /* Print game info */ void PrintPGNTags (FILE *fp, GameInfo *gameInfo) { fprintf(fp, "[Event \"%s\"]\n", gameInfo->event ? gameInfo->event : "?"); fprintf(fp, "[Site \"%s\"]\n", gameInfo->site ? gameInfo->site : "?"); fprintf(fp, "[Date \"%s\"]\n", gameInfo->date ? gameInfo->date : "?"); fprintf(fp, "[Round \"%s\"]\n", gameInfo->round ? gameInfo->round : "-"); fprintf(fp, "[White \"%s\"]\n", gameInfo->white ? gameInfo->white : "?"); fprintf(fp, "[Black \"%s\"]\n", gameInfo->black ? gameInfo->black : "?"); fprintf(fp, "[Result \"%s\"]\n", PGNResult(gameInfo->result)); if (gameInfo->whiteRating >= 0) fprintf(fp, "[WhiteElo \"%d\"]\n", gameInfo->whiteRating); if (gameInfo->blackRating >= 0) fprintf(fp, "[BlackElo \"%d\"]\n", gameInfo->blackRating); if (gameInfo->timeControl) fprintf(fp, "[TimeControl \"%s\"]\n", gameInfo->timeControl); if (gameInfo->variant != VariantNormal) fprintf(fp, "[Variant \"%s\"]\n", VariantName(gameInfo->variant)); if (gameInfo->extraTags) fputs(gameInfo->extraTags, fp); } /* Return a non-static buffer with a games info. */ char * PGNTags (GameInfo *gameInfo) { size_t len; char *buf; char *p; // First calculate the needed buffer size. // Then we don't have to check the buffer size later. len = 12 + 11 + 11 + 12 + 12 + 12 + 25 + 1; // The first 7 tags if (gameInfo->event) len += strlen(gameInfo->event); if (gameInfo->site) len += strlen(gameInfo->site); if (gameInfo->date) len += strlen(gameInfo->date); if (gameInfo->round) len += strlen(gameInfo->round); if (gameInfo->white) len += strlen(gameInfo->white); if (gameInfo->black) len += strlen(gameInfo->black); if (gameInfo->whiteRating >= 0) len += 40; if (gameInfo->blackRating >= 0) len += 40; if (gameInfo->timeControl) len += strlen(gameInfo->timeControl) + 20; if (gameInfo->variant != VariantNormal) len += 50; if (gameInfo->extraTags) len += strlen(gameInfo->extraTags); buf = malloc(len); if (!buf) return 0; p = buf; p += sprintf(p, "[Event \"%s\"]\n", gameInfo->event ? gameInfo->event : "?"); p += sprintf(p, "[Site \"%s\"]\n", gameInfo->site ? gameInfo->site : "?"); p += sprintf(p, "[Date \"%s\"]\n", gameInfo->date ? gameInfo->date : "?"); p += sprintf(p, "[Round \"%s\"]\n", gameInfo->round ? gameInfo->round : "-"); p += sprintf(p, "[White \"%s\"]\n", gameInfo->white ? gameInfo->white : "?"); p += sprintf(p, "[Black \"%s\"]\n", gameInfo->black ? gameInfo->black : "?"); p += sprintf(p, "[Result \"%s\"]\n", PGNResult(gameInfo->result)); if (gameInfo->whiteRating >= 0) p += sprintf(p, "[WhiteElo \"%d\"]\n", gameInfo->whiteRating); if (gameInfo->blackRating >= 0) p += sprintf(p, "[BlackElo \"%d\"]\n", gameInfo->blackRating); if (gameInfo->timeControl) p += sprintf(p, "[TimeControl \"%s\"]\n", gameInfo->timeControl); if (gameInfo->variant != VariantNormal) p += sprintf(p, "[Variant \"%s\"]\n", VariantName(gameInfo->variant)); if (gameInfo->extraTags) strcpy(p, gameInfo->extraTags); return buf; } /* Returns pointer to a static string with a result. */ char * PGNResult (ChessMove result) { switch (result) { case GameUnfinished: default: return "*"; case WhiteWins: return "1-0"; case BlackWins: return "0-1"; case GameIsDrawn: return "1/2-1/2"; } } /* Returns 0 for success, nonzero for error */ int ReplaceTags (char *tags, GameInfo *gameInfo) { ChessMove moveType; int err; ClearGameInfo(gameInfo); yynewstr(tags); for (;;) { yyboardindex = 0; moveType = (ChessMove) Myylex(); if (moveType == (ChessMove) 0) { break; } else if (moveType == PGNTag) { err = ParsePGNTag(yy_text, gameInfo); if (err != 0) return err; } } /* just one problem...if there is a result in the new tags, * DisplayMove() won't ever show it because ClearGameInfo() set * gameInfo->resultDetails to NULL. So we must plug something in if there * is a result. */ if (gameInfo->result != GameUnfinished) { if (gameInfo->resultDetails) free(gameInfo->resultDetails); gameInfo->resultDetails = strdup(""); } return 0; } xboard-4.7.3/moves.h0000644000175000001440000001760112262562252011234 00000000000000/* * moves.h - Move generation and checking * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ extern ChessSquare PromoPiece P((ChessMove moveType)); extern ChessMove PromoCharToMoveType P((int whiteOnMove, int promoChar)); extern char PieceToChar P((ChessSquare p)); extern ChessSquare CharToPiece P((int c)); extern int PieceToNumber P((ChessSquare p)); extern void CopyBoard P((Board to, Board from)); extern int CompareBoards P((Board board1, Board board2)); extern char pieceToChar[(int)EmptySquare+1]; extern char pieceNickName[(int)EmptySquare]; typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); /* Values for flags arguments */ #define F_WHITE_ON_MOVE 1 #define F_WHITE_KCASTLE_OK 2 #define F_WHITE_QCASTLE_OK 4 #define F_BLACK_KCASTLE_OK 8 #define F_BLACK_QCASTLE_OK 16 #define F_ALL_CASTLE_OK (F_WHITE_KCASTLE_OK | F_WHITE_QCASTLE_OK | \ F_BLACK_KCASTLE_OK | F_BLACK_QCASTLE_OK) #define F_IGNORE_CHECK 32 #define F_KRIEGSPIEL_CAPTURE 64 /* pawns can try to capture invisible pieces */ #define F_ATOMIC_CAPTURE 128 /* capturing piece explodes, destroying itself and all non-pawns on adjacent squares; destroying your own king is illegal */ #define F_FRC_TYPE_CASTLING 256 /* generate castlings as captures of own Rook */ #define F_MANDATORY_CAPTURE 0x200 /* Special epfile values. [HGM] positive values are non-reversible moves! */ #define EP_NONE (-4) /* [HGM] Tricky! order matters: */ #define EP_UNKNOWN (-1) /* >= EP_UNKNOWN spils rep-draw */ #define EP_CAPTURE (-2) /* <= EP_NONE is reversible move */ #define EP_PAWN_MOVE (-3) #define EP_REP_DRAW (-15) #define EP_RULE_DRAW (-14) #define EP_INSUF_DRAW (-13) #define EP_DRAWS (-10) #define EP_WINS (-9) #define EP_BEROLIN_A 16 /* [HGM] berolina: add to file if pawn to be taken of a-side of e.p.file */ #define EP_CHECKMATE 100 /* [HGM] verify: record mates in epStatus for easy claim verification */ #define EP_STALEMATE -16 /* Call callback once for each pseudo-legal move in the given position, except castling moves. A move is pseudo-legal if it is legal, or if it would be legal except that it leaves the king in check. In the arguments, epfile is EP_NONE if the previous move was not a double pawn push, or the file 0..7 if it was, or EP_UNKNOWN if we don't know and want to allow all e.p. captures. Promotion moves generated are to Queen only. */ extern void GenPseudoLegal P((Board board, int flags, MoveCallback callback, VOIDSTAR closure, ChessSquare filter)); /* Like GenPseudoLegal, but include castling moves and (unless F_IGNORE_CHECK is set in the flags) omit moves that would leave the king in check. The CASTLE_OK flags are true if castling is not yet ruled out by a move of the king or rook. Return TRUE if the player on move is currently in check and F_IGNORE_CHECK is not set. */ extern int GenLegal P((Board board, int flags, MoveCallback callback, VOIDSTAR closure, ChessSquare filter)); /* If the player on move were to move from (rf, ff) to (rt, ft), would he leave himself in check? Or if rf == -1, is the player on move in check now? enPassant must be TRUE if the indicated move is an e.p. capture. The possibility of castling out of a check along the back rank is not accounted for (i.e., we still return nonzero), as this is illegal anyway. Return value is the number of times the king is in check. */ extern int CheckTest P((Board board, int flags, int rf, int ff, int rt, int ft, int enPassant)); /* Is a move from (rf, ff) to (rt, ft) legal for the player whom the flags say is on move? Other arguments as in GenPseudoLegal. Returns the type of move made, taking promoChar into account. */ extern ChessMove LegalityTest P((Board board, int flags, int rf, int ff, int rt, int ft, int promoChar)); #define MT_NONE 0 #define MT_CHECK 1 #define MT_CHECKMATE 2 #define MT_STALEMATE 3 #define MT_STAINMATE 4 /* [HGM] xq: for games where being stalemated counts as a loss */ #define MT_STEALMATE 5 /* [HGM] losers: for games where being stalemated counts as a win */ #define MT_TRICKMATE 6 /* [HGM] losers: for games where being checkmated counts as a win */ #define MT_BARE 7 /* [HGM] shatranj: for games where having bare king loses */ #define MT_DRAW 8 /* [HGM] shatranj: other draws */ #define MT_NOKING 9 /* [HGM] atomic: for games lost through king capture */ /* Return MT_NONE, MT_CHECK, MT_CHECKMATE, or MT_STALEMATE */ extern int MateTest P((Board board, int flags)); typedef struct { /* Input data */ ChessSquare pieceIn; /* EmptySquare if unknown */ int rfIn, ffIn, rtIn, ftIn; /* -1 if unknown */ int promoCharIn; /* NULLCHAR if unknown */ /* Output data for matched move */ ChessMove kind; ChessSquare piece; int rf, ff, rt, ft; int promoChar; /* 'q' if a promotion and promoCharIn was NULLCHAR */ int count; /* Number of possibilities found */ int captures; /* [HGM] oneclick: number of matching captures */ } DisambiguateClosure; /* Disambiguate a partially-known move */ void Disambiguate P((Board board, int flags, DisambiguateClosure *closure)); /* Convert coordinates to normal algebraic notation. promoChar must be NULLCHAR or '.' if not a promotion. */ ChessMove CoordsToAlgebraic P((Board board, int flags, int rf, int ff, int rt, int ft, int promoChar, char out[MOVE_LEN])); extern int quickFlag; xboard-4.7.3/INSTALL0000644000175000001440000001701312262415351010755 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). The file `configure.ac' is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. Please use the autogen.sh shell script, which will run all the autotools to generate the `configure' script if it is missing. The simplest way to compile this package is: 0. If the configure script is missing, run ./autogen.sh in the source directory 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. xboard-4.7.3/config.guess0000755000175000001440000013111012247021262012234 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac case "${UNAME_MACHINE}" in i?86) test -z "$VENDOR" && VENDOR=pc ;; *) test -z "$VENDOR" && VENDOR=unknown ;; esac test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-${VENDOR}-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-${VENDOR}-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-${VENDOR}-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-${VENDOR}-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-${VENDOR}-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-${VENDOR}-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-${VENDOR}-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-${VENDOR}-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-${VENDOR}-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-${VENDOR}-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-${VENDOR}-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-${VENDOR}-osf1mk else echo ${UNAME_MACHINE}-${VENDOR}-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-${VENDOR}-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-${VENDOR}-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-${VENDOR}-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-${VENDOR}-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-${VENDOR}-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-${VENDOR}-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-${VENDOR}-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-${VENDOR}-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-${VENDOR}-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-${VENDOR}-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-${VENDOR}-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-${VENDOR}-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-${VENDOR}-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-${VENDOR}-linux-${LIBC} ;; PA8*) echo hppa2.0-${VENDOR}-linux-${LIBC} ;; *) echo hppa-${VENDOR}-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-${VENDOR}-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-${VENDOR}-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-${VENDOR}-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-${VENDOR}-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-${VENDOR}-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-${VENDOR}-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-${VENDOR}-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-${VENODR}-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-${VENDOR}-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-${VENODR}-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-${VENDOR}-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-${VENDOR}-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-${VENDOR}-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-${VENDOR}-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-${VENDOR}-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-${VENDOR}-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-${VENDOR}-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-${VENDOR}-tops10 exit ;; *:TENEX:*:*) echo pdp10-${VENDOR}-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-${VENDOR}-tops20 exit ;; *:ITS:*:*) echo pdp10-${VENDOR}-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-${VENDOR}-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-${VENDOR}-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: xboard-4.7.3/gamelist.c0000644000175000001440000004371012262562252011703 00000000000000/* * gamelist.c -- Functions to manage a gamelist * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #include "common.h" #include "frontend.h" #include "backend.h" #include "parser.h" #include "moves.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif /* Variables */ List gameList; extern Board initialPosition; extern int quickFlag; extern int movePtr; /* Local function prototypes */ static void GameListDeleteGame P((ListGame *)); static ListGame *GameListCreate P((void)); static void GameListFree P((List *)); static int GameListNewGame P((ListGame **)); /* [AS] Wildcard pattern matching */ Boolean HasPattern (const char * text, const char * pattern) { while( *pattern != '\0' ) { if( *pattern == '*' ) { while( *pattern == '*' ) { pattern++; } if( *pattern == '\0' ) { return TRUE; } while( *text != '\0' ) { if( HasPattern( text, pattern ) ) { return TRUE; } text++; } } else if( (*pattern == *text) || ((*pattern == '?') && (*text != '\0')) ) { pattern++; text++; continue; } return FALSE; } return TRUE; } Boolean SearchPattern (const char * text, const char * pattern) { Boolean result = TRUE; if( pattern != NULL && *pattern != '\0' ) { if( *pattern == '*' ) { result = HasPattern( text, pattern ); } else { result = FALSE; while( *text != '\0' ) { if( HasPattern( text, pattern ) ) { result = TRUE; break; } text++; } } } return result; } /* Delete a ListGame; implies removint it from a list. */ static void GameListDeleteGame (ListGame *listGame) { if (listGame) { if (listGame->gameInfo.event) free(listGame->gameInfo.event); if (listGame->gameInfo.site) free(listGame->gameInfo.site); if (listGame->gameInfo.date) free(listGame->gameInfo.date); if (listGame->gameInfo.round) free(listGame->gameInfo.round); if (listGame->gameInfo.white) free(listGame->gameInfo.white); if (listGame->gameInfo.black) free(listGame->gameInfo.black); if (listGame->gameInfo.fen) free(listGame->gameInfo.fen); if (listGame->gameInfo.resultDetails) free(listGame->gameInfo.resultDetails); if (listGame->gameInfo.timeControl) free(listGame->gameInfo.timeControl); if (listGame->gameInfo.extraTags) free(listGame->gameInfo.extraTags); if (listGame->gameInfo.outOfBook) free(listGame->gameInfo.outOfBook); ListNodeFree((ListNode *) listGame); } } /* Free the previous list of games. */ static void GameListFree (List *gameList) { while (!ListEmpty(gameList)) { GameListDeleteGame((ListGame *) gameList->head); } } /* Initialize a new GameInfo structure. */ void GameListInitGameInfo (GameInfo *gameInfo) { gameInfo->event = NULL; gameInfo->site = NULL; gameInfo->date = NULL; gameInfo->round = NULL; gameInfo->white = NULL; gameInfo->black = NULL; gameInfo->result = GameUnfinished; gameInfo->fen = NULL; gameInfo->resultDetails = NULL; gameInfo->timeControl = NULL; gameInfo->extraTags = NULL; gameInfo->whiteRating = -1; /* unknown */ gameInfo->blackRating = -1; /* unknown */ gameInfo->variant = VariantNormal; gameInfo->outOfBook = NULL; gameInfo->resultDetails = NULL; } /* Create empty ListGame; returns ListGame or NULL, if out of memory. * * Note, that the ListGame is *not* added to any list */ static ListGame * GameListCreate () { ListGame *listGame; if ((listGame = (ListGame *) ListNodeCreate(sizeof(*listGame)))) { GameListInitGameInfo(&listGame->gameInfo); } return(listGame); } /* Creates a new game for the gamelist. */ static int GameListNewGame (ListGame **listGamePtr) { if (!(*listGamePtr = (ListGame *) GameListCreate())) { GameListFree(&gameList); return(ENOMEM); } ListAddTail(&gameList, (ListNode *) *listGamePtr); return(0); } /* Build the list of games in the open file f. * Returns 0 for success or error number. */ int GameListBuild (FILE *f) { ChessMove cm, lastStart; int gameNumber; ListGame *currentListGame = NULL; int error, scratch=100, plyNr=0, fromX, fromY, toX, toY; int offset; char lastComment[MSG_SIZ], buf[MSG_SIZ]; TimeMark t, t2; GetTimeMark(&t); GameListFree(&gameList); yynewfile(f); gameNumber = 0; movePtr = 0; lastStart = (ChessMove) 0; yyskipmoves = FALSE; do { yyboardindex = scratch; offset = yyoffset(); quickFlag = plyNr + 1; cm = (ChessMove) Myylex(); switch (cm) { case GNUChessGame: if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } if (currentListGame->gameInfo.event != NULL) { free(currentListGame->gameInfo.event); } currentListGame->gameInfo.event = StrSave(yy_text); lastStart = cm; break; case XBoardGame: lastStart = cm; break; case MoveNumberOne: switch (lastStart) { case GNUChessGame: break; /* ignore */ case PGNTag: lastStart = cm; break; /* Already started */ case (ChessMove) 0: case MoveNumberOne: case XBoardGame: if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = cm; break; default: break; /* impossible */ } break; case PGNTag: lastStart = cm; if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; ParsePGNTag(yy_text, ¤tListGame->gameInfo); do { yyboardindex = 1; offset = yyoffset(); cm = (ChessMove) Myylex(); if (cm == PGNTag) { ParsePGNTag(yy_text, ¤tListGame->gameInfo); } } while (cm == PGNTag || cm == Comment); if(1) { int btm=0; if(currentListGame->gameInfo.fen) ParseFEN(boards[scratch], &btm, currentListGame->gameInfo.fen); else CopyBoard(boards[scratch], initialPosition); plyNr = (btm != 0); currentListGame->moves = PackGame(boards[scratch]); } if(cm != NormalMove) break; case IllegalMove: if(appData.testLegality) break; case NormalMove: /* Allow the first game to start with an unnumbered move */ yyskipmoves = FALSE; if (lastStart == (ChessMove) 0) { if ((error = GameListNewGame(¤tListGame))) { rewind(f); yyskipmoves = FALSE; return(error); } currentListGame->number = ++gameNumber; currentListGame->offset = offset; if(1) { CopyBoard(boards[scratch], initialPosition); plyNr = 0; currentListGame->moves = PackGame(boards[scratch]); } lastStart = MoveNumberOne; } case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; plyNr++; ApplyMove(fromX, fromY, toX, toY, currentMoveString[4], boards[scratch]); if(currentListGame && currentListGame->moves) PackMove(fromX, fromY, toX, toY, boards[scratch][toY][toX]); break; case WhiteWins: // [HGM] rescom: save last comment as result details case BlackWins: case GameIsDrawn: case GameUnfinished: if(!currentListGame) break; if (currentListGame->gameInfo.resultDetails != NULL) { free(currentListGame->gameInfo.resultDetails); } if(yy_text[0] == '{') { char *p; safeStrCpy(lastComment, yy_text+1, sizeof(lastComment)/sizeof(lastComment[0])); if((p = strchr(lastComment, '}'))) *p = 0; currentListGame->gameInfo.resultDetails = StrSave(lastComment); } break; default: break; } if(gameNumber % 1000 == 0) { snprintf(buf, MSG_SIZ, _("Reading game file (%d)"), gameNumber); DisplayTitle(buf); } } while (cm != (ChessMove) 0); if(currentListGame) { if(!currentListGame->moves) DisplayError("Game cache overflowed\nPosition-searching might not work properly", 0); if (appData.debugMode) { for (currentListGame = (ListGame *) gameList.head; currentListGame->node.succ; currentListGame = (ListGame *) currentListGame->node.succ) { fprintf(debugFP, "Parsed game number %d, offset %ld:\n", currentListGame->number, currentListGame->offset); PrintPGNTags(debugFP, ¤tListGame->gameInfo); } } } if(appData.debugMode) { GetTimeMark(&t2);printf("GameListBuild %ld msec\n", SubtractTimeMarks(&t2,&t)); } quickFlag = 0; PackGame(boards[scratch]); // for appending end-of-game marker. DisplayTitle("WinBoard"); rewind(f); yyskipmoves = FALSE; return 0; } /* Clear an existing GameInfo structure. */ void ClearGameInfo (GameInfo *gameInfo) { if (gameInfo->event != NULL) { free(gameInfo->event); } if (gameInfo->site != NULL) { free(gameInfo->site); } if (gameInfo->date != NULL) { free(gameInfo->date); } if (gameInfo->round != NULL) { free(gameInfo->round); } if (gameInfo->white != NULL) { free(gameInfo->white); } if (gameInfo->black != NULL) { free(gameInfo->black); } if (gameInfo->resultDetails != NULL) { free(gameInfo->resultDetails); } if (gameInfo->fen != NULL) { free(gameInfo->fen); } if (gameInfo->timeControl != NULL) { free(gameInfo->timeControl); } if (gameInfo->extraTags != NULL) { free(gameInfo->extraTags); } if (gameInfo->outOfBook != NULL) { free(gameInfo->outOfBook); } GameListInitGameInfo(gameInfo); } /* [AS] Replaced by "dynamic" tag selection below */ char * GameListLineOld (int number, GameInfo *gameInfo) { char *event = (gameInfo->event && strcmp(gameInfo->event, "?") != 0) ? gameInfo->event : gameInfo->site ? gameInfo->site : "?"; char *white = gameInfo->white ? gameInfo->white : "?"; char *black = gameInfo->black ? gameInfo->black : "?"; char *date = gameInfo->date ? gameInfo->date : "?"; int len = 10 + strlen(event) + 2 + strlen(white) + 1 + strlen(black) + 11 + strlen(date) + 1; char *ret = (char *) malloc(len); sprintf(ret, "%d. %s, %s-%s, %s, %s", number, event, white, black, PGNResult(gameInfo->result), date); return ret; } #define MAX_FIELD_LEN 80 /* To avoid overflowing the buffer */ char * GameListLine (int number, GameInfo * gameInfo) { char buffer[2*MSG_SIZ]; char * buf = buffer; char * glt = appData.gameListTags; buf += sprintf( buffer, "%d.", number ); while( *glt != '\0' ) { *buf++ = ' '; switch( *glt ) { case GLT_EVENT: strncpy( buf, gameInfo->event ? gameInfo->event : "?", MAX_FIELD_LEN ); break; case GLT_SITE: strncpy( buf, gameInfo->site ? gameInfo->site : "?", MAX_FIELD_LEN ); break; case GLT_DATE: strncpy( buf, gameInfo->date ? gameInfo->date : "?", MAX_FIELD_LEN ); break; case GLT_ROUND: strncpy( buf, gameInfo->round ? gameInfo->round : "?", MAX_FIELD_LEN ); break; case GLT_PLAYERS: strncpy( buf, gameInfo->white ? gameInfo->white : "?", MAX_FIELD_LEN ); buf[ MAX_FIELD_LEN-1 ] = '\0'; buf += strlen( buf ); *buf++ = '-'; strncpy( buf, gameInfo->black ? gameInfo->black : "?", MAX_FIELD_LEN ); break; case GLT_RESULT: safeStrCpy( buf, PGNResult(gameInfo->result), 2*MSG_SIZ ); break; case GLT_WHITE_ELO: if( gameInfo->whiteRating > 0 ) sprintf( buf, "%d", gameInfo->whiteRating ); else safeStrCpy( buf, "?" , 2*MSG_SIZ); break; case GLT_BLACK_ELO: if( gameInfo->blackRating > 0 ) sprintf( buf, "%d", gameInfo->blackRating ); else safeStrCpy( buf, "?" , 2*MSG_SIZ); break; case GLT_TIME_CONTROL: strncpy( buf, gameInfo->timeControl ? gameInfo->timeControl : "?", MAX_FIELD_LEN ); break; case GLT_VARIANT: break; case GLT_OUT_OF_BOOK: strncpy( buf, gameInfo->outOfBook ? gameInfo->outOfBook : "?", MAX_FIELD_LEN ); break; case GLT_RESULT_COMMENT: strncpy( buf, gameInfo->resultDetails ? gameInfo->resultDetails : "res?", MAX_FIELD_LEN ); break; default: break; } buf[MAX_FIELD_LEN-1] = '\0'; buf += strlen( buf ); glt++; if( *glt != '\0' ) { *buf++ = ','; } } *buf = '\0'; return strdup( buffer ); } char * GameListLineFull (int number, GameInfo * gameInfo) { char * event = gameInfo->event ? gameInfo->event : "?"; char * site = gameInfo->site ? gameInfo->site : "?"; char * white = gameInfo->white ? gameInfo->white : "?"; char * black = gameInfo->black ? gameInfo->black : "?"; char * round = gameInfo->round ? gameInfo->round : "?"; char * date = gameInfo->date ? gameInfo->date : "?"; char * oob = gameInfo->outOfBook ? gameInfo->outOfBook : ""; char * reason = gameInfo->resultDetails ? gameInfo->resultDetails : ""; int len = 64 + strlen(event) + strlen(site) + strlen(white) + strlen(black) + strlen(date) + strlen(oob) + strlen(reason); char *ret = (char *) malloc(len); sprintf(ret, "%d, \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"", number, event, site, round, white, black, PGNResult(gameInfo->result), reason, date, oob ); return ret; } // --------------------------------------- Game-List options dialog -------------------------------------- // back-end typedef struct { char id; char * name; } GLT_Item; // back-end: translation table tag id-char <-> full tag name static GLT_Item GLT_ItemInfo[] = { { GLT_EVENT, "Event" }, { GLT_SITE, "Site" }, { GLT_DATE, "Date" }, { GLT_ROUND, "Round" }, { GLT_PLAYERS, "Players" }, { GLT_RESULT, "Result" }, { GLT_WHITE_ELO, "White Rating" }, { GLT_BLACK_ELO, "Black Rating" }, { GLT_TIME_CONTROL,"Time Control" }, { GLT_VARIANT, "Variant" }, { GLT_OUT_OF_BOOK,PGN_OUT_OF_BOOK }, { GLT_RESULT_COMMENT, "Result Comment" }, // [HGM] rescom { 0, 0 } }; char lpUserGLT[LPUSERGLT_SIZE]; // back-end: convert the tag id-char to a full tag name char * GLT_FindItem (char id) { char * result = 0; GLT_Item * list = GLT_ItemInfo; while( list->id != 0 ) { if( list->id == id ) { result = list->name; break; } list++; } return result; } // back-end: build the list of tag names void GLT_TagsToList (char *tags) { char * pc = tags; GLT_ClearList(); while( *pc ) { GLT_AddToList( GLT_FindItem(*pc) ); pc++; } GLT_AddToList( " --- Hidden tags --- " ); pc = GLT_ALL_TAGS; while( *pc ) { if( strchr( tags, *pc ) == 0 ) { GLT_AddToList( GLT_FindItem(*pc) ); } pc++; } GLT_DeSelectList(); } // back-end: retrieve item from dialog and translate to id-char char GLT_ListItemToTag (int index) { char result = '\0'; char name[MSG_SIZ]; GLT_Item * list = GLT_ItemInfo; if( GLT_GetFromList(index, name) ) { while( list->id != 0 ) { if( strcmp( list->name, name ) == 0 ) { result = list->id; break; } list++; } } return result; } // back-end: add items id-chars one-by-one to temp tags string void GLT_ParseList () { char * pc = lpUserGLT; int idx = 0; char id; do { id = GLT_ListItemToTag( idx ); *pc++ = id; idx++; } while( id != '\0' ); } xboard-4.7.3/FAQ.html0000644000175000001440000025307012262415351011226 00000000000000 XBoard and WinBoard: Frequently Asked Questions

XBoard and WinBoard: Frequently Asked Questions

This document answers some frequently asked questions about the graphical chess interfaces XBoard and WinBoard. A hyperlinked version of this FAQ is available on the Web through the page http://www.gnu.org/software/xboard/FAQ.html.

This FAQ is in need of revision. Please contact us if you'd like to help update it.


Outline


Detailed contents


[A] Introduction and hot topics


[A.1] What are XBoard and WinBoard?

XBoard and WinBoard are graphical user interfaces for chess. XBoard runs with the X Window System on Unix systems (including GNU/Linux); see topic [B.1]. WinBoard runs on true 32-bit Microsoft Windows operating systems, such as Windows 95, 98, NT, 2000, ME, XP, Vista, and should continue to work on future 32-bit Windows systems. It does not work on Windows CE (also known as Pocket PC), nor does it work on 16-bit Windows systems such as Windows 3.1. See topic [B.2].


[A.2] Where can I get chess information and chess software?

As a shortcut to most things mentioned in this FAQ, try Tim Mann's Chess Web page, http://www.tim-mann.org/chess.html. This page page is currently a very bad place to get the latest released versions of XBoard and WinBoard and the most up-to-date version of this FAQ, though. A better place is the WinBoard forum. Also see our Savannah project pages at https://savannah.gnu.org/projects/xboard/.

If you have other questions about XBoard/WinBoard that aren't answered in this FAQ, you can try Aaron Tay's WinBoard and Chess Engines FAQ, atdefunct URL.

For general news and information about chess, try the CCC forum or the WinBoard forum. Anothe possibility is the newsgroup hierarchy rec.games.chess.*, especially the groups rec.games.chess.misc and rec.games.chess.computer. Both of the latter groups have very informative FAQs maintained by Steve Pribut; look for them on the newsgroups or at defunct URL.

Like other GNU software, you can get XBoard, and WinBoard by anonymous FTP from ftp://ftp.gnu.org/pub/gnu/ and its many mirror sites. Look in the subdirectories xboard, and winboard. The .tar.gz suffix on the files there indicates they were packed with tar and compressed with gzip. The .exe or .zip suffixes indicate files that were packed and compressed with zip.

For other chess software, try the Internet Chess Library. Use anonymous FTP to connect to ftp.freechess.org, or go to the Web page http://www.freechess.org/. You can get chess software, game collections, the FAQ file for rec.games.chess, and other chess-related material there, in the directory pub/chess. The FTP server can automatically decompress files for you as you download them, useful if you don't have gzip.

Here is a sample anonymous ftp session. Some of the ftp server's responses are abbreviated, but all the commands you must type are included.

    % ftp ftp.gnu.org
    Connected to ftp.gnu.org
    Name: anonymous
    Password: your-email-address@your-site
    ftp> binary
    200 Type set to I.
    ftp> cd /pub/gnu/xboard
    ftp> dir
    -rw-r--r-- 1 14910 wheel  1057625 May 20 00:25 xboard-4.2.7.tar.gz
    ftp> get xboard-4.2.7.tar.gz
    150 BINARY connection for xboard-4.2.7.tar.gz (1057625 bytes).
    226 Transfer complete.
    ftp> quit

[A.3] What are the current version numbers for XBoard and WinBoard?

At this writing, the current version numbers are:

  • XBoard 4.4.0
  • WinBoard 4.4.0

[A.4] Who is working on this project?

Please see our Savannah project pages at https://savannah.gnu.org/projects/xboard/ for a list of active developers. Many others occasionally contribute suggestions and snippets of code, for which we are grateful.

[A.5] How do I report bugs, offer help, etc.?

Bug reports, suggestions, and offers to help on XBoard or WinBoard should be sent to bug-xboard@gnu.org.

Beginner questions and discussion about the program may get faster answers on the WinBoard Forum at http://www.open-aurec.com/wbforum/. This forum also constains a section dedicated to propose and discuss new features for WinBoard / XBoard or WinBoard protocol, and reposrt bugs, and offers downloads of pre-installed packages of WinBoard bundled with other software, useful for conducting computer-computer tournaments.

If you are developing a chess engine that works with XBoard or WinBoard (or an alternative GUI that works with such engines), see the Chess Engines mailing list, hosted at http://groups.yahoo.com/group/chess-engines. For better response, join the above-mentioned WinBoard forum, or the CCC forum.

Any time you want to report a possible bug in XBoard or WinBoard, we need to know exactly what you did, and exactly what error (or other) messages you got.

If you are using Unix, run the "script" program, run XBoard with the -debug flag (if you get as far as running it), do whatever is necessary to reproduce the problem, type "exit" to the shell, and mail us the resulting typescript file. We also need to know what hardware/operating system combination you are using. The command "uname -a" will usually tell you this; include its output in your typescript.

If you are using MS Windows, run WinBoard with the -debug flag, and send us a copy of the WinBoard.debug file. If you aren't sure how to add command-line flags to WinBoard, you can hit Ctrl+Alt+F12 to create a WinBoard.debug file after WinBoard starts, but that is not as good, because a few messages that would have been printed at the start are lost.

Either way, please send us the exact text of the commands you typed and the output you got, not just your recollection of approximately what they were. The messages may seem meaningless to you, but they are very meaningful to us and essential for diagnosing problems.


[A.6] What are the future plans for XBoard and WinBoard?

Our plans are always in flux. As with most free software projects, the next release will happen when it happens -- or it may never happen. This has always been the policy for XBoard/WinBoard. Releases have never been promised in specific time frames.

Starting in November 2003, several new developers have joined the project, and work is now hosted at https://savannah.gnu.org/projects/xboard/. Lots of work is just getting underway, but nothing is far along yet.

Here is a partial list of items that have a nonzero probability of happening in finite time.

  • Small bug fixes. Occasionally someone sends us a fix, or reports a small bug very clearly so that we're able to fix it in a few minutes work.
  • Protocol version 3. The members of the chess engine authors' mailing list discussed a set of proposed features for the next version of the XBoard/WinBoard chess engine communication protocol. The WinBoard 4.3 fork has taken the protocol in a different direction, though, extending version 2 with new features as they were needed, rather than upgrading to a new protocol in a single sweep. It does not seem likely that there will be a v3 protocol in the foreseeable future.
  • Contributed features. Several people have mailed me code to add various features. Most of this code is available on the XBoard/WinBoard extensions page at http://www.tim-mann.org/extensions.html, but it is not in any official releases yet. We are in the process of getting folks to formally assign the copyrights on their contributions to the Free Software Foundation so that we can include it in official releases in the future.
  • Internationalization. Several people have expressed interest in internationalizing XBoard/WinBoard. Version 4.4 implements internationalization in its XBoard branch, and includes (partial) Turkish and German translations. For WinBoard a suitable way for internationalization still has to be found, as all menu strings there are not in the C code, but in a Windows resource file. In any case, we will need more translators, to update the existing translations (for version 4.2.7) to the current version, and to provide translaions for oter languages. Watch for news on the xboard-devel mailing list on our Savannah pages.

[B] XBoard and WinBoard


[B.1] What is XBoard?

XBoard is a graphical user interface for chess. It displays a chessboard on the screen, accepts moves made with the mouse, and loads and saves games in Portable Game Notation (PGN). XBoard is free software. It serves as a front-end for many different chess services, including:

Chess engines that will run on your machine and play a game against you or help you analyze, such as GNU Chess and Crafty (topic [D.3] below).

Chess servers on the Internet, where you can connect to play chess with people from all over the world, watch other users play, or just hang out and chat.

Correspondence chess played by electronic mail. The cmail program (topic [B.6] below) automates the tasks of parsing email from your opponent, playing his moves out on your board, and mailing your reply move after you've chosen it.

The Web and your own saved games. You can use XBoard as a helper application to view PGN games in your Web browser, or to load and save your own PGN files.

XBoard runs under Unix or Unix-compatible systems. It requires the X Window System, version X11R4 or later. There are also ports of XBoard to 32-bit Microsoft Windows and to the Amiga. See topics [B.2] and [B.3] respectively.


[B.2] Is there an XBoard for Microsoft Windows? What is WinBoard? How do I install WinBoard?

WinBoard is a port of XBoard to 32-bit Microsoft Windows systems, such as Windows 95, 98, NT, 2000, ME, and XP. It uses the same back end chess code as XBoard, but the front end graphics code is a complete rewrite. WinBoard is free software.

The WinBoard distribution includes a sample Chess engine.

The WinBoard distribution also includes the ICC timestamp and FICS timeseal programs (topic [B.12]).

cmail (topic [B.6]) has not been ported to Windows. All the other XBoard functions are included in WinBoard. The International Email Chess Group web site at http://www.iecg.org/ recommends ECTool (http://www.ectool.nu/) for playing correspondence chess under Windows.

You install WinBoard as follows. Download the WinBoard package to your PC (see topic [A.2]). It will be a file with a name like winboard-4_0_0.exe. Double-click on this file in the Explorer or File Manager to run it. Follow the on-screen prompts.


[B.3] Is there an XBoard for the Amiga? What is AmyBoard?

AmyBoard is a port of XBoard to the Amiga, by Jochen Wiedmann. The distribution includes a port of GNU Chess. AmyBoard is free software.

The current version of AmyBoard is 330.5 (based on XBoard 3.3.0). No one is currently maintaining it.

System requirements:

  • An Amiga (obviously :-), running OS 2.04 or later, 2Mb RAM or more.
  • MUI 2.0 or later.
  • Workbench or another screen with no less than 640x400 pixels (adjustable with the MUI-Prefs); this restriction is just because we don't have bitmaps with less than 40x40 pixels per square. If someone contributes bitmaps with 20x20 or 20x25, they will work with any Hires mode.

If you would like to use an ICS, you need an Internet connection via either

  • a telnet-like program, or
  • a terminal program reading from stdin and writing to stdout.

AmyBoard is available in the Internet Chess Library (topic [A.2]).


[B.4] Is there an XBoard for the Macintosh?

Note: I am not a Mac user and have not tried this myself, so I cannot answer questions about it.

Because MacOS X has a Unix base, XBoard will compile and run on it. You do need an X11 (X Window System) server and client libraries. I'm told that these come standard with MacOS X 10.3 and later. Once you install the X11 package, XBoard is reported to compile and run without changes.

You can avoid having to compile XBoard (and GNU Chess) yourself by using the Fink sofware packaging system. See http://fink.sourceforge.net/ and http://finkcommander.sourceforge.net/ for more info on Fink.

There is no version of XBoard or WinBoard that runs with the native (non-X11) Mac graphical interface, and none that runs on MacOS 9 or earlier.


[B.5] Does XBoard run on VMS?

No. This port would probably be a lot easier than the Win32 and Amiga ports were, because VMS has the X Window system (under the name DECwindows) and is now POSIX compliant. If you are working on this, send mail to bug-xboard@gnu.org to let us know.


[B.6] What is cmail?

cmail is a program that helps you play and keep track of electronic mail correspondence chess games using XBoard. It is distributed with XBoard and has its own manual page. cmail is free software. It was written by Even Welsh. cmail has not been ported to Windows; sorry.


[B.7] How do I build XBoard? Do I need gcc?

The first step to building XBoard is to get the distribution file. See topic [A.2] for places you can ftp the software from.

Next, decide what directory tree you are going to install XBoard in. The default is /usr/local, but you probably don't have write access to that directory unless you are a system administrator. If you do, type the following to install it there:

    gzip -cd xboard-*.tar.gz | tar -xvf -
    cd xboard-*/
    ./configure
    make
    su
    make install

If you want to install xboard in your personal home directory ($HOME/bin), type this:

    gzip -cd xboard-*.tar.gz | tar -xvf -
    cd xboard-*/
    ./configure --prefix=$HOME
    make
    make install

If the first step above fails because you don't have gzip, see topic [A.2], and ask a local Unix expert if you need more help. If you have any problems with the last two steps, read the READ_ME and INSTALL files in the xboard-*/ directory. You will also find this FAQ there.

You don't need to have gcc to build XBoard. Almost any Unix C compiler should do.


[B.8] Can I use XBoard or WinBoard to play a game of chess with another human?

The only way for two humans on different machines to play chess in real time using XBoard/WinBoard is to use an Internet Chess Server as an intermediary. That is, each player runs his own copy of XBoard or WinBoard, both of them log into an ICS, and they play a game there. Two copies of XBoard/WinBoard cannot communicate with each other directly.

Instructions on how to get started with Internet chess are included with the XBoard and WinBoard distributions. The network addresses included in the distribution may not always be current. The oldest and largest ICS is the Internet Chess Club at chessclub.com, which now has a fee for registered use, but still allows free unregistered use. There are also many newer sites with no fees, using the Free Internet Chess Server implementation (FICS). The most active FICS site is freechess.org. On these and most other chess servers, the port number to use is 5000.

If you don't have network connectivity to any ICS site, you can run your own server using a version of the FICS code, but this is not easy. See http://www.tim-mann.org/ics.html#ownics for advice and pointers.

The cmail program included with XBoard lets you play email postal games with another human; see topic [B.6].

Two humans can play chess on the same machine using one copy of XBoard/WinBoard in Edit Game mode, but the clocks don't run in this mode, so it's of limited usefulness.

See also topic [D.2], Winsock Chess.


[B.9] Will WinBoard run on Windows 3.1? How about Windows CE (also known as Pocket PC)?

WinBoard does not run on Windows 3.1, Windows for Workgroups 3.11, etc., not even with the Win32s compatibility package. The main problem is that Win32s does not have threads or real concurrent processes. A port of WinBoard to Windows 3.1 is possible in theory, but it would be difficult and messy, and no one is going to do it.

WinBoard does not run on Windows CE (also known as Pocket PC). I don't know what would be required to port it.

WinBoard does run well on full 32-bit versions of Windows, such as Windows 95, 98, NT, 2000, ME, XP, and Vista, and should continue to work on future 32-bit Windows systems. To use the help files in Vista, you will need to install the WinHlp32.exe from MicroSoft on your Vista system.


[B.10] How do I use XBoard or WinBoard as an external viewer for PGN files with my Web browser?

  1. On Unix systems:
    • Add the following line to the file .mime.types in your home directory. (Create the file if it doesn't exist already.)
          application/x-chess-pgn    pgn
      
    • Add the following line to the file .mailcap in your home directory. (Create the file if it doesn't exist already.)
          application/x-chess-pgn; xboard -ncp -lgf %s
      
    • Exit from your Web browser and restart it.
  2. On MS Windows systems:

    The exact procedure depends on which Web browser you are using. The current version of WinBoard automatically configures itself as your PGN viewer for local files, Netscape 4.x and later, and Internet Explorer. This automatic setup probably works for all other current Web browsers, too.


[B.11] How do I use WinBoard as an external viewer for PGN files with the MS Windows File Manager or Explorer?

WinBoard sets this up automatically when you install it, except on old versions of Windows NT (prior to 4.0). On Windows NT 3.51 or earlier, go to the File Manager, click on the File menu, select Associate, enter "pgn" as the extension, and use the Browse button to find your copy of WinBoard and set up the association.


[B.12] How do I use ICC timestamp or FICS timeseal with XBoard?

First, get the appropriate version of timestamp or timeseal for your machine from ftp.chessclub.com or ftp.freechess.org. Second, be sure that you can connect using XBoard without timestamp/timeseal. Third, be sure that you can connect using timestamp/timeseal without XBoard. See the help files on ICC and FICS or ask people online if you have problems.

If you are in a completely ordinary situation, where your machine is directly on the Internet and you can connect to ICC or FICS without timestamp/timeseal using just the command "xboard -ics" or "xboard -ics -icshost freechess.org", change that command to one of the following:

    xboard -ics -icshost chessclub.com -icshelper timestamp

    xboard -ics -icshost freechess.org -icshelper timeseal

If you have a firewall between your machine and the ICS, see topic [B.19].

If you normally have to use the "/icscomm" command line option on xboard to log into a second machine, and then telnet to ICC or FICS from there, you are going to have to run the Unix version of timestamp or timeseal on the second machine. (If the second machine is not running Unix, you are out of luck.) Get the appropriate version of timestamp or timeseal onto the shell machine via FTP; see the help files on ICC and FICS for instructions. Then simply run it when you would normally run telnet. In this configuration you are not protected against lag between your PC and the shell machine, or for lag caused by heavy load on the shell machine itself from other users.

For further information on timestamp and timeseal, see the help files on ICC and FICS.


[B.13] How do I use ICC timestamp or FICS timeseal with WinBoard?

If you select an ICS from either the WinBoard Startup dialog or the Windows Start submenu that WinBoard installs, WinBoard automatically runs timestamp or timeseal if the ICS you chose is known to support it.

If you are constructing a WinBoard command line by hand, add the option "/icshelper timestamp" or "/icshelper timeseal" to the WinBoard command line to use timestamp or timeseal. Both timestamp.exe and timeseal.exe are included in the WinBoard distribution. They both function identically to the Unix versions, as documented in "help timestamp" on ICC and "help timeseal" on FICS.

If you have a firewall between your machine and the ICS, see topic [B.19].

If you normally have to use the "/icscomm" command line option on WinBoard to log into a shell account, and then telnet to ICC or FICS from there, you are going to have to run the Unix version of timestamp or timeseal on the shell machine. (If the shell account is not on a Unix machine, you are out of luck.) Get the appropriate version of timestamp or timeseal onto the shell machine via FTP; see the help files on ICC and FICS for instructions. Then simply run it when you would normally run telnet. In this configuration you are not protected against lag between your PC and the shell machine, or for lag caused by heavy load on the shell machine itself from other users.

For further information on timestamp and timeseal, see the help files on ICC and FICS.


[B.14] How do I play bughouse with XBoard or WinBoard?

XBoard and WinBoard have full bughouse support. Offboard piece holdings are shown next to the board, and you drop offboard pieces by dragging them with the mouse (holding the left button down) to their drop square, or left-click the piece and the drop square, just like when you enter any ordinary move.

XBoard and WinBoard can display only one board at a time, but you can observe your partner's game by running a second copy of the program and logging in as a guest. (Unfortunately, this is not possible if you are using the /icscomm option.) To observe your partner's games automatically, use the "follow" or "pfollow" ICS command; see the ICS online help for details.


[B.16] What is Zippy? How can I interface a chess program to the Internet Chess Servers?

Zippy is an interface that lets a compatible chess engine (such as GNU Chess or Crafty) act as a computer player on an Internet Chess Server. Zippy is included in both the XBoard and WinBoard distributions. It is implemented as a small amount of additional code within XBoard or WinBoard. For documentation, see the file zippy.README, included in both distributions or available from my chess Web page, http://www.tim-mann/chess.html. The version of zippy.README on my Web page is often more up-to-date than those in the XBoard/WinBoard distributions. You'll also find a "biography" of Zippy and pointers to the original Zippy the Pinhead comic strips on my Web page. Please read zippy.README carefully before you ask me any questions about Zippy.

Using a computer to choose your moves on a chess server is considered cheating unless your account is on the computer (C) list. Read "help computer" on your favorite server for details on their policy. Most of the servers have plenty of computers running now, so they will not be excited about having you run a new one unless you have written your own chess engine. They don't really need yet another Crafty or GNU Chess clone.


[B.17] How can I interface my own chess program to XBoard or WinBoard?

This is a non-trivial task. XBoard and WinBoard were not designed with a clean interface for talking to chess programs; they were written to work with an existing version of GNU Chess that expects to be talking to a person. Your program has to emulate GNU Chess's rather idiosyncratic command structure to work with XBoard and WinBoard. We are gradually cleaning up, improving, and documenting the interface as newer versions of XBoard and WinBoard come out, however.

For documentation, see the file engine-intf.html, included in both distributions or available from Tim Mann's chess Web page, http://www.tim-mann.org/chess.html. The version of engine-intf.html on Tim's Web page might totally obsolete, though. To know how the current WinBoard or XBoard version communicate with their engines, use the documentation in the XBoard/WinBoard distributions, or on the WinBoard forum.


[B.18] How can I recompile WinBoard from source?

The source code for WinBoard is available from the author's Web page, http://www.tim-mann.org/chess.html.

WinBoard is currently developed using gcc under Cygwin. To build WinBoard with the free Cygwin tools, available from http://www.cygwin.com/), use the command "make -f makefile.gcc" from the winboard directory of the source distribution.

You can build the program from the MSVC++ GUI by opening the project file (winboard.dsp) and telling MSVC++ to build the project. You can also build it from the the command line by using the nmake program supplied with MSVC++. The makefile for MSVC is makefile.ms in the winboard directory.

WinBoard 4.2.5 was successfully compiled with the net release of Cygwin as downloaded on 20-March-2001 (cygwin1.dll 1.1.8, gcc 2.95.2-6, binutils 20001221-1, flex 2.5.4-1), but exhibits a command-line parsing bug; see item 511 in the ToDo file that comes with WinBoard. WinBoard 4.1.0 does not compile with Cygwin. WinBoard 4.0.7 is known to compile with Cygwin BL20.1.

To build WinBoard with Borland C++ 4.5, use "borland.mak", supplied with the WinBoard sources, as the Makefile. Support for Borland C++ was contributed by Don Fong and has not been tested by the author of WinBoard.

WinBoard is a Win32 application, so you definitely need a compiler and tool set that supports Win32. In particular, older versions of DJGPP can build only 32-bit MSDOS programs; that is, programs that use a DOS extender to get a 32-bit address space and do not make any Windows calls. The latest versions of DJGPP are said to be able to build Win32 programs when used with the proper extension package(s), but this is not known to work with WinBoard. Use Cygwin instead.

See also topic [C.16].


[B.19] How can I use XBoard or WinBoard to talk to an Internet Chess Server through a firewall or proxy?

There is no single answer to this question, because there are many different kinds of firewalls in use. They work in various different ways and have various different security policies. This answer can only provide hints.

Note that you can't access Internet Chess Servers through a Web proxy, because they are not a Web service. You talk to them through a raw TCP connection, not an HTTP connection. If you can only access the Web through a proxy, there may be a firewall that stops you from making direct TCP connections, but there may also be a way through it. Read on for hints, and contact your local system administrator if you need more information about your local configuration.

A helpful user mailed me the following explanation of how to use WinBoard with WinGate:

"I have managed to setup WinBoard though my WinGate proxy. I have the Office version. What I needed to do was to setup the TCP/IP connection to add the User/Host name and my provider service name for the DNS, but I had to leave the HOST IP address blank. I have not played with all the variations, so it may be just that I have the DNS lookup enabled."

I hope this helps, though I don't find it very clear. I don't have a copy of WinGate myself and can't help if you have questions about it.

If you are using some other non-SOCKS firewall, read the FIREWALLS section in your XBoard or WinBoard documentation (man page, info document, or Help file). If you can telnet to a chess server in some way, then you can almost certainly connect to it with xboard/WinBoard, though in some cases you may not be able to run timestamp or timeseal. The timestamp and timeseal protocols require a clean, 8-bit wide TCP connection from your machine to the ICS, which some firewalls do not provide.

If you have a SOCKS firewall and are using XBoard, you should be able to SOCKSify xboard and use it. See http://www.socks.nec.com/ for information about SOCKS and socksification. However, if you do this, you can't use timestamp or timeseal; what you really need is a socksified version of timestamp or timeseal. This is hard because the source code for timestamp and timeseal is proprietary; the folks running the chess servers don't give it out because that would make it too easy to cheat. On some versions of Unix, you may be able to socksify a program that you don't have the source code to by running it with an appropriate dynamic library; see http://www.socks.nec.com/. For others, you might be able to get a pre-built socksified version from the chess server administrators. For timeseal versions, see ftp://ftp.freechess.org/pub/chess/timeseal/. For timestamp versions, the directory would be ftp://ftp.chessclub.com/pub/icc/timestamp/, but at this writing there don't seem to be any socksified timestamps there. Once you have a socksified timestamp or timeseal, simply run it with a normal, non-socksified xboard in place of the standard timestamp or timeseal.

If you have a SOCKS firewall and you are using WinBoard, we now know how to make this configuration work, complete with timestamp or timeseal!

Start by getting SocksCap32. This software is freely available from http://www.socks.nec.com/. Install it on your machine, read the documentation, and learn to use it. You may find it useful with many other programs besides WinBoard.

Next, don't socksify WinBoard. Socksifying WinBoard itself doesn't let you use it with timestamp or timeseal. For some reason I don't understand -- something strange that SocksCap32 does -- the socksified WinBoard runs but does nothing, and timestamp/timeseal runs all by itself in its own window.

Instead, use the following workaround. Follow the instructions exactly; don't try to skip steps or simplify things.

First, make SocksCap32 application profiles for timestamp and timeseal. Use the following command lines in the SocksCap32 profiles. Name the first profile "timestamp" and the second "timeseal".

    "c:\program files\winboard\timestamp.exe" chessclub.com 5000 -p 5000
    "c:\program files\winboard\timeseal.exe" freechess.org 5000 -p 5000

Second, run timestamp or timeseal by itself, socksified, using its profile. This will open an unneeded, black window that will not respond to typing. Minimize it to the task bar and ignore it. It will go away when you exit from WinBoard.

Next, run WinBoard using the following command line. Make a shortcut or type this command into an MS-DOS Prompt box. Don't run WinBoard itself socksified, just run it directly.

    "c:\program files\winboard.exe" /ics /icshost=localhost /icsport=5000

After you get this working, you can try getting the timestamp window to auto-minimize by starting it from a shortcut instead of from the SocksCap32 control window. As it says in the SocksCap32 help file, put the following in the Target field of a shortcut's Properties page:

    "c:\program files\sockscap32\sc32.exe" timestamp

Then select "Run: Minimized" on the same page. Do the same for timeseal.

Another method that can work is to use a .bat file to start both timestamp and WinBoard. It would look something like this:

    REM --
    REM -- icc.bat
    REM -- Start timestamp under SocksCap32 and use WinBoard to connect to it.
    REM -- The string "timestamp" refers to a SocksCap32 profile for timestamp.
    REM --  Do not change it to the filename of the timestamp program!
    REM --
    start /minimized "c:\program files\sockscap32\sc32.exe" timestamp
    cd "c:\program files\winboard"
    winboard /ics /icshost=localhost /icsport=5000

This workaround has a problem if you want to run two copies of WinBoard at once, talking to the same chess server twice (for bughouse) or to two different chess servers. If you need to do that, you will need to run a separate copy of timestamp with a different port number for each connection. You'll need to make a second set of profile entries with a different value after the -p flag (say, 5001) and you'll need to change the WinBoard command line /icsport=5000 for the second WinBoard to match.


[B.20] How can I use XBoard or WinBoard on chess.net with accuclock?

I believe chess.net provides a Win32 command-line version of accuclock that will work with WinBoard. Please see the documentation on the chess.net server itself; don't ask the author of WinBoard.

I don't know whether chess.net provides versions of accuclock for Unix at this time. Ask them.


[B.21] Can I get Zippy to do one or more ICS commands automatically at the start or end of each game?

By default, Zippy automatically sends the command "gameend" to ICS at the end of each game. You can alias this command (using the ICS "alias" feature) to anything you want. On ICC, you can use the "multi" feature to alias gameend to several commands, but other servers don't have that feature. Zippy doesn't send anything at the start of the game by default.

You can get Zippy to send one or more commands of your choosing, at the start and/or end of each game, by using the -zippyGameStart and -zippyGameEnd command line options, newly added in version 4.0.3. Both xboard and WinBoard have (somewhat obscure) ways of getting newlines into this option to send several commands. Here is an example of one way to do it for each.

    xboard -ics -zp -xrm '*zippyGameStart: say hi\nsay prepare to die\n'

    WinBoard /ics /zp /zippyGameEnd='say thanks\nseek 5 0\nseek 2 12\n'

[B.22] How do I print from WinBoard?

WinBoard does not have built-in printing functionality. If you want to print a picture of the board, press Alt+PrintScrn, run the standard Windows application Paintbrush, select Paste, and print from there. If you want to print a list of moves, save your game as a PGN file, then open the PGN file with Notepad or any other plain text editor and print it from there.

WinBoard 4.4 has a menu item "Save Diagram..." in the file menu, which saves the board part of the display as a Windows .bmp file, but only if the board size is not too big.


[B.23] Can I get Zippy to automatically reconnect to ICS when its connection breaks?

There isn't a perfect solution to this problem yet, but a pretty good one is to write a shell script (for xboard) or .bat script (for WinBoard) that automatically restarts the program whenever it exits. Use the -xexit flag so that you don't get a popup dialog that must be dismissed with the OK button before the program will exit. The gap in this solution is that your connection to ICS can sometimes get into a state where the program does not notice that the connection is broken until the next time it tries to send a command. Perhaps some future version of xboard/WinBoard will have an option to send a harmless command every five minutes or so.

Anyway, here is a sample Windows .bat file that restarts WinBoard each time it exits. Thanks to Jason Williamson. It assumes that you have put your computer account's name and password in a file named logon.ini.

REM --
REM -- wbrecon.bat
REM -- Start WinBoard in Zippy mode, and restart it each time it exits.
REM -- Add or change parameters as needed for your application.
REM --
:loop
start /w winboard /zp /ics /icslogon logon.ini /xexit /xautoraise
REM -- The next line is to have a short delay setup for 139 seconds.
REM -- Leave it out if it doesn't work on the version of Windows you use.
TYPE NUL | CHOICE.COM /N /CY /TY,99 >NUL
goto loop

Here is a Unix shell script to do the same thing for xboard. It's a bit more elaborate. It is based on the script I use for the original Zippy. It logs all ICS output to a file named zippy.out, and it lets you type commands to Zippy by running "cat > zippy.fifo".

#! /bin/sh
host="204.178.125.65 -icsport 5000 -telnet -telnetProgram timestamp"
#host="164.58.253.13 -icsport 5000 -telnet -telnetProgram timeseal"
out=zippy.out
fifo=zippy.fifo
ZIPPYPASSWORD='something'
export ZIPPYPASSWORD
ZIPPYPASSWORD2='orother'
export ZIPPYPASSWORD2
ZIPPYLINES=`pwd`/all.lines
export ZIPPYLINES
ZIPPYGAMEEND='say Yow, that was FUN!
gameend'
export ZIPPYGAMEEND
zippylogon=`pwd`/logon.ini
DISPLAY=`hostname`:0.0
export DISPLAY
mv -f $out ${out}.old
rm -f $fifo
mkfifo $fifo
pid=$$
( while [ true ] ; do cat -u $fifo ; done ) | \
      ( while [ true ] ; do
          xboard -iconic -ics -icshost $host \
                 -zt -zp -xbell -xanimate \
                 -xautosave -xquiet -fcp "gnuchessx -h" \
                 -icslogon $zippylogon -xexit -autoflag -xautoraise $*
          sleep 600
        done ) > $out 2>&1 &

[B.24] The chess engines are too strong and always beat me. How can I adjust the difficulty level to make them weaker?

The best way is to get a weaker chess engine. On the ChessWar website you will find a rating list of virtually all engines that are able to play under XBoard/WinBoard, from super-humanly strong to ridculously weak. Most of them can be downloaded for free from the internet.

A way to get that effect is to limit the time the engine can use for deciding on its move. The time-odds options or menu items in the time-control dialog) can be used to this end. This is only of limited help, as engines do not weeken that much at faster time-control, and there is a practical limit to how fast you can order the engine to go. Also feel free to use Retract Move if you make a blunder.

Many chess coaches will let you switch sides after they get a stronger position so that you can get experience playing positions where you are winning. You can try this with XBoard/WinBoard by using the Machine White or Machine Black menu command to make the machine take over your position.

The -depth command-line option to XBoard/WinBoard can also be used to weaken the engine (see the man page or Help file). It's a bit of a nuisance to set command line options in Windows, but see topic [C.7] for instructions.

Other ways of weakening engines are engine-specific. Many of them let you adjust various parameters, and if you choose bad settings, the engine will play more poorly. Consult whatever documentation came with the engine you are using.


[B.25] May I use the piece bitmaps from XBoard/WinBoard in my own program?

The piece bitmaps used in XBoard and WinBoard were designed by Elmar Bartel. He released them under the GNU General Public License. This means that if your program is also free software distributed under the GPL, you can use them freely. If your program is distributed under some other license, including commercial, shareware, or non-GPL freeware, then you cannot use the bitmaps unless you obtain special permission from Elmar. See the file README.bitmaps that comes with the XBoard and WinBoard source code for more information and an email address you can write to.


[B.26] How can I get rid of these silly logos that this new WinBoard displays above the board?

WinBoard 4.4.0 has an option /autoLogo, which makes is search for bitmap files to display as logo, in the engine directory or in the folder "logos". If you see logos without having asked for them, the settings in your winboard.ini file probably contains the line

/autoLogo=true

Just change that to /autoLogo=false. You can also achieve that by starting WinBoard through the startup dialog (from the start menu), and then tick "additional options" at the bottom, and type /autoLogo=false in the edit field, before pressing OK. If you then later select "Save Settings Now" from the Option menu, or when "Save Settings on Exit" is on, and you close WinBoard, this will automatically end up in your settings field.

When /autoLogo=false, logos will only be displayed if you explicitly ask for them, by running WinBoard with the option /firstLogo=FILENAME.bmp or /secondLogo=FILENAME.bmp. (Which will not be stored in the winboard.ini, but might of course be hidden somewhere in a settings file mentioned on the command line as @SETTINGSFILE.ini.)


[B.27] How can I install logos for other engines, Internet Chess Servers or Human users?

With the option /autoLogo=true, (which is remembered in your settings file), WinBoard automatically looks into the engine folder (specified by the /fd="..." or /sd="..." option), for a file called "logo.bmp". If it is found, it is used as a logo for the engine when it plays. So all you have to do is put a logo.bmp file there. Popular logo formats are 100x50 and 130x65; many engine logos are available from David Dahlem or Graham Banks

It is possible to overrule the /autoLogo by explicitly using a /firstLogo="FILENAME.bmp" or /secondLogo="FILENAME.bmp" with the engine on the engine line in the startup dialog. This is useful for engines that run with an adapter like Polyglot, when you have only one polyglot on your system, used by many engines. E.g. for Fruit the engine line to be typed in or selected from the combo box is

"polyglot fruit.ini" /firstLogo="D:\Engines\Fruit\logo.bmp" /fd="D:\Engines\Polyglot"
This prevents WinBoard looking for the logo in the Polyglot folder.

For Internet Chess Servers and Human users the logos should be in the "logos" sub-folder of the folder where WinBoard is installed. With /autoLogo=true, WinBoard would look for a logo file in that folder with the same name as the ICS, suffixed with .bmp (e.g. freechess.org.bmp) or the Human username (specified by the /userName="..." option or taken from the system), suffixed by .bmp, e.g. administrator.bmp)


[B.28] Is there readline/history support for the input in XBoard/Winboard?

There is a special ICS input box that has history support which is the standard in Winboard and can be used in XBoard too.

Another good tip from Michel van der Bergh is to use the rlwarp program together with XBoard which gives you full readline support. Just run "rlwrap xboard" instead of just "xboard". The rlwarp program should be available for most linux distributions or can be downloaded at: http://utopia.knoware.nl/~hlub/uck/rlwrap/.


[C] XBoard and WinBoard, bugs and problems


[C.1] I can't build XBoard because the X11/Xaw/... include files are not found.

These are the header files for the Athena Widgets library, which XBoard uses heavily. Some versions of Unix don't supply these files, but they are part of the standard X distribution, freely available from MIT.

For general information on getting missing X sources, see the FAQ on comp.windows.x. Note that you may be missing only the header files, or you may be missing the libraries themselves too.

HP-UX users are missing only the header files. You can get them by anonymous FTP as follows. (But first check with your system administrator to see if someone else at your site has already done this.) Get the archive file /hpux9/X11R5/Core/Xaw-5.00.tar.gz (Xaw header files) via anonymous FTP from the site hpux.csc.liv.ac.uk (138.253.42.172), or one of the other official sites---Germany: hpux.ask.uni-karlsruhe.de (129.13.200.57), US: hpux.cae.wisc.edu (144.92.4.15), France: hpux.cict.fr (192.70.79.53) or Netherlands: hpux.ced.tudelft.nl (130.161.140.100). Unpack the archive using gzip and follow the instructions in its README and/or HPUX.Install files. Thanks to Richard Lloyd for this information.

If you have the Xaw header files installed in a different place than the other X11 headers, you may need to configure XBoard with an extra flag to help it find them. For example, if yours are in /foo/bar/X11/Xaw, try this:

    rm config.cache
    (setenv CFLAGS -I/foo/bar ; configure)

Also see topic [C.2].


[C.2] Configuring or building XBoard fails due to missing header files, missing libraries, or undefined symbols.

Perhaps you have the X server and client programs installed on your machine, but not the X header files and link-time libraries. If so, you can run existing X programs, but you cannot compile a new X program from source code. In this case the XBoard configure script will fail and will tell you to look at this question in the FAQ. Many GNU/Linux distributions put the headers and libraries in a separate package, which you might not have installed. If you are using RedHat, install the XFree86-devel package. If you are using some other kind of Unix, ask your system administrator where to find the X header files and link-time libraries. If this is not your problem, read on.

The configure script for XBoard looks for X libraries and header files in some common places. Sometimes it fails: If yours are installed in an odd place, it may not find them at all. If you have more than one version of X installed on your system, it may find the "wrong" one, or occasionally it may find libraries from one version and incompatible header files from another. You can work around these problems by telling the configure script where the files are. For example:

    configure --x-includes=/odd/place/include \
              --x-libraries=/odd/place/lib

The directory named in the argument to --x-includes must have a subdirectory "X11" that contains the actual .h files. That is, if your X.h file has full pathname /odd/place/X11R6/include/X11/X.h, then you must give the argument --x-includes=/odd/place/X11R6/include.

Some linkers have bugs that cause bogus error messages when you try to link X programs. The configure script includes a workaround for a bug of this kind that exists in some SunOS 4.x.x installations. See the FAQ on comp.windows.x for more information about problems of this kind.

If all else fails, check whether anyone else at your site has been able to compile any X programs on your system. Your X installation might be buggy. If so, the system administrator at your site might know how to fix or work around the problem.

Also see topic [C.1].


[C.3] I have problems using WinBoard on ICS with a modem. I'm not running SLIP or PPP, but just dialing in to an ordinary login account ("shell account").

Here are solutions to some common problems in this area.

Some people want to connect to ICS through HyperTerminal or some other terminal program first, then run WinBoard. This is not how it works. WinBoard wants to talk directly with your modem, acting as a terminal program itself. Start out with the modem "on hook" (not making a call).

Run WinBoard with a command line like this (adding more options if desired):

    WinBoard /ics /icscom com1

Use com2, com3, or com4 in place of com1 if your modem is connected to one of those ports.

After you start WinBoard, you may need to change some of the options in the Communications dialog (on the Options menu). The dialog has the usual options for talking to modems: bits per second, bits per byte, parity, number of stop bits. You will probably want to use Save Settings Now when you're done.

Next, type dialing commands to your modem in the text window that WinBoard creates. You may need to turn off Local Line Editing on the Options menu while you are typing commands to your modem. Turn it back on when you're done. See the WinBoard Help file for instructions if you see your typing echoed an extra time after you hit Enter.


[C.4] I have problems using WinBoard on ICS with Windows 95 and SLIP or PPP. When trying to start up, it gets the error "Address family not supported by protocol family" (or some equally strange message).

WinBoard is a 32-bit application, but some Winsock (TCP/IP) implementations support only 16-bit applications. You get a strange looking error message if you try to use a 32-bit application because there is no standard Winsock error code number for "32-bit application not supported."

Microsoft TCP/IP works with both 16-bit and 32-bit applications, supports SLIP, PPP, Ethernet, etc., and is included with Windows 95 and later Windows systems. If possible, I recommend that you uninstall whatever Winsock you are using and install Microsoft TCP/IP instead. For more information, see http://walden.mo.net/~rymabry/95winfaq.html (the Win95-L FAQ).

Trumpet Winsock 2.1 (and earlier) supports only 16-bit applications, and hence does not work with WinBoard. But there is a beta-test release available that does support 32-bit applications. I have not tried it with WinBoard, but it should work. See Trumpet's Web page http://www.trumpet.com.au/wsk/winsock.htm for more information.

The 16-bit versions of America On-Line's software do not support 32-bit Winsock applications. Get the 32-bit version. At one time the 32-bit version was called "AOL for Windows 95," but I imagine that has changed. Hopefully the current versions are all 32-bit.

A few versions of Winsock may have bugs that prevent Windows timestamp/timeseal from working with them. I'm not sure if such bugs exist in any versions that actually have 32-bit support, so this point might be moot. Again, Microsoft TCP/IP is known to work.


[C.5] When I try to run WinBoard, I get the message "Failed to start chess program gnuchess on localhost: NO LANGFILE (file gnuchess.lan not found)".

This message means that WinBoard is trying to run GNU Chess, but GNU Chess cannot find a file that it needs, named gnuchess.lan. If you see it, you've probably customized WinBoard's /fcp, /fd, /scp, and/or /sd options and made a mistake in the process. Review what you did, and see the WinBoard help file.


[C.6] I want to use XBoard or WinBoard as an Internet Chess Server interface, but the ICS Client option is grayed out on the menu.

XBoard and WinBoard have three major modes that can't be changed from the menus: local chess engine mode, ICS mode, and standalone mode.

With XBoard, you have to set the mode using command-line options. Local chess engine mode is the default, -ics selects ICS mode, and -ncp ("no chess program") selects standalone mode.

With WinBoard, if you don't set the mode using command-line options, you get a dialog box asking which mode you want. To bypass the dialog box, use -cp ("chess program") for local chess engine mode, or -ics or -ncp as with XBoard. Also see topic [C.7].


[C.7] How do I give command-line options to a Windows program like WinBoard?

There are many ways; pick your favorite:

  • Type the command line into an MS-DOS Prompt box. Example: "WinBoard -ics".
  • Make a Windows shortcut for WinBoard. You can do this by right-dragging WinBoard.exe to the desktop and selecting "Create Shortcut(s) Here" from the menu that appears. Right-click on the shortcut, select Properties, and click the Shortcut tab. The command-line text box is labelled "Target" instead of "Command line" just to confuse you. Edit the text in this box, adding the command line options to the end.
  • Choose Run from the Start menu, or File / Run from the Program Manager or File Manager, and type the command line into the dialog you get. You may have to give WinBoard's full drivespec and filename if it is not in a directory on your search path.
  • Make a Program Manager icon for WinBoard. You can do this by dragging WinBoard.exe from the File Manager into the Program Manager, or by using File / New in the Program Manager. Select the icon and choose File / Properties. Edit the Command Line text box to add the command-line options to the end.

[C.9] When I exit from WinBoard after using it to play against a chess program on my machine, the chess program keeps running in the background.

Be sure you have the current versions of WinBoard and the chess engine you are using. WinBoard 3.4.1 and earlier had a bug that caused this problem to occur with all chess engines. A buggy chess engine that does not respond to the "quit" command will also cause this.

If you still see this problem, you can stop the rogue chess engine by pressing Ctrl+Alt+Del, selecting the chess engine process from the menu, and pressing the End Task button.


[C.12] Why do my ICS opponents often get extra time after they make their moves? Why do I sometimes lose time off my clock after I make my move?

If you are playing with the ICS incremental clock, both you and your opponent get a set amount of extra time after each move.

If your or your opponent has netlag, your opponent might appear to get extra time, especially if your opponent is using timestamp or timeseal. The ICS charges each player who is using timestamp or timeseal only for the time between when the player received his opponent's move and the time he sent his own move. Thus delays in network transmission do not count against either player. But WinBoard counts down the display of your opponent's clock on your screen under the assumption that there is no netlag. When his move comes in, if there was netlag, the ICS may not have really charged him for that much time, and WinBoard corrects the clock to what the ICS says it should read.

If you are not using timestamp or timeseal, you may appear to lose time off your clock at some point after you make your move. In this case, the ICS charges you for the time between when it sent you your opponent's move and the time it received your move. Thus delays in network transmission count against you. WinBoard stops counting down the display of your clock on your screen (and starts your opponent's) when you make your move. When the ICS echoes your move back to you, it may have charged you for more time than that, and WinBoard corrects the clocks to what the ICS says they should read.

See "help lag" and "help timestamp" or "help timeseal" on your ICS for more detailed information.


[C.13] I can't run WinBoard unless I delete the WinBoard.ini file each time!

Most people don't have this problem, but two or three people using Windows NT 4.0 with Service Pack 3 or 4 have reported it. I have no idea what causes this problem. Contrary to what was reported in a previous version of this FAQ, reinstalling the service pack after installing WinBoard does not seem to solve the problem.


[C.15] I get errors compiling XBoard's parser.c.

The file parser.c is automatically generated from parser.l. The copy included with XBoard 4.0.2 was generated by lex on Tru64 Unix and has problems compiling and linking on current GNU/Linux versions. The copy included with XBoard 4.0.3 was generated by flex on a GNU/Linux machine, but it too won't necessarily work on other versions of Unix. If you have this problem, you can fix it by deleting parser.c and letting the Makefile re-create it from parser.l. This will work if you have either lex or flex on your system. Flex is available in all GNU/Linux distributions and can be obtained at no charge from the Free Software Foundation, www.fsf.org.


[C.16] I get an error building WinBoard from source because "flex" is not found.

The file parser.c is automatically generated from parser.l. The Makefile included with the WinBoard source kit has a rule for generating parser.c using the program "flex", which will fail if you don't have flex. However, the source kit also includes a ready-made copy of parser.c, so you don't really need flex unless you have made changes to parser.l. Check that you still have a copy of parser.c; if you don't, unpack the WinBoard source zip file again to get one. Either set the last-modified time of parser.c to be later than that of parser.l, delete parser.l, or comment out the Makefile rule for building parser.c from parser.l, and then try building WinBoard again.

If you do want to change parser.l and rebuild parser.c, you can get flex as part of the free Cygwin kit from http://sourceware.cygnus.com/cygwin/. You can probably also get flex for Windows by itself from various other places around the Internet. It is free software distributed by the Free Software Foundation, www.fsf.org.


[C.17] XBoard hangs shortly after connecting to an ICS when used with dxterm, cmdtool, dtterm, kterm, konsole, or other substitutes for xterm.

After connecting to a chess server, XBoard 4.0.2 and later sends an escape sequence to its terminal that is meant to display your handle and the ICS host name (for example, "user@chessclub.com") in the terminal's banner and icon. It seems that several of the alternative X terminal programs have a bug that makes them hang when sent this escape sequence.

You can work around the problem by using xterm, nxterm, rxvt, aterm, xiterm, or gnome-terminal, all of which seem to work fine. In fact, current versions of kterm and konsole seem to work fine too, so if you are having problems with one of them, be sure you are not running an outdated version.

Alternatively, you can disable this feature by commenting out the body of DisplayIcsInteractionTitle in xboard.c and recompling xboard.


[C.18] The WinBoard pieces show up in the wrong colors, appear distorted, or are not visible at all.

This can happen if you have a bug in your Windows display driver. Check with the manufacturer of your display card, the manufacturer of your computer, or Microsoft to see if there is an updated driver available. You can usually download updated drivers from the Web.

If you can't find an updated driver, you can try running Windows using a different number of colors and/or disabling some of the hardware acceleration features on your display card. To change the number of colors, go to Windows Start / Settings / Control Panel / Display / Settings / Color Palette. To disable hardware acceleration features, go to Windows Start / Settings / Control Panel / Display / Settings / Advanced Properties / Performance / Hardware Acceleration.

It's also possible that Windows has the right driver for your hardware already but you are not using it. It may help to reinstall your driver. Go to Windows Start / Settings / Control Panel / System and delete your display card (maybe even your monitor too), then reboot. Windows should automatically re-detect your card and monitor and re-install the drivers; if it doesn't, run Start / Settings / Control Panel / Add New Hardware to force it to.

If all else fails, try Monochrome mode. On WinBoard's menus, go to Options / Color and check Monochrome. WinBoard will display in black and white.


[C.19] XBoard or WinBoard tells me "Error: first chess program (...) exited unexpectedly".

This message means that your chess engine crashed, probably due to a bug in the engine, or because you have it configured incorrectly. You can try running XBoard or WinBoard again with the "-debug" flag on the command line. This will print out all the messages received from the chess engine. (With WinBoard, the messages go into a file called WinBoard.debug; with XBoard, they go to the xterm that you started XBoard from.)

If you are using GNU Chess and you see this problem as soon as it starts up, most likely GNU Chess is exiting with an error message. If you see the message "NO LANGFILE", it means that you did not install GNU Chess correctly, and it is unable to find the file gnuchess.lang. Make sure that you defined LIBDIR in the gnuchess Makefile, and that gnuchess.lang is in that directory. If gnuchess.lang is not there, you probably didn't type "make install" in the gnuchess src directory; you must do this to install gnuchess.lang (and the gnuchess book). If you defined LIBDIR to something that is not an absolute pathname (that is, to something that does not start with a "/"), GNU Chess will work only if you run it from the GNU Chess "src" directory where you built it.


[C.20] XBoard tells me "Warning: Cannot allocate colormap entry", or "too few colors available; trying monochrome mode", or "XPM pieces cannot be used in monochrome mode".

You are running your X server with 8-bit color depth, and you are running some program that has used up all 256 of your colors. Netscape tends to do this, or maybe you have a background image that uses up all of your colors.

If you have a modern machine, you probably have enough display memory to run your X server with 16-, 24-, or 32-bit color depth. If you're using "startx" to start the X server, try giving the command as "startx -- -bpp 24" (or 16, or 32). On newer X servers you may have to use -depth instead of -bpp. Further details on configuring your X server are beyond the scope of this FAQ.

If you must run in 8-bit mode, try the following: Avoid background images that use up all your colors. If you run Netscape, try starting it up with the -install command-line option; this gives Netscape its own private colormap that X will switch to when Netscape has the keyboard focus.

If all else fails, another possibility is to run xboard in monochrome (black and white) mode by giving it the -mono command-line option. XBoard will try this by itself in some cases. Monochrome mode works only with bitmap pieces, not pixmap pieces, so trying to use it may give you the error "XPM pieces cannot be used in monochrome mode". To get around this, either use the -bitmapDirectory command line option to point XBoard to the directory containing the bitmap pieces included with the XBoard source code, or rebuild XBoard with pixmap support disabled, using "./configure --disable-xpm ; make clean ; make".


[C.21] When I log in to freechess.org, the Enter key doesn't work, and I have to use Ctrl+J instead. But when I use WinBoard, Ctrl+J doesn't work either, so I'm stuck.

This is a pretty rare problem. It should only arise if you have to reach freechess.org by telnetting (or connecting with WinBoard /icsport=23) from a Windows PC to a Unix box, and then telnetting from there to freechess.org. The Enter key should always work when connecting directly from your PC to freechess.org.

The best way to get around the problem is to run timeseal on the intermediate Unix box instead of telnet. Get the appropriate version of timeseal for your box from ftp.freechess.org and follow the directions in the help files on FICS.

If you can't run timeseal for some reason, there are some things you can do to make telnet stay in line mode instead of going to character mode. Then the Enter key will work. First, try "telnet freechess.org 5000" instead of "telnet freechess.org." If that still doesn't work, then when the Enter key stops working, type the following. Here < and > surround the names of keys.

    <Ctrl+S><Ctrl+]>mode line<Enter>

[C.22] XBoard says, "Failed to start first chess program fairymax on localhost: fairymax: No such file or directory."

XBoard is looking for the Fairy-Max chess engine. If you didn't want to use XBoard with Fairy-Max, please see topic [C.6]. If you did want to use Fairy-Max, be sure you have it installed and that it is on your $PATH. If you wanted to use GNU Chess instead, see topic [D.6].


[D] Crafty and other topics


[D.1] What is XChess?

XChess is an older chessboard program that is no longer supported. XChess was written for X version 10, and you may or may not be able to build and run it on an X11 system.

XChess has only one significant feature that is not present in XBoard: Two humans can play chess using XChess on different machines, without using the Internet Chess Server as an intermediary. This feature is of interest only if you don't have network connectivity to the Internet Chess Server.

Note: There actually have been several different programs called "XChess" in circulation at various times. The above describes one that was associated with GNU Chess.


[D.2] What is Winsock Chess?

Winsock Chess is a program that lets two people play chess across a network. It runs only under Microsoft Windows. Some of the code in Winsock Chess is derived from GNU Chess, but it is not maintained by the GNU Chess team. You can get a copy from the Internet Chess Library; see topic [A.2]. For more information, contact its author, Donald Munro, ccahdm@beluga.upe.ac.za.


[D.3] What is Crafty?

Crafty is a freely-available chess program written by Bob Hyatt. Bob is the main author of the well-known chess program Cray Blitz. Crafty is a very strong program, its code is available, commented and fairly readable, and its author is actively working on improvements.

You can download Crafty from ftp://ftp.cis.uab.edu/pub/hyatt/. Start by getting the read.me file and reading it. Among other things, this file contains instructions on how to install Crafty as a command-line application on your machine.

There is a Crafty mailing list. To subscribe, send email to majordomo@cis.uab.edu, with "subscribe crafty-list" in the body.


[D.4] How do I use Crafty with XBoard?

First, you need to get Crafty and install it as a command-line application on your machine. See topic [D.3].

To use Crafty with XBoard, give the -fcp parameter like this:

    xboard -fcp "./crafty" -fd crafty_directory

Here crafty_directory is the directory where you installed Crafty. You can add more xboard options at the end of the command line.

Crafty 15.14 or later is required to work properly with XBoard 4.0.0 or later. We generally recommend using the latest versions of both XBoard and Crafty.


[D.5] How do I use Crafty with WinBoard?

First, you need to get Crafty and install it as a command-line application on your machine. See topic [D.3]. It is best to use the latest version of Crafty with the latest version of WinBoard to make sure all features are compatible and function correctly. You can install Crafty in any directory you like.

You also need to get WinBoard and install it in the normal way using its built-in installer. You can do that either before or after you install Crafty.

After both Crafty and WinBoard are installed separately, follow the directions in the WinBoard Help file (included with WinBoard) for connecting new chess engines to WinBoard.

If you want to have Crafty act as an automated computer player on a chess server, see topic [B.16]. Before you try to get that working, be sure you can play against Crafty locally, first without WinBoard, then with it. Also be sure you can use WinBoard to play on the chess server yourself, without having Crafty connected to it. You have to crawl before you can walk!


[D.6] How do I use GNU Chess with XBoard?

By default, XBoard tries to use Fairy-Max by running the command "fairymax". That's why if you don't have Fairy-Max, you get the error message "Failed to start first chess program fairymax on localhost: fairymax: No such file or directory."

If you have GNU Chess 5, the command should be "gnuchess xboard" instead. To make XBoard use this command, give the -fcp parameter like this:

    xboard -fcp "gnuchess xboard" 
If you instaled GNU Chess as a package, the operating system usually knows where to find it, and GNU Chess knwos where to find its data files, such as the opening book. If GNU Chess is installed in a non-compliant way, e.g. together with its book file in a user directory, you must use:
    xboard -fd gnuchess_directory -fcp "./gnuchess xboard" 

Here gnuchess_directory is the directory where you installed GNU Chess 5 and its book. In all cases you can add more xboard options at the end of the command line.

If you want to use GNU Chess 4, the command should be "gnuchessx" instead. To make XBoard use this command, give the -fcp parameter like this:

    xboard -fcp "gnuchessx" 

The same applies for non-compliant installs as for GNU Chess 5: the install directory has to be given with the -fd argument.


[D.7] How do I use GNU Chess with WinBoard?

Well, why would you want to? If you want a strong free engine, use Crafty, Glaurung, Fruit or Toga. If you wnt an engine that plays many variants, use Fairy-Max, Pulsar or Sjeng. But the procedure to install and run those is not any different than for GNU Chess.

If you want to use a WinBoard-compatible chess engine that is not automatically installed with the download, you will have to download it yourself. Most chess engines are downloaded as a compressed archive (e.g. a .zip file), and on downloadig it, the decompression software on your Windows system is automatically invoked when you seected "Open" in the download dialog. You can then click "extract all files", and you are prompted for a place to put the unpacked stuff. The place it proposes is usually no good, so browse to the folder in which you installed the winBoard download (where you see the Fairy-Max and WinBoard folders).

When the archiv contained a single folder, (with files in it), unpack it there. If the archive contained a lot of small files, first create a folder, and browse there, before you unpack. (To get all the files in a single place, not mixed with others, so you can easily delete it again.) Say you unpacked in a folder named "NewEngine", which now sits next to your "WinBoard" folder amongst the chess files on your system. Say there is a file "Engine.exe" in this "NewEngine" folder.

Then to run the engine with WinBoard, you have to enter the command:

        winboard /fcp="Engine.exe" /fd="..\NewEngine"

Sometimes engines need parameters on their command line, e.g. to set the hash-table size, or tell them they have to deal with WinBoard. These should then go within the quotes around the Engine.exe file name, directly behind it, and separated from it (and each other) by spaces. See any README files that come with the engine to learn how exactly the engine has to be invoked.


[D.8] What is Fairy-Max?

Fairy-Max is a chess engine that plays chess at a level where you don't need to be a super GM to still have a chance to beat it. Apart from normal chess it plays many variants as well, such as Capablanca or Gothic Chess, Knightmate, etc. Dedicated versions of it are available to play Shatranj and Xiangqi (Chinese Chess).


[D.9] What is UCI? What is Polyglot?

UCI, or Universal Chess Interface, is a standard for communication between chess engines and its Graphical User Interface, that was created as an alternative to the way XBoard / WinBoard does it. (The latter way having become known as "WinBoard protocol"). XBoard / WinBoard do not understand a word of UCI, so UCI engines cannnot be run directly as engine under them.

Polyglot is an adapter that translates WB protocol to UCI. It bhaves like it is a WB engine, but, without XBoard / WinBoard knowing about this, it consults an UCI engine for getting the moves. With the aid of Polyglot, any UCI engine can be run under WinBoard. Polyglot is available as a Debian package for Linux, and is included in the WinBoard installation. Polyglot is open source software released under the GPL.


[D.10] How can I run a UCI engine under XBoard / WinBoard?

First you have to download and install the UCI engine. This is similar to installing WinBoard engines, see D.7. Furthermore, you have to make sure that Polyglot is nstalled on your system, in a place where XBoard / WinBoard can find it. There are then two ways to run the UCI engine:

In the first method, the only thing you have to do is add an extra option to the command that invokes XBoard / WinBoard, to tell it that the engine is UCI:

        xboard -fcp "fruit" -fUCI

        winboard /fcp="Fruit_21.exe" /fd="..\Fruit" /fUCI

The second method is more complicated, but also more versatile. UCI engines accept many settings from their GUI than XBoard / WinBoard usually send to a WB engine. Polyglot can provide such settings from a file dedicated to that engine, usully referred to as a "polyglot.ini" file (although the actual name can be different.) If the engine you downloaded comes with a polyglot.ini file for it, you can force Polyglot to use this file with engine settings by invoking it explicitly from XBoard / WinBoard:

        xboard -fcp "polyglot INIFILE"

        winboard /fcp="polyglot INIFILE" /fd="POLYGLOTDIR"

INIFILE is the name of the polyglot.ini file (possibly a path name, such as "PG\fruit.ini", while POLYGLOTDIR should be the directory (path) name were the Polyglot executable is located. The directory and name of the actual engine are described in the polygot.ini file, and XBoard / WinBoard need not be aware of them.

If you don't have a polyglot.ini file for the engine, you would have to make one. How to do that is beyond the scope of this FAQ. Refer to the Polyglot documentation for this, or use method 1.


** End of XBoard/WinBoard FAQ ** xboard-4.7.3/install-sh0000755000175000001440000001271112262415351011730 00000000000000#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 xboard-4.7.3/depcomp0000755000175000001440000005601612247021262011304 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: xboard-4.7.3/cmail.in0000644000175000001440000020165112262415351011344 00000000000000#! @PERLPATH@ ## (configure will change the top line to the location of perl on your system) #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## cmail: a tool to aid playing chess by email ## Copyright (C) 1993,2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. ## ## cmail is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or (at ## your option) any later version. ## ## cmail is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see http://www.gnu.org/licenses/. * ## ## Email: evan@quadstone.co.uk ## Snailmail: Evan Welsh ## Quadstone Ltd ## 16 Chester Street ## Edinburgh EH3 7RA ## Scotland #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Print verbose diagnostics for debugging sub debug { if ($DEBUG) { local ($old) = select ; ## Remember selected output select (logfile) ; $| = 1 ; ## Keep it flushed print @_ ; ## Print arguments select ($old) ; } } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Create a directory for storing games in if it doesn't already exist sub need_chess_dir { local ($old) ; ## ################################################################# ## ## Check for existence of the named chess directory ## ################################################################# ## if (! (-d "$CMAILDIR")) { ## ############################################################# ## ## Ask user for confirmation if attached to tty ## ############################################################# ## if (-t) { $old = select ; ## Remember selected output select (stdout) ; ## Write to standard output $| = 1 ; ## Keep it flushed print ( "CMail directory \"$CMAILDIR\" does not exist." . " Create it? [y/q]: ") ; $_ = ; ## Read response from tty die "Bye!\n" if (/^[qQ].*/) ; ## Quit if q selected select ($old) ; ## Re-select the old output } ## ############################################################# ## ## Create a cmail directory or die ## ############################################################# ## die "cmail: Can't create CMail directory: \"$CMAILDIR\"\n" unless mkdir ("$CMAILDIR", 511) ; print ( "Created cmail directory \"$CMAILDIR\".\n" . "You can move it but remember to set the CMAIL_DIR" . " environment variable.\n") ; } ## ################################################################# ## ## Change to the $CMAILDIR directory whether newly created or not ## ################################################################# ## die "Couldn't changed directory to \"$CMAILDIR\"\n" unless (chdir "$CMAILDIR") ; ## ################################################################# ## ## Check for existence of the named chess directory ## ################################################################# ## if (! (-d "$ARCDIR")) { ## ############################################################# ## ## Ask user for confirmation if attached to tty ## ############################################################# ## if (-t) { $old = select ; ## Remember selected output select (stdout) ; ## Write to standard output $| = 1 ; ## Keep it flushed print ( "Archive directory \"$ARCDIR\" does not exist." . " Create it? [y/q]: ") ; $_ = ; ## Read response from tty die "Bye!\n" if (/^[qQ].*/) ; ## Quit if q selected select ($old) ; ## Re-select the old output } ## ############################################################# ## ## Create a chess directory or die ## ############################################################# ## die "cmail: Can't create archive directory: \"$ARCDIR\"\n" unless mkdir ("$ARCDIR", 511) ; print ( "Created archive directory \"$ARCDIR\".\n" . "You can move it but remember to set the CMAIL_ARCDIR" . " environment variable.\n") ; } } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Parse command-line arguments sub parse_flags { ## ################################################################# ## ## Set up defaults from the environment or from hard-wired constants ## ################################################################# ## $SHOWC = 0 ; $SHOWW = 0 ; $OUTPUT_POS = $ENV{'CMAIL_OUTPUT_POS'} ; $LOGFILE = $ENV{'CMAIL_LOGFILE'} ; $MAILPROG = $ENV{'CMAIL_MAILPROG'} ; $MAILPROG = "/usr/sbin/sendmail" if ( (-x "/usr/sbin/sendmail") && (! $MAILPROG)) ; $MAILPROG = "/usr/lib/sendmail" if ( (-x "/usr/lib/sendmail") && (! $MAILPROG)) ; $MAILPROG = "/etc/sendmail" if ( (-x "/usr/lib/sendmail") && (! $MAILPROG)) ; $MAILPROG = "/usr/ucb/Mail" if ( (-x "/usr/ucb/Mail") && (! $MAILPROG)) ; $MAILPROG = "/usr/ucb/mail" if ( (-x "/usr/ucb/mail") && (! $MAILPROG)) ; $MAILPROG = "Mail" unless ($MAILPROG) ; $HOMEDIR = $ENV{'HOME'} ; $CMAILDIR = $ENV{'CMAIL_DIR'} ; $CMAILDIR = $ENV{'CHESSDIR'} unless ($CMAILDIR) ; $CMAILDIR = "$HOMEDIR/Chess" unless ($CMAILDIR) ; $CMAILDIR = "~/Chess" unless ($HOMEDIR) ; $NUM_GAMES = "?" ; $NUM_WGAMES = "?" ; $NUM_BGAMES = "?" ; $TIME_DELAY = $ENV{'CMAIL_TIME_DELAY'} ; $TIME_DELAY = 0 unless ($TIME_DELAY) ; $PW_NAME = &get_pw_name () ; $MY_NNAME = $PW_NAME ; $MY_NNAME = $ENV{'LOGNAME'} unless ($MY_NNAME) ; $MY_NNAME = $ENV{'USER'} unless ($MY_NNAME) ; $MY_NNAME = "?" unless ($MY_NNAME) ; $PGN_EVENT = "Email correspondence game" ; $PGN_SITE = "NET"; $PGN_ROUND = "-"; $PGN_MODE = "EM"; $SEND_MAIL = 1 ; $REMAIL = 0 ; $LOAD_XBOARD = 1 unless $ENV{'CMAIL_NO_XBOARD'} ; $REUSE = 1 ; @TD_FLAGS = ("-td", $TIME_DELAY) ; @NCP_FLAGS = ("-ncp") ; ## ################################################################# ## ## Define the usage string ## ################################################################# ## $USAGE = ("cmail [-h] [-c] [-w] [-[x]v] [-[x]mail] [-[x]xboard] [-[x]reuse] [-remail] [-game ] [-(w|b|)games ] [-(me|opp) ] [-(w|b|my|opp)name ] [-(w|b|my|opp)na ] [-dir ] [-arcdir ] [-mailprog ] [-logFile ] [-event ] [-site ] [-round ] [-mode ]") ; ## ################################################################# ## ## Overwrite defaults if specified on the command-line ## ################################################################# ## @UNREC_ARGS = () ; while ($ARGV = shift) { $UNREC = 0 if ($ARGV =~ /^-/) ; if ("$ARGV" eq "-h") {die ("Usage: $USAGE\n") ;} elsif ("$ARGV" eq "-c") {$SHOWC = 1 ;} elsif ("$ARGV" eq "-w") {$SHOWW = 1 ;} elsif ("$ARGV" eq "-v") {$DEBUG = 1 ; @DEBUG_FLAGS = ("-debug") ;} elsif ("$ARGV" eq "-xv") {$DEBUG = 0 ; $QUIET = 1 ;} elsif ("$ARGV" eq "-mail") {$SEND_MAIL = 1 ;} elsif ("$ARGV" eq "-xmail") {$SEND_MAIL = 0 ;} elsif ("$ARGV" eq "-xboard") {$LOAD_XBOARD = 1 ;} elsif ("$ARGV" eq "-xxboard") {$LOAD_XBOARD = 0 ;} elsif ("$ARGV" eq "-reuse") {$REUSE = 1 ;} elsif ("$ARGV" eq "-xreuse") {$REUSE = 0 ;} elsif ("$ARGV" eq "-remail") {$LOAD_XBOARD = 0 ; $SEND_MAIL = 1 ; $REMAIL = 1 ;} elsif ("$ARGV" eq "-game") {$PGN_GAME = shift ;} elsif ("$ARGV" eq "-games") {$NUM_GAMES = shift ;} elsif ("$ARGV" eq "-wgames") {$NUM_WGAMES = shift ;} elsif ("$ARGV" eq "-bgames") {$NUM_BGAMES = shift ;} elsif ("$ARGV" eq "-me") {$MY_NNAME = shift ;} elsif ("$ARGV" eq "-opp") {$OPP_NNAME = shift ;} elsif ("$ARGV" eq "-myname") {$MY_FNAME = shift ;} elsif ("$ARGV" eq "-oppname") {$OPP_FNAME = shift ;} elsif ("$ARGV" eq "-wname") {$WHITE_FNAME = shift ;} elsif ("$ARGV" eq "-bname") {$BLACK_FNAME = shift ;} elsif ("$ARGV" eq "-myna") {$MY_ADDRESS = shift ;} elsif ("$ARGV" eq "-oppna") {$OPP_ADDRESS = shift ;} elsif ("$ARGV" eq "-wna") {$WHITENA = shift ;} elsif ("$ARGV" eq "-bna") {$BLACKNA = shift ;} elsif ("$ARGV" eq "-dir") {$CMAILDIR = shift ;} elsif ("$ARGV" eq "-arcdir") {$ARCDIR = shift ;} elsif ("$ARGV" eq "-mailprog") {$MAILPROG = shift ;} elsif ("$ARGV" eq "-logFile") {$LOGFILE = shift ;} elsif ("$ARGV" =~ /^-(td|timeDelay)$/) {@TD_FLAGS = ($ARGV, shift) ;} elsif ("$ARGV" =~ /^-noChessComputer$/) {@NCP_FLAGS = ($ARGV, shift) ;} elsif ("$ARGV" =~ /^-[x]?ncp$/) {@NCP_FLAGS = ($ARGV) ;} elsif ("$ARGV" eq "-event") {$PGN_EVENT = shift ;} elsif ("$ARGV" eq "-site") {$PGN_SITE = shift ;} elsif ("$ARGV" eq "-round") {$PGN_ROUND = shift ;} elsif ("$ARGV" eq "-mode") {$PGN_MODE = shift ;} elsif ("$ARGV" =~ /^-/ || $UNREC) { push(@UNREC_ARGS, $ARGV) ; $UNREC = 1 ; } else { die("cmail: Unrecognised flag \"$ARGV\"\nUsage: $USAGE\n") ; } } ## ################################################################# ## ## Assign a value to $ARCDIR if not specified on the command line ## ################################################################# ## $ARCDIR = $ENV{'CMAIL_ARCDIR'} unless ($ARCDIR) ; $ARCDIR = $CMAILDIR unless ($ARCDIR) ; $ENV{'CMAIL_ARCDIR'} = $ARCDIR ; ## Make sure this is set for xboard ## ################################################################# ## ## Propagate some CMAIL variables through xboard to the cmail ## grandchild so that it uses the same important variables as this one ## ################################################################# ## $ENV{'CMAIL_MAILPROG'} = $MAILPROG ; $ENV{'CMAIL_DIR'} = $CMAILDIR ; $ENV{'CHESSDIR'} = $CMAILDIR ; ## Make xboard use $CMAILDIR $ENV{'CMAIL_ARCDIR'} = $ARCDIR ; if ($LOGFILE) { $ENV{'CMAIL_LOGFILE'} = $LOGFILE ; } else { $LOGFILE = "&STDERR" ; } ## ################################################################# ## ## Work out how many games of each colour will be played ## ################################################################# ## die "cmail: Illegal number of games: $NUM_GAMES\n" if ($NUM_GAMES < 0) ; die "cmail: Illegal number of white games: $NUM_WGAMES\n" if ($NUM_WGAMES < 0) ; die "cmail: Illegal number of black games: $NUM_BGAMES\n" if ($NUM_BGAMES < 0) ; if ("$NUM_GAMES" ne "?") { if ("$NUM_WGAMES" eq "?") { if ("$NUM_BGAMES" eq "?") { $NUM_BGAMES = int($NUM_GAMES / 2) ; } $NUM_WGAMES = $NUM_GAMES - $NUM_BGAMES ; } elsif ("$NUM_BGAMES" eq "?") { $NUM_BGAMES = $NUM_GAMES - $NUM_WGAMES ; } } elsif ("$NUM_WGAMES" eq "?") { if ("$NUM_BGAMES" eq "?") { $NUM_GAMES = 1 ; $NUM_WGAMES = 1 ; $NUM_BGAMES = 0 ; } else { $NUM_GAMES = $NUM_BGAMES ; $NUM_WGAMES = 0 ; } } else { if ("$NUM_BGAMES" eq "?") { $NUM_GAMES = $NUM_WGAMES ; $NUM_BGAMES = 0 ; } else { $NUM_GAMES = $NUM_WGAMES + $NUM_BGAMES ; } } die "cmail: Illegal number of games: $NUM_GAMES\n" if ("$NUM_GAMES" eq "0") ; die ( "cmail: Inconsistent numbers of games specified:" . " $NUM_WGAMES + $NUM_BGAMES != $NUM_GAMES\n") unless ($NUM_GAMES == $NUM_WGAMES + $NUM_BGAMES) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Initialisation of variables and environment sub showGPL { ## ################################################################# ## ## Show copyright notice ## ################################################################# ## while () { last if (/^{END OF GPL COPYRIGHT}$/) ; s/\$Revision[:] (.*) \$/$1/ ; print ; } ## ################################################################# ## ## Show conditions if requested ## ################################################################# ## while () { last if (/^{END OF GPL CONDITIONS}$/) ; print if ($SHOWW) ; } ## ################################################################# ## ## Show warranty if requested ## ################################################################# ## if ($SHOWC) { print "\n" if ($SHOWW) ; print while () ; } exit 0 if ($SHOWC || $SHOWW) ; ## Abort if showed conditions or warranty } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Initialisation of variables and environment sub initialise { local ($p) = "[.PRNBQKprnbqk]" ; local ($l) = "$p $p $p $p $p $p $p $p\n" ; local ($board) = "$l$l$l$l$l$l$l$l" ; local ($tp) = ".* to play\n" ; $posdiag = "\{--------------\n$board$tp--------------\}\n+" ; &parse_flags (@ARGV) ; ## Parse command-line arguments &showGPL unless $QUIET ; open (tty, "< /dev/tty") ; ## Open tty for reading &need_chess_dir () ; ## Check for the existence of CMAILDIR open (logfile, ">$LOGFILE") if ($DEBUG) ; ## Default is STDERR &debug ("Called \n") ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Prompt for a game name, if use a default sub prompt_for_game_name { &debug ("Called \n") ; local ($old) = select ; ## Remember the selected output select (stdout); ## Prompt goes to stdout $| = 1 ; ## Keep it flushed print "Game name [ to use default]: " ; die "cmail: tty not open\n" unless (-t) ; =~ /(.*)/ ; ## Read line from tty $PGN_GAME = "$1" ; ## Assign to game name select ($old) ; ## Re-select the old output } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Prompt for opponent's address sub prompt_for_opp_address { &debug ("Called \n") ; local ($old) = select ; ## Remember the selected output select (stdout); ## Prompt goes to stdout $| = 1 ; ## Keep it flushed ## ################################################################# ## ## Prompt for opponent's email address ## ################################################################# ## print "Opponent's email address: " ; die "cmail: tty not open\n" unless (-t) ; =~ /(.*)/ ; $OPP_ADDRESS = $1 ; ## ################################################################# ## ## Use name as default if still blank ## ################################################################# ## $OPP_ADDRESS = $OPP_NNAME if ("" eq $OPP_ADDRESS) ; select ($old) ; ## Re-select the old output } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Prompt for opponent's name sub prompt_for_opp_name { &debug ("Called \n") ; local ($old) = select ; ## Remember the selected output select (stdout) ; ## Prompt goes to stdout $| = 1 ; ## Keep it flushed print "Opponent's name: " ; die "cmail: tty not open\n" unless (-t) ; ## Check tty is open =~ /(.*)/ ; ## Read line from tty $OPP_NNAME = $1 ; ## Match! die "cmail: Can't proceed without the opponent's name.\n" unless ($OPP_NNAME) ; select ($old) ; ## Re-select the old output } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Prompt for move sub prompt_for_move { local ($prompt) = shift ; local ($pattern) = shift ; &debug ("Called \n") ; local ($move) = "" ; local ($old) = select ; ## Remember the selected output select (stdout) ; ## Write to stdout $| = 1 ; ## Keep it flushed die "cmail: tty not open\n" unless (-t) ; ## Check tty is open do { print $prompt ; =~ /(.*)/ ; ## Read line from tty $move = $1 ; ## Match! } until ($move =~ /^$pattern$/) ; select ($old) ; ## Re-select the old output return ($move) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Load the game sub play_game { &debug ("Called \n") ; $| = 1 ; ## Start flushing output buffer ## ################################################################# ## ## Load xboard unless inhibited by command-line arguments ## ################################################################# ## if (($STARTING_NEW_GAME) && ($NUM_WGAMES == 0)) { print ( "Bypassing xboard and mailing $NUM_BGAMES empty" . " black games.\n") ; } elsif ($LOAD_XBOARD) { ## ############################################################# ## ## Remove output file from previous run, but preserve ## $PGN_GAME.game.out.* because they will be empty black games ## ############################################################# ## unlink "$PGN_GAME.out" ; ## ############################################################# ## ## Invoke xboard with loads of flags ## ############################################################# ## if ($PGN_GAME) { if (@ARCHIVE) { local ($date) = &get_date_from_games (@ARCHIVE) ; $XBOARD_ARGS = join (' ', (("-lgf", "'$ARCDIR/$PGN_GAME.$date.archive'"), @NCP_FLAGS, "-xics", @TD_FLAGS, @DEBUG_FLAGS, @UNREC_ARGS)) ; } else { $XBOARD_ARGS = join (' ', (("-cmail", "'$PGN_GAME'"), @TD_FLAGS, @NCP_FLAGS, "-xics", @DEBUG_FLAGS, @UNREC_ARGS)) ; } } else { $PGN_GAME = "unknown.cmail" ; $XBOARD_ARGS = join (' ', (("-lgf", "'$PGN_GAME'"), @NCP_FLAGS, "-xics", @TD_FLAGS, @DEBUG_FLAGS, @UNREC_ARGS)) ; $REUSE = 0 ; } $LOG_FILE = "$PGN_GAME.log" ; &debug ("Invoking xboard with args: $XBOARD_ARGS\n") ; $PID_FILE = "$PGN_GAME.pid" ; if ( (! $REUSE) || (! ( (-f $PID_FILE) && ($XBOARD_PID = `cat '$PID_FILE'`) && ("$XBOARD_PID" =~ /^\d+$/) && (kill "SIGUSR1", $XBOARD_PID)))) { print "Loading xboard for game \"$PGN_GAME\"..." ; # system ("gdb xboard") ; system ( "{ ({ xboard $XBOARD_ARGS & } ;" . " echo \$! > '$PID_FILE' ;" . " wait ;" . " rm '$PID_FILE') & } >'$LOG_FILE' 2>&1") ; print ( "done.\n" . "If nothing happens look for an error message in\n" . "$CMAILDIR/$LOG_FILE\n") ; } else { print ("Revived existing xboard for game \"$PGN_GAME\".\n" . "If nothing happens" . " remove $CMAILDIR/$PID_FILE and try again.\n") ; } return 1 ; } return 0 ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Enter moves on tty instead of xboard sub play_on_tty { &debug ("Called \n") ; local (@results) = @_ ; local (@games, $game, $to_play) ; ## ################################################################# ## ## Check we have access to tty ## ################################################################# ## if (open(STDIN, '/dev/tty')) { ## ############################################################# ## ## Read in games ## ############################################################# ## local ($infile) = "$PGN_GAME.game.in" ; if (-f $infile) { @games = &get_games_from_file($infile) ; &debug ("Read in games from \"$infile\"\n") ; if (@results) { foreach $game (@games) { $result = shift (@results) ; if ($result && ($game =~ /\[Result\s+"[^*]+"\]/)) { $game = "" ; } } } ## ################################################################# ## ## Accept move on tty for each game in turn ## ################################################################# ## local ($comment_orig, $comment, $comment_line, $pos, $move, $normal_move, $action, $result) ; foreach $game (@games) { next unless $game ; $game =~ s/[\s\n]*[*]?[\s\n]*$// ; $pos = "" ; $pos = $1 if ($game =~ s/($posdiag)//) ; print $game, "\n\n", $pos ; ($number, $to_play) = &get_to_play ($game) ; $comment_orig = "" ; $game_nocomment = $game ; if ($game_nocomment =~ s/\n?{\n?([^{]*)}$//) { $comment_orig = $1 ; $comment_orig =~ s/([^\n])$/$1\n/ ; # &debug ("Comment is:\n{\n$comment_orig}\n") ; } if ($game =~ /\[Result\s+"[^*]+"\]/) { &prompt_for_move ("Game finished, press \"Return\" to continue: ", "") ; next ; } $tmpgame = $game_nocomment ; $comment = $comment_orig ; outer: while (1) { if ($game =~ /{\n?.* offers a draw\n?}$/) { $move = &prompt_for_move ("Enter move [MOVE/(r)esign/(a)ccept/(c)omment/re(t)ry]: ", "([-a-h0-9PRNBQK][-a-h0-9PRNBQK]+|[ract])") ; } else { $move = &prompt_for_move ("Enter move [MOVE/(r)esign/(c)omment/re(t)ry]: ", "([-a-h0-9PRNBQK][-a-h0-9PRNBQK]+|[rct])") ; } $normal_move = 0 ; $result = "" ; if ($move =~ /^\s*r\s*$/i) { if ($to_play eq "White") { $result = "0-1" ; } else { $result = "1-0" ; } $move = "\n{$to_play resigns} $result" ; } elsif ($move =~ /^\s*a\s*$/i) { $move = "\n{Draw agreed} $result" ; } elsif ($move =~ /^\s*c\s*$/i) { while ($comment_line = &prompt_for_move ("Enter comment: ", ".*")) { $comment .= $comment_line . "\n" ; } next ; } elsif ($move =~ /^\s*t\s*$/i) { print $game, "\n\n", $pos ; $tmpgame = $game_nocomment ; $comment = $comment_orig ; print "Try again.\n" ; next ; } else { $normal_move = 1 ; } $tmpgame .= "\n{\n" . $comment . "}" if ($comment) ; if (! $normal_move) { $tmpgame .= "$move" ; } elsif ($to_play eq "White") { $tmpgame .= "\n$number. $move" ; } elsif ($tmpgame =~ /}$/) { $tmpgame .= "\n$number. ... $move" ; } else { $tmpgame .= " $move" ; } $tmpgame =~ s/\[Result\s+"(.*)"\]/[Result "$result"]/ if ($result) ; $comment = "" ; middle: while (1) { if ($normal_move) { $action = &prompt_for_move ("Enter action [(d)raw/(c)omment/(s)end/re(t)ry]: ", "[dcst]") ; } elsif ($result) { $action = &prompt_for_move ("Enter action [(s)end/re(t)ry]: ", "[st]") ; } else { $action = &prompt_for_move ("Enter action [(c)omment/(s)end/re(t)ry]: ", "[cst]") ; } if ($action =~ /^\s*d\s*$/i) { if ($normal_move) { $comment .= "$to_play offers a draw\n" ; while (1) { $action = &prompt_for_move ("Enter action [(c)omment/(s)end/re(t)ry]: ", "[cst]") ; if ($action =~ /^\s*c\s*$/i) { while ($comment_line = &prompt_for_move ("Enter comment: ", ".*")) { $comment .= $comment_line . "\n" ; } next ; } elsif ($action =~ /^\s*t\s*$/i) { print $game, "\n\n", $pos ; $tmpgame = $game_nocomment ; $comment = $comment_orig ; print "Try again.\n" ; next outer; } elsif ($action =~ /^\s*s\s*$/i) { $tmpgame .= "\n{\n" . $comment . "}" ; last middle ; } } } else { print "You can't offer a draw at this point.\n" ; next ; } } elsif ($action =~ /^\s*c\s*$/i) { if ($result) { print "You can't enter a comment after the game is finished.\n" ; } else { while ($comment_line = &prompt_for_move ("Enter comment: ", ".*")) { $comment .= $comment_line . "\n" ; } } next ; } elsif ($action =~ /^\s*t\s*$/i) { print $game, $pos ; $tmpgame = $game_nocomment ; $comment = $comment_orig ; print "Try again.\n" ; next outer; } elsif ($action =~ /^\s*s\s*$/i) { $tmpgame .= "\n{\n" . $comment . "}\n" if ($comment) ; last ; } } last ; } $tmpgame .= "\n*" if ($normal_move) ; $tmpgame .= "\n\n" ; $game = $tmpgame ; } } else { die "cmail: No games to be read\n" ; } } else { die "cmail: Can't open tty" ; } return (@games) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Find the game the user wants by any means possible sub find_game { &debug ("Called \n") ; ## ################################################################# ## ## Ask user for a game name if not already known ## ################################################################# ## &prompt_for_game_name () if ("" eq "$PGN_GAME") ; ## ################################################################# ## ## Find out opponent's details ## ################################################################# ## if ("" eq "$PGN_GAME") { ## ############################################################# ## ## Failed to find the game name so construct a default from players ## ############################################################# ## &prompt_for_opp_name () if ("" eq "$OPP_NNAME") ; ## Ask user die "cmail: Can't proceed without your opponent's short name (-opp)\n" if ("" eq "$OPP_NNAME") ; die "cmail: Can't proceed without your own short name (-me)\n" if ("" eq "$MY_NNAME") ; if ($NUM_WGAMES > 0) { $PGN_GAME = "$MY_NNAME-vs-$OPP_NNAME" ; ## Construct default } else { $PGN_GAME = "$OPP_NNAME-vs-$MY_NNAME" ; ## Construct default } } elsif (("" eq "$OPP_ADDRESS") && ("" ne "$RETURN_ADDRESS")) { $OPP_ADDRESS = $RETURN_ADDRESS ; ## Use return address instead &debug ( "Using return address \"$OPP_ADDRESS\"" . " for opponent address\n") ; } ## ################################################################# ## ## If no $PGN_GAME.game.in file, assume we're starting a new game ## ################################################################# ## &start_new_game () unless (-f "$PGN_GAME.game.in") ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get the date sub get_date { local ($the_time) = time ; local ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime ($the_time) ; $mon ++ ; $year += 1900 ; if ($mon < 10) { $mon = "0$mon" ; } if ($mday < 10) { $mday = "0$mday" ; } "$year.$mon.$mday" ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Start a new game sub start_new_game { print ( "Starting new game" . " -- $NUM_WGAMES as white, $NUM_BGAMES as black.\n") ; local ($to_play) = "white" ; $move_num = 0 ; $STARTING_NEW_GAME = 1 ; local (@game) ; ## ################################################################# ## ## Ask user for opponent's email address if unknown ## ################################################################# ## &prompt_for_opp_address () if ("" eq "$OPP_ADDRESS") ; ## ################################################################# ## ## Give up if we haven't got anywhere to send a move to ## ################################################################# ## die "cmail: Can't proceed without your opponent's email address.\n" if ("" eq "$OPP_ADDRESS") ; ## ################################################################# ## ## Create an empty game file ## ################################################################# ## open (GAMEFILE, "> $PGN_GAME.game.in") ; for ($j = 1; $j <= $NUM_GAMES; $j ++) { $PW_GCOS = &get_pw_gcos () ; $PGN_MYCOL = $MY_FNAME ; $PGN_MYCOL = $PW_GCOS unless $PGN_MYCOL ; $PGN_MYCOL = $MY_NNAME unless $PGN_MYCOL ; $PGN_MYCOLNA = $MY_ADDRESS ; $PGN_MYCOLNA = "?" unless ($PGN_MYCOLNA) ; $PGN_OPPCOL = $OPP_FNAME ; $PGN_OPPCOL = "?" unless ($PGN_OPPCOL) ; $PGN_OPPCOLNA = $OPP_ADDRESS ; $PGN_OPPCOLNA = "?" unless ($PGN_OPPCOLNA) ; if ($j > $NUM_WGAMES) { $PGN_WHITE = $PGN_OPPCOL ; $PGN_BLACK = $PGN_MYCOL ; $PGN_WHITENA = $PGN_OPPCOLNA ; $PGN_BLACKNA = $PGN_MYCOLNA ; } else { $PGN_WHITE = $PGN_MYCOL ; $PGN_BLACK = $PGN_OPPCOL ; $PGN_WHITENA = $PGN_MYCOLNA ; $PGN_BLACKNA = $PGN_OPPCOLNA ; } ## ######################################################### ## ## If we only have one colour of game then allow command-line ## colour specs to override ## ######################################################### ## if (! ($NUM_WGAMES && $NUM_BGAMES)) { $PGN_WHITE = $WHITE_FNAME if ($WHITE_FNAME) ; $PGN_BLACK = $BLACK_FNAME if ($BLACK_FNAME) ; $PGN_WHITENA = $WHITENA if ($WHITENA) ; $PGN_BLACKNA = $BLACKNA if ($BLACKNA) ; } $PGN_DATE = &get_date () ; $PGN_DATE = "?" unless ($PGN_DATE) ; if ($NUM_GAMES > 1) { $SUFFIX = ".$j" ; } else { $SUFFIX = "" ; } @game = ("[Event \"$PGN_EVENT\"]\n", "[Site \"$PGN_SITE\"]\n", "[Date \"$PGN_DATE\"]\n", "[Round \"$PGN_ROUND\"]\n", "[White \"$PGN_WHITE\"]\n", "[Black \"$PGN_BLACK\"]\n", "[Result \"*\"]\n", "[WhiteNA \"$PGN_WHITENA\"]\n", "[BlackNA \"$PGN_BLACKNA\"]\n", "[Mode \"$PGN_MODE\"]\n", "[CmailGameName \"$PGN_GAME$SUFFIX\"]\n\n*\n") ; if ($j > $NUM_WGAMES) { open (GAMEOUTFILE, "> $PGN_GAME.game.out.$j") ; print GAMEOUTFILE @game ; close (GAMEOUTFILE) ; } else { print GAMEFILE @game ; } } close (GAMEFILE) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get the password file gcos (full name) entry sub get_pw_entry { local ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwuid ($<); ($name, $gcos) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get password file gcos (full name) entry sub get_pw_gcos { local ($PW_GCOS) ; if (! $PW_GCOS) { ($dummy, $PW_GCOS) = &get_pw_entry () ; $PW_GCOS =~ s/^\s*([^,()]+[^ ,()])[ ]*[,()].*$/$1/; if ($PW_GCOS =~ /^([^,()]+)\s+([^\s,()]+)$/) { ## Multi-word name $PW_GCOS = $2 . ", " . $1 ; } elsif ($PW_GCOS !~ /^([^\s,()]+)/) { ## No sensible gcos entry $PW_GCOS = "" ; } ## Else leave it as one word &debug ("PW full name is \"$PW_GCOS\"\n"); } return $PW_GCOS ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get password file user name entry sub get_pw_name { local ($PW_NAME) ; ($PW_NAME, $dummy) = &get_pw_entry () ; &debug ("PW name is $PW_NAME\n"); return $PW_NAME ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Analyse the email message sub analyse_email_message { local ($new_result, $delete_result, $unfinished, $finished) = (0, 0, 0, 0) ; local ($gamefile, @games) ; ## ################################################################# ## ## Slurp the mail message ## ################################################################# ## die "cmail: No games on standard input" unless (@games = &get_games_from_file ("STDIN")) ; ## ################################################################# ## ## Is the message a real cmail message or just a chess game? $PGN_GAME ## will have been set by calling get_games_from_file if it's real ## ################################################################# ## print "Processing game message..." ; if ($PGN_GAME) { ## ############################################################# ## ## Restore the results file from the archive if ## necessary. This is helpful if the user pipes in an old ## message for take-back purposes or whatever. ## ############################################################# ## if (! -f "$PGN_GAME.res") { ## Find what date would have been used to create the archive foreach (@games) { if (/\[Date\s"(.*)"\]/) { $date = $1 ; last ; ## Assume all dates are the same } } ## Restore results file from archive directory if it exists if ($date && (-f "$ARCDIR/$PGN_GAME.$date.archive")) { if (system ("cp", "$ARCDIR/$PGN_GAME.$date.archive", "$PGN_GAME.res")) { print stderr ( "\nWarning: couldn't restore results file" . " from archive\n") ; } else { print "restored results file from archive..." ; } } } ## ############################################################# ## ## Find existing results, if any. ## ############################################################# ## local (@results) = &get_games_from_file ("$PGN_GAME.res") ; ## ############################################################# ## ## Parse each game ## ############################################################# ## foreach $game (@games) { next unless ($game) ; ($game_name, $game_num) = &get_game_name_and_number ($game) ; $result = 0 ; @game = split("\n", $game) ; foreach (@game) { if (/^\[(Black|White)\s*"[?]"\]$/) { $colour = $1; $PW_GCOS = &get_pw_gcos () unless ($PW_GCOS) ; $PW_GCOS = "$MY_NNAME" unless ($PW_GCOS) ; s/".*"/"$PW_GCOS"/ ; &debug ("Changed $colour tag to be $_") ; } elsif (/^\[((Black|White)NA)\s*"(.*)"\]$/) { $NA = $3 ; if ($NA eq "?") { if ($RETURN_ADDRESS) { $NA = $RETURN_ADDRESS ; } else { $NA = "??" ; } $_ = "[$1 \"$NA\"]" ; &debug ("Changed $1 tag.\n") ; } if ($2 eq "White") { $PGN_WHITENA = $NA ; &debug ("WhiteNA tag is \"$PGN_WHITENA\"\n") ; } else { $PGN_BLACKNA = $NA ; &debug ("BlackNA tag is \"$PGN_BLACKNA\"\n") ; } } elsif (/\[Result\s*"(.*)"\]$/) { if ($1 ne "*") { $result = 1 ; $finished ++ ; } else { $unfinished ++ ; } } elsif (/^(.*[^\d]+)?\d+[.]\s*([^\s*]*\s+)?[^\s.*]+(\s*\d+[.]\s*)?[\s*]*$/) { if ($2) { $to_play = "white" ; } else { $to_play = "black" ; } &debug ("$to_play to play\n") ; } } ## ######################################################### ## ## Reconstruct possibly edited game ## ######################################################### ## $game = join ("\n", @game) . "\n\n" ; ## ######################################################### ## ## Build up results array ## ######################################################### ## if ($result) { $results[$game_num] = $games[$game_num] ; $new_result = 1 ; } elsif ($results[$game_num]) { ## Deleting a result does actually make sense if the user ## pipes in an old message for take-back purposes or whatever $results[$game_num] = "" ; $delete_result = 1 ; } ## ######################################################### ## ## Remove old .out files ## ######################################################### ## unlink <$PGN_GAME.game.out.*> ; ## ######################################################### ## ## Write ongoing games to game file and append new results ## ######################################################### ## die "cmail: Can't open file for writing:" . " \"$CMAILDIR/$PGN_GAME.game.in\"\n" unless open (gamefile, ">$PGN_GAME.game.in") ; &debug (@games) ; print gamefile @games ; close (gamefile) ; } ## ############################################################# ## ## Print how many finished/unfinished games were found ## ############################################################# ## printf ("%d unfinished %s and %d finished %s...", $unfinished, ($unfinished == 1) ? "game" : "games", $finished, ($finished == 1) ? "game" : "games") ; ## ############################################################# ## ## Write results back to results file if there were any results ## in the input ## ############################################################# ## if ($new_result || $delete_result) { die ( "cmail: Can't open results file for writing:" . "\"$CMAILDIR/$PGN_GAME.res\"\n") unless open (resfile, ">$PGN_GAME.res") ; print resfile @results ; close (resfile) ; } ## ############################################################# ## ## Archive results if there are no unfinished games ## ############################################################# ## @ARCHIVE = @results unless ($unfinished) ; ## ############################################################# ## ## Figure out return address if not known ## ############################################################# ## if (! $RETURN_ADDRESS) { if ($to_play eq "black") { $RETURN_ADDRESS = $PGN_WHITENA unless ("$PGN_WHITENA" eq "?") ; } else { $RETURN_ADDRESS = $PGN_BLACKNA unless ("$PGN_BLACKNA" eq "?") ; } } ## ############################################################# ## ## Decide to include position diagrams in output if not already ## decided and a position diagram was found in the input ## ############################################################# ## if ("$OUTPUT_POS" eq "") { if (grep (/$posdiag/, @games)) { $OUTPUT_POS = "y" ; # Output position only if it was input } else { $OUTPUT_POS = "n" ; } } $ENV{'CMAIL_OUTPUT_POS'} = $OUTPUT_POS ; ## ############################################################# ## ## Check that we have enough info about the players to continue ## ############################################################# ## &find_game () ; } else { ## ############################################################# ## ## Set up xboard for viewing non-cmail PGN file ## ############################################################# ## local ($file) = "unknown.cmail" ; print "done.\nDumping non-cmail file into $CMAILDIR/$file..." ; die "cmail: Can't open file for writing: \"$CMAILDIR/$file\"\n" unless open (gamefile, ">$file") ; print gamefile @games ; close (gamefile) ; } print "done.\n" ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Sort two filenames by the numeric suffix sub sort_by_numeric_suffix { $a =~ /[.](\d+)$/ ; local ($na) = $1 ; $b =~ /[.](\d+)$/ ; local ($nb) = $1 ; return ($na <=> $nb) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# sub get_game_name_and_number { local ($game) = join ("\n", @_) ; local ($game_name, $game_num) ; die "CMailGameName tag missing\n" unless ($game =~ /\[C[Mm]ailGameName\s+"(.*)"\]/) ; ## ################################################################# ## ## Set game name and number ## ################################################################# ## $game_name = $1 ; if ($game_name =~ s/^(.*)[.](\d+)$/$1/) { $game_num = $2 ; } else { $game_num = 1 ; } ## ################################################################# ## ## Set $PGN_GAME as a side-effect or check validity ## ################################################################# ## if ($PGN_GAME) { die ( "cmail: Mismatched game names in input message:\n" . "\"$PGN_GAME\", \"$game_name\"\n") if ("$PGN_GAME" ne "$game_name") ; } else { $PGN_GAME = $game_name ; &debug ("PGN_GAME set to \"$PGN_GAME\"\n") ; } return ($game_name, $game_num) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Read in a file of games and split into separate games sub get_games_from_file { local ($file) = shift ; local (@file, $first_line) ; ## Slurp stdin if ($file eq "STDIN") { if ($first_line = ) { ## Necessary to handle no input case @file = ; ## Slurp stdin @file = ($first_line, @file) ; foreach (@file) { ## Strip off leading quotation characters s/^[^\s]*>// ; s/^[ \t]+// ; ## Find return address and set it as a side-effect if ( /^From:?.*<([^>]+)>.*\n$/ || /^From:? *([^ ]*).*\n$/) { $RETURN_ADDRESS = $1 ; ## Default for opp's email &debug ("Found opponent's email address", " \"$RETURN_ADDRESS\"\n") ; } elsif (/\[C[Mm]ailGameName\s+"(.*)"\]/) { $PGN_GAME = $1 ; $PGN_GAME =~ s/[.]\d+$// ; } } return (@file) unless ($PGN_GAME) ; if (grep (/\{--------------|\[Event/, @file)) { shift (@file) while ($file[0] !~ /\{--------------|\[Event/) ; } } else { return () ; } } else { return () unless (open (file, "<$file")) ; @file = ; ## Slurp file close (file) ; } local (@games, $game_name, $game_num, $game, $tag) ; ## ################################################################# ## ## Remove headers and leading blanks ## ################################################################# ## local (@tgames) = split (/($posdiag\[Event|\[Event)/, join ('', @file)) ; shift (@tgames) while (!$tgames[0]) ; ## ################################################################# ## ## Set up @games array with proper game numbers ## ################################################################# ## while (@tgames) { $game = shift (@tgames) . shift (@tgames) ; ($game_name, $game_num) = &get_game_name_and_number ($game) ; $games[$game_num] = $game ; } return (@games) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Analyse output files and send the move sub send_move { &debug ("Called \n") ; ## ################################################################# ## ## Cat the pos (if it exists), game and result (if it exists) files ## into the .out file. ## ################################################################# ## local ($unfinished, $finished) = (0, 0) ; local (@results, $move, $move_msg, $to_play, $number) ; ## ################################################################# ## ## Find any .game.out.* files ## ################################################################# ## local (@outfiles) = (<$PGN_GAME.game.out.*>) ; @outfiles = grep (/[.]\d+$/, @outfiles) ; ## Ignore autosave files @outfiles = sort sort_by_numeric_suffix @outfiles ; ## Sort ## ################################################################# ## ## Find .res file if it exists ## ################################################################# ## local ($resfile) = "$PGN_GAME.res" ; if (-f $resfile) { @results = &get_games_from_file($resfile) ; &debug ("Read in results\n") ; } else { @results = () ; &debug ("No results to read\n") ; } ## ################################################################# ## ## Find .out file if it exists ## ################################################################# ## local ($outfile) = "$PGN_GAME.out" ; if (! ($REMAIL || $LOAD_XBOARD)) { @games = &play_on_tty (@results) ; } elsif (@outfiles) { foreach (@outfiles) { die "Can't open game file \"$_\" for reading" unless (open (game, "<$_")) ; die "Empty game file \"$_\"" unless ($game = join ('', )) ; close (game) ; &debug ("Read in game file \"$_\"\n") ; ## Remove position diagram if it wasn't in the input msg $game =~ s/($posdiag)// if ("$OUTPUT_POS" ne "y") ; ($game_name, $game_num) = &get_game_name_and_number ($game) ; $games[$game_num] = $game ; } &debug ("Read in games from output files\n") ; $games[0] = "" ; } else { &debug ("No games to read from STDIN\n") ; if (-f $outfile) { @games = &get_games_from_file($outfile) ; } else { die "Can't find any game files\n" unless (@results) ; } } ## ################################################################# ## ## Process games ## ################################################################# ## if (@games) { ## ############################################################# ## ## Find opponent's email address in games ## ############################################################# ## $OPP_ADDRESS = &get_opp_address_from_games (@games) unless ($OPP_ADDRESS) ; ## ############################################################# ## ## Collect the .game.out.* files into the .out file, remembering ## the move number of the last line and whether result or not ## ############################################################# ## $unfinished = 0 ; $move_num = 0 ; $move = blank ; ## Write games to output file die "Can't open output file \"$PGN_GAME.out\" for writing\n" unless open (outfile, ">$PGN_GAME.out") ; print outfile @games ; close (outfile) ; $game_num = -1 ; $num_games = 0 ; foreach $game (@games) { $game_num ++ ; next unless ($game) ; $num_games ++ ; ## Determine last move and whether result or not $result = 0 ; foreach (split(/\n/, $game)) { if (/^(.*[^\d]+|)(\d+)[.]+\s*[^\s.]*\s+(\S+)\s*$/) { $move_num = $2 ; $move = $3 ; } elsif (/^\[Result\s*"(.*)"\]$/) { if ($1 ne "*") { $result = 1 ; $finished ++ ; } else { $unfinished ++ ; } } } $results[$game_num] = $game if ($result) ; } ## Write result files back to $PGN_GAME.res if (@results) { die "Can't open results file $PGN_GAME.res for writing\n" unless open (resfile, ">$PGN_GAME.res") ; print resfile @results ; close (results) ; } unlink <$PGN_GAME.game.out.*> ; ## ############################################################# ## ## Just say how many games are in the message ## ############################################################# ## if ($num_games > 1) { $move_msg = "$num_games games" ; } else { $move_msg = "1 game" ; } ## ############################################################# ## ## Print how many finished/unfinished games were found ## ############################################################# ## printf ("Sending %d unfinished %s and %d finished %s.\n", $unfinished, ($unfinished == 1) ? "game" : "games", $finished, ($finished == 1) ? "game" : "games") ; ## ############################################################# ## ## Send the mail message to opponent's address unless bypassed ## ############################################################# ## if ($SEND_MAIL) { local ($subject) = "cmail $move_msg <$PGN_GAME>" ; if ($MAILPROG =~ /sendmail/) { $opened = open (mail, "|$MAILPROG $OPP_ADDRESS") ; print mail "To: $OPP_ADDRESS\n"; print mail "Subject: $subject\n"; print mail "Mime-Version: 1.0\n"; print mail "Content-Type: application/x-chess;name=$PGN_GAME.pgn\n\n"; } else { $opened = open (mail, "|$MAILPROG -s \"$subject\" $OPP_ADDRESS") ; } if ($opened) { print mail @games ; close (mail) ; print ( "Mailed cmail message to \"$OPP_ADDRESS\":\n" . "$move_msg <$PGN_GAME>\n") ; @ARCHIVE = @results unless ($unfinished) ; } else { die "Failed to mail cmail message.\n" ; } } else { print ( "Email not sent (as requested).\n" . "Would have mailed cmail message to \"$OPP_ADDRESS\":\n" . "$NUM_GAMES games <$PGN_GAME>\n") ; } } else { if (@results) { print "Email not sent (the game is over).\n" ; } else { die "No games found\n" ; } } } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get date from array of games sub get_date_from_games { local (@games) = @_ ; local ($date) = "nodate" ; foreach (@games) { if (/\[Date\s"(.*)"\]/) { $date = $1 ; last ; ## Assume all dates are the same } } return ($date) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Determine which colour is to play and the move number sub get_to_play { &debug ("Called \n") ; local ($game) = shift ; local ($number, $to_play) = (1, "White") ; $game =~ s/{[^}]*}//g ; $game =~ s/[\s\n]*[*][\s\n]*$// ; if ($game =~ /(\d+)[.][\n ]*([.]*)[\n ]*([^\n.]*)[\n\s]*[10-]*[\n\s]*$/) { $number = $1 ; if ($game =~ /\[Result "0-1"\]/) { $to_play = "Black" ; } elsif ($game =~ /\[Result "1-0"\]/) { $to_play = "White" ; } elsif (($2 ne "") || (($3 =~ / /) || ($3 eq ""))) { $to_play = "White" ; $number ++ ; } else { $to_play = "Black" ; } } &debug ("$to_play to play on move $number\n") ; return ($number, $to_play) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Get opp address from array of games sub get_opp_address_from_games { &debug ("Called \n") ; local (@games) = @_ ; local ($opp_address) = "" ; local ($number, $to_play, $tag) ; foreach (@games) { next unless $_ ; ($number, $to_play) = &get_to_play ($_) ; $tag = ( ($to_play eq "White") ? "WhiteNA" : "BlackNA") ; if (/\[$tag\s"(.*)"\]/) { $opp_address = $1 ; die "cmail: Empty \"$tag\" tag\n" unless ($opp_address) ; &debug ("Found opponent's address \"$opp_address\" from games.\n") ; last ; ## Assume all opp addresses are the same } else { die "cmail: Can't find \"$tag\" tag\n" ; } } die "cmail: Can't find opponent's email address\n" unless ($opp_address) ; return ($opp_address) ; } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Archive @ARCHIVE in the $ARCDIR directory sub archive { return () unless (@ARCHIVE) ; local ($date) = &get_date_from_games (@ARCHIVE) ; local ($file) = "$ARCDIR/$PGN_GAME.$date.archive" ; if (open (archive, ">$file")) { print archive @ARCHIVE ; close (archive) ; print "Archived game in $file\n" ; local (@remove) = <$PGN_GAME*> ; @remove = grep ($_ ne "$PGN_GAME.$date.archive", @remove) ; ## Don't delete archive unlink (@remove) ; } else { print "Couldn't open \"$file\" to archive game\n" ; } } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# ## Main body sub main { local (@games) = () ; &initialise () ; ## Initialise variables etc. if (-t || $REMAIL) { ## No input directed (invoked from a shell rather than a mailer) &debug ("Interactive!\n") ; &find_game () ; ## Get the necessary info about the game } else { &debug ("Piping!\n") ; &analyse_email_message () ; ## Analyse the mail message } if (! &play_game ()) { ## Load the game &send_move () ; ## Analyse output and send moves } &archive () ; ## Archive games if all finished close (tty) ; ## Tidy up close (logfile) if ($DEBUG) ; ## Tidy up } #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# &main () ; #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=# __END__ cmail (From XBoard version @PACKAGE_VERSION@), Copyright (C) 1993 Free Software Foundation, Inc. cmail comes with ABSOLUTELY NO WARRANTY; for details type `cmail -w'. cmail is free software, and you are welcome to redistribute it under certain conditions; type `cmail -c' for details. {END OF GPL COPYRIGHT} GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. {END OF GPL CONDITIONS} GNU GENERAL PUBLIC LICENSE NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. xboard-4.7.3/ics-parsing.txt0000644000175000001440000001325612262415351012711 00000000000000Parsing of ICS Output Updated to match xboard/WinBoard 4.0.2 ============================================================================== This document describes how xboard and WinBoard parse ICS output. The general parsing method is to compare a list of patterns against the current line (whether partial or complete) each time new input is received from ICS. The patterns are considered in a fixed order. The pattern matching is not "anchored", so unmatched text at the beginning of a line (including the prompt, usually) is skipped. Whenever a pattern is matched, the characters are "consumed" and matching begins again with the next unmatched character, starting at the top of the list. The last pattern is "\n", causing characters up to a newline to be discarded if they have not matched any patterns. The pattern language is very simple. Every character but "*" must match literally. "*" matches zero or more characters that don't include a newline and don't match the character immediately following the *, if any. A "*" at the end of a pattern will not match until a complete line is received This method of pattern matching is rather fragile. The patterns have to be chosen quite carefully to avoid unexpected results. For example, at one time "* shouts: *" was used to match shouts, while "<12>" was used to match the start of a board. If someone shouted "<12>", xboard would succeed in ignoring the <12> only if all the characters from the ">" to the next newline were received at one time, so that the shout pattern could match before the start-of-board pattern was considered. (This usually happens on TCP connections, but is not guaranteed.) The patterns intentionally allow text in finger notes to be parsed and colorized as tells, shouts, etc. I did this because Zek once said that ZIICS users like this feature, even though he originally considered it a bug in ZIICS, and so he doesn't dare change it. I may eventually change it anyway so that people stop reporting it as a bug. Here is the complete list of patterns that xboard looks for, in order. The list was obtained by grepping the source code for "looking_at", my procedure for pattern-matching. Some of these are specific to FICS, some to ICC, and some may be outdated---that is, they may reflect messages that no ICS produces anymore. Occasionally the same pattern appears more than once because earlier occurrences were inside if/then/else statements. There may also be a couple of places where I do a test without calling looking_at. zippy.c (runs first if Zippy is active, otherwise skipped): "* kibitzes: Hello from Crafty" "* is in the computer list." "* * is a computer *" "* offers to be your bughouse partner" "* tells you: [automatic message] I chose you" "* agrees to be your partner" "are no longer *'s partner" "no longer have a bughouse partner" "partner has disconnected" "partner has just chosen a new partner" "* tells you: [automatic message] I'm no longer your" "* (your partner) tells you: *" "* tells you: *" "* says: *" "--> * *" "* shouts: *" "* kibitzes: *" "* whispers: *" "You have * message*." "* has left a message for you." "* just sent you a message." "--* (*:*): *" "*. * (*:*): *" "*. * at *:*: *" "*(*): *" "*(*)(*): *" "Notification: * has arrived" "Not sent -- * is censoring you" "command is currently turned off" "* * match * * requested with * (*)" "* * match * requested with * (*)" * has made an alternate proposal of * * match * *." "Challenge: * (*) *(*) * * * * Loaded from *" "Challenge: * (*) *(*) * * * * : * * Loaded from *" "Challenge: * (*) *(*) * * * * : * *" "Challenge: * (*) *(*) * * * * * *" "Challenge: * (*) *(*) * * * *" "offers you a draw" "requests that the game be aborted" "would like to abort" "requests adjournment" "would like to adjourn" backend.c: "ics%" /* right after login only; nonessential */ "chessclub.com" /* before login; turns on ICC mode */ "\"*\" is *a registered name" "Logging you in as \"*\"" "Your name will be \"*\"" "* s-shouts: " "* c-shouts: " "--->" /* seen in FICS login, not a shout */ "* shouts: " "--> " "* tells you: " "* (your partner) tells you: " "* says: " "* has left a message " "* just sent you a message:\n" "*. * (*:*): " "*. * at *:*: " "* whispers: " "* kibitzes: " "*)(*): *" /* channel tell or allobs or admin comment */ "*(*): *" /* channel tell or allobs or admin comment */ "*)(*)(*): *" /* channel tell */ "Challenge:" "* offers you" "* offers to be" "* would like to" "* requests to" "Your opponent offers" "Your opponent requests" "\\ " /* continuation line */ "Black Strength :" /* need to issue "style 12; refresh" */ "<<< style 10 board >>>" /* need to issue "style 12; refresh" */ "<10>" /* need to issue "style 12; refresh" */ "#@#" /* need to issue "style 12; refresh" */ "login:" "\n<12> " "<12> " "\n " " " "* *vs. * *--- *" /* move list coming */ "* * match, initial time: * minute*, increment: * second" "Move " /* move list is here */ "% " /* end of prompt; nonessential */ "}*" /* ends a move list */ "Adding game * to observation list" "Game notification: * (*) vs. * (*)" "Entering examine mode for game *" "has made you an examiner of game *" "Illegal move" "Not a legal move" "Your king is in check" "It isn't your turn" "It is not your move" "still have time" "not out of time" "either player is out of time" "has timeseal; checking" "added * seconds to" "seconds were added to" "clock paused" "clock resumed" "Creating: * (*)* * (*)" "Creating: * (*) [*] * (*)" "{Game * (* vs. *) *}*" "Removing game * from observation" "no longer observing game *" "Game * (*) has no examiners" "no longer examining game *" "\n" "*% " /* end of prompt; nonessential */ xboard-4.7.3/draw.h0000644000175000001440000000626012262415351011034 00000000000000/* * draw.h -- declarations shared between xboard.c and draw.c * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define DRAWABLE(X) ((cairo_surface_t *) ((X)->choice)) // defined in xboard.c void ResizeBoardWindow P((int w, int h, int inhibit)); void CreateGrid P((void)); void CreateGCs P((int redo)); void DelayedDrag P((void)); extern int lineGap, squareSize; // defined in draw.c void CreateGCs P((int redo)); void CreateAnyPieces P((void)); void CreatePNGPieces P((void)); void CreateGrid P((void)); void DrawSegment P((int x, int y, int *lastX, int *lastY, int p)); void DrawRectangle P((int left, int top, int right, int bottom, int side, int style)); void DrawEvalText P((char *buf, int cbBuf, int y)); extern Option *disp; // defined in evaldraw.c float Color P((char *col, int n)); // defined in xoptions.c void GraphExpose P((Option *opt, int x, int y, int w, int h)); xboard-4.7.3/evalgraph.c0000644000175000001440000002320512262415351012041 00000000000000/* * evalgraph.c - Evaluation graph back-end part * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancments Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // code refactored by HGM to obtain front-end / back-end separation #include "config.h" #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #include "common.h" #include "frontend.h" #include "backend.h" #include "evalgraph.h" /* Module globals */ ChessProgramStats_Move * currPvInfo; int currFirst = 0; int currLast = 0; int currCurrent = -1; int range = 1; int nWidthPB = 0; int nHeightPB = 0; int MarginX = 18; int MarginW = 4; int MarginH = 4; // back-end static void DrawLine (int x1, int y1, int x2, int y2, int penType) { DrawSegment( x1, y1, NULL, NULL, PEN_NONE ); DrawSegment( x2, y2, NULL, NULL, penType ); } // back-end static void DrawLineEx (int x1, int y1, int x2, int y2, int penType) { int savX, savY; DrawSegment( x1, y1, &savX, &savY, PEN_NONE ); DrawSegment( x2, y2, NULL, NULL, penType ); DrawSegment( savX, savY, NULL, NULL, PEN_NONE ); } // back-end static int GetPvScore (int index) { int score = currPvInfo[ index ].score; if( index & 1 ) score = -score; /* Flip score for black */ return score; } char * MakeEvalTitle (char *title) { int score, depth; static char buf[MSG_SIZ]; if( currCurrent <0 ) return title; // currCurrent = -1 crashed WB on start without ini file! score = currPvInfo[ currCurrent ].score; depth = currPvInfo[ currCurrent ].depth; if( depth <=0 ) return title; if( currCurrent & 1 ) score = -score; /* Flip score for black */ snprintf(buf, MSG_SIZ, "%s {%d: %s%.2f/%-2d %d}", title, currCurrent/2+1, score>0 ? "+" : " ", score/100., depth, (currPvInfo[currCurrent].time+50)/100); return buf; } // back-end /* For a centipawn value, this function returns the height of the corresponding histogram, centered on the reference axis. Note: height can be negative! */ static int GetValueY (int value) { if( value < -range*700 ) value = -range*700; if( value > +range*700 ) value = +range*700; if(value > 100*range) value += (appData.zoom - 1)*100*range; else if(value < -100*range) value -= (appData.zoom - 1)*100*range; else value *= appData.zoom; return (nHeightPB / 2) - (int)(value * (nHeightPB - 2*MarginH) / ((1200. + 200.*appData.zoom)*range)); } // the brush selection is made part of the DrawLine, by passing a style argument // the wrapper for doing the text output makes this back-end static void DrawAxisSegmentHoriz (int value, Boolean drawValue) { int y = GetValueY( range*value*100 ); if( drawValue ) { char buf[MSG_SIZ], *b = buf; if( value > 0 ) *b++ = '+'; sprintf(b, "%d", range*value); DrawEvalText(buf, strlen(buf), y); } // [HGM] counts on DrawEvalText to have select transparent background for dotted line! DrawLine( MarginX, y, MarginX + MarginW, y, PEN_BLACK ); // Y-axis tick marks DrawLine( MarginX + MarginW, y, nWidthPB - MarginW, y, PEN_DOTTED ); // hor grid } // The DrawLines again must select their own brush. // the initial brush selection is useless? BkMode needed for dotted line and text static void DrawAxis () { int cy = nHeightPB / 2, space = nHeightPB/(6 + appData.zoom); DrawAxisSegmentHoriz( +5, TRUE ); DrawAxisSegmentHoriz( +3, space >= 20 ); DrawAxisSegmentHoriz( +1, space >= 20 && space*appData.zoom >= 40 ); DrawAxisSegmentHoriz( 0, TRUE ); DrawAxisSegmentHoriz( -1, space >= 20 && space*appData.zoom >= 40 ); DrawAxisSegmentHoriz( -3, space >= 20 ); DrawAxisSegmentHoriz( -5, TRUE ); DrawLine( MarginX + MarginW, cy, nWidthPB - MarginW, cy, PEN_BLACK ); // x-axis DrawLine( MarginX + MarginW, MarginH, MarginX + MarginW, nHeightPB - MarginH, PEN_BLACK ); // y-axis } // back-end static void DrawHistogram (int x, int y, int width, int value, int side) { int left, top, right, bottom; if( value > -appData.evalThreshold*range && value < +appData.evalThreshold*range ) return; left = x; right = left + width + 1; if( value > 0 ) { top = GetValueY( value ); bottom = y+1; } else { top = y; bottom = GetValueY( value ) + 1; } if( width == MIN_HIST_WIDTH ) { right--; DrawRectangle( left, top, right, bottom, side, FILLED ); } else { DrawRectangle( left, top, right, bottom, side, OPEN ); } } // back-end static void DrawSeparator (int index, int x) { if( index > 0 ) { if( index == currCurrent ) { DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_BLUEDOTTED ); } else if( (index % 20) == 0 ) { DrawLineEx( x, MarginH, x, nHeightPB - MarginH, PEN_DOTTED ); } } } // made back-end by replacing MoveToEx and LineTo by DrawSegment /* Actually draw histogram as a diagram, cause there's too much data */ static void DrawHistogramAsDiagram (int cy, int paint_width, int hist_count) { double step; int i; /* Rescale the graph every few moves (as opposed to every move) */ hist_count -= hist_count % 8; hist_count += 8; hist_count /= 2; step = (double) paint_width / (hist_count + 1); for( i=0; i<2; i++ ) { int index = currFirst; int side = (currCurrent + i + 1) & 1; /* Draw current side last */ double x = MarginX + MarginW; if( (index & 1) != side ) { x += step / 2; index++; } DrawSegment( (int) x, cy, NULL, NULL, PEN_NONE ); index += 2; while( index < currLast ) { x += step; DrawSeparator( index, (int) x ); /* Extend line up to current point */ if( currPvInfo[index].depth > 0 ) { DrawSegment((int) x, GetValueY( GetPvScore(index) ), NULL, NULL, (side==0 ? PEN_BOLDWHITE: PEN_BOLDBLACK) ); } index += 2; } } } // back-end, delete pen selection static void DrawHistogramFull (int cy, int hist_width, int hist_count) { int i; // SelectObject( hdcPB, GetStockObject(BLACK_PEN) ); for( i=0; i 0 ) { DrawHistogram( x, cy, hist_width, GetPvScore(index), index & 1 ); } } } typedef struct { int cy; int hist_width; int hist_count; int paint_width; } VisualizationData; // back-end static Boolean InitVisualization (VisualizationData *vd) { Boolean result = FALSE; vd->cy = nHeightPB / 2; vd->hist_width = MIN_HIST_WIDTH; vd->hist_count = currLast - currFirst; vd->paint_width = nWidthPB - MarginX - 2*MarginW; if( vd->hist_count > 0 ) { result = TRUE; /* Compute width */ vd->hist_width = vd->paint_width / vd->hist_count; if( vd->hist_width > MAX_HIST_WIDTH ) vd->hist_width = MAX_HIST_WIDTH; vd->hist_width -= vd->hist_width % 2; } return result; } // back-end static void DrawHistograms () { VisualizationData vd; if( InitVisualization( &vd ) ) { if( vd.hist_width < MIN_HIST_WIDTH ) { DrawHistogramAsDiagram( vd.cy, vd.paint_width, vd.hist_count ); } else { DrawHistogramFull( vd.cy, vd.hist_width, vd.hist_count ); } } } // back-end int GetMoveIndexFromPoint (int x, int y) { int result = -1; int start_x = MarginX + MarginW; VisualizationData vd; if( x >= start_x && InitVisualization( &vd ) ) { /* Almost an hack here... we duplicate some of the paint logic */ if( vd.hist_width < MIN_HIST_WIDTH ) { double step; vd.hist_count -= vd.hist_count % 8; vd.hist_count += 8; vd.hist_count /= 2; step = (double) vd.paint_width / (vd.hist_count + 1); step /= 2; result = (int) (0.5 + (double) (x - start_x) / step); } else { result = (x - start_x) / vd.hist_width; } } if( result >= currLast ) { result = -1; } return result; } // init and display part split of so they can be moved to front end void PaintEvalGraph (void) { VariantClass v = gameInfo.variant; range = (gameInfo.holdingsWidth && v != VariantSuper && v != VariantGreat && v != VariantSChess) ? 2 : 1; // [HGM] double range in drop games /* Draw */ DrawRectangle(0, 0, nWidthPB, nHeightPB, 2, FILLED); DrawAxis(); DrawHistograms(); } xboard-4.7.3/book.c0000644000175000001440000013000212262415351011014 00000000000000/* * book.c -- code for probing Polyglot opening books * * This code was first released in the public domain by Michel Van den Bergh. * The array Random64 is taken from the Polyglot source code. * I am pretty sure that a table of random numbers is never protected * by copyright. * * It s adapted by H.G. Muller for working with xboard / Winboard * * The following terms apply to the enhanced version of XBoard distributed * by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * * ------------------------------------------------------------------------ */ #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "moves.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif #ifdef _MSC_VER typedef unsigned __int64 uint64; #else typedef unsigned long long int uint64; #endif #ifdef _MSC_VER # define U64(u) (u##ui64) #else # define U64(u) (u##ULL) #endif typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; typedef struct { uint64 key; uint16 move; uint16 weight; uint16 learnPoints; uint16 learnCount; } entry_t; entry_t entry_none = { 0, 0, 0, 0 }; char *promote_pieces=" nbrqac=+"; uint64 Random64[781] = { U64(0x9D39247E33776D41), U64(0x2AF7398005AAA5C7), U64(0x44DB015024623547), U64(0x9C15F73E62A76AE2), U64(0x75834465489C0C89), U64(0x3290AC3A203001BF), U64(0x0FBBAD1F61042279), U64(0xE83A908FF2FB60CA), U64(0x0D7E765D58755C10), U64(0x1A083822CEAFE02D), U64(0x9605D5F0E25EC3B0), U64(0xD021FF5CD13A2ED5), U64(0x40BDF15D4A672E32), U64(0x011355146FD56395), U64(0x5DB4832046F3D9E5), U64(0x239F8B2D7FF719CC), U64(0x05D1A1AE85B49AA1), U64(0x679F848F6E8FC971), U64(0x7449BBFF801FED0B), U64(0x7D11CDB1C3B7ADF0), U64(0x82C7709E781EB7CC), U64(0xF3218F1C9510786C), U64(0x331478F3AF51BBE6), U64(0x4BB38DE5E7219443), U64(0xAA649C6EBCFD50FC), U64(0x8DBD98A352AFD40B), U64(0x87D2074B81D79217), U64(0x19F3C751D3E92AE1), U64(0xB4AB30F062B19ABF), U64(0x7B0500AC42047AC4), U64(0xC9452CA81A09D85D), U64(0x24AA6C514DA27500), U64(0x4C9F34427501B447), U64(0x14A68FD73C910841), U64(0xA71B9B83461CBD93), U64(0x03488B95B0F1850F), U64(0x637B2B34FF93C040), U64(0x09D1BC9A3DD90A94), U64(0x3575668334A1DD3B), U64(0x735E2B97A4C45A23), U64(0x18727070F1BD400B), U64(0x1FCBACD259BF02E7), U64(0xD310A7C2CE9B6555), U64(0xBF983FE0FE5D8244), U64(0x9F74D14F7454A824), U64(0x51EBDC4AB9BA3035), U64(0x5C82C505DB9AB0FA), U64(0xFCF7FE8A3430B241), U64(0x3253A729B9BA3DDE), U64(0x8C74C368081B3075), U64(0xB9BC6C87167C33E7), U64(0x7EF48F2B83024E20), U64(0x11D505D4C351BD7F), U64(0x6568FCA92C76A243), U64(0x4DE0B0F40F32A7B8), U64(0x96D693460CC37E5D), U64(0x42E240CB63689F2F), U64(0x6D2BDCDAE2919661), U64(0x42880B0236E4D951), U64(0x5F0F4A5898171BB6), U64(0x39F890F579F92F88), U64(0x93C5B5F47356388B), U64(0x63DC359D8D231B78), U64(0xEC16CA8AEA98AD76), U64(0x5355F900C2A82DC7), U64(0x07FB9F855A997142), U64(0x5093417AA8A7ED5E), U64(0x7BCBC38DA25A7F3C), U64(0x19FC8A768CF4B6D4), U64(0x637A7780DECFC0D9), U64(0x8249A47AEE0E41F7), U64(0x79AD695501E7D1E8), U64(0x14ACBAF4777D5776), U64(0xF145B6BECCDEA195), U64(0xDABF2AC8201752FC), U64(0x24C3C94DF9C8D3F6), U64(0xBB6E2924F03912EA), U64(0x0CE26C0B95C980D9), U64(0xA49CD132BFBF7CC4), U64(0xE99D662AF4243939), U64(0x27E6AD7891165C3F), U64(0x8535F040B9744FF1), U64(0x54B3F4FA5F40D873), U64(0x72B12C32127FED2B), U64(0xEE954D3C7B411F47), U64(0x9A85AC909A24EAA1), U64(0x70AC4CD9F04F21F5), U64(0xF9B89D3E99A075C2), U64(0x87B3E2B2B5C907B1), U64(0xA366E5B8C54F48B8), U64(0xAE4A9346CC3F7CF2), U64(0x1920C04D47267BBD), U64(0x87BF02C6B49E2AE9), U64(0x092237AC237F3859), U64(0xFF07F64EF8ED14D0), U64(0x8DE8DCA9F03CC54E), U64(0x9C1633264DB49C89), U64(0xB3F22C3D0B0B38ED), U64(0x390E5FB44D01144B), U64(0x5BFEA5B4712768E9), U64(0x1E1032911FA78984), U64(0x9A74ACB964E78CB3), U64(0x4F80F7A035DAFB04), U64(0x6304D09A0B3738C4), U64(0x2171E64683023A08), U64(0x5B9B63EB9CEFF80C), U64(0x506AACF489889342), U64(0x1881AFC9A3A701D6), U64(0x6503080440750644), U64(0xDFD395339CDBF4A7), U64(0xEF927DBCF00C20F2), U64(0x7B32F7D1E03680EC), U64(0xB9FD7620E7316243), U64(0x05A7E8A57DB91B77), U64(0xB5889C6E15630A75), U64(0x4A750A09CE9573F7), U64(0xCF464CEC899A2F8A), U64(0xF538639CE705B824), U64(0x3C79A0FF5580EF7F), U64(0xEDE6C87F8477609D), U64(0x799E81F05BC93F31), U64(0x86536B8CF3428A8C), U64(0x97D7374C60087B73), U64(0xA246637CFF328532), U64(0x043FCAE60CC0EBA0), U64(0x920E449535DD359E), U64(0x70EB093B15B290CC), U64(0x73A1921916591CBD), U64(0x56436C9FE1A1AA8D), U64(0xEFAC4B70633B8F81), U64(0xBB215798D45DF7AF), U64(0x45F20042F24F1768), U64(0x930F80F4E8EB7462), U64(0xFF6712FFCFD75EA1), U64(0xAE623FD67468AA70), U64(0xDD2C5BC84BC8D8FC), U64(0x7EED120D54CF2DD9), U64(0x22FE545401165F1C), U64(0xC91800E98FB99929), U64(0x808BD68E6AC10365), U64(0xDEC468145B7605F6), U64(0x1BEDE3A3AEF53302), U64(0x43539603D6C55602), U64(0xAA969B5C691CCB7A), U64(0xA87832D392EFEE56), U64(0x65942C7B3C7E11AE), U64(0xDED2D633CAD004F6), U64(0x21F08570F420E565), U64(0xB415938D7DA94E3C), U64(0x91B859E59ECB6350), U64(0x10CFF333E0ED804A), U64(0x28AED140BE0BB7DD), U64(0xC5CC1D89724FA456), U64(0x5648F680F11A2741), U64(0x2D255069F0B7DAB3), U64(0x9BC5A38EF729ABD4), U64(0xEF2F054308F6A2BC), U64(0xAF2042F5CC5C2858), U64(0x480412BAB7F5BE2A), U64(0xAEF3AF4A563DFE43), U64(0x19AFE59AE451497F), U64(0x52593803DFF1E840), U64(0xF4F076E65F2CE6F0), U64(0x11379625747D5AF3), U64(0xBCE5D2248682C115), U64(0x9DA4243DE836994F), U64(0x066F70B33FE09017), U64(0x4DC4DE189B671A1C), U64(0x51039AB7712457C3), U64(0xC07A3F80C31FB4B4), U64(0xB46EE9C5E64A6E7C), U64(0xB3819A42ABE61C87), U64(0x21A007933A522A20), U64(0x2DF16F761598AA4F), U64(0x763C4A1371B368FD), U64(0xF793C46702E086A0), U64(0xD7288E012AEB8D31), U64(0xDE336A2A4BC1C44B), U64(0x0BF692B38D079F23), U64(0x2C604A7A177326B3), U64(0x4850E73E03EB6064), U64(0xCFC447F1E53C8E1B), U64(0xB05CA3F564268D99), U64(0x9AE182C8BC9474E8), U64(0xA4FC4BD4FC5558CA), U64(0xE755178D58FC4E76), U64(0x69B97DB1A4C03DFE), U64(0xF9B5B7C4ACC67C96), U64(0xFC6A82D64B8655FB), U64(0x9C684CB6C4D24417), U64(0x8EC97D2917456ED0), U64(0x6703DF9D2924E97E), U64(0xC547F57E42A7444E), U64(0x78E37644E7CAD29E), U64(0xFE9A44E9362F05FA), U64(0x08BD35CC38336615), U64(0x9315E5EB3A129ACE), U64(0x94061B871E04DF75), U64(0xDF1D9F9D784BA010), U64(0x3BBA57B68871B59D), U64(0xD2B7ADEEDED1F73F), U64(0xF7A255D83BC373F8), U64(0xD7F4F2448C0CEB81), U64(0xD95BE88CD210FFA7), U64(0x336F52F8FF4728E7), U64(0xA74049DAC312AC71), U64(0xA2F61BB6E437FDB5), U64(0x4F2A5CB07F6A35B3), U64(0x87D380BDA5BF7859), U64(0x16B9F7E06C453A21), U64(0x7BA2484C8A0FD54E), U64(0xF3A678CAD9A2E38C), U64(0x39B0BF7DDE437BA2), U64(0xFCAF55C1BF8A4424), U64(0x18FCF680573FA594), U64(0x4C0563B89F495AC3), U64(0x40E087931A00930D), U64(0x8CFFA9412EB642C1), U64(0x68CA39053261169F), U64(0x7A1EE967D27579E2), U64(0x9D1D60E5076F5B6F), U64(0x3810E399B6F65BA2), U64(0x32095B6D4AB5F9B1), U64(0x35CAB62109DD038A), U64(0xA90B24499FCFAFB1), U64(0x77A225A07CC2C6BD), U64(0x513E5E634C70E331), U64(0x4361C0CA3F692F12), U64(0xD941ACA44B20A45B), U64(0x528F7C8602C5807B), U64(0x52AB92BEB9613989), U64(0x9D1DFA2EFC557F73), U64(0x722FF175F572C348), U64(0x1D1260A51107FE97), U64(0x7A249A57EC0C9BA2), U64(0x04208FE9E8F7F2D6), U64(0x5A110C6058B920A0), U64(0x0CD9A497658A5698), U64(0x56FD23C8F9715A4C), U64(0x284C847B9D887AAE), U64(0x04FEABFBBDB619CB), U64(0x742E1E651C60BA83), U64(0x9A9632E65904AD3C), U64(0x881B82A13B51B9E2), U64(0x506E6744CD974924), U64(0xB0183DB56FFC6A79), U64(0x0ED9B915C66ED37E), U64(0x5E11E86D5873D484), U64(0xF678647E3519AC6E), U64(0x1B85D488D0F20CC5), U64(0xDAB9FE6525D89021), U64(0x0D151D86ADB73615), U64(0xA865A54EDCC0F019), U64(0x93C42566AEF98FFB), U64(0x99E7AFEABE000731), U64(0x48CBFF086DDF285A), U64(0x7F9B6AF1EBF78BAF), U64(0x58627E1A149BBA21), U64(0x2CD16E2ABD791E33), U64(0xD363EFF5F0977996), U64(0x0CE2A38C344A6EED), U64(0x1A804AADB9CFA741), U64(0x907F30421D78C5DE), U64(0x501F65EDB3034D07), U64(0x37624AE5A48FA6E9), U64(0x957BAF61700CFF4E), U64(0x3A6C27934E31188A), U64(0xD49503536ABCA345), U64(0x088E049589C432E0), U64(0xF943AEE7FEBF21B8), U64(0x6C3B8E3E336139D3), U64(0x364F6FFA464EE52E), U64(0xD60F6DCEDC314222), U64(0x56963B0DCA418FC0), U64(0x16F50EDF91E513AF), U64(0xEF1955914B609F93), U64(0x565601C0364E3228), U64(0xECB53939887E8175), U64(0xBAC7A9A18531294B), U64(0xB344C470397BBA52), U64(0x65D34954DAF3CEBD), U64(0xB4B81B3FA97511E2), U64(0xB422061193D6F6A7), U64(0x071582401C38434D), U64(0x7A13F18BBEDC4FF5), U64(0xBC4097B116C524D2), U64(0x59B97885E2F2EA28), U64(0x99170A5DC3115544), U64(0x6F423357E7C6A9F9), U64(0x325928EE6E6F8794), U64(0xD0E4366228B03343), U64(0x565C31F7DE89EA27), U64(0x30F5611484119414), U64(0xD873DB391292ED4F), U64(0x7BD94E1D8E17DEBC), U64(0xC7D9F16864A76E94), U64(0x947AE053EE56E63C), U64(0xC8C93882F9475F5F), U64(0x3A9BF55BA91F81CA), U64(0xD9A11FBB3D9808E4), U64(0x0FD22063EDC29FCA), U64(0xB3F256D8ACA0B0B9), U64(0xB03031A8B4516E84), U64(0x35DD37D5871448AF), U64(0xE9F6082B05542E4E), U64(0xEBFAFA33D7254B59), U64(0x9255ABB50D532280), U64(0xB9AB4CE57F2D34F3), U64(0x693501D628297551), U64(0xC62C58F97DD949BF), U64(0xCD454F8F19C5126A), U64(0xBBE83F4ECC2BDECB), U64(0xDC842B7E2819E230), U64(0xBA89142E007503B8), U64(0xA3BC941D0A5061CB), U64(0xE9F6760E32CD8021), U64(0x09C7E552BC76492F), U64(0x852F54934DA55CC9), U64(0x8107FCCF064FCF56), U64(0x098954D51FFF6580), U64(0x23B70EDB1955C4BF), U64(0xC330DE426430F69D), U64(0x4715ED43E8A45C0A), U64(0xA8D7E4DAB780A08D), U64(0x0572B974F03CE0BB), U64(0xB57D2E985E1419C7), U64(0xE8D9ECBE2CF3D73F), U64(0x2FE4B17170E59750), U64(0x11317BA87905E790), U64(0x7FBF21EC8A1F45EC), U64(0x1725CABFCB045B00), U64(0x964E915CD5E2B207), U64(0x3E2B8BCBF016D66D), U64(0xBE7444E39328A0AC), U64(0xF85B2B4FBCDE44B7), U64(0x49353FEA39BA63B1), U64(0x1DD01AAFCD53486A), U64(0x1FCA8A92FD719F85), U64(0xFC7C95D827357AFA), U64(0x18A6A990C8B35EBD), U64(0xCCCB7005C6B9C28D), U64(0x3BDBB92C43B17F26), U64(0xAA70B5B4F89695A2), U64(0xE94C39A54A98307F), U64(0xB7A0B174CFF6F36E), U64(0xD4DBA84729AF48AD), U64(0x2E18BC1AD9704A68), U64(0x2DE0966DAF2F8B1C), U64(0xB9C11D5B1E43A07E), U64(0x64972D68DEE33360), U64(0x94628D38D0C20584), U64(0xDBC0D2B6AB90A559), U64(0xD2733C4335C6A72F), U64(0x7E75D99D94A70F4D), U64(0x6CED1983376FA72B), U64(0x97FCAACBF030BC24), U64(0x7B77497B32503B12), U64(0x8547EDDFB81CCB94), U64(0x79999CDFF70902CB), U64(0xCFFE1939438E9B24), U64(0x829626E3892D95D7), U64(0x92FAE24291F2B3F1), U64(0x63E22C147B9C3403), U64(0xC678B6D860284A1C), U64(0x5873888850659AE7), U64(0x0981DCD296A8736D), U64(0x9F65789A6509A440), U64(0x9FF38FED72E9052F), U64(0xE479EE5B9930578C), U64(0xE7F28ECD2D49EECD), U64(0x56C074A581EA17FE), U64(0x5544F7D774B14AEF), U64(0x7B3F0195FC6F290F), U64(0x12153635B2C0CF57), U64(0x7F5126DBBA5E0CA7), U64(0x7A76956C3EAFB413), U64(0x3D5774A11D31AB39), U64(0x8A1B083821F40CB4), U64(0x7B4A38E32537DF62), U64(0x950113646D1D6E03), U64(0x4DA8979A0041E8A9), U64(0x3BC36E078F7515D7), U64(0x5D0A12F27AD310D1), U64(0x7F9D1A2E1EBE1327), U64(0xDA3A361B1C5157B1), U64(0xDCDD7D20903D0C25), U64(0x36833336D068F707), U64(0xCE68341F79893389), U64(0xAB9090168DD05F34), U64(0x43954B3252DC25E5), U64(0xB438C2B67F98E5E9), U64(0x10DCD78E3851A492), U64(0xDBC27AB5447822BF), U64(0x9B3CDB65F82CA382), U64(0xB67B7896167B4C84), U64(0xBFCED1B0048EAC50), U64(0xA9119B60369FFEBD), U64(0x1FFF7AC80904BF45), U64(0xAC12FB171817EEE7), U64(0xAF08DA9177DDA93D), U64(0x1B0CAB936E65C744), U64(0xB559EB1D04E5E932), U64(0xC37B45B3F8D6F2BA), U64(0xC3A9DC228CAAC9E9), U64(0xF3B8B6675A6507FF), U64(0x9FC477DE4ED681DA), U64(0x67378D8ECCEF96CB), U64(0x6DD856D94D259236), U64(0xA319CE15B0B4DB31), U64(0x073973751F12DD5E), U64(0x8A8E849EB32781A5), U64(0xE1925C71285279F5), U64(0x74C04BF1790C0EFE), U64(0x4DDA48153C94938A), U64(0x9D266D6A1CC0542C), U64(0x7440FB816508C4FE), U64(0x13328503DF48229F), U64(0xD6BF7BAEE43CAC40), U64(0x4838D65F6EF6748F), U64(0x1E152328F3318DEA), U64(0x8F8419A348F296BF), U64(0x72C8834A5957B511), U64(0xD7A023A73260B45C), U64(0x94EBC8ABCFB56DAE), U64(0x9FC10D0F989993E0), U64(0xDE68A2355B93CAE6), U64(0xA44CFE79AE538BBE), U64(0x9D1D84FCCE371425), U64(0x51D2B1AB2DDFB636), U64(0x2FD7E4B9E72CD38C), U64(0x65CA5B96B7552210), U64(0xDD69A0D8AB3B546D), U64(0x604D51B25FBF70E2), U64(0x73AA8A564FB7AC9E), U64(0x1A8C1E992B941148), U64(0xAAC40A2703D9BEA0), U64(0x764DBEAE7FA4F3A6), U64(0x1E99B96E70A9BE8B), U64(0x2C5E9DEB57EF4743), U64(0x3A938FEE32D29981), U64(0x26E6DB8FFDF5ADFE), U64(0x469356C504EC9F9D), U64(0xC8763C5B08D1908C), U64(0x3F6C6AF859D80055), U64(0x7F7CC39420A3A545), U64(0x9BFB227EBDF4C5CE), U64(0x89039D79D6FC5C5C), U64(0x8FE88B57305E2AB6), U64(0xA09E8C8C35AB96DE), U64(0xFA7E393983325753), U64(0xD6B6D0ECC617C699), U64(0xDFEA21EA9E7557E3), U64(0xB67C1FA481680AF8), U64(0xCA1E3785A9E724E5), U64(0x1CFC8BED0D681639), U64(0xD18D8549D140CAEA), U64(0x4ED0FE7E9DC91335), U64(0xE4DBF0634473F5D2), U64(0x1761F93A44D5AEFE), U64(0x53898E4C3910DA55), U64(0x734DE8181F6EC39A), U64(0x2680B122BAA28D97), U64(0x298AF231C85BAFAB), U64(0x7983EED3740847D5), U64(0x66C1A2A1A60CD889), U64(0x9E17E49642A3E4C1), U64(0xEDB454E7BADC0805), U64(0x50B704CAB602C329), U64(0x4CC317FB9CDDD023), U64(0x66B4835D9EAFEA22), U64(0x219B97E26FFC81BD), U64(0x261E4E4C0A333A9D), U64(0x1FE2CCA76517DB90), U64(0xD7504DFA8816EDBB), U64(0xB9571FA04DC089C8), U64(0x1DDC0325259B27DE), U64(0xCF3F4688801EB9AA), U64(0xF4F5D05C10CAB243), U64(0x38B6525C21A42B0E), U64(0x36F60E2BA4FA6800), U64(0xEB3593803173E0CE), U64(0x9C4CD6257C5A3603), U64(0xAF0C317D32ADAA8A), U64(0x258E5A80C7204C4B), U64(0x8B889D624D44885D), U64(0xF4D14597E660F855), U64(0xD4347F66EC8941C3), U64(0xE699ED85B0DFB40D), U64(0x2472F6207C2D0484), U64(0xC2A1E7B5B459AEB5), U64(0xAB4F6451CC1D45EC), U64(0x63767572AE3D6174), U64(0xA59E0BD101731A28), U64(0x116D0016CB948F09), U64(0x2CF9C8CA052F6E9F), U64(0x0B090A7560A968E3), U64(0xABEEDDB2DDE06FF1), U64(0x58EFC10B06A2068D), U64(0xC6E57A78FBD986E0), U64(0x2EAB8CA63CE802D7), U64(0x14A195640116F336), U64(0x7C0828DD624EC390), U64(0xD74BBE77E6116AC7), U64(0x804456AF10F5FB53), U64(0xEBE9EA2ADF4321C7), U64(0x03219A39EE587A30), U64(0x49787FEF17AF9924), U64(0xA1E9300CD8520548), U64(0x5B45E522E4B1B4EF), U64(0xB49C3B3995091A36), U64(0xD4490AD526F14431), U64(0x12A8F216AF9418C2), U64(0x001F837CC7350524), U64(0x1877B51E57A764D5), U64(0xA2853B80F17F58EE), U64(0x993E1DE72D36D310), U64(0xB3598080CE64A656), U64(0x252F59CF0D9F04BB), U64(0xD23C8E176D113600), U64(0x1BDA0492E7E4586E), U64(0x21E0BD5026C619BF), U64(0x3B097ADAF088F94E), U64(0x8D14DEDB30BE846E), U64(0xF95CFFA23AF5F6F4), U64(0x3871700761B3F743), U64(0xCA672B91E9E4FA16), U64(0x64C8E531BFF53B55), U64(0x241260ED4AD1E87D), U64(0x106C09B972D2E822), U64(0x7FBA195410E5CA30), U64(0x7884D9BC6CB569D8), U64(0x0647DFEDCD894A29), U64(0x63573FF03E224774), U64(0x4FC8E9560F91B123), U64(0x1DB956E450275779), U64(0xB8D91274B9E9D4FB), U64(0xA2EBEE47E2FBFCE1), U64(0xD9F1F30CCD97FB09), U64(0xEFED53D75FD64E6B), U64(0x2E6D02C36017F67F), U64(0xA9AA4D20DB084E9B), U64(0xB64BE8D8B25396C1), U64(0x70CB6AF7C2D5BCF0), U64(0x98F076A4F7A2322E), U64(0xBF84470805E69B5F), U64(0x94C3251F06F90CF3), U64(0x3E003E616A6591E9), U64(0xB925A6CD0421AFF3), U64(0x61BDD1307C66E300), U64(0xBF8D5108E27E0D48), U64(0x240AB57A8B888B20), U64(0xFC87614BAF287E07), U64(0xEF02CDD06FFDB432), U64(0xA1082C0466DF6C0A), U64(0x8215E577001332C8), U64(0xD39BB9C3A48DB6CF), U64(0x2738259634305C14), U64(0x61CF4F94C97DF93D), U64(0x1B6BACA2AE4E125B), U64(0x758F450C88572E0B), U64(0x959F587D507A8359), U64(0xB063E962E045F54D), U64(0x60E8ED72C0DFF5D1), U64(0x7B64978555326F9F), U64(0xFD080D236DA814BA), U64(0x8C90FD9B083F4558), U64(0x106F72FE81E2C590), U64(0x7976033A39F7D952), U64(0xA4EC0132764CA04B), U64(0x733EA705FAE4FA77), U64(0xB4D8F77BC3E56167), U64(0x9E21F4F903B33FD9), U64(0x9D765E419FB69F6D), U64(0xD30C088BA61EA5EF), U64(0x5D94337FBFAF7F5B), U64(0x1A4E4822EB4D7A59), U64(0x6FFE73E81B637FB3), U64(0xDDF957BC36D8B9CA), U64(0x64D0E29EEA8838B3), U64(0x08DD9BDFD96B9F63), U64(0x087E79E5A57D1D13), U64(0xE328E230E3E2B3FB), U64(0x1C2559E30F0946BE), U64(0x720BF5F26F4D2EAA), U64(0xB0774D261CC609DB), U64(0x443F64EC5A371195), U64(0x4112CF68649A260E), U64(0xD813F2FAB7F5C5CA), U64(0x660D3257380841EE), U64(0x59AC2C7873F910A3), U64(0xE846963877671A17), U64(0x93B633ABFA3469F8), U64(0xC0C0F5A60EF4CDCF), U64(0xCAF21ECD4377B28C), U64(0x57277707199B8175), U64(0x506C11B9D90E8B1D), U64(0xD83CC2687A19255F), U64(0x4A29C6465A314CD1), U64(0xED2DF21216235097), U64(0xB5635C95FF7296E2), U64(0x22AF003AB672E811), U64(0x52E762596BF68235), U64(0x9AEBA33AC6ECC6B0), U64(0x944F6DE09134DFB6), U64(0x6C47BEC883A7DE39), U64(0x6AD047C430A12104), U64(0xA5B1CFDBA0AB4067), U64(0x7C45D833AFF07862), U64(0x5092EF950A16DA0B), U64(0x9338E69C052B8E7B), U64(0x455A4B4CFE30E3F5), U64(0x6B02E63195AD0CF8), U64(0x6B17B224BAD6BF27), U64(0xD1E0CCD25BB9C169), U64(0xDE0C89A556B9AE70), U64(0x50065E535A213CF6), U64(0x9C1169FA2777B874), U64(0x78EDEFD694AF1EED), U64(0x6DC93D9526A50E68), U64(0xEE97F453F06791ED), U64(0x32AB0EDB696703D3), U64(0x3A6853C7E70757A7), U64(0x31865CED6120F37D), U64(0x67FEF95D92607890), U64(0x1F2B1D1F15F6DC9C), U64(0xB69E38A8965C6B65), U64(0xAA9119FF184CCCF4), U64(0xF43C732873F24C13), U64(0xFB4A3D794A9A80D2), U64(0x3550C2321FD6109C), U64(0x371F77E76BB8417E), U64(0x6BFA9AAE5EC05779), U64(0xCD04F3FF001A4778), U64(0xE3273522064480CA), U64(0x9F91508BFFCFC14A), U64(0x049A7F41061A9E60), U64(0xFCB6BE43A9F2FE9B), U64(0x08DE8A1C7797DA9B), U64(0x8F9887E6078735A1), U64(0xB5B4071DBFC73A66), U64(0x230E343DFBA08D33), U64(0x43ED7F5A0FAE657D), U64(0x3A88A0FBBCB05C63), U64(0x21874B8B4D2DBC4F), U64(0x1BDEA12E35F6A8C9), U64(0x53C065C6C8E63528), U64(0xE34A1D250E7A8D6B), U64(0xD6B04D3B7651DD7E), U64(0x5E90277E7CB39E2D), U64(0x2C046F22062DC67D), U64(0xB10BB459132D0A26), U64(0x3FA9DDFB67E2F199), U64(0x0E09B88E1914F7AF), U64(0x10E8B35AF3EEAB37), U64(0x9EEDECA8E272B933), U64(0xD4C718BC4AE8AE5F), U64(0x81536D601170FC20), U64(0x91B534F885818A06), U64(0xEC8177F83F900978), U64(0x190E714FADA5156E), U64(0xB592BF39B0364963), U64(0x89C350C893AE7DC1), U64(0xAC042E70F8B383F2), U64(0xB49B52E587A1EE60), U64(0xFB152FE3FF26DA89), U64(0x3E666E6F69AE2C15), U64(0x3B544EBE544C19F9), U64(0xE805A1E290CF2456), U64(0x24B33C9D7ED25117), U64(0xE74733427B72F0C1), U64(0x0A804D18B7097475), U64(0x57E3306D881EDB4F), U64(0x4AE7D6A36EB5DBCB), U64(0x2D8D5432157064C8), U64(0xD1E649DE1E7F268B), U64(0x8A328A1CEDFE552C), U64(0x07A3AEC79624C7DA), U64(0x84547DDC3E203C94), U64(0x990A98FD5071D263), U64(0x1A4FF12616EEFC89), U64(0xF6F7FD1431714200), U64(0x30C05B1BA332F41C), U64(0x8D2636B81555A786), U64(0x46C9FEB55D120902), U64(0xCCEC0A73B49C9921), U64(0x4E9D2827355FC492), U64(0x19EBB029435DCB0F), U64(0x4659D2B743848A2C), U64(0x963EF2C96B33BE31), U64(0x74F85198B05A2E7D), U64(0x5A0F544DD2B1FB18), U64(0x03727073C2E134B1), U64(0xC7F6AA2DE59AEA61), U64(0x352787BAA0D7C22F), U64(0x9853EAB63B5E0B35), U64(0xABBDCDD7ED5C0860), U64(0xCF05DAF5AC8D77B0), U64(0x49CAD48CEBF4A71E), U64(0x7A4C10EC2158C4A6), U64(0xD9E92AA246BF719E), U64(0x13AE978D09FE5557), U64(0x730499AF921549FF), U64(0x4E4B705B92903BA4), U64(0xFF577222C14F0A3A), U64(0x55B6344CF97AAFAE), U64(0xB862225B055B6960), U64(0xCAC09AFBDDD2CDB4), U64(0xDAF8E9829FE96B5F), U64(0xB5FDFC5D3132C498), U64(0x310CB380DB6F7503), U64(0xE87FBB46217A360E), U64(0x2102AE466EBB1148), U64(0xF8549E1A3AA5E00D), U64(0x07A69AFDCC42261A), U64(0xC4C118BFE78FEAAE), U64(0xF9F4892ED96BD438), U64(0x1AF3DBE25D8F45DA), U64(0xF5B4B0B0D2DEEEB4), U64(0x962ACEEFA82E1C84), U64(0x046E3ECAAF453CE9), U64(0xF05D129681949A4C), U64(0x964781CE734B3C84), U64(0x9C2ED44081CE5FBD), U64(0x522E23F3925E319E), U64(0x177E00F9FC32F791), U64(0x2BC60A63A6F3B3F2), U64(0x222BBFAE61725606), U64(0x486289DDCC3D6780), U64(0x7DC7785B8EFDFC80), U64(0x8AF38731C02BA980), U64(0x1FAB64EA29A2DDF7), U64(0xE4D9429322CD065A), U64(0x9DA058C67844F20C), U64(0x24C0E332B70019B0), U64(0x233003B5A6CFE6AD), U64(0xD586BD01C5C217F6), U64(0x5E5637885F29BC2B), U64(0x7EBA726D8C94094B), U64(0x0A56A5F0BFE39272), U64(0xD79476A84EE20D06), U64(0x9E4C1269BAA4BF37), U64(0x17EFEE45B0DEE640), U64(0x1D95B0A5FCF90BC6), U64(0x93CBE0B699C2585D), U64(0x65FA4F227A2B6D79), U64(0xD5F9E858292504D5), U64(0xC2B5A03F71471A6F), U64(0x59300222B4561E00), U64(0xCE2F8642CA0712DC), U64(0x7CA9723FBB2E8988), U64(0x2785338347F2BA08), U64(0xC61BB3A141E50E8C), U64(0x150F361DAB9DEC26), U64(0x9F6A419D382595F4), U64(0x64A53DC924FE7AC9), U64(0x142DE49FFF7A7C3D), U64(0x0C335248857FA9E7), U64(0x0A9C32D5EAE45305), U64(0xE6C42178C4BBB92E), U64(0x71F1CE2490D20B07), U64(0xF1BCC3D275AFE51A), U64(0xE728E8C83C334074), U64(0x96FBF83A12884624), U64(0x81A1549FD6573DA5), U64(0x5FA7867CAF35E149), U64(0x56986E2EF3ED091B), U64(0x917F1DD5F8886C61), U64(0xD20D8C88C8FFE65F), U64(0x31D71DCE64B2C310), U64(0xF165B587DF898190), U64(0xA57E6339DD2CF3A0), U64(0x1EF6E6DBB1961EC9), U64(0x70CC73D90BC26E24), U64(0xE21A6B35DF0C3AD7), U64(0x003A93D8B2806962), U64(0x1C99DED33CB890A1), U64(0xCF3145DE0ADD4289), U64(0xD0E4427A5514FB72), U64(0x77C621CC9FB3A483), U64(0x67A34DAC4356550B), U64(0xF8D626AAAF278509), }; uint64 *RandomPiece =Random64; uint64 *RandomCastle =Random64+768; uint64 *RandomEnPassant =Random64+772; uint64 *RandomTurn =Random64+780; uint64 hash (int moveNr) { int r, f, p_enc, squareNr, pieceGroup; uint64 key=0, holdingsKey=0, Zobrist; VariantClass v = gameInfo.variant; switch(v) { case VariantNormal: case VariantFischeRandom: // compatible with normal case VariantNoCastle: case VariantXiangqi: // for historic reasons; does never collide anyway because of other King type break; case VariantGiveaway: // in opening same as suicide key += VariantSuicide; break; case VariantGothic: // these are special cases of CRC, and can share book case VariantCapablanca: v = VariantCapaRandom; default: key += v; // variant type incorporated in key to allow mixed books without collisions } for(f=0; f= (int)BlackPawn) ? (int)BlackPawn :(int)WhitePawn; if(j > (int)WhiteQueen) j++; // make space for King if(j > (int) WhiteKing) j = (int)WhiteQueen + 1; p_enc = 2*j + ((int)p < (int)BlackPawn); // holdings squares get nmbers immediately after board; first left, then right holdings if(f == BOARD_LEFT-2) squareNr = (BOARD_RGHT - BOARD_LEFT)*BOARD_HEIGHT + r; else if(f == BOARD_RGHT+1) squareNr = (BOARD_RGHT - BOARD_LEFT + 1)*BOARD_HEIGHT + r; else squareNr = (BOARD_RGHT - BOARD_LEFT)*r + (f - BOARD_LEFT); // note that in normal Chess squareNr < 64 and p_enc < 12. The following code // maps other pieces and squares in this range, and then modify the corresponding // Zobrist random by rotating its bitpattern according to what the piece really was. pieceGroup = p_enc / 12; p_enc = p_enc % 12; Zobrist = RandomPiece[64*p_enc + (squareNr & 63)]; switch(pieceGroup) { case 1: // pieces 5-10 (FEACWM) Zobrist = (Zobrist << 16) ^ (Zobrist >> 48); break; case 2: // pieces 11-16 (OHIJGD) Zobrist = (Zobrist << 32) ^ (Zobrist >> 32); break; case 3: // pieces 17-20 (VLSU) Zobrist = (Zobrist << 48) ^ (Zobrist >> 16); break; } if(squareNr >= 64) Zobrist = (Zobrist << 8) ^ (Zobrist >> 56); // holdings have separate (additive) key, to encode presence of multiple pieces on same square if(f == BOARD_LEFT-2) holdingsKey += Zobrist * boards[moveNr][r][f+1]; else if(f == BOARD_RGHT+1) holdingsKey += Zobrist * boards[moveNr][r][f-1]; else key ^= Zobrist; } } } if(boards[moveNr][CASTLING][2] != NoRights) { if(boards[moveNr][CASTLING][0] != NoRights) key^=RandomCastle[0]; if(boards[moveNr][CASTLING][1] != NoRights) key^=RandomCastle[1]; } if(boards[moveNr][CASTLING][5] != NoRights) { if(boards[moveNr][CASTLING][3] != NoRights) key^=RandomCastle[2]; if(boards[moveNr][CASTLING][4] != NoRights) key^=RandomCastle[3]; } f = boards[moveNr][EP_STATUS]; if(f >= 0 && f < 8){ if(!WhiteOnMove(moveNr)){ // the test for neighboring Pawns might not be needed, // as epStatus already kept track of it, but better safe than sorry. if((f>0 && boards[moveNr][3][f-1]==BlackPawn)|| (f<7 && boards[moveNr][3][f+1]==BlackPawn)){ key^=RandomEnPassant[f]; } }else{ if((f>0 && boards[moveNr][4][f-1]==WhitePawn)|| (f<7 && boards[moveNr][4][f+1]==WhitePawn)){ key^=RandomEnPassant[f]; } } } if(WhiteOnMove(moveNr)){ key^=RandomTurn[0]; } return key + holdingsKey; } #define MOVE_BUF 100 // fs routines read from memory buffer if no file specified static unsigned char *memBuf, *memPtr; static int bufSize; Boolean mcMode; int fsseek (FILE *f, int n, int mode) { if(f) return fseek(f, n, mode); if(mode == SEEK_SET) memPtr = memBuf + n; else if(mode == SEEK_END) memPtr = memBuf + 16*bufSize + n; return memPtr < memBuf || memPtr > memBuf + 16*bufSize; } int fstell (FILE *f) { if(f) return ftell(f); return memPtr - memBuf; } int fsgetc (FILE *f) { if(f) return fgetc(f); if(memPtr >= memBuf + 16*bufSize) return EOF; return *memPtr++ ; } int int_from_file (FILE *f, int l, uint64 *r) { int i,c; for(i=0;ikey=r; ret=int_from_file(f,2,&r); if(ret) return 1; entry->move=r; ret=int_from_file(f,2,&r); if(ret) return 1; entry->weight=r; ret=int_from_file(f,2,&r); if(ret) return 1; entry->learnCount=r; ret=int_from_file(f,2,&r); if(ret) return 1; entry->learnPoints=r; return 0; } int find_key (FILE *f, uint64 key, entry_t *entry) { int first, last, middle; entry_t last_entry,middle_entry; first=-1; if(fsseek(f,-16,SEEK_END)){ *entry=entry_none; entry->key=key+1; //hack return -1; } last=fstell(f)/16; entry_from_file(f,&last_entry); while(1){ if(last-first==1){ *entry=last_entry; return last; } middle=(first+last)/2; fsseek(f,16*middle,SEEK_SET); entry_from_file(f,&middle_entry); if(key<=middle_entry.key){ last=middle; last_entry=middle_entry; }else{ first=middle; } } } void move_to_string (char move_s[6], uint16 move) { int f,fr,ff,t,tr,tf,p; int width = BOARD_RGHT - BOARD_LEFT, size; // allow for alternative board formats size = width * BOARD_HEIGHT; p = move / (size*size); move = move % (size*size); f = move / size; fr = f / width; ff = f % width; t = move % size; tr = t / width; tf = t % width; move_s[0] = ff + 'a'; move_s[1] = fr + '1' - (BOARD_HEIGHT > 9); move_s[2] = tf + 'a'; move_s[3] = tr + '1' - (BOARD_HEIGHT > 9); // kludge: encode drops as special promotion code if(gameInfo.holdingsSize && p == 9) { move_s[0] = f + '@'; // from square encodes piece type move_s[1] = '@'; // drop symbol p = 0; } // add promotion piece, if any if(p){ move_s[4] = promote_pieces[p]; move_s[5] = '\0'; }else{ move_s[4] = '\0'; } if(gameInfo.variant != VariantNormal) return; // correct FRC-style castlings in variant normal. // [HGM] This is buggy code! e1h1 could very well be a normal R or Q move. if(!strcmp(move_s,"e1h1")){ safeStrCpy(move_s,"e1g1", 6); }else if(!strcmp(move_s,"e1a1")){ safeStrCpy(move_s,"e1c1", 6); }else if(!strcmp(move_s,"e8h8")){ safeStrCpy(move_s,"e8g8", 6); }else if(!strcmp(move_s,"e8a8")){ safeStrCpy(move_s,"e8c8", 6); } } int GetBookMoves (FILE *f, int moveNr, entry_t entries[], int max) { // retrieve all entries for given position from book in 'entries', return number. entry_t entry; int offset; uint64 key; int count; int ret; key = hash(moveNr); if(appData.debugMode) fprintf(debugFP, "book key = %08x%08x\n", (unsigned int)(key>>32), (unsigned int)key); offset=find_key(f, key, &entry); if(entry.key != key) { return FALSE; } entries[0] = entry; count=1; fsseek(f, 16*(offset+1), SEEK_SET); while(1){ ret=entry_from_file(f, &entry); if(ret){ break; } if(entry.key != key){ break; } if(count == max) break; entries[count++] = entry; } return count; } int ReadFromBookFile (int moveNr, char *book, entry_t entries[]) { // retrieve all entries for given position from book in 'entries', return number. static FILE *f = NULL; static char curBook[MSG_SIZ]; if(book == NULL) return -1; if(!f || strcmp(book, curBook)){ // keep book file open until book changed strncpy(curBook, book, MSG_SIZ); if(f) fclose(f); f = fopen(book,"rb"); } if(!f){ DisplayError(_("Polyglot book not valid"), 0); appData.usePolyglotBook = FALSE; return -1; } return GetBookMoves(f, moveNr, entries, MOVE_BUF); } // next three made into subroutines to facilitate future changes in storage scheme (e.g. 2 x 3 bytes) static int wins(entry_t *e) { return e->learnPoints; } static int losses(entry_t *e) { return e->learnCount; } static void CountMove (entry_t *e, int result) { switch(result) { case 0: e->learnCount ++; break; case 1: e->learnCount ++; // count draw as win + loss case 2: e->learnPoints ++; break; } } #define MERGESIZE 2048 #define HASHSIZE 1024*1024*4 entry_t *memBook, *hashTab, *mergeBuf; int bookSize=1, mergeSize=1, mask = HASHSIZE-1; void InitMemBook () { static int initDone = FALSE; if(initDone) return; memBook = (entry_t *) calloc(1024*1024, sizeof(entry_t)); hashTab = (entry_t *) calloc(HASHSIZE, sizeof(entry_t)); mergeBuf = (entry_t *) calloc(MERGESIZE+5, sizeof(entry_t)); memBook[0].key = -1LL; mergeBuf[0].key = -1LL; initDone = TRUE; } char * MCprobe (moveNr) { int count, count2, games, i, choice=0; entry_t entries[MOVE_BUF]; float nominal[MOVE_BUF], tot, deficit, max, min; static char move_s[6]; InitMemBook(); memBuf = (unsigned char*) memBook; bufSize = bookSize; // in MC mode book resides in memory count = GetBookMoves(NULL, moveNr, entries, MOVE_BUF); if(count < 0) count = 0; // don't care about miss yet memBuf = (unsigned char*) mergeBuf; bufSize = mergeSize; // there could be moves still waiting to be merged count2 = count + GetBookMoves(NULL, moveNr, entries+count, MOVE_BUF - count); if(appData.debugMode) fprintf(debugFP, "MC probe: %d/%d (%d+%d)\n", count, count2,bookSize,mergeSize); if(!count2) return NULL; tot = games = 0; for(i=0; i max) max = deficit, choice = i; if(deficit < min) min = deficit; } // note that a single move will never be underplayed if(max - min > 0.5*sqrt(nominal[choice])) { // if one of the listed moves is significantly under-played, play it now. move_to_string(move_s, entries[choice].move); if(appData.debugMode) fprintf(debugFP, "book move field = %d\n", entries[choice].move); return move_s; } return NULL; // otherwise fake book miss to force engine think, hoping for hitherto unplayed move. } char *ProbeBook (int moveNr, char *book) { // entry_t entries[MOVE_BUF]; int count; int i, j; static char move_s[6]; int total_weight; if(moveNr >= 2*appData.bookDepth) return NULL; if(mcMode) return MCprobe(moveNr); if((count = ReadFromBookFile(moveNr, book, entries)) <= 0) return NULL; // no book, or no hit if(appData.bookStrength != 50) { // transform weights double power = 0, maxWeight = 0.0; if(appData.bookStrength) power = (100.-appData.bookStrength)/appData.bookStrength; for(i=0; i maxWeight) maxWeight = entries[i].weight; for(i=0; i 0) entries[i].weight = appData.bookStrength || weight == 1.0 ? 1e4*exp(power * log(weight)) + 0.5 : 0.0; } } total_weight = 0; for(i=0; i> 12; // create random < total_weight total_weight = 0; for(i=0; i j) break; } if(i >= count) DisplayFatalError(_("Book Fault"), 0, 1); // safety catch, cannot happen move_to_string(move_s, entries[i].move); if(appData.debugMode) fprintf(debugFP, "book move field = %d\n", entries[i].move); return move_s; } extern char yy_textstr[]; entry_t lastEntries[MOVE_BUF]; char * MovesToText(int count, entry_t *entries) { int i, totalWeight = 0; char algMove[6]; char *p = (char*) malloc(40*count+1); for(i=0; i=0;i--) fputc(r>>8*i & 255, f); } void entry_to_file (FILE *f, entry_t *entry) { int_to_file(f,8,entry->key); int_to_file(f,2,entry->move); int_to_file(f,2,entry->weight); int_to_file(f,2,entry->learnCount); int_to_file(f,2,entry->learnPoints); } char buf1[4096], buf2[4096]; void SaveToBook (char *text) { entry_t entries[MOVE_BUF], entry; int count = TextToMoves(text, currentMove, entries); int offset, i, len1=0, len2, readpos=0, writepos=0; FILE *f; if(!count && !currentCount) return; f=fopen(appData.polyglotBook, "rb+"); if(!f){ DisplayError(_("Polyglot book not valid"), 0); return; } offset=find_key(f, entries[0].key, &entry); if(entries[0].key != entry.key && currentCount) { DisplayError(_("Hash keys are different"), 0); fclose(f); return; } if(count != currentCount) { readpos = 16*(offset + currentCount); writepos = 16*(offset + count); fsseek(f, readpos, SEEK_SET); readpos += len1 = fread(buf1, 1, 4096 - 16*currentCount, f); // salvage some entries immediately behind change } fsseek(f, 16*(offset), SEEK_SET); for(i=0; i writepos) { fsseek(f, readpos, SEEK_SET); readpos += len1 = fread(buf1, 1, 4096, f); } else len1 = 0; // wrote already past old EOF fsseek(f, writepos, SEEK_SET); fwrite(buf2, 1, len2, f); writepos += len2; } while(len1); } fclose(f); } void NewEntry (entry_t *e, uint64 key, int move, int result) { e->key = key; e->move = move; e->learnPoints = 0; e->learnCount = 0; CountMove(e, result); } void Merge () { int i; if(appData.debugMode) fprintf(debugFP, "book merge %d moves (old size %d)\n", mergeSize, bookSize); bookSize += --mergeSize; for(i=bookSize-1; mergeSize; i--) { while(mergeSize && (i < mergeSize || mergeBuf[mergeSize-1].key >= memBook[i-mergeSize].key)) memBook[i--] = mergeBuf[--mergeSize]; if(i < 0) break; memBook[i] = memBook[i-mergeSize]; } if(mergeSize) DisplayFatalError("merge error", 0, 0); // impossible mergeSize = 1; mergeBuf[0].key = -1LL; } void AddToBook (int moveNr, int result) { entry_t entry; int offset, start, move; uint64 key; int i, j, fromY, toY; char fromX, toX, promo; extern char moveList[][MOVE_LEN]; if(!moveList[moveNr][0] || moveList[moveNr][0] == '\n') return; // could be terminal position if(appData.debugMode) fprintf(debugFP, "add move %d to book %s", moveNr, moveList[moveNr]); // calculate key and book representation of move key = hash(moveNr); if(moveList[moveNr][1] == '@') { sscanf(moveList[moveNr], "%c@%c%d", &promo, &toX, &toY); fromX = CharToPiece(WhiteOnMove(moveNr) ? ToUpper(promo) : ToLower(promo)); fromY = DROP_RANK; promo = NULLCHAR; } else sscanf(moveList[moveNr], "%c%d%c%d%c", &fromX, &fromY, &toX, &toY, &promo), fromX -= AAA, fromY -= ONE - '0'; move = CoordsToMove(fromX, fromY, toX-AAA, toY-ONE+'0', promo); // if move already in book, just add count memBuf = (unsigned char*) memBook; bufSize = bookSize; // in MC mode book resides in memory offset = find_key(NULL, key, &entry); while(memBook[offset].key == key) { if(memBook[offset].move == move) { CountMove(memBook+offset, result); return; } else offset++; } // move did not occur in the main book memBuf = (unsigned char*) mergeBuf; bufSize = mergeSize; // it could be amongst moves still waiting to be merged start = offset = find_key(NULL, key, &entry); while(mergeBuf[offset].key == key) { if(mergeBuf[offset].move == move) { if(appData.debugMode) fprintf(debugFP, "found in book merge buf @ %d\n", offset); CountMove(mergeBuf+offset, result); return; } else offset++; } if(start != offset) { // position was in mergeBuf, but move is new if(appData.debugMode) fprintf(debugFP, "add in book merge buf @ %d\n", offset); for(i=mergeSize++; i>offset; i--) mergeBuf[i] = mergeBuf[i-1]; // make room NewEntry(mergeBuf+offset, key, move, result); return; } // position was not in mergeBuf; look in hash table i = (key & mask); offset = -1; while(hashTab[i].key) { // search in hash table (necessary because sought item could be re-hashed) if(hashTab[i].key == 1 && offset < 0) offset = i; // remember first invalidated entry we pass if(!((hashTab[i].key - key) & ~1)) { // hit if(hashTab[i].move == move) { CountMove(hashTab+i, result); for(j=mergeSize++; j>start; j--) mergeBuf[j] = mergeBuf[j-1]; } else { // position already in hash now occurs with different move; move both moves to mergeBuf for(j=mergeSize+1; j>start+1; j--) mergeBuf[j] = mergeBuf[j-2]; NewEntry(mergeBuf+start+1, key, move, result); mergeSize += 2; } hashTab[i].key = 1; // kludge to invalidate hash entry mergeBuf[start] = hashTab[i]; mergeBuf[start].key = key; if(mergeSize >= MERGESIZE) Merge(); return; } i = i+1 & mask; // wrap! } // position did not yet occur in hash table. Put it there if(offset < 0) offset = i; NewEntry(hashTab+offset, key, move, result); if(appData.debugMode) fprintf(debugFP, "book hash @ %d (%d-%d)\n", offset, hashTab[offset].learnPoints, hashTab[offset].learnCount); } void AddGameToBook (int always) { int i, result; if(!mcMode && !always) return; InitMemBook(); switch(gameInfo.result) { case GameIsDrawn: result = 1; break; case WhiteWins: result = 2; break; case BlackWins: result = 0; break; default: return; // don't treat games with unknown result } if(appData.debugMode) fprintf(debugFP, "add game to book (%d-%d)\n", backwardMostMove, forwardMostMove); for(i=backwardMostMove; i #endif extern GameInfo gameInfo; /* ICS vars used with backend.c and zippy.c */ enum ICS_TYPE { ICS_GENERIC, ICS_ICC, ICS_FICS, ICS_CHESSNET /* not really supported */ }; enum ICS_TYPE ics_type; /* pgntags.c prototypes */ char *PGNTags P((GameInfo *)); void PrintPGNTags P((FILE *f, GameInfo *)); int ParsePGNTag P((char *, GameInfo *)); char *PGNResult P((ChessMove result)); /* gamelist.c prototypes */ /* A game node in the double linked list of games. */ typedef struct XB_ListGame { ListNode node; int number; int position; int moves; unsigned long offset; /* Byte offset of game within file. */ GameInfo gameInfo; /* Note that some entries may be NULL. */ } ListGame; extern int doubleClick; extern int storedGames; extern int opponentKibitzes; extern ChessSquare gatingPiece; extern List gameList; extern int lastLoadGameNumber; void ClearGameInfo P((GameInfo *)); int GameListBuild P((FILE *)); void GameListInitGameInfo P((GameInfo *)); char *GameListLine P((int, GameInfo *)); char * GameListLineFull P(( int, GameInfo *)); void InitSearch P((void)); int GameContainsPosition P((FILE *f, ListGame *lg)); void GLT_TagsToList P(( char * tags )); void GLT_ParseList P((void)); int NamesToList P((char *name, char **engines, char **mnemonics, char *group)); int CreateTourney P((char *name)); char *MakeName P((char *templ)); void SwapEngines P((int n)); void Substitute P((char *participants, int expunge)); extern char* StripHighlight P((char *)); /* returns static data */ extern char* StripHighlightAndTitle P((char *)); /* returns static data */ extern void ics_update_width P((int new_width)); extern Boolean set_cont_sequence P((char *new_seq)); extern int wrap P((char *dest, char *src, int count, int width, int *lp)); int Explode P((Board board, int fromX, int fromY, int toX, int toY)); typedef enum { CheckBox, ComboBox, TextBox, Button, Spin, ResetButton, SaveButton, ListBox, Graph, PopUp, FileName, PathName, Slider, Message, Fractional, Label, Icon, BoxBegin, BoxEnd, BarBegin, BarEnd, DropDown, Break, EndMark } Control; typedef struct XB_OPT { // [HGM] options: descriptor of UCI-style option int value; // current setting, starts as default int min; // Also used for flags int max; void *handle; // for use by front end void *target; // for use by front end char *textValue; // points to beginning of text value in name field char **choice; // points to array of combo choices in cps->combo Control type; char *name; // holds both option name and text value (in allocated memory) } Option; typedef struct XB_CPS { char *which; int maybeThinking; ProcRef pr; InputSourceRef isr; char *twoMachinesColor; /* "white\n" or "black\n" */ char *program; char *host; char *dir; struct XB_CPS *other; char *initString; char *computerString; int sendTime; /* 0=don't, 1=do, 2=test */ int sendDrawOffers; int useSigint; int useSigterm; int offeredDraw; /* countdown */ int reuse; int useSetboard; /* 0=use "edit"; 1=use "setboard" */ int extendedEdit;/* 1=also set holdings with "edit" */ int useSAN; /* 0=use coordinate notation; 1=use SAN */ int usePing; /* 0=not OK to use ping; 1=OK */ int lastPing; int lastPong; int usePlayother;/* 0=not OK to use playother; 1=OK */ int useColors; /* 0=avoid obsolete white/black commands; 1=use them */ int useUsermove; /* 0=just send move; 1=send "usermove move" */ int sendICS; /* 0=don't use "ics" command; 1=do */ int sendName; /* 0=don't use "name" command; 1=do */ int sdKludge; /* 0=use "sd DEPTH" command; 1=use "depth\nDEPTH" */ int stKludge; /* 0=use "st TIME" command; 1=use "level 1 TIME" */ int excludeMoves;/* 0=don't use "exclude" command; 1=do */ char *tidy; int matchWins; char *variants; int analysisSupport; int analyzing; int protocolVersion; int initDone; /* Added by Tord: */ int useFEN960; /* 0=use "KQkq" style FENs, 1=use "HAha" style FENs */ int useOOCastle; /* 0="O-O" notation for castling, 1="king capture rook" notation */ /* End of additions by Tord */ int scoreIsAbsolute; /* [AS] 0=don't know (standard), 1=score is always from white side */ int isUCI; /* [AS] 0=no (Winboard), 1=UCI (requires Polyglot) */ int hasOwnBookUCI; /* [AS] 0=use GUI or Polyglot book, 1=has own book */ /* [HGM] time odds */ float timeOdds; /* factor through which we divide time for this engine */ int debug; /* [HGM] ignore engine debug lines starting with '#' */ int maxNrOfSessions; /* [HGM] secondary TC: max args in 'level' command */ int accumulateTC; /* [HGM] secondary TC: how to handle extra sessions */ int nps; /* [HGM] nps: factor for node count to replace time */ int supportsNPS; int alphaRank; /* [HGM] shogi: engine uses shogi-type coordinates */ int maxCores; /* [HGM] SMP: engine understands cores command */ int memSize; /* [HGM] memsize: engine understands memory command */ char *egtFormats; /* [HGM] EGT: supported tablebase formats */ int bookSuspend; /* [HGM] book: go was deferred because of book hit */ int pause; /* [HGM] pause: 1=supports it, 2=actually paused */ int nrOptions; /* [HGM] options: remembered option="..." features */ #define MAX_OPTIONS 200 Option option[MAX_OPTIONS]; int comboCnt; char *comboList[20*MAX_OPTIONS]; char *optionSettings; void *programLogo; /* [HGM] logo: bitmap of the logo */ char *fenOverride; /* [HGM} FRC: force FEN casling & ep fields by hand */ char userError; /* [HGM] crash: flag to suppress fatal-error messages*/ char reload; /* [HGM] options: flag to resend options with xreuse */ } ChessProgramState; extern ChessProgramState first, second; /* Search stats from chessprogram */ typedef struct { char movelist[2*MSG_SIZ]; /* Last PV we were sent */ int depth; /* Current search depth */ int nr_moves; /* Total nr of root moves */ int moves_left; /* Moves remaining to be searched */ char move_name[MOVE_LEN]; /* Current move being searched, if provided */ u64 nodes; /* # of nodes searched */ int time; /* Search time (centiseconds) */ int score; /* Score (centipawns) */ int got_only_move; /* If last msg was "(only move)" */ int got_fail; /* 0 - nothing, 1 - got "--", 2 - got "++" */ int ok_to_send; /* handshaking between send & recv */ int line_is_book; /* 1 if movelist is book moves */ int seen_stat; /* 1 if we've seen the stat01: line */ } ChessProgramStats; extern ChessProgramStats_Move pvInfoList[MAX_MOVES]; extern Boolean shuffleOpenings; extern ChessProgramStats programStats; extern int opponentKibitzes; // used by wengineo.c extern int errorExitStatus; extern char *recentEngines; extern char *comboLine; extern Boolean partnerUp, twoBoards; void SettingsPopUp P((ChessProgramState *cps)); // [HGM] really in front-end, but CPS not known in frontend.h int WaitForEngine P((ChessProgramState *cps, DelayedEventCallback x)); void Load P((ChessProgramState *cps, int n)); int MultiPV P((ChessProgramState *cps)); void MoveHistorySet P(( char movelist[][2*MOVE_LEN], int first, int last, int current, ChessProgramStats_Move * pvInfo )); void MakeEngineOutputTitle P((void)); void LoadTheme P((void)); void CreateBookEvent P((void)); /* A point in time */ typedef struct { long sec; /* Assuming this is >= 32 bits */ int ms; /* Assuming this is >= 16 bits */ } TimeMark; void GetTimeMark P((TimeMark *)); long SubtractTimeMarks P((TimeMark *, TimeMark *)); #endif /* XB_BACKEND */ xboard-4.7.3/README0000644000175000001440000000450512262415351010606 00000000000000What is XBoard? =============== XBoard is a graphical chessboard for the X Window System. It can serve as a user interface for chess engines such as Fairy-Max, Crafty or GNU Chess, for the Internet Chess Server, or for electronic mail correspondence chess. It supports all major forms of chess, such as international chess, xiangqi and shogi. XBoard can also be used by itself as viewer for stored chess games. See the manual page for further details. XBoard is free software, copyrighted by the Free Software Foundation and released under the GNU General Public License (GPL). See the file COPYING for details. You can build xboard on most systems with the following commands. ./configure make See the file INSTALL for more detailed instructions. See the file FAQ.html for answers to frequently asked questions. What is WinBoard? ================= WinBoard is a port of XBoard to run natively on Windows. It is part of the XBoard project and is released under the same terms as XBoard. You can build WinBoard using the free Cygwin toolchain from www.cygnus.com with the following commands. cd winboard make -f makefile.gcc You can build WinBoard using Microsoft Visual C with the following commands, or by opening the project in Visual Studio and clicking the build button. cd winboard nmake -f makefile.ms Reporting problems ================== Report bugs and problems with XBoard and WinBoard to . With XBoard, please use the "script" program to start a typescript, run XBoard with the -debug command line option, and include the typescript output in your message. With WinBoard, please use the /debug command line option and include the contents of the file WinBoard.debug. Also tell us what kind of machine and what operating system version you are using. On Unix, the command "uname -a" will tell you this. On Windows, right-click on My Computer and select Properties. Here is a sample of approximately what you should type (on Unix): script uname -a ./configure make ./xboard -debug exit mail bug-xboard@gnu.org Subject: Your short description of the problem Your detailed description of the problem ~r typescript . If you improve XBoard, please send a message about your changes, and we will get in touch with you about merging them in to the main line of development. xboard-4.7.3/xboard.conf.in0000644000175000001440000000613412262562252012464 00000000000000; ; xboard 4.6 Save Settings file ; ; This file contains the system-wide settings of XBoard, in so far they ; deviate from the compiled-in defaults, and are not settable through menus, ; to comfort users that have no history of xboard usage. ; You can edit the values of options that are already set in this file, ; or add other options that you think are convenient as defaults for all users. ; This file is not automatically overwritten, because it redefines the ; -saveSettingsFile to .xboardrc in the user's home directory, so that ; user settings will be saved in a place the user has write access to. ; ; Looks ; -internetChessServerInputBox false -titleInWindow false -showButtonBar true -moveHistoryUp false -evalGraphUp false -engineOutputUp false -monoMode false -flashCount 0 -flashRate 5 -fontSizeTolerance 4 -useBoardTexture true -liteBackTextureFile "@pngdir@/wood_l.png" -darkBackTextureFile "@pngdir@/wood_d.png" -overrideLineGap 1 -highlightMoveWithArrow true -recentEngines 4 -gameListW 500 -gameListH 300 -stickyWindows false ; ; Behavior ; -sweepPromotions true -pieceMenu false -showTargetSquares true -seekGraph true -soundProgram "aplay -q" -soundDirectory "@soundsdir@" -soundTell phone.wav -soundChallenge gong.wav -soundMove woodthunk.wav -soundIcsAlarm penalty.wav -pasteSelection false -keepLineBreaksICS false -timeDelay 1 -autoDisplayComment true -autoDisplayTags true -lowTimeWarning false -icsAlarm false -icsAlarmTime 5000 -msLoginDelay 0 -delayBeforeQuit 0 -delayAfterQuit 0 -defaultTourneyName "Tourney_%y%M%d_%h%m.trn" -variations true -appendPV true ; ; PGN format & Game List ; -pgnExtendedInfo true -saveOutOfBookInfo true -gameListTags "eprd" ; ; Engines & adjudicatons in engine-engine games ; -firstChessProgram fairymax -secondChessProgram fairymax -firstChessProgramNames {fairymax "Fruit 2.1" -fcp fruit -fUCI "Crafty" -fcp crafty "GNU Chess" -fcp gnuchess } -niceEngines 0 -polyglotDir "" -adapterCommand 'polyglot -noini -ec "%fcp" -ed "%fd" -uci NalimovCache=%defaultCacheSizeEGTB' -defaultPathEGTB "/egtb" -egtFormats "" -testClaims true -checkMates true -materialDraws true -trivialDraws false ; ; preconfigure some ICS nams, for use with -is option ; -icsNames {"fics" -icshost freechess.org -icshelper timeseal "icc" -icshost chessclub.com -icshelper timestamp "kc" -icshost alanimus.com -icshelper timeseal } ; ; Configure the ICS text menu ; -icsMenu {Give me;ptell Please give me $input; Avoid;ptell Please don't let him get $input; Q;$add a Queen $input; R;$add a Rook $input; B;$add a Bishop $input; N;$add a Knight $input; P;$add a Pawn $input; Dead;ptell I will be checkmated; MultiLine; set open 0 set seek 0 set tell 1; Kill;ptell I will checkmate him!; Who;who; Finger (name);finger $name; Players;players; Vars (name);vars $name; Games;games; Observe (name);observe $name; Sought;sought; Match (name);match $name; Tell (name);tell $name $input; Play (name);play $name; Message (name);message $name $input; } ; ; Save user settings. ; Must be last in file to make user options prevail over system-wide settings! ; -saveSettingsOnExit true -saveSettingsFile "~/.xboardrc" -settingsFile "~/.xboardrc" xboard-4.7.3/m4/0000755000175000001440000000000012262562277010334 500000000000000xboard-4.7.3/m4/intlmacosx.m40000644000175000001440000000457512247021670012700 00000000000000# intlmacosx.m4 serial 3 (gettext-0.18) dnl Copyright (C) 2004-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) xboard-4.7.3/m4/progtest.m40000644000175000001440000000557312262415351012365 00000000000000# progtest.m4 serial 6 (gettext-0.18) dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) xboard-4.7.3/m4/gettext.m40000644000175000001440000003513212262415351012174 00000000000000# gettext.m4 serial 63 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) xboard-4.7.3/m4/nls.m40000644000175000001440000000231512262415351011301 00000000000000# nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) xboard-4.7.3/m4/po.m40000644000175000001440000004461612262415351011135 00000000000000# po.m4 serial 17 (gettext-0.18) dnl Copyright (C) 1995-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.18]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT([$LD]) else AC_MSG_RESULT([no]) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) xboard-4.7.3/m4/lib-prefix.m40000644000175000001440000002042212262415351012545 00000000000000# lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) xboard-4.7.3/m4/iconv.m40000644000175000001440000001653712262415351011636 00000000000000# iconv.m4 serial 11 (gettext-0.18.1) dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) fi ]) xboard-4.7.3/m4/lib-link.m40000644000175000001440000010020212262415351012200 00000000000000# lib-link.m4 serial 21 (gettext-0.18) dnl Copyright (C) 2001-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ([2.54]) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes popdef([NAME]) popdef([Name]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message]) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. The missing-message dnl defaults to 'no' and may contain additional hints for the user. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) pushdef([Name],[translit([$1],[./-], [___])]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS, dnl because these -l options might require -L options that are present in dnl LIBS. -l options benefit only from the -L options listed before it. dnl Otherwise, add it to the front of LIBS, because it may be a static dnl library that depends on another static library that is present in LIBS. dnl Static libraries benefit only from the static libraries listed after dnl it. case " $LIB[]NAME" in *" -l"*) LIBS="$LIBS $LIB[]NAME" ;; *) LIBS="$LIB[]NAME $LIBS" ;; esac AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])']) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) popdef([NAME]) popdef([Name]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) xboard-4.7.3/svg/0000755000175000001440000000000012262562300010576 500000000000000xboard-4.7.3/svg/WhiteGoldSilver.svg0000644000175000001440000000734512262415351014326 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackCanon.svg0000644000175000001440000000770112262415351013242 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteAdvisor.svg0000644000175000001440000000762312262415351013662 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteHawk.svg0000644000175000001440000001556612262415351013152 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackGoldLance.svg0000644000175000001440000000673112262415351014036 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteRook.svg0000644000175000001440000000637512262415351013170 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackCrownedRook.svg0000644000175000001440000000750612262415351014443 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteNightrider.svg0000644000175000001440000001044112262415351014342 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackArchbishop.svg0000644000175000001440000001405712262415351014270 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_White.svg0000644000175000001440000000532012262415351013005 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackHawk.svg0000644000175000001440000001643312262415351013100 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackGoldPawn.svg0000644000175000001440000000601112262415351013710 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackQueen.svg0000644000175000001440000000770212262415351013262 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteQueen.svg0000644000175000001440000001740512262415351013327 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackGoldKnight.svg0000644000175000001440000000726412262415351014242 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteGoldKnight.svg0000644000175000001440000000741512262415351014304 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteBishop.svg0000644000175000001440000001175212262415351013475 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteArchbishop.svg0000644000175000001440000001235412262415351014332 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackCobra.svg0000644000175000001440000001232112262415351013224 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackCrownedBishop.svg0000644000175000001440000001201312262415351014742 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackKing.svg0000644000175000001440000001302712262415351013072 00000000000000 image/svg+xml xboard-4.7.3/svg/icon_black.svg0000644000175000001440000000627312262415351013336 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackMarshall.svg0000644000175000001440000001203512262415351013743 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Clear.svg0000644000175000001440000000200712262415351012752 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteCommoner.svg0000644000175000001440000000757212262415351014035 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackPrincess.svg0000644000175000001440000001501512262415351013767 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteUnicorn.svg0000644000175000001440000001402212262415351013657 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackUnicorn.svg0000644000175000001440000001411112262415351013612 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteGold.svg0000644000175000001440000000711112262415351013130 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackRook.svg0000644000175000001440000000706012262415351013114 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteKing.svg0000644000175000001440000001050212262415351013131 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteGoldLance.svg0000644000175000001440000000711112262415351014073 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteCobra.svg0000644000175000001440000001052512262415351013274 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteMarshall.svg0000644000175000001440000001224112262415351014006 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Analyzing.svg0000644000175000001440000001023512262415351013662 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteLance.svg0000644000175000001440000000571512262415351013275 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteChancellor.svg0000644000175000001440000002233712262415351014324 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackLance.svg0000644000175000001440000000571512262415351013231 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackGold.svg0000644000175000001440000000673412262415351013076 00000000000000 image/svg+xml xboard-4.7.3/svg/WhitePrincess.svg0000644000175000001440000001531412262415351014035 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackBishop.svg0000644000175000001440000001275312262415351013433 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteCrownedBishop.svg0000644000175000001440000001114612262415351015014 00000000000000 image/svg+xml xboard-4.7.3/svg/icon_white.svg0000644000175000001440000000673112262415351013401 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteGoldPawn.svg0000644000175000001440000000626212262415351013764 00000000000000 image/svg+xml xboard-4.7.3/svg/WhitePawn.svg0000644000175000001440000000356012262415351013154 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackKnight.svg0000644000175000001440000001211512262415351013423 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Ponder.svg0000644000175000001440000001242212262415351013155 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteCanon.svg0000644000175000001440000000674012262415351013310 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteKnight.svg0000644000175000001440000001115112262415351013466 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackElephant.svg0000644000175000001440000001712012262415351013740 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Unknown.svg0000644000175000001440000000531712262415351013372 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteElephant.svg0000644000175000001440000001531212262415351014005 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackNightrider.svg0000644000175000001440000001312712262415351014302 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackGoldSilver.svg0000644000175000001440000000717112262415351014257 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Black.svg0000644000175000001440000000530512262415351012744 00000000000000 image/svg+xml xboard-4.7.3/svg/eo_Thinking.svg0000644000175000001440000001057212262415351013505 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackAdvisor.svg0000644000175000001440000001010012262415351013576 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackCommoner.svg0000644000175000001440000001031112262415351013752 00000000000000 image/svg+xml xboard-4.7.3/svg/WhiteCrownedRook.svg0000644000175000001440000000731112262415351014501 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackChancellor.svg0000644000175000001440000001513112262415351014252 00000000000000 image/svg+xml xboard-4.7.3/svg/BlackPawn.svg0000644000175000001440000000357112262415351013112 00000000000000 image/svg+xml xboard-4.7.3/compile0000755000175000001440000001624512247021262011305 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: xboard-4.7.3/zippy.README0000644000175000001440000004525012262415351011762 00000000000000Zippy README file For version xboard/WinBoard 4.2.4 and later only ----------------------------------------------------- Zippy is a program that lets GNU Chess act as a computer player on an Internet Chess Server. It also works with Crafty. Zippy is unsupported, experimental code. Zippy is based on XBoard, a graphical interface to GNU Chess and to the ICS for the X Window system on Unix. Zippy consists of exactly the same code as XBoard, plus one extra module that ties together the otherwise-separate functions of talking to GNU Chess and talking to the ICS. Zippy is included in the XBoard distribution. There is also a version of Zippy that is based on WinBoard, a port of XBoard to Win32 (Microsoft Windows NT and Windows 95). WinBoard does *not* run on Windows 3.1 or 3.11, not even with Win32s. In versions 3.5 and later, the Zippy code is included in WinBoard.exe. If you use Zippy, I ask you to do the following: - Don't expect fast response if you send me mail about problems. It might take weeks for me to get back to you, or I might answer right away. Try to solve problems yourself before you mail me about them. Try asking someone who is actively running a Zippy-based player on ICC or FICS for help getting started. Mail me only if you get stuck. - Be honest. Tell the admins of whatever ICS you use that your player is a computer, so that it gets put onto the computer list, and follow the ICS computer policies. On ICC these are in "help computer"; read this file and abide by what it says. - If you want to interface some other chess program to ICS, feel free to start with this code. Some documentation is in the file engine-intf.html in the distribution. - Please do not use the -zt flag to have your program shout Zippy the Pinhead sayings (or other things that my Zippy shouts). One pinhead per server is plenty, and I'd like to keep the franchise. Feel free to use -zt to have your program shout some other kind of sayings if you like. Some of the jokes that Zippy shouts on ICC came from ftp://ftp.cco.caltech.edu/pub/humor. The poetry came from Project Gutenberg; try http://www.cs.cmu.edu/Web/booktitles.html as a starting point. You might find other suitable material at these sites. Prose tends to work poorly because it is dull when shouted in isolated 250-character chunks. --Tim Mann http://www.tim-mann.org/chess.html * * * Unix: To build the Zippy version of xboard, on most systems just do: configure --enable-zippy make Windows: WinBoard.exe (versions 3.5 and later) includes the Zippy code. There is no longer a distinct WinZippy.exe. In both xboard and WinBoard, the Zippy features are off by default. You can activate them with two new resources/command line options, and you can fine-tune them with some new environment variables, all described below. You will probably want to make a shell script or Windows .BAT file that sets the environment variables you want to use and invokes Zippy with the right command line options for your situation. Some examples are at the bottom of this file. If you have problems building or running Zippy, see the rest of the xboard documentation: INSTALL documents the configure program, while READ_ME and xboard.man (or xboard.txt) document xboard itself, and WinBoard.hlp documents WinBoard. FAQ answers some frequently asked questions. The file engine-intf.html contains some information about the interface between xboard/WinBoard and GNU Chess (or other chess engines). =========== NEW OPTIONS =========== -zippyPlay True/False or -zp/-xzp If zippyPlay is set to True, when xboard is in -ics mode, it will interface a chess engine to the ICS instead of letting you play. You must also set -ics when you use this mode. In zippyPlay mode, xboard blindly issues an accept command for every (well, almost every, see below) challenge it gets, without remembering anything about the challenge afterwards. This means that often it will get several challenges very close together and try to accept them all! ICS gives an error message for every accept command after the one that actually starts a match, but xboard just happily ignores the message. xboard doesn't actually start the chess engine playing until the first board image comes in from ICS. The getMoveList option controls how adjourned games are continued. If it is True (the default), xboard fetches the move list from ICS and feeds it into the chess program before having the program start play. If False, xboard feeds the current position into the chess program and has it start from there. The latter option gets the program going sooner, but can cause problems with detection of en passant legality, castling legality (if a king or rook has moved and then returned to its home square), draw by repetition, and draw by the 50 move rule. In zippyPlay mode, colorization in the ICS interaction window, and the sounds corresponding to colors in that window, do not work. zippyPassword and related features (see below) capture the tells, etc., before they can be matched by the color/sound code. -zippyTalk True/False or -zt/-xzt If zippyTalk is set to True and xboard is in -ics mode: (1) It will reply to anything said to it with a saying (if there is a file of sayings in its working directory). This includes channel tells and shouts where its name is mentioned. Some things it says to opponents in specific situations will also be made Zippy-ish; you might want to change that. See zippyLines below for the file format. (2) If a player XXX in your notify list logs on, xboard sends the command "greet XXX" to ICS and tells XXX something from its sayings file. You can alias this to whatever you like. If XXX is censoring you, he is automatically removed from your notify list. (3) If a player XXX in your notify list logs off, xboard sends the command "farewell XXX" to ICS. You can alias this to whatever you like. Note that the player is already gone, so telling him something is futile. If zippyTalk is on, colorization in the ICS interaction window, and the sounds corresponding to colors in that window, do not work. The reply feature captures the tells, etc., before they can be matched by the color/sound code. In both -zp and -zt modes, if admin X spoofs Zippy, Zippy sends the command "spoofedby X" to ICS. You can alias this to something if you want; otherwise it will produce a harmless error message. -zippyPinhead string In zippyTalk mode, if user XXX shouts anything containing this string, xboard sends the command "insult XXX" to ICS. You can alias "insult" to whatever you like. This feature is disabled if the option is not set. -zippyPassword string If someone does an ICS "tell" to xboard that begins with this password, it will type the same string back as a command with the password stripped off. For example, if the password is !%%! and xboard sees the string "Darooha tells you: !%%!shout Hi there", it will type the command "shout Hi there" to the ICS. This feature is disabled if the option is not set. -zippyPassword2 string If someone does an ICS "tell" to xboard that begins with this password, it will send the same string directly to the chess engine with the password stripped off. This feature is disabled if the option is not set. Use with caution. -zippyWrongPassword string This is a joke feature. If player XXX does an ICS "tell" to xboard that begins with this password, it will send the command "wrong XXX" to ICS. ICS does not define a "wrong" command, but you can alias it to whatever you like. The feature is supposed to be used after you've changed the zippyPassword, so that people who knew the old password get a funny message. Disabled if not set. -zippyUseI True/False or -zui/-xzui If this option is true, Zippy's shouts use the "i" command with funny verbs; otherwise they use the "shout" command. Default is true. The variable is automatically set to false if the "i" command is disabled on ICS by the admins. -zippyLines filename Name of the file Zippy looks in for sayings when -zt is set. Default: yow.lines. File format: There must be a single ^ character or null character (control-@, ASCII code \000) after each saying. Sayings can have newlines in them; Zippy will remove them. Sayings can be at most about 250 characters; longer ones will be ignored. The first saying in the file is never used; you should put a comment there. If you have only one or two sayings in your file, Zippy may get into a loop trying to choose one. Zippy chooses a saying by seeking to a random character position in the file, skipping ahead to the *next* null character, and printing the saying that starts there. If it hits end of file without finding a new saying, it tries again. Yes, this is a dumb algorithm. -zippyAcceptOnly string Normally, Zippy automatically accepts challenges from all opponents. If this option is set to an ICS login name, Zippy will auto-accept challenges only from that opponent. Set the option to an invalid name like "0" if you don't want Zippy to auto-accept any challenges. You can still accept challenges manually. Setting this option also suppresses the zippyGameEnd feature described below. Default: not set. -zippyNoplayCrafty True/False or -znc/-xznc If this option is set to True, if Zippy's opponent kibitzes "Hello from Crafty" within the first couple of moves, Zippy will abort the game and add the opponent to his noplay list. Default: False. -zippyGameStart string At the start of each game Zippy plays (including resuming from adjournment), it sends this string to ICS, followed by a newline. If the option is not set, nothing is sent. -zippyGameEnd string At the end of each game, Zippy sends this string to ICS, followed by a newline. If you do not set this option, the string "gameend" is sent. This is not a legal ICS command, but you can alias it to whatever you like, or you can leave it undefined, which will cause ICS to print a harmless error message after each game. If you want to send more than one command at the end of the game, on ICC you can alias gameend to a "multi" command (see the ICC help files), but on FICS that does not work. Instead, use the -zippyGameEnd option to have a string of several commands sent, with newlines in between. For example, you could give WinBoard the command line option -zippyGameEnd=\"say thanks\\nseek 5 0\\nseek 2 12\\n\" Note the extra backslashes: these are essential, because the shell will strip them from the command before passing it to XBoard, and XBoard needs to see the quotes (which would otherwise be stripped by the shell as well), because only within quotes it will recognize the \n as a linefeed. -zippyAdjourn True/False or -zadj/-xzadj Zippy will allow its opponent to adjourn if this option is set to true. Default: False. -zippyAbort True/False or -zab/-xzab Zippy will allow its opponent to abort if this option is set to true. Default: False. -zippyVariants string Zippy will decline to play chess variants unless their names (as given in engine-intf.html) are listed in this option. Default: "normal". Example: "suicide,losers,bughouse,normal". Obviously, zippyVariants other than "normal" will work only if your chess engine can play those variants. GNU Chess certainly cannot, but there are some suicide and bughouse engines available. While playing bughouse, Zippy passes certain extra information on to the engine; see engine-intf.html. -zippyBughouse int This option controls how Zippy handles bughouse partner requests. If zippyBughouse is set to 0, Zippy will decline any offers of partnership and tell the offerer that it cannot play bughouse. If zippyBughouse is set to 1, Zippy will decline offers, but you can make Zippy your partner by having *it* offer *you* partnership (by using zippyPassword or typing directly into its window). If zippyBughouse is set to 2, Zippy will accept all offers of partnership, even if it already has a partner. zippyBughouse must be at least 1 for partner tells to be relayed to the engine with the ptell command. -zippyMaxGames int -zippyReplayTimeout If zippyMaxGames > 0, Zippy will play at most the given number of consecutive games against the same opponent. Thereafter, Zippy will decline all challenges from that opponent (with an explanatory tell) until either someone else has played or zippyReplayTimeout seconds have elapsed. Defaults: zippyMaxGames=0, zippyReplayTimeout=120. Note: If you use these options and you have Zippy doing seeks, be sure to include the "m" flag in the ICS seek command. If you use "seek m", when a player responds to the seek, the ICS gives Zippy a challenge that it can either accept or decline. If you use a seek without the "m" flag, the ICS immediately starts a game between Zippy and the first opponent to respond, giving Zippy no choice about whether to accept or decline. -zippyShortGame int If zippyShortGame > 0, Zippy will decline all challenges from an opponent that terminated a game before the given number of ply (with an explanatory tell) until either someone else has played or zippyReplayTimeout seconds have elapsed. Do not set the number of moves to large; the number of ply during which opponents can abort a game without rating change would be a good setting. Default: zippyShortGame=0. ===================== ENVIRONMENT VARIABLES ===================== For backward compatibility with version 4.0.2 and earlier only, most of the command line options listed above can also be set as environment variables. For boolean options, use 0 for false, 1 for true in the corresponding environment variable. The following environment variables are supported.: ZIPPYPINHEAD, ZIPPYPASSWORD, ZIPPYPASSWORD2, ZIPPYWRONGPASSWORD, ZIPPYUSEI, ZIPPYLINES, ZIPPYACCEPTONLY, ZIPPYNOPLAYCRAFTY, ZIPPYGAMESTART, ZIPPYGAMEEND, ZIPPYADJOURN, ZIPPYABORT, ZIPPYVARIANTS, ZIPPYBUGHOUSE Warnings: (1) If both the command line option and the corresponding environment variable are set, the environment variable takes precedence! (2) Some of the environment variables have names that are too long for Solaris 2.5's /bin/csh. Use the command line options instead. (3) Newer options DO NOT have environment variables. If you don't see it in the list above, it doesn't exist. (4) In the future the environment variables may go away entirely. It would be a good idea to stop using them now and switch to the command line options. You may also want to customize other things by editing zippy.c and recompiling the program. ===================== ICS VARIABLE SETTINGS ===================== You need to do the following settings on ICS: set highlight 0 <-- I'm not sure this is still needed set oldmatch 0 set examine 0 If you want to use the zippyPassword remote-control feature, it's a good idea to do the following, so that commands you give Zippy won't be truncated because the ICS wrapped a "tell" to a new line: set wrap 0 <-- on ICC, or set width 255 <-- on FICS You will probably want to turn on server-side autoflagging too: set autoflag 1 ====== SIMULS ====== It has been discovered that Zippy can play simuls on ICC (but not on FICS). If you arrange for Zippy to send the ICC command "simulize" in the -zippyGameStart string, it will accept additional games while playing. Zippy will use the same engine for every game, so whenever it switches opponents, the engine's state will be reset with the "new" command. This will of course weaken its play, so don't enable simuls if you want your engine to have the highest possible rating. Zippy was never designed to work with simuls; it just works by accident, and it hasn't been tested much. So please report any bugs you notice, but don't expect them to be fixed rapidly. Be sure to use xboard/WinBoard 4.2.4 or later for simuls, because some obscure bugs are fixed in that version that affect starting a game in the middle (as with resuming from adjournments or switching opponents in a simul). As noted under -zippyPlay above, you should have -getMoveList on to ensure that the engine knows the game history after switching boards and thus handles draw by repetition and by the 50-move rule correctly. It should, however, also work to turn off this option to speed things up and reduce network bandwidth, if you don't mind the engine occasionally failing to see draw possibilities. Unfortunately, though, with Crafty 18.3 (and probably other versions too) as the engine, users trying this have experienced Crafty crashes. This looks to me like a Crafty bug, but I wasn't able to reproduce it, so it remains a mystery. ======== EXAMPLES ======== Here are some small example command lines. You may want to use more options; see the man page, info file, or help file, and perhaps the FAQ file too. You may want to put the command line into a Unix shell script or Windows .BAT file, which is simply a text file of commands. On Unix, turn on execute permission for the file (chmod a+x file); on Windows, give it the extension .BAT. You can then run it just like an ordinary program. Please do not ask me questions about how to make a shell script or .BAT file; these are not functions of xboard/WinBoard, but basic operating system features that you can learn about from introductory books, friends, teachers, or the online help for your system. The examples below should be more than enough to get you started. Unix command lines: # xboard + GNU Chess on chessclub.com xboard -zp -ics -icshost chessclub.com -icshelper timestamp \ -zippyPassword beer # xboard + GNU Chess on freechess.org xboard -zp -ics -icshost freechess.org -icshelper timeseal \ # xboard + Crafty on chessclub.com xboard -zp -ics -icshost chessclub.com \ -fd /home/crafty -fcp crafty -icshelper timestamp \ -zippyPassword beer # xboard + Crafty on freechess.org xboard -zp -ics -icshost freechess.org -autoflag \ -fd /home/crafty -fcp crafty -icshelper timeseal \ -zippyPassword beer Windows command lines: REM WinBoard + GNU Chess on chessclub.com WinBoard -zp -ics -icshost chessclub.com -fcp GNUChess -icshelper timestamp -zippyPassword beer REM WinBoard + GNU Chess on freechess.org WinBoard -zp -ics -icshost freechess.org -fcp GNUChess -icshelper timeseal -zippyPassword beer REM WinBoard + Crafty on chessclub.com WinBoard -zp -ics -icshost chessclub.com -fd C:\Crafty -fcp WCrafty -icshelper timestamp -zippyPassword beer REM WinBoard + Crafty on freechess.org WinBoard -zp -ics -icshost freechess.org -fd C:\Crafty -fcp WCrafty -icshelper timestamp -zippyPassword beer xboard-4.7.3/engineoutput.h0000644000175000001440000000532512262415351012626 00000000000000/* * wengineo.h -- Clipboard routines for WinBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // [HGM] define numbers to indicate icons, for referring to them in platform-independent way #define nColorBlack 1 #define nColorWhite 2 #define nColorUnknown 3 #define nClear 4 #define nPondering 5 #define nThinking 6 #define nAnalyzing 7 // [HGM] same for output fields (note that there are two of each type, one per color) #define nColorIcon 1 #define nLabel 2 #define nStateIcon 3 #define nStateData 4 #define nLabelNPS 5 #define nMemo 6 /* must match the ranking of the TextBox in following option list! */ #define STRIDE 7 /* must match the number of option in one pane! */ #define MEMO (nMemo-1) /* Module variables */ #define H_MARGIN 2 #define V_MARGIN 2 #define LABEL_V_DISTANCE 1 /* Distance between label and memo */ #define SPLITTER_SIZE 4 /* Distance between first memo and second label */ #define ICON_SIZE 14 enum ENGINE_STATE { STATE_UNKNOWN, STATE_THINKING, STATE_IDLE, STATE_PONDERING, STATE_ANALYZING }; extern int windowMode; extern char exclusionHeader[]; extern int highTextStart[2], highTextEnd[2]; // back-end called by front-end void SetEngineState( int which, enum ENGINE_STATE state, char * state_data ); // front-end called by back-end void SetEngineColorIcon( int which ); void SetIcon( int which, int field, int nIcon ); void DoSetWindowText(int which, int field, char *s_label); void InsertIntoMemo( int which, char * text, int where ); void DoClearMemo(int which); void ResizeWindowControls( int mode ); int EngineOutputDialogExists(); void SetEngineOutputTitle( char *title ); void InitEngineOutput P((Option *opt, Option *memo2)); // XB only void DrawWidgetIcon P((Option *opt, int nIcon)); // XB only xboard-4.7.3/childio.h0000644000175000001440000000474112262415351011514 00000000000000/* * childio.h -- set up communication with child processes * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ void SetUpChildIO P((int to_prog[2], int from_prog[2])); xboard-4.7.3/nhistory.c0000644000175000001440000000654212262415351011754 00000000000000/* * New (WinBoard-style) Move history for XBoard * * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "dialogs.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif // templates for calls into back-end (= history.c; should be moved to history.h header shared with it!) void RefreshMemoContent P((void)); void MemoContentUpdated P((void)); // variables in xoptions.c extern Option historyOptions[]; // ------------- low-level front-end actions called by MoveHistory back-end ----------------- void ClearHistoryMemo () { SetWidgetText(&historyOptions[0], "", HistoryDlg); } // the bold argument says 0 = normal, 1 = bold typeface // the colorNr argument says 0 = font-default, 1 = gray int AppendToHistoryMemo (char * text, int bold, int colorNr) { return AppendText(&historyOptions[0], text); // for now ignore bold & color stuff, as Xaw cannot handle that } void HighlightMove (int from, int to, Boolean highlight) { HighlightText (&historyOptions[0], from, to, highlight); } char *historyText; int SelectMove (Option *opt, int n, int x, int y, char *text, int index) { if(n != 3 && n != 1) return FALSE; // only on button-1 and 3 press FindMoveByCharIndex( index ); // [HGM] also does the actual moving to it, now return (n == 3); // suppress context menu for button 3, but allow selection with button 1 } Option historyOptions[] = { { 200, T_VSCRL | T_FILL | T_WRAP | T_TOP, 400, NULL, (void*) &historyText, NULL, (char**) &SelectMove, TextBox, "" }, { 0, NO_OK, 0, NULL, (void*) NULL, "", NULL, EndMark , "" } }; void ScrollToCurrent (int caretPos) { ScrollToCursor(&historyOptions[0], caretPos); } // ------------ standard entry points into MoveHistory code ----------- Boolean MoveHistoryIsUp () { return shellUp[HistoryDlg]; } Boolean MoveHistoryDialogExists () { return DialogExists(HistoryDlg); } void HistoryPopUp () { if(GenericPopUp(historyOptions, _("Move list"), HistoryDlg, BoardWindow, NONMODAL, appData.topLevel)) AddHandler(&historyOptions[0], HistoryDlg, 0); MarkMenu("View.MoveHistory", HistoryDlg); } void HistoryShowProc () { if (!shellUp[HistoryDlg]) { ASSIGN(historyText, ""); HistoryPopUp(); RefreshMemoContent(); MemoContentUpdated(); } else PopDown(HistoryDlg); ToNrEvent(currentMove); } xboard-4.7.3/xboard.xml0000644000175000001440000000651112262415351011726 00000000000000 PGN chess game notation تدوينة لعبة الشطرنج PGN Zaciem ab šachmatnaj partyi PGN Zaciem ab šachmatnaj partyi PGN Игра шах — PGN notació de joc d'escacs PGN Šachová notace PGN PGN-skakspilsnotation PGN-Schachspielnotation PGN chess game notation Notación de partida de ajedrez PGN PGN xake jokoaren notazioa PGN-šakkipelinotaatio notation de jeu d'échecs PGN nodaireacht chluiche ficheall PGN PGN sakkfeljegyzés Notasi permainan catur PGN Notazione partita a scacchi PGN PGN チェスゲーム記録 PGN шахмат ойыны PGN 체스게임 기보 PGN šachmatų žaidimo žymėjimas PGN šaha spēles notācija PGN sjakkspillnotasjon PGN-schaakspelnotatie PGN-sjakkspelnotasjon Plik PGN notacji gry w szachy Notação de jogo de xadrez PGN Notație joc șah PGN шахматная партия PGN Njoftim loje shahu PGN PGN-schackpartinotation запис гри у шахи PGN Cách ghi lượt chơi cờ PGN PGN 象棋游戏注记 PGN chess position XBoard tournament XBoard options xboard-4.7.3/configure0000755000175000001440000114545412262562275011657 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for xboard 4.7.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-xboard@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='xboard' PACKAGE_TARNAME='xboard' PACKAGE_VERSION='4.7.3' PACKAGE_STRING='xboard 4.7.3' PACKAGE_BUGREPORT='bug-xboard@gnu.org' PACKAGE_URL='' gt_needs= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS XDG_ICON_RESOURCE XDG_DESKTOP_MENU XDG_MIME ENABLE_UPDATE_MIMEDB_FALSE ENABLE_UPDATE_MIMEDB_TRUE ZIPPY_FALSE ZIPPY_TRUE CONF_LDFLAGS CONF_CFLAGS POST_XMULIB PRE_XMULIB FRONTEND_LIBS FRONTEND_CFLAGS withXaw_FALSE withXaw_TRUE withGTK_FALSE withGTK_TRUE X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF GTK_LIBS GTK_CFLAGS CAIRO_LIBS CAIRO_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG PKGCONFIG PERLPATH AWKPATH NROFFFLAGS NROFF MINFO RSH POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS EGREP GREP host_os host_vendor host_cpu host build_os build_vendor build_cpu build XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix with_gtk with_Xaw3d with_Xaw with_x enable_xpm enable_ptys enable_zippy enable_sigint enable_update_mimedb ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR CAIRO_CFLAGS CAIRO_LIBS GTK_CFLAGS GTK_LIBS XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures xboard 4.7.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/xboard] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of xboard 4.7.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-xpm libXpm will be used if found (default) --enable-ptys force use of pseudo-ttys with child processes --enable-zippy support interfacing a chess program to ICS (default) --enable-sigint sending SIGINT (^C) wakes up GNU Chess (default) --disable-update-mimedb disable the update-mime-database after install [default=no] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-gtk use GTK front-end (experimental) --with-Xaw3d use Xaw3d front-end (not fully supported anymore) --with-Xaw use Xaw front-end (default) --with-x use the X Window System Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF xboard configure 4.7.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## --------------------------------- ## ## Report this to bug-xboard@gnu.org ## ## --------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by xboard $as_me 4.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.13' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='xboard' VERSION='4.7.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' ac_config_headers="$ac_config_headers config.h" if test -z "$CFLAGS" ; then CFLAGS=" " fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } if ${ac_cv_search_strerror+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_strerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_strerror+:} false; then : break fi done if ${ac_cv_search_strerror+:} false; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 $as_echo "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.18 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" for ac_prog in remsh rsh do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RSH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RSH"; then ac_cv_prog_RSH="$RSH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RSH="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RSH=$ac_cv_prog_RSH if test -n "$RSH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSH" >&5 $as_echo "$RSH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RSH" && break done test -n "$RSH" || RSH="rsh" for ac_prog in makeinfo do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MINFO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MINFO"; then ac_cv_prog_MINFO="$MINFO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MINFO="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MINFO=$ac_cv_prog_MINFO if test -n "$MINFO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MINFO" >&5 $as_echo "$MINFO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MINFO" && break done test -n "$MINFO" || MINFO="makeinfo_not_found" if test "$MINFO" = makeinfo_not_found ; then echo Please install \"makeinfo\" exit 1 fi cat >>confdefs.h <<_ACEOF #define REMOTE_SHELL "$RSH" _ACEOF # Extract the first word of "nroff", so it can be a program name with args. set dummy nroff; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NROFF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NROFF"; then ac_cv_prog_NROFF="$NROFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NROFF="nroff -man" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_NROFF" && ac_cv_prog_NROFF="cat" fi fi NROFF=$ac_cv_prog_NROFF if test -n "$NROFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 $as_echo "$NROFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi for ac_prog in awk mawk gawk nawk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_AWKPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $AWKPATH in [\\/]* | ?:[\\/]*) ac_cv_path_AWKPATH="$AWKPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_AWKPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi AWKPATH=$ac_cv_path_AWKPATH if test -n "$AWKPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWKPATH" >&5 $as_echo "$AWKPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWKPATH" && break done for ac_prog in perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERLPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $PERLPATH in [\\/]* | ?:[\\/]*) ac_cv_path_PERLPATH="$PERLPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERLPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERLPATH=$ac_cv_path_PERLPATH if test -n "$PERLPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERLPATH" >&5 $as_echo "$PERLPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERLPATH" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in stropts.h sys/time.h string.h unistd.h sys/systeminfo.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/fcntl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done for ac_header in sys/socket.h lan/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF break fi done ac_fn_c_check_header_mongrel "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default" if test "x$ac_cv_header_stddef_h" = xyes; then : else $as_echo "#define X_WCHAR 1" >>confdefs.h fi for ac_func in _getpty grantpt setitimer usleep do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in gettimeofday ftime do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF break fi done for ac_func in random rand48 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF break fi done for ac_func in gethostname sysinfo do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF break fi done ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setlocale in -li" >&5 $as_echo_n "checking for setlocale in -li... " >&6; } if ${ac_cv_lib_i_setlocale+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-li $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setlocale (); int main () { return setlocale (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_i_setlocale=yes else ac_cv_lib_i_setlocale=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_i_setlocale" >&5 $as_echo "$ac_cv_lib_i_setlocale" >&6; } if test "x$ac_cv_lib_i_setlocale" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBI 1 _ACEOF LIBS="-li $LIBS" else $as_echo "#define X_LOCALE 1" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpseudotty in -lseq" >&5 $as_echo_n "checking for getpseudotty in -lseq... " >&6; } if ${ac_cv_lib_seq_getpseudotty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lseq $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getpseudotty (); int main () { return getpseudotty (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_seq_getpseudotty=yes else ac_cv_lib_seq_getpseudotty=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_seq_getpseudotty" >&5 $as_echo "$ac_cv_lib_seq_getpseudotty" >&6; } if test "x$ac_cv_lib_seq_getpseudotty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSEQ 1 _ACEOF LIBS="-lseq $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler understands -Wall -Wno-parentheses" >&5 $as_echo_n "checking whether compiler understands -Wall -Wno-parentheses... " >&6; } SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -Wall -Wno-parentheses" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } CFLAGS="$SAVE_CFLAGS" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext for ac_prog in pkg-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PKGCONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PKGCONFIG" && break done test -n "$PKGCONFIG" || PKGCONFIG="pkgconfig_not_found" if test "x$PKGCONFIG" = xpkgconfig_not_found; then : as_fn_error $? "cannot find pkg-config! Please install it." "$LINENO" 5 fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 \""; } >&5 ($PKG_CONFIG --exists --print-errors " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 " 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 \""; } >&5 ($PKG_CONFIG --exists --print-errors " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 " 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 " 2>&1` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs " cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 " 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements ( cairo >= 1.2.0 librsvg-2.0 >= 2.14.0 ) were not met: $CAIRO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables CAIRO_CFLAGS and CAIRO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables CAIRO_CFLAGS and CAIRO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi FRONTEND_CFLAGS="" FRONTEND_LIBS="" # Check whether --with-gtk was given. if test "${with_gtk+set}" = set; then : withval=$with_gtk; with_GTK=yes else with_GTK=no fi # Check whether --with-Xaw3d was given. if test "${with_Xaw3d+set}" = set; then : withval=$with_Xaw3d; with_Xaw3d=yes else with_Xaw3d=no fi # Check whether --with-Xaw was given. if test "${with_Xaw+set}" = set; then : withval=$with_Xaw; with_Xaw=yes else with_Xaw=no fi if test x"$with_GTK" = x"yes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gtk+-2.0 >= 2.16.0 gmodule-2.0 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gtk+-2.0 >= 2.16.0 gmodule-2.0 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags " gtk+-2.0 >= 2.16.0 gmodule-2.0 " 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" gtk+-2.0 >= 2.16.0 gmodule-2.0 \""; } >&5 ($PKG_CONFIG --exists --print-errors " gtk+-2.0 >= 2.16.0 gmodule-2.0 ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs " gtk+-2.0 >= 2.16.0 gmodule-2.0 " 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs " gtk+-2.0 >= 2.16.0 gmodule-2.0 " 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs " gtk+-2.0 >= 2.16.0 gmodule-2.0 " 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements ( gtk+-2.0 >= 2.16.0 gmodule-2.0 ) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi FRONTEND_CFLAGS=$GTK_CFLAGS FRONTEND_LIBS=$GTK_LIBS fi if test x"$with_GTK" = x"no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test -n "$no_x" ; then as_fn_error $? " \" $PACKAGE requires the X Window System header files and libraries! They were not found on your system. See FAQ topic C.2. configure failed\"" "$LINENO" 5 fi save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "X11/Intrinsic.h" "ac_cv_header_X11_Intrinsic_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Intrinsic_h" = xyes; then : xt="yes" else xt="no" fi CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test "$xt" = "no" ; then as_fn_error $? "Xt headers not found. Please install the X11 packages." "$LINENO" 5 fi FRONTEND_LIBS= if test x"$with_Xaw3d" != x"no"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XawTextReplace in -lXaw3d" >&5 $as_echo_n "checking for XawTextReplace in -lXaw3d... " >&6; } if ${ac_cv_lib_Xaw3d_XawTextReplace+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXaw3d -lXaw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XawTextReplace (); int main () { return XawTextReplace (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xaw3d_XawTextReplace=yes else ac_cv_lib_Xaw3d_XawTextReplace=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xaw3d_XawTextReplace" >&5 $as_echo "$ac_cv_lib_Xaw3d_XawTextReplace" >&6; } if test "x$ac_cv_lib_Xaw3d_XawTextReplace" = xyes; then : FRONTEND_LIBS="-lXaw3d" $as_echo "#define USE_XAW3D 1" >>confdefs.h else as_fn_error $? "--with-Xaw3d was given, but test for Xaw3d failed. Make sure that you have Xaw3d installed, else you might want to try the configure option --without-Xaw3d" "$LINENO" 5 fi fi if test x"$with_Xaw3d" = x"no" ; then with_Xaw=yes save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "X11/Xaw/Dialog.h" "ac_cv_header_X11_Xaw_Dialog_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Xaw_Dialog_h" = xyes; then : xaw_headers="yes" else xaw_headers="no" fi CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test x"$xaw_headers" = x"no" ; then as_fn_error $? "Xaw headers not found. Please install the Xaw package and headers." "$LINENO" 5 fi FRONTEND_LIBS="-lXaw" fi fi if test x"$with_GTK" = x"yes"; then withGTK_TRUE= withGTK_FALSE='#' else withGTK_TRUE='#' withGTK_FALSE= fi if test x"$with_Xaw3d" = x"yes"; then withXaw_TRUE= withXaw_FALSE='#' else withXaw_TRUE='#' withXaw_FALSE= fi if test x"$with_Xaw" = x"yes"; then withXaw_TRUE= withXaw_FALSE='#' else withXaw_TRUE='#' withXaw_FALSE= fi USE_PTYS=0 case "$host" in *-*-hpux* ) $as_echo "#define PTY_TTY_NAME_SPRINTF sprintf (pty_name, \"/dev/pty/tty%c%x\", c, i);" >>confdefs.h $as_echo "#define PTY_NAME_SPRINTF sprintf (pty_name, \"/dev/ptym/pty%c%x\", c, i);" >>confdefs.h if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" else CONF_CFLAGS="-Aa -D_HPUX_SOURCE" fi if test -d /opt/hppd/include/X11; then X_CFLAGS="$X_CFLAGS -I/opt/hppd/include" X_LIBS="$X_LIBS -L/opt/hppd/lib" elif test -d /usr/contrib/X11R5/include; then X_CFLAGS="$X_CFLAGS -I/usr/contrib/X11R5/include" X_LIBS="$X_LIBS -L/usr/contrib/X11R5/lib" elif test -d /usr/contrib/mitX11R5/include; then X_CFLAGS="$X_CFLAGS -I/usr/contrib/mitX11R5/include" X_LIBS="$X_LIBS -L/usr/contrib/mitX11R5/lib" elif test -d /MIT/X11R5/include; then X_CFLAGS="$X_CFLAGS -I/MIT/X11R5/include" X_LIBS="$X_LIBS -L/MIT/X11R5/lib" elif test -d /usr/local/include/X11R5; then X_CFLAGS="$X_CFLAGS -I/usr/local/include/X11R5" X_LIBS="$X_LIBS -L/usr/local/lib/X11R5" fi if test -d /usr/include/X11R5; then X_CFLAGS="$X_CFLAGS -I/usr/include/X11R5" X_LIBS="$X_LIBS -L/usr/lib/X11R5 -L/usr/lib/X11R4" elif test -d /usr/include/X11R4; then X_CFLAGS="$X_CFLAGS -I/usr/include/X11R4" X_LIBS="$X_LIBS -L/usr/lib/X11R4" fi ;; romp-ibm-aix* ) $as_echo "#define IBMRTAIX 1" >>confdefs.h ;; i386-ibm-aix ) if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" fi ;; *-*-aix3* | *-*-bosx* ) $as_echo "#define PTY_ITERATION for (c = 0; !c; c++)" >>confdefs.h $as_echo "#define PTY_NAME_SPRINTF strcpy (pty_name, \"/dev/ptc\");" >>confdefs.h $as_echo "#define PTY_TTY_NAME_SPRINTF strcpy (pty_name, ttyname (fd));" >>confdefs.h ;; *-*-cxux* ) $as_echo "#define FIRST_PTY_LETTER 'A'" >>confdefs.h $as_echo "#define LAST_PTY_LETTER 'P'" >>confdefs.h ;; *-*-uniplus* ) $as_echo "#define UNIPLUS 1" >>confdefs.h ;; *-*-rtu* ) $as_echo "#define FIRST_PTY_LETTER 'z'" >>confdefs.h $as_echo "#define PTY_TTY_NAME_SPRINTF sprintf (pty_name, \"/dev/ttyp%x\", i);" >>confdefs.h $as_echo "#define PTY_NAME_SPRINTF sprintf (pty_name, \"/dev/pty%x\", i);" >>confdefs.h $as_echo "#define RTU 1" >>confdefs.h ;; *-*-iris* | *-*-irix3* ) $as_echo "#define PTY_ITERATION for (c = 0; !c; c++)" >>confdefs.h $as_echo "#define PTY_NAME_SPRINTF strcpy (pty_name, \"/dev/ptc\");" >>confdefs.h $as_echo "#define PTY_TTY_NAME_SPRINTF sprintf (pty_name, \"/dev/ttyq%d\", minor(stb.st_rdev));" >>confdefs.h ;; *-*-irix* ) ;; *-*-sunos4* | *-*-solaris1* ) if test "$GCC" = yes; then PRE_XMULIB="-static" POST_XMULIB="-dynamic" else PRE_XMULIB="-Bstatic" POST_XMULIB="-Bdynamic" fi ;; *-*-sunos5* | *-*-solaris2* ) X_LIBS="$X_LIBS -lelf" ;; *-*-sco* ) $as_echo "#define PTY_ITERATION for (i = 0; ; i++)" >>confdefs.h $as_echo "#define PTY_NAME_SPRINTF sprintf (pty_name, \"/dev/ptyp%d\", i);" >>confdefs.h $as_echo "#define PTY_TTY_NAME_SPRINTF sprintf (pty_name, \"/dev/ttyp%d\", i);" >>confdefs.h ;; *-*-dynix* | *-*-ptx* ) ;; *-*-esix* ) ;; *-*-usg5-4* | *-*-sysvr4* ) ;; *-*-usg* | *-*-sysv* | *-*-aix* ) ;; vax-*-ultrix ) if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" fi ;; *-apple-* ) ;; esac # Check whether --enable-xpm was given. if test "${enable_xpm+set}" = set; then : enableval=$enable_xpm; enable_xpm="$enableval" else enable_xpm="yes" fi if test x"$enable_xpm" != "xno"; then save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" for ac_header in X11/xpm.h do : ac_fn_c_check_header_mongrel "$LINENO" "X11/xpm.h" "ac_cv_header_X11_xpm_h" "$ac_includes_default" if test "x$ac_cv_header_X11_xpm_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_XPM_H 1 _ACEOF fi done CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test "$ac_cv_header_X11_xpm_h" = "yes"; then save_ldflags="$LDFLAGS" LDFLAGS="$LDFLAGS $X_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XpmReadFileToPixmap in -lXpm" >&5 $as_echo_n "checking for XpmReadFileToPixmap in -lXpm... " >&6; } if ${ac_cv_lib_Xpm_XpmReadFileToPixmap+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXpm $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XpmReadFileToPixmap (); int main () { return XpmReadFileToPixmap (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xpm_XpmReadFileToPixmap=yes else ac_cv_lib_Xpm_XpmReadFileToPixmap=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xpm_XpmReadFileToPixmap" >&5 $as_echo "$ac_cv_lib_Xpm_XpmReadFileToPixmap" >&6; } if test "x$ac_cv_lib_Xpm_XpmReadFileToPixmap" = xyes; then : X_PRE_LIBS="-lXpm $X_PRE_LIBS"; $as_echo "#define HAVE_LIBXPM 1" >>confdefs.h fi LDFLAGS="$save_ldflags" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ptys or pipes should be used" >&5 $as_echo_n "checking whether ptys or pipes should be used... " >&6; } # Check whether --enable-ptys was given. if test "${enable_ptys+set}" = set; then : enableval=$enable_ptys; if test "$enableval" = yes; then USE_PTYS=1 enable_ptys="ptys" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ptys (user override)" >&5 $as_echo "ptys (user override)" >&6; } fi if test "$enableval" = no; then USE_PTYS=0 enable_ptys="pipes" { $as_echo "$as_me:${as_lineno-$LINENO}: result: pipes (user override)" >&5 $as_echo "pipes (user override)" >&6; } fi else if test "$USE_PTYS" = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ptys" >&5 $as_echo "ptys" >&6; } enable_ptys="ptys" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: pipes" >&5 $as_echo "pipes" >&6; } enable_ptys="pipes" fi fi cat >>confdefs.h <<_ACEOF #define USE_PTYS $USE_PTYS _ACEOF # Check whether --enable-zippy was given. if test "${enable_zippy+set}" = set; then : enableval=$enable_zippy; else enable_zippy="no" fi if test x"$enable_zippy" != xno; then $as_echo "#define ZIPPY 1" >>confdefs.h else $as_echo "#define ZIPPY 0" >>confdefs.h fi if test x$enable_zippy != xno; then ZIPPY_TRUE= ZIPPY_FALSE='#' else ZIPPY_TRUE='#' ZIPPY_FALSE= fi # Check whether --enable-sigint was given. if test "${enable_sigint+set}" = set; then : enableval=$enable_sigint; if test "$enableval" = yes; then $as_echo "#define ATTENTION 1" >>confdefs.h fi enable_sigint=$enableval else enable_sigint="yes" $as_echo "#define ATTENTION 1" >>confdefs.h fi if test x"$with_Xaw3d" = x"yes" -o x"$with_Xaw" = x"yes" ; then X_LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS -lXmu -lX11 -lXt " fi # Check whether --enable-update-mimedb was given. if test "${enable_update_mimedb+set}" = set; then : enableval=$enable_update_mimedb; enable_mimedb="no" else enable_mimedb="yes" fi if test x"$enable_mimedb" = "xyes"; then ENABLE_UPDATE_MIMEDB_TRUE= ENABLE_UPDATE_MIMEDB_FALSE='#' else ENABLE_UPDATE_MIMEDB_TRUE='#' ENABLE_UPDATE_MIMEDB_FALSE= fi if test x"$enable_mimedb" = "xyes"; then # Extract the first word of "xdg-mime", so it can be a program name with args. set dummy xdg-mime; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XDG_MIME+:} false; then : $as_echo_n "(cached) " >&6 else case $XDG_MIME in [\\/]* | ?:[\\/]*) ac_cv_path_XDG_MIME="$XDG_MIME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XDG_MIME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XDG_MIME=$ac_cv_path_XDG_MIME if test -n "$XDG_MIME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDG_MIME" >&5 $as_echo "$XDG_MIME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xdg-desktop-menu", so it can be a program name with args. set dummy xdg-desktop-menu; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XDG_DESKTOP_MENU+:} false; then : $as_echo_n "(cached) " >&6 else case $XDG_DESKTOP_MENU in [\\/]* | ?:[\\/]*) ac_cv_path_XDG_DESKTOP_MENU="$XDG_DESKTOP_MENU" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XDG_DESKTOP_MENU="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XDG_DESKTOP_MENU=$ac_cv_path_XDG_DESKTOP_MENU if test -n "$XDG_DESKTOP_MENU"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDG_DESKTOP_MENU" >&5 $as_echo "$XDG_DESKTOP_MENU" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xdg-icon-resource", so it can be a program name with args. set dummy xdg-icon-resource; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XDG_ICON_RESOURCE+:} false; then : $as_echo_n "(cached) " >&6 else case $XDG_ICON_RESOURCE in [\\/]* | ?:[\\/]*) ac_cv_path_XDG_ICON_RESOURCE="$XDG_ICON_RESOURCE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XDG_ICON_RESOURCE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XDG_ICON_RESOURCE=$ac_cv_path_XDG_ICON_RESOURCE if test -n "$XDG_ICON_RESOURCE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDG_ICON_RESOURCE" >&5 $as_echo "$XDG_ICON_RESOURCE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi ac_config_files="$ac_config_files Makefile cmail po/Makefile.in" ac_config_commands="$ac_config_commands test-stamp-h" ac_config_commands="$ac_config_commands chmod-cmail" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${withGTK_TRUE}" && test -z "${withGTK_FALSE}"; then as_fn_error $? "conditional \"withGTK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${withXaw_TRUE}" && test -z "${withXaw_FALSE}"; then as_fn_error $? "conditional \"withXaw\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${withXaw_TRUE}" && test -z "${withXaw_FALSE}"; then as_fn_error $? "conditional \"withXaw\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ZIPPY_TRUE}" && test -z "${ZIPPY_FALSE}"; then as_fn_error $? "conditional \"ZIPPY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_UPDATE_MIMEDB_TRUE}" && test -z "${ENABLE_UPDATE_MIMEDB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_UPDATE_MIMEDB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by xboard $as_me 4.7.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ xboard config.status 4.7.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "cmail") CONFIG_FILES="$CONFIG_FILES cmail" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "test-stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS test-stamp-h" ;; "chmod-cmail") CONFIG_COMMANDS="$CONFIG_COMMANDS chmod-cmail" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; "test-stamp-h":C) test -z "$CONFIG_HEADERS" || date > stamp-h ;; "chmod-cmail":C) chmod 755 cmail ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo " Configurations summary:" echo "" echo " prefix: $prefix " echo " datarootdir: $datarootdir " echo " datadir: $datadir (icons will go in \$datadir/icons/hicolor/...)" echo " (bitmaps will go in \$datadir/games/xboard/...)" echo " infodir: $infodir (info files will go here)" echo " sysconfdir: $sysconfdir (xboard.conf will go here)" echo "" echo " update mimedb: $enable_mimedb" echo "" echo " NLS support: $USE_NLS" echo "" echo " GTK: $with_GTK" echo " Xaw3d: $with_Xaw3d" echo " Xaw: $with_Xaw" echo "" echo " xpm: $enable_xpm" echo " ptys: $enable_ptys" echo " zippy: $enable_zippy" echo " sigint: $enable_sigint" xboard-4.7.3/draw.c0000644000175000001440000006717412262562252011045 00000000000000/* * draw.c -- drawing routines for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if ENABLE_NLS #include #endif #include "common.h" #include "backend.h" #include "board.h" #include "menus.h" #include "dialogs.h" #include "evalgraph.h" #include "gettext.h" #include "draw.h" #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif #define SOLID 0 #define OUTLINE 1 Boolean cairoAnimate; Option *currBoard; cairo_surface_t *csBoardWindow; static cairo_surface_t *pngPieceImages[2][(int)BlackPawn+4]; // png 256 x 256 images static cairo_surface_t *pngPieceBitmaps[2][(int)BlackPawn]; // scaled pieces as used static cairo_surface_t *pngPieceBitmaps2[2][(int)BlackPawn+4]; // scaled pieces in store static RsvgHandle *svgPieces[2][(int)BlackPawn+4]; // vector pieces in store static cairo_surface_t *pngBoardBitmap[2]; int useTexture, textureW[2], textureH[2]; #define pieceToSolid(piece) &pieceBitmap[SOLID][(piece) % (int)BlackPawn] #define pieceToOutline(piece) &pieceBitmap[OUTLINE][(piece) % (int)BlackPawn] #define White(piece) ((int)(piece) < (int)BlackPawn) char *crWhite = "#FFFFB0"; char *crBlack = "#AD5D3D"; struct { int x1, x2, y1, y2; } gridSegments[BOARD_RANKS + BOARD_FILES + 2]; void SwitchWindow (int main) { currBoard = (main ? &mainOptions[W_BOARD] : &dualOptions[3]); csBoardWindow = DRAWABLE(currBoard); } void SelectPieces(VariantClass v) { int i; for(i=0; i<2; i++) { int p; for(p=0; p<=(int)WhiteKing; p++) pngPieceBitmaps[i][p] = pngPieceBitmaps2[i][p]; // defaults if(v == VariantShogi) { pngPieceBitmaps[i][(int)WhiteCannon] = pngPieceBitmaps2[i][(int)WhiteKing+1]; pngPieceBitmaps[i][(int)WhiteNightrider] = pngPieceBitmaps2[i][(int)WhiteKing+2]; pngPieceBitmaps[i][(int)WhiteSilver] = pngPieceBitmaps2[i][(int)WhiteKing+3]; pngPieceBitmaps[i][(int)WhiteGrasshopper] = pngPieceBitmaps2[i][(int)WhiteKing+4]; pngPieceBitmaps[i][(int)WhiteQueen] = pngPieceBitmaps2[i][(int)WhiteLance]; } #ifdef GOTHIC if(v == VariantGothic) { pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteSilver]; } #endif if(v == VariantSChess) { pngPieceBitmaps[i][(int)WhiteAngel] = pngPieceBitmaps2[i][(int)WhiteFalcon]; pngPieceBitmaps[i][(int)WhiteMarshall] = pngPieceBitmaps2[i][(int)WhiteAlfil]; } } } #define BoardSize int void InitDrawingSizes (BoardSize boardSize, int flags) { // [HGM] resize is functional now, but for board format changes only (nr of ranks, files) int boardWidth, boardHeight; static int oldWidth, oldHeight; static VariantClass oldVariant; static int oldTwoBoards = 0; if(!mainOptions[W_BOARD].handle) return; if(oldTwoBoards && !twoBoards) PopDown(DummyDlg); oldTwoBoards = twoBoards; if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); if(boardWidth != oldWidth || boardHeight != oldHeight) { // do resizing stuff only if size actually changed oldWidth = boardWidth; oldHeight = boardHeight; CreateGrid(); /* * Inhibit shell resizing. */ ResizeBoardWindow(boardWidth, boardHeight, 0); DelayedDrag(); } // [HGM] pieces: tailor piece bitmaps to needs of specific variant // (only for xpm) if(gameInfo.variant != oldVariant) { // and only if variant changed SelectPieces(gameInfo.variant); oldVariant = gameInfo.variant; } CreateAnimVars(); } void ExposeRedraw (Option *graph, int x, int y, int w, int h) { // copy a selected part of the buffer bitmap to the display cairo_t *cr = cairo_create((cairo_surface_t *) graph->textValue); cairo_set_source_surface(cr, (cairo_surface_t *) graph->choice, 0, 0); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_rectangle(cr, x, y, w, h); cairo_fill(cr); cairo_destroy(cr); } static void CreatePNGBoard (char *s, int kind) { if(!appData.useBitmaps || s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; } if(strstr(s, ".png")) { cairo_surface_t *img = cairo_image_surface_create_from_png (s); if(img) { useTexture |= kind + 1; pngBoardBitmap[kind] = img; textureW[kind] = cairo_image_surface_get_width (img); textureH[kind] = cairo_image_surface_get_height (img); } } } char *pngPieceNames[] = // must be in same order as internal piece encoding { "Pawn", "Knight", "Bishop", "Rook", "Queen", "Advisor", "Elephant", "Archbishop", "Marshall", "Gold", "Commoner", "Canon", "Nightrider", "CrownedBishop", "CrownedRook", "Princess", "Chancellor", "Hawk", "Lance", "Cobra", "Unicorn", "King", "GoldKnight", "GoldLance", "GoldPawn", "GoldSilver", NULL }; RsvgHandle * LoadSVG (char *dir, int color, int piece) { char buf[MSG_SIZ]; RsvgHandle *svg=svgPieces[color][piece]; RsvgDimensionData svg_dimensions; GError *svgerror=NULL; cairo_surface_t *img; cairo_t *cr; snprintf(buf, MSG_SIZ, "%s/%s%s.svg", dir, color ? "Black" : "White", pngPieceNames[piece]); if(svg || *dir && (svg = rsvg_handle_new_from_file(buf, &svgerror))) { rsvg_handle_get_dimensions(svg, &svg_dimensions); img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, squareSize, squareSize); cr = cairo_create(img); cairo_scale(cr, squareSize/(double) svg_dimensions.width, squareSize/(double) svg_dimensions.height); rsvg_handle_render_cairo(svg, cr); if(cairo_surface_status(img) == CAIRO_STATUS_SUCCESS) { if(pngPieceImages[color][piece]) cairo_surface_destroy(pngPieceImages[color][piece]); pngPieceImages[color][piece] = img; } cairo_destroy(cr); return svg; } if(svgerror) g_error_free(svgerror); return NULL; } static void ScaleOnePiece (int color, int piece) { float w, h; char buf[MSG_SIZ]; cairo_surface_t *img, *cs; cairo_t *cr; g_type_init (); svgPieces[color][piece] = LoadSVG("", color, piece); // this fills pngPieceImages if we had cached svg with bitmap of wanted size if(!pngPieceImages[color][piece]) { // we don't have cached bitmap (implying we did not have cached svg) if(*appData.pieceDirectory) { // user specified piece directory snprintf(buf, MSG_SIZ, "%s/%s%s.png", appData.pieceDirectory, color ? "Black" : "White", pngPieceNames[piece]); img = cairo_image_surface_create_from_png (buf); // try if there are png pieces there if(cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) { // there were not svgPieces[color][piece] = LoadSVG(appData.pieceDirectory, color, piece); // so try if he has svg there } else pngPieceImages[color][piece] = img; } } if(!pngPieceImages[color][piece]) { // we still did not manage to acquire a piece bitmap static int warned = 0; if(!(svgPieces[color][piece] = LoadSVG(SVGDIR, color, piece)) && !warned) { // try to fall back on installed svg char *msg = _("No default pieces installed\nSelect your own -pieceImageDirectory"); printf("%s\n", msg); // give up DisplayError(msg, 0); warned = 1; // prevent error message being repeated for each piece type } } img = pngPieceImages[color][piece]; // create new bitmap to hold scaled piece image (and remove any old) if(pngPieceBitmaps2[color][piece]) cairo_surface_destroy (pngPieceBitmaps2[color][piece]); pngPieceBitmaps2[color][piece] = cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize); if(!img) return; // scaled copying of the raw png image cr = cairo_create(cs); w = cairo_image_surface_get_width (img); h = cairo_image_surface_get_height (img); cairo_scale(cr, squareSize/w, squareSize/h); cairo_set_source_surface (cr, img, 0, 0); cairo_paint (cr); cairo_destroy (cr); if(!appData.trueColors || !*appData.pieceDirectory) { // operate on bitmap to color it (king-size hack...) int stride = cairo_image_surface_get_stride(cs)/4; int *buf = (int *) cairo_image_surface_get_data(cs); int i, j, p; sscanf(color ? appData.blackPieceColor+1 : appData.whitePieceColor+1, "%x", &p); // replacement color cairo_surface_flush(cs); for(i=0; i> 24; r = c >> 16 & 255; // alpha and red, where red is the 'white' weight, since white is #FFFFCC in the source images f = (color ? a - r : r)/255.; // fraction of black or white in the mix that has to be replaced buf[i*stride + j] = c & 0xFF000000; // alpha channel is kept at same opacity buf[i*stride + j] += ((int)(f*(p&0xFF0000)) & 0xFF0000) + ((int)(f*(p&0xFF00)) & 0xFF00) + (int)(f*(p&0xFF)); // add desired fraction of new color if(color) buf[i*stride + j] += r | r << 8 | r << 16; // details on black pieces get their weight added in pure white if(appData.monoMode) { if(a < 64) buf[i*stride + j] = 0; // if not opaque enough, totally transparent else if(2*r < a) buf[i*stride + j] = 0xFF000000; // if not light enough, totally black else buf[i*stride + j] = 0xFFFFFFFF; // otherwise white } } cairo_surface_mark_dirty(cs); } } void CreatePNGPieces () { int p; for(p=0; pngPieceNames[p]; p++) { ScaleOnePiece(0, p); ScaleOnePiece(1, p); } SelectPieces(gameInfo.variant); } void CreateAnyPieces () { // [HGM] taken out of main CreatePNGPieces(); CreatePNGBoard(appData.liteBackTextureFile, 1); CreatePNGBoard(appData.darkBackTextureFile, 0); } void InitDrawingParams (int reloadPieces) { int i, p; if(reloadPieces) for(i=0; i<2; i++) for(p=0; p> 4*n & 255; return c/255.; } void SetPen (cairo_t *cr, float w, char *col, int dash) { static const double dotted[] = {4.0, 4.0}; static int len = sizeof(dotted) / sizeof(dotted[0]); cairo_set_line_width (cr, w); cairo_set_source_rgba (cr, Color(col, 4), Color(col, 2), Color(col, 0), 1.0); if(dash) cairo_set_dash (cr, dotted, len, 0.0); } void DrawSeekAxis( int x, int y, int xTo, int yTo ) { cairo_t *cr; /* get a cairo_t */ cr = cairo_create (csBoardWindow); cairo_move_to (cr, x, y); cairo_line_to(cr, xTo, yTo ); SetPen(cr, 2, "#000000", 0); cairo_stroke(cr); /* free memory */ cairo_destroy (cr); GraphExpose(currBoard, x-1, yTo-1, xTo-x+2, y-yTo+2); } void DrawSeekBackground( int left, int top, int right, int bottom ) { cairo_t *cr = cairo_create (csBoardWindow); cairo_rectangle (cr, left, top, right-left, bottom-top); cairo_set_source_rgba(cr, 0.8, 0.8, 0.4,1.0); cairo_fill(cr); /* free memory */ cairo_destroy (cr); GraphExpose(currBoard, left, top, right-left, bottom-top); } void DrawSeekText(char *buf, int x, int y) { cairo_t *cr = cairo_create (csBoardWindow); cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size (cr, 12.0); cairo_move_to (cr, x, y+4); cairo_set_source_rgba(cr, 0, 0, 0,1.0); cairo_show_text( cr, buf); /* free memory */ cairo_destroy (cr); GraphExpose(currBoard, x-5, y-10, 60, 15); } void DrawSeekDot(int x, int y, int colorNr) { cairo_t *cr = cairo_create (csBoardWindow); int square = colorNr & 0x80; colorNr &= 0x7F; if(square) cairo_rectangle (cr, x-squareSize/9, y-squareSize/9, 2*(squareSize/9), 2*(squareSize/9)); else cairo_arc(cr, x, y, squareSize/9, 0.0, 2*M_PI); SetPen(cr, 2, "#000000", 0); cairo_stroke_preserve(cr); switch (colorNr) { case 0: cairo_set_source_rgba(cr, 1.0, 0, 0,1.0); break; case 1: cairo_set_source_rgba (cr, 0.0, 0.7, 0.2, 1.0); break; default: cairo_set_source_rgba (cr, 1.0, 1.0, 0.0, 1.0); break; } cairo_fill(cr); /* free memory */ cairo_destroy (cr); GraphExpose(currBoard, x-squareSize/8, y-squareSize/8, 2*(squareSize/8), 2*(squareSize/8)); } void InitDrawingHandle (Option *opt) { csBoardWindow = DRAWABLE(opt); } void CreateGrid () { int i, j; if (lineGap == 0) return; /* [HR] Split this into 2 loops for non-square boards. */ for (i = 0; i < BOARD_HEIGHT + 1; i++) { gridSegments[i].x1 = 0; gridSegments[i].x2 = lineGap + BOARD_WIDTH * (squareSize + lineGap); gridSegments[i].y1 = gridSegments[i].y2 = lineGap / 2 + (i * (squareSize + lineGap)); } for (j = 0; j < BOARD_WIDTH + 1; j++) { gridSegments[j + i].y1 = 0; gridSegments[j + i].y2 = lineGap + BOARD_HEIGHT * (squareSize + lineGap); gridSegments[j + i].x1 = gridSegments[j + i].x2 = lineGap / 2 + (j * (squareSize + lineGap)); } } void DrawGrid() { /* draws a grid starting around Nx, Ny squares starting at x,y */ int i; float odd = (lineGap & 1)/2.; cairo_t *cr; /* get a cairo_t */ cr = cairo_create (csBoardWindow); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); SetPen(cr, lineGap, "#000000", 0); /* lines in X */ for (i = 0; i < BOARD_WIDTH + BOARD_HEIGHT + 2; i++) { int h = (gridSegments[i].y1 == gridSegments[i].y2); // horizontal cairo_move_to (cr, gridSegments[i].x1 + !h*odd, gridSegments[i].y1 + h*odd); cairo_line_to (cr, gridSegments[i].x2 + !h*odd, gridSegments[i].y2 + h*odd); cairo_stroke (cr); } /* free memory */ cairo_destroy (cr); return; } void DrawBorder (int x, int y, int type, int odd) { cairo_t *cr; char *col; switch(type) { case 0: col = "#000000"; break; case 1: col = appData.highlightSquareColor; break; case 2: col = appData.premoveHighlightColor; break; default: col = "#808080"; break; // cannot happen } cr = cairo_create(csBoardWindow); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_rectangle(cr, x+odd/2., y+odd/2., squareSize+lineGap, squareSize+lineGap); SetPen(cr, lineGap, col, 0); cairo_stroke(cr); cairo_destroy(cr); GraphExpose(currBoard, x - lineGap/2, y - lineGap/2, squareSize+2*lineGap+odd, squareSize+2*lineGap+odd); } static int CutOutSquare (int x, int y, int *x0, int *y0, int kind) { int W = BOARD_WIDTH, H = BOARD_HEIGHT; int nx = x/(squareSize + lineGap), ny = y/(squareSize + lineGap); *x0 = 0; *y0 = 0; if(textureW[kind] < squareSize || textureH[kind] < squareSize) return 0; if(textureW[kind] < W*squareSize) *x0 = (textureW[kind] - squareSize) * nx/(W-1); else *x0 = textureW[kind]*nx / W + (textureW[kind] - W*squareSize) / (2*W); if(textureH[kind] < H*squareSize) *y0 = (textureH[kind] - squareSize) * ny/(H-1); else *y0 = textureH[kind]*ny / H + (textureH[kind] - H*squareSize) / (2*H); return 1; } void DrawLogo (Option *opt, void *logo) { cairo_surface_t *img; cairo_t *cr; int w, h; if(!logo || !opt) return; img = cairo_image_surface_create_from_png (logo); w = cairo_image_surface_get_width (img); h = cairo_image_surface_get_height (img); cr = cairo_create(DRAWABLE(opt)); // cairo_scale(cr, (float)appData.logoSize/w, appData.logoSize/(2.*h)); cairo_scale(cr, (float)opt->max/w, (float)opt->value/h); cairo_set_source_surface (cr, img, 0, 0); cairo_paint (cr); cairo_destroy (cr); cairo_surface_destroy (img); GraphExpose(opt, 0, 0, appData.logoSize, appData.logoSize/2); } static void BlankSquare (cairo_surface_t *dest, int x, int y, int color, ChessSquare piece, int fac) { // [HGM] extra param 'fac' for forcing destination to (0,0) for copying to animation buffer int x0, y0; cairo_t *cr; cr = cairo_create (dest); if ((useTexture & color+1) && CutOutSquare(x, y, &x0, &y0, color)) { cairo_set_source_surface (cr, pngBoardBitmap[color], x*fac - x0, y*fac - y0); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_rectangle (cr, x*fac, y*fac, squareSize, squareSize); cairo_fill (cr); cairo_destroy (cr); } else { // evenly colored squares char *col = NULL; switch (color) { case 0: col = appData.darkSquareColor; break; case 1: col = appData.lightSquareColor; break; case 2: col = "#000000"; break; default: col = "#808080"; break; // cannot happen } SetPen(cr, 2.0, col, 0); cairo_rectangle (cr, fac*x, fac*y, squareSize, squareSize); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_fill (cr); cairo_destroy (cr); } } static void pngDrawPiece (cairo_surface_t *dest, ChessSquare piece, int square_color, int x, int y) { int kind; cairo_t *cr; if ((int)piece < (int) BlackPawn) { kind = 0; } else { kind = 1; piece -= BlackPawn; } if(appData.upsideDown && flipView) kind = 1 - kind; // swap white and black pieces BlankSquare(dest, x, y, square_color, piece, 1); // erase previous contents with background cr = cairo_create (dest); cairo_set_source_surface (cr, pngPieceBitmaps[kind][piece], x, y); cairo_paint(cr); cairo_destroy (cr); } void DoDrawDot (cairo_surface_t *cs, int marker, int x, int y, int r) { cairo_t *cr; cr = cairo_create(cs); cairo_arc(cr, x+r/2, y+r/2, r/2, 0.0, 2*M_PI); if(appData.monoMode) { SetPen(cr, 2, marker == 2 ? "#000000" : "#FFFFFF", 0); cairo_stroke_preserve(cr); SetPen(cr, 2, marker == 2 ? "#FFFFFF" : "#000000", 0); } else { SetPen(cr, 2, marker == 2 ? "#FF0000" : "#FFFF00", 0); } cairo_fill(cr); cairo_destroy(cr); } void DrawDot (int marker, int x, int y, int r) { // used for atomic captures; no need to draw on backup DoDrawDot(csBoardWindow, marker, x, y, r); GraphExpose(currBoard, x-r, y-r, 2*r, 2*r); } static void DrawText (char *string, int x, int y, int align) { int xx = x, yy = y; cairo_text_extents_t te; cairo_t *cr; cr = cairo_create (csBoardWindow); cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, squareSize/4); // calculate where it goes cairo_text_extents (cr, string, &te); if (align == 1) { xx += squareSize - te.width - te.x_bearing - 1; yy += squareSize - te.height - te.y_bearing - 1; } else if (align == 2) { xx += te.x_bearing + 1, yy += -te.y_bearing + 1; } else if (align == 3) { xx += squareSize - te.width -te.x_bearing - 1; yy += -te.y_bearing + 3; } else if (align == 4) { xx += te.x_bearing + 1, yy += -te.y_bearing + 3; } cairo_move_to (cr, xx-1, yy); if(align < 3) cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); else cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_show_text (cr, string); cairo_destroy (cr); } void DrawOneSquare (int x, int y, ChessSquare piece, int square_color, int marker, char *tString, char *bString, int align) { // basic front-end board-draw function: takes care of everything that can be in square: // piece, background, coordinate/count, marker dot if (piece == EmptySquare) { BlankSquare(csBoardWindow, x, y, square_color, piece, 1); } else { pngDrawPiece(csBoardWindow, piece, square_color, x, y); } if(align) { // square carries inscription (coord or piece count) if(align > 1) DrawText(tString, x, y, align); // top (rank or count) if(bString && *bString) DrawText(bString, x, y, 1); // bottom (always lower right file ID) } if(marker) { // print fat marker dot, if requested DoDrawDot(csBoardWindow, marker, x + squareSize/4, y+squareSize/4, squareSize/2); } } /**** Animation code by Hugh Fisher, DCS, ANU. ****/ /* Masks for XPM pieces. Black and white pieces can have different shapes, but in the interest of retaining my sanity pieces must have the same outline on both light and dark squares, and all pieces must use the same background square colors/images. */ static cairo_surface_t *c_animBufs[3*NrOfAnims]; // newBuf, saveBuf static void InitAnimState (AnimNr anr) { if(c_animBufs[anr]) cairo_surface_destroy (c_animBufs[anr]); if(c_animBufs[anr+2]) cairo_surface_destroy (c_animBufs[anr+2]); c_animBufs[anr+4] = csBoardWindow; c_animBufs[anr+2] = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize); c_animBufs[anr] = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, squareSize, squareSize); } void CreateAnimVars () { InitAnimState(Game); InitAnimState(Player); } static void CairoOverlayPiece (ChessSquare piece, cairo_surface_t *dest) { static cairo_t *pieceSource; pieceSource = cairo_create (dest); cairo_set_source_surface (pieceSource, pngPieceBitmaps[!White(piece)][piece % BlackPawn], 0, 0); if(doubleClick) cairo_paint_with_alpha (pieceSource, 0.6); else cairo_paint(pieceSource); cairo_destroy (pieceSource); } void InsertPiece (AnimNr anr, ChessSquare piece) { CairoOverlayPiece(piece, c_animBufs[anr]); } void DrawBlank (AnimNr anr, int x, int y, int startColor) { BlankSquare(c_animBufs[anr+2], x, y, startColor, EmptySquare, 0); } void CopyRectangle (AnimNr anr, int srcBuf, int destBuf, int srcX, int srcY, int width, int height, int destX, int destY) { cairo_t *cr; c_animBufs[anr+4] = csBoardWindow; cr = cairo_create (c_animBufs[anr+destBuf]); cairo_set_source_surface (cr, c_animBufs[anr+srcBuf], destX - srcX, destY - srcY); cairo_rectangle (cr, destX, destY, width, height); cairo_fill (cr); cairo_destroy (cr); if(c_animBufs[anr+destBuf] == csBoardWindow) // suspect that GTK needs this! GraphExpose(currBoard, destX, destY, width, height); } void SetDragPiece (AnimNr anr, ChessSquare piece) { } /* [AS] Arrow highlighting support */ void DoDrawPolygon (cairo_surface_t *cs, Pnt arrow[], int nr) { cairo_t *cr; int i; cr = cairo_create (cs); cairo_move_to (cr, arrow[nr-1].x, arrow[nr-1].y); for (i=0;i:C[Xeȏ{tsy}st{}}}zytrlihe^[][TSTVOIMVL>>>[Eks}sz}st}{wvvriehf][[ZWWVPSSOOMC<>rm?اzzwzwvy{}zwwtrkfeeb[ZXWSTPOLIML?5OJ]ŋ{w{y}zwvz}{ywtrliee^ZZXSPPMLOLFFH;ZC{ֲyw}{wvy}}}}{wslkie^[ZXPPOJJJIFC:f̳wsy}{tlrz{{{}}z{ysrokfd]ZWSMLHEE<8:ebAștvy}tlsy{{yvwvrmlid_[WTSMFC?;4?ozPX}yz}{smvzyz{}}}{}}{wtssmhed^XVTOJFCA:8_{dS{{zwwyvy{{zyyzzyz{{{zywvsrolhe_ZWSMLJE>:>dyeZzwyzyyz{zywwy{{wttvtmkihe_[VSOHA<87Tsres{yyz{{zwyyywwwwvvwywvtrlkkieb^[XTOLFAJ^ovyzy{yyzz{zywwwwyyzzzyywwvvssolifeb^[ZWSPV^ehhilow}}}{{zwtommossssrrooooomlheb^[XWTV]dfhfimt{}}}{yvromosttsroomoooomkheb^[XTV[dffehlsz}zwtrrrstsrommlllllifd_]ZVVZbeffehlt{yvtttvvvtroommlkihe_]XTTZ_efeehks}}zwvtvwvtsrromlkifeb]ZTTZbeeddfho{{ywvvwwvtsromlkheb_]XWZ_efedfhlw}{ywwwwvvtsromkhfd_]XX^defedfhmy{zywvvtttssomkhe_]Z[_ehheeeflv}{{zywvttttsrmieb^[^ehiifffhmv}{zzyywvvvvtsrmkfb_^dfhihfffiov{{ywwwwwwwvvwwwwvsoie^XSOPXer}zyz}{zz{}zwttvwyz{{}}}{{{zwslfb]WX_ly{wvwz{{ytrstvyzyywwyyyywvssromliedkt}vrtz}{yvtvvwzzyywvtttvwvtsrrstvvtssvz}{}{z{}}{ywwwwwwvsrsrookd]eoy}wosyzzyyz{}{yvwyy{}}{zyz}}}}zzyyzzywvtssstssssvvz}y{{z{{ytsrsstwyzyyvsrlhdhs{ztw{}}wvyz{}{{zzz{}}}}}{zyyywyyywywvvvvtvwyyzz{{}}}}{zyzzzywvttvwz{}}}{zyyyyyywsty}}yy{}}{{{}}}{zzyzz{{{{zywyywwywvwwwyyvtvvvvvwz{{z{}}}}}}}}}}}{}}}}{{zzyzzyvvsroolhdbhs}ytty}zz{}}}}}}}{zzz{zzywtrmheb_^bis{zvsty}{{zz{}}zyvtttsolhdb^^^_emy{yvwz}zyy{}{wtrmkkkiihe_[ZVV^r{zyw}{{zyz{}}}{zvrmkhikkhe^ZWTTVV]t{sszz{{yy{{vrommlkihedd_[WVTPPSWlvms{y}}}yvrlkkfb^]]^_[ZWVSJIFIbykry{{}}}}wtolifd_^]]][WVVMJJC77Xwelyz}}ww{}{tmiebb__b_^[XTPOIFA;48ihft}vry}}vokfd_][[]_]XTSJIF?;7.Is^{ztvy{tohed_[XZ[[ZZSLIFAA?71bdo}vvv}y}}{tmkhfd^ZWWTTTOMLIC>;8?8-HObúmi{wz{okms}zwzrrrmhb][__[XVTSOJA<:5&0^Swlzy}yloty{trsoke^dfdb^XWXSIE>::58Weýsw{oo}}rs{{}wtttsmffhhe^XVVPIA;:784VSszmir{wzzywyzwmffhe]WTPMLF<:;;70&mW{wztkkv}{{wz}wlfdeb[VVPLIJA;>><;*7heá{m{smmy}}z{{}zyz{tkeb^[]ZPJLMIC>>>;8*Altwv{rrsv}}}}zvtrib_bbZTSPOMMLHCEC;4Zh{}{wts{}zwvtsrliifeeb_^^]]ZXWSPMJXvzlv}{{}}}}yvy{}}{}}zywvtsomkhhhfe_^[XXVTOJM^hehir{zwwtwwtrrtyz{zz}}{ywtrmlkkieb^[[[XVSMLZhhhimzzwvvwwvsrswzz{{{}}}{zwtroomkhebb_][XVSPOSdoihms{{zwvvwwtrosvz{{{{{ywwvvsmkhhed_^]ZXWTPOMM^y}ov}{zzytsvyyywsrtw{{z{{{zyvssroomihffedb^[[][VVTPPSZy}o}wyyzvmloov{zyyy{{}}}yzzwwtommlkiffhhfd_^bb_^]^_[Z[WP_i{vtsy{rkow{zzww{}z}{}{zywwwtrrtvtrrsrmlllifffe_^df^X[Z^i}y}}zwyyyzywyzz{}}ztstw}}}zywyyywvsstsollmmiefhb^bd_bddddbfktzywyywwwwy{{zzzz{ywwy{{yz{zwwwyywwwvttvtoorrmkkkikihhkiehmiekmov{zzywwyyyyz{{zz{zywyz{{{zwwzzyvvwyyyyvtvvtrossrmmoommmmmoolhkmklmrw}{zzyzzz{{}}}}}}}{{{}}}}zvy{{wwyzzzyywvvvvrrstsoorrmmomklolikmoorw{}{{{{{{}}{{{{{}}{}}{{{{zzzz{{{{{{zzzywwwwvvttssttsrstrorromlklommv{}}}}}}}{{}yw{}{yz}}{{zwz}{z{}{zz{ywwwwwttwyvvwwvvwvttwwvtvwwwvvvwvtsrswzvw{z{{}}z{{z}}{}}}}{{}}{zzzzzywwwwwwvvwwwwyyyyz{zyyz{{z{}}{{{}{yy{}{yy}wy}vv{}wty}yy{}{}}{}{{}{y{{yz{zwy}yvyzyvw{zyz{{{z{{z{}{{{z{z}}{{}{}{}}{z}}}{}}{{}}}}}}}}}}}}{{{{}}}{{{}}}}}{}z}}}{{}z{{}}}}{{}}}}y{{}}}}}z{{{z}}}}{z}}z}}}z}{{y{{}{{z}{{z{}{}{{}z}{ww}w}z}y}w}}}{{}}z{{{}{}{}}{}}}{{{}}{}}yzz{}}{{{yzzz{{{yzyy{z}{{{wy{{}y}yy{}z{v{w{y}zy}}{}{z{z{{{}vr}zyyzy{zy{ywzz{{ww}zwtyzw{{yy{w{v{}y}{}{y{yz}vy}z}wwzv}{mvsvz}}w{}vyryy}wyzv}zyw{z{v}y{v{z{}{wyyvw}zzv}}}zwsvvy{w{zv}{ywyzzw{}z{{}w{{}s}twyt}}wzz}y}{{z}y}}{{z}}{w{{{{wyws}}vy}w{t}{vyzz{}v}rty{{tw}zzzzzyzwyyyrwtv{w{v{v}{}wzs}w{{{yzz{zv}z}y}}tzty}{ywtso{tzv{y}ttzzy}y}}zy{}zwsvr{s{}wyztytzyswzzw{{w}w{{zzytzz}t}{z{zwy}ywzzttyy{z{}{w}{}w}{yy}}zz}w{{}{z{zz{{}}{z{}}}{y{}{yzv{t}z{y}}}{{{z}z}}{{}y}}}{}{}}{}}}}}}}}{}{}}}}}}}{}}}{y{{}{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{yyy}{z}{{}}}}}z}z}}z}}{{}}z{}yw{zwy{zw{wzyz{}}}zzz}yzzy{z{{{}{{{}zz}{}{z}}}{{}{}{}}{}}}}}}}{}}{}}{}}}}}}}}}{}}}}}{}}}}}}}}}}}}}}}}{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{}}{}}}}}}}}}}}}}}}}}}}}{}}}}}{}}}}}{}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/squeak.wav0000644000175000001440000000316412262415351013251 00000000000000RIFFlWAVEfmt **dataHpgfhjlhovh]agipompbffiginncccW\fjqpXZbmoilwd]ahgdmtzp[[\\^dj||cXZ^dfjxd[db`gkpf^d^_gipv\\]Y^jlwaM`ifjqut^\_dnhipX^cbnnlo\gnfcfvl`imggfp|cafcjjhh^jfepptqd^_k}ZZl`\dc|iV_`[Z]vnYac\Waadj`^^c{cmmadhqlaklfepgVgn`bnnRXjgbms_\`Y]loZ\b[WgiWalYOgaVag\bxu`^g]Tfh]`bRXjY\dWVxlfg`PNhwaZi_C_qih`^Xkrgfpcbsnvmf\vZYenjlZN\XSelXXMMZwWc`SKag`WR\tpokXMTofnf\ansp_^zmblg`riWig[hxX\jcdqR`m\XWJSW]vONYNUxKNSMagNVTNci`\NPwNS][j^PGHajPKFS|SEGPn]PNDZgRTJRvRPRRq~`WSPl^TTJ\wNKNH\pMRRCZmHPQMh\FWTEf]E[[DadM\VCdnLX^QbsRYbYaVOgi]j]_j\\z{c_caan|Y`dXV{p_gZSa{a\cg[`igk^Xcw`el`Wuitn]SepfacTaohhbSOuga`aXXyg[`kWQxke_`[ZpkUZgYNpt[U\`XdqWTea\igS^h[Upr\[ggYg{bZptflxijwpbdmqhmi^\fz~\isYSXhh]`VLT`~~TOXZ[\lkQZc_`guo\`b\kyv`Zekmf`QQkfadgdXjieokse]mldll{ySdrhkcasafia^in`X^bhb\wtTYf\^mo~^Q^binmxzodlm`l|xq\[dpvuymxboard-4.7.3/sounds/tell.wav0000644000175000001440000001313212262415351012714 00000000000000RIFFRWAVEfmt ++data.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~x{~{|~|~~|~|~|~~~{~{{|x{~|~~y~|~~{y~x{~y|{{v|yq{~|{~||{yxqv~y{s|{syx{~tt|~|{{vt~{~vpt{|yx{|sq~||v~xtv~vttn{{{xnx{v||{~~xy{||y~yy|y~qps|~|~||~|tstqy~yxy|vx~yy~yx|{yy~ynq|x{|y~~{y~yx{~x~qy{{{~|yyyx||v~{y~{||~y~{|~~~~~|{y|y{~|yx|y{{{{|~||y~{~|~y~y|{|{||~{{y{xy||~{|~|~~|~|~~~~{{{~|{|||~{|~~|~~~~~~|~~|~~~||~|~|{~{{|~~{~~||~|y~y~||~~|~{~~|~~|||~|{|~~|||||{~|~~~~~|{~~~~~~~~~~~|{{~~|{y|y|x{|{{vx{tt|vs{{vtv{|vx|||{x{~~{vx~~~~~|{yyxttssqqstsnpsnkkklkifhhddda^Vp~~~~~|{~|{xyyxtstspppnnnkllfcc`^[SSUPXvsv~{v|~y{|ytstvssqnnpqlhikf```^UPPKHQ{xnlsxxtt~~|xvxvsqstvtsqqnkhd`^]XSQKH@`ɹ~h]av|tqxysy|x{tv~|{{||ysnqtvspkiid^YVPNNH>8qඎnUM^yslx{kcn~|tnt{y{|{tnpv{xsnkhc^YSQQQKA8t߹qSFUvyn{{h^k{{x|xqs{ytx{xqlnttqia[USPIEF5P͛x]@Aavsż|yq]Ysqp{tpv|xtx{xplqtsk`YUSPKFE;]Ģ{s^EE^~xqqph`ntks|{x~~vpqxytppsph`XPIHIEFtıxi[MSi{xsqkdhy~npx~|~~qkptxqppnlcYQIEECSxdQHYs{tqnkhn|tnqx{~yplpqqpnlhc[SKEAA^tcMMd{plnnlp{~sqv{~~vsqsttqkd]VPI@>Hl~kXFNhxhfklpvxvxxv{~|~yttyyxtqkcYSMF@>IxylUESlqhklnt{|~~||~xtsv{|yvsnh]SIC>=V{viPMav~nknsx{~||{xtsv{|ytnh`XQMH;As{qxt]KYl~qlpsv||xxy{{{~~xnha[VSNH=FvpinqaQ^l|{pqvtv~{~xqv|~{tld^YXVSNFItlahpi]fqx~vpkq|~yy||~{vv{xpkd`][][YUIQth^cllfpxyqiiq|xy~|{{||{|~|slhdddddhd`VMSqnfhnpnv|{{nip~~{yy~{{~|~~yqlklllppnha]UIKakhcfhp{||vicky~{~{xx~|yxvvsqqssttsnic]UPNXv~qa[aft~yldhly~~~|{~|~||~|{{{yyy{|~|{xvvtsplhc^YUQVivdU[`p~tc]^fx{yvsxx{||~{xxvxy~|xtqqpsstssqlhd^YXYav{d^afv~qkhks|~|xtssx~{yy{||xvx|{xtqqssvxyyyvsnkhfffhhikv~xifdlv~|vqnqsy~{vvssvy|||xx{||~~{xx{~|{yyyy||~~~~{yxvsqppppqqqnkkilt{|tnlpt||{yvxy~~{yxxxy|~|{{||||~~~~~~||||{{{{{y{|{|{{yvvvvvttttsttstssstx||yyy{~~|{{{{|~|{{{||~~|{||~|{{yyyy{||~~~|{yxvvvxxyyyxxxvttsqqqssvx{|xttx{~||{{y{{|~~{yxxy{~~~~|~~~~~~||{{{{{{||||||{{{{yyyxxxvvvvxxvvtttvx{~{xvvx||||{|||~~|{yyy{~|~~~~~~~|~|||||||||{{{{{{y{{{{{{{{yyyyyyyyxxxxvvvvxxyy{|~~|{{{|~~||||~~~||||~|||~~~~|||~|~~~~~~||||{{{{{{{||||||{{{yyyyyyyyyyyy{{{{|||~~~~|||~~~~~||~~~~~~~~~~~~~~~~~~~~~~~~~~||||||||||~~~~|||||{{{{{{{|||{{{{{{{{{|||||||~~~~~~~~~~~~~|||||~~~~|||||||~~~~~~~|||||||||||||||||||{||{{{|{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|||||||||||||||||||||{{{{{{{{{{{{{{{y{{{|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||||||||||||||||||||||||||{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~||||~~~~~~~~~~~|~~~~~~~|||||||||||||||||||||||{{{{{{{{{{{{yy{{|~~~|||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~|||||||||||||||||||||{|{{{{{{yyyyyyyy{|~~||{||~~~~~||~~~~~~~~~~~~~~~~~~~~~~~~~~~||||||||||||||||||||{{{{{{{yyyyxyy{|~~|{{|||~~~|||||~~~~~||||~~~~~~~~|||||~~|~|||||||||||||||||||||||{{{{{{yyyyxyy{{|~~||||~~~~||||~~~~~~~~~~~~~~~~~||||||||||||||||||||||||||{{{{{{{{{{{{yyyyyyyy{|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|||||||||||||||||||||||{{{{{{{{{{{{{||~~~~~~~~~~~~~~~~~~~||||||||||||||||||~||||~~~~~~~||||||~~~~~|||||~~~~|||||||||||~~~~~~~~~~~~~~||||||||||||||||~~~~~~~|||||~~~~~~~||||||||||||{{{{{{{||||||||~~~~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~~~~~|||||||~~|||{|{{||||||||||||||||||||||~~~~~~||~~~~~~~~~~~~~~~~~~~||||||||~~||||{{{||~~~~||~~~||||~~~~~~~||||~~~~~~~~~~~~||||~~~~|||~~~~|~~~~~~~~~~~~~~~~~|~~~~~~~~||||~~~~~~~~~~~~~~~~|||||~~~~~||~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/README0000644000175000001440000000056212262415351012120 00000000000000The sound files in this directory are in the public domain. alarm.wav, challenge.wav, channel1.wav, channel.wav, draw.wav, kibitz.wav, lose.wav, request.wav, seek.wav, shout.wav, sshout.wav, tell.wav, unfinished.wav, and win.wav were recorded and contributed by Timothy Mann on 17 September 2000. move.wav was recorded and contributed by Pete Galati in February 1999. xboard-4.7.3/sounds/challenge.wav0000644000175000001440000001611412262415351013701 00000000000000RIFFDWAVEfmt ++data ~~~~~~~~}}~}}|~}~|}{|}|||}z~|~yyy||||~|{|~~{~{|y||umr||ywy|tt~{|wy|rq|~y{uy|yuu|u~to{xr~wx|~xtyyxrr{{{w~|wryuo~{|y|~~~ut~{|yux|{{{{{t|{~|tyywr{yt~{wy|w~yy{~{x|~{ux{~uu{u||qux~|{y~r|y{~|uq{x~{{y~xx~~~|rwtyy|yu{yy{|wuy|y~u|||w{yu~w|~w|{~~||wxyyx{{x|||{|~~||~{yxy{~~yy{~~~x~{xy{|~{~|{y|~y|||{~{x||{|y~xw{{~~r{~|{|y~||~x{~|~|~~{~~~|~|~~~|~~~{~~||~|{~~~~|~~~~~y{~|y{||yx~yuxyywtwxuywttqotokmkkg^oy|~~y||||yutrrrqonmnkkmhhmhdgfa]`\VZptyx|y~{~~wwy{ytrtqqnjjhfgd]Z\\`\VVU[lo~|yy~~|~||~{yuqonmjhdafga]Z]`]\UMXnrywoux|~~y{y{|wtoonkkgaaacacc``]VXUN]}}yw~ynmt{yy~{ywx~xrqoomggfacgkhd^``ZYTNWxtw~yqot~ur{|{rw~~{unmkjkgc`ajkf^Z^^VZUFZruu{|~wqt{~tq{{{xw{|wrjddfghhddccgdWRT]^LS̻}ruyxw{~{xx{~yx~{{~xuwtkd]]gkhdcddc`YPMSUPgլ|ortx|qrtx~~w{{y{y~wqnmf]Z]fkkmhab[WQIQWQsخyqtty|qnowwt{{{~umdcccacdfhjhaWLJJPPTȘ~xqhŷ{qdf|{uqu~xu{{rg^\]dgdacfb]SIGGJ[ϥyto|ykduy|~wuy||ytoh`^]`ddfaYXUJDGI^Ƨrvxo°lgxyntyy{wy{{|~wnga^\\^cca]YOFB9Gzln|pĭ{y{ttyjgns~{|ztx|~rg^Z\``\]\WPJC;)zьW4 Uެh=5פe7?H"0t˕a5$VԿZ:+CrҴwNES_i̊_G63Fκxkdaji]l~Q2\vMIOP_lk^[vjkvjLBQnpTGIVruXHFQi|sh^Zbp~kYNOZpznjg`[_pƼcJ=8@Vu}iXNHJTawþqYB;CVrr``huwmjirxk`VS\lzsgbgn|kcckxm]PLRf~~gWMN_x|qllmt|}ysposxxpjkmprw|}~rjfkry|{{zqmkgcckqyzkb[[enu{v|zqmpxuokilw~}zvrss||uqooqt{}rjcabiv{tifemy}wtvumdaju{unoszvutw|}|zxvy{}wqmnmnu|vqmmmmuz||~wrrsv|{rkjmuwspqx|slgjr{zx{|zvqolpyyrqsz{rmgiox~zwv|}yutux|{|~}|~}|xwwwz~~|||~zvtprrxz}zywwz|~~{yxxz{~}xwwwwyzy{}|vomotz~ztsqrvx}~||yxzz}|yvsw{{yyxz|~zxvx||~zvyy~~ysrsuy~{wvwx|z{xy~|wuvy~}yyxy|~~|xwyz~z|{}z{{{zvxy|}{{|}}~|}}|~~}|}{y|}}|~~~}}}~}{|}~~}~~}~~~~|zxxz}~}~|}}~~~||||~}z||~~||}{|{|~||{}|}|z~}~|{{z}}}}}~~|z}|}{|{}~}|yx{|~~}~}~~{}~~}}~~}~~}}~~~~~}}}}}~}~~~~~~~~}~~~~|||~}~~~~~~~~~~}~}~~}~~~~~~~~~~~~~~~~~~~~~~}}}~~~~~~~~~xboard-4.7.3/sounds/laser.wav0000644000175000001440000000360412262415351013065 00000000000000RIFF|WAVEfmt **dataXxfizwrwlQWkk|pd}VBdwrgR_٧Q/:kƱpS\YcѓL*2Pưo.(8tӰvJ@1&Z]#DYPiJUiZ?Svnp>1Ed鿜R'1PkѲkGFUangI3Ctko٬C#0Slr\ZƳNF]MEazwMCFFBJ`s~z6Gln~K*BNETi۹a/8gʮqE2LdnìP*/TnpT$'dĀ`^6RR%$9gX,&FȾ_clqyQ2G]6.I_CFaS\NPkl~oSZt]L`r_mc`umgnwr|aRSzal`TnXOt|Ocp:Ex{dXHiSHvJWff[We+RԋIW89~CefA`̎5Jڢ<.дd>w]JϹW R΀>`߉1>׎'.\ Gل;Yԛ<ty4JȶlMh{cpm^ngbzj`qxQȩ]'AȵzR]{mjzw>@rws}|U3Wָu;Lvs>0gkCv̱nQAOfzҦi<<Ò{rT4=xܷmK70G-.b@SzġzO$0oqO:A|WAOyq`Uu`NLl|rHIhgOekn{}d^mv`\}waj|QEWnfjRZWaPUǐH9lr_hG]THqWQfk_Pzu4FѧcQU0{Ȅ9Lx@R֣@<߾R[~Fhp>kw$:͕HR؟>3>ix4ޠD=ܸ_QЎ@>~|NVd`wZbkcygio~d^ȖJ0cxbwlbpIJqtbf<0f̤lQezyʵf#&tܛgXhq^l؀+3foHGxXVGSlܱc(6Rw̑A(Uոp(7xǴÀE NѼg0)^ŲP#.HeƼn0#EWfŸzFHSgtisêz>!>Q^mhϵyI5>UgaaʌfR;7Lc̽Q1)Fguʰ;"4[}֨wdE ;~G,?ϾC*|)+bZMbИO&'Vյz?'Lrhdf}dO]jniav|WDaretiPXe\vrttsitɔR1Gxl}xYPzvVatgx|77*SǪ^gjksT\u̽ytwtbWPOSOI?8,9㼤lYYX|f[q}Ͳvt|wru|p\RIGMOF?51|δ}XNHkqev{Ѻripy~vvy{gXKBEMJB;4mӿ\LA`vulz|Ѿ~pemx}vrrzm\PEAGHA=;p[IA]qwq}~н{l`kzznnqzo\QFAEGD>=sXC>[p}yϻyfZk}unmq{zgYNFBCA@6LβoI8EaxʯpZYq}mkowp^SKDDCA=:mʒR=5PkξbQbynkmqwaUNHDED@4Tӯc@-@`ınTVowlko{xbTNHEGGD5CsB-5T{¸yYQgvponw|cSMHFIID8<{E--Nv`PbzĴsprrxfTLHGJJD97r͉E+'HqeO]uʼpmrw{hTKHFJIF97sЈH*%DngR[r}ihrziTKHGKJH<2iґH'AllQWnƬyjgp{jVKHIOMH=/`כK(;fsTTh˳}icmzoZOKJPSMG2=k3'NcOZqèp`ds|fVQOQUVKB+A׹`*-X~`LXrɫp\^q{j\WURUWM@/5xu1#N~mMPfԺzdXf~tf_\XVVTG>+@ӹc+0V~eLQiԷscXhxka]WSSVMC03s}8'I{|sRPcξmacv}pe`\YX[XKA-7xr6,LzuXVeqifnwmfedc_ZULD4.dѓG!!CptaTXrǼqhkv}sligfea]XRI9-^ΙM)$Kqzp²`QUqķsjmy~vonlifc`]\SF1;uxC&:]wuzSR_{tuy{vsojjifdbZK4,aИP/0UtzyZQZu|z}wtsrsrmgecZK:.YʡX50Wrvx[KVs~xz||~vstwxupkgc[L=.RĩbA4Xovz]O]x|~{u{}wx|~{tlijnj`M7%Oƥ];4\urx]Te|tnyzx|vnknqpiXD5*SöW9;hyo~wYVotupcpxpx~vmjr{~xgQ:.#L^EIs}trwcd|yu|yl`qsqtjfp~nZC862YcO[vs{zrr{ynkkz{vxwmknz|jYKCEE>li]f}yw}~vvsipvy{~qmrxvfYSQPO=J{`]t~|tzvr{uln{yvux}vnje^WNE7Fs^byujttutu|}ystw}~xtpni`XQJ>Cy{np|~phuzx~~~|yyuvz|||||}|wne_ZXUODVyvx{qq|{||~yvx|{xy}zqhca_ZSLGdzx}{rmx~{~wz~yy}}xwz}}zwqmmkfaXPIJkt{}vst~{||}}zxx{|{xwwuqmhc`ZSMRquwsv}~{|{xyz{{{xwxytpligb[RKRv}vrrz}||}}|xy}~{ywwy{yupljhcZROWvzw}or~}~~}}zx{{xwxz{ysponjbZTQWrzu~pr~~~~{y|zwvxzzwtponjc\WSVmzurq}~}~|z{~{xwxzzyuqnnlhaZVUb~w{|tx}~|z{}}|zwwxzxtqolie_ZV[qz~|y||z{~~}zyyzzyxvttsqmhb][Z`sz|~~||||}~|zxxxxxwusplhea^\ew{z|}||||}}|{zzzzzyxwusqmjgddjs{}{z{~~~}}{zyyyyxwvtrpomkighlqttssux{~~~~}}|zyxyyyyxwvtrpnljikosttstvx|~~~}|zyyyzyyxwusrqonlklorssstvx{~~~~~~}|zyyyyyyxwvtsrqpnmnqtuttuvx{~~~~~~}|zzzzzyyxwutsrqpnnprtutuvvx{~~~}}|{zyyxxxxxxvutsrqpoqsuvuvvwx{~~~~~}|{zyyyxxxxxwvutsrrqrtuvwwxxy{}~~}}}|{{zyyyxxxxwvvutssrsuvwxxxyz|~~~}}||{{zyyxxxxxwwvvuttsstvwxyyyz{}~}|||{{zyyxxxxxxwwwvvuuuuvwxyzz{{|}~}||{{{zzyyxxxxxxxwwwwvvvvvwyzz{{||}~}|{{zzyyyyyxxxxxxxxxxxxxxwyz{|||}}~~}|{zzzzyyyyyyyyyyyyyyyzzyyz{|}}}~~~}}||{{zzyyyyyyyyyyyyyyzzzz{{{|}~~~~}}}}}||||}}}|||}}}}~~~~~~~~~~xboard-4.7.3/sounds/draw.wav0000644000175000001440000002066012262415351012715 00000000000000RIFF!WAVEfmt ++data!~~~~~~~~~~~~~~~~}~~~~~~~~~~~~}}~~}~~~}~~~~~~~||||{{zzzyyywvwvtttssssssstxzz}}}|zx{}~~|}||y{|zy{zzxz|{}}~||zwutsromopolopsqqv|~}}|x}~yx|}}}y{}z{|{{||{}}}~}}~}{zzxxusspoomklpmloqopqpy~y}y|{wx|w{y~{zy}~}xyzyyxyy{{z}||}|{yxvuupnmkmkiiijmnmmpros|~}|~{vwz~~|}|{zywxxuwwwyxxzzzzyvwwsqpnmmijllijlnq~wZex~owttv{}{~}}|zwvwuvtruutuvtvxwtutsqnnlkkjhehjifcyuyx|}sq}~|||zxtsttsrsrsvtsuuvwsrusqooopmikljgeagyyyvw{}|yx||}~}}}~|xwwxxvsruuuutuvxxxwxywvwxtvxswuutusu~~~~~~~~}}~|}|||}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}{||~}~~~~~~~~~~~~~~~~~~~~~~~}}}~~}}~}~~}~~~|~}z{}{|zz~~~~~~|y~}~}}z|}yz}}|}{}}z~}y|}{~~||y}}z{|z}y}~{~}xy~~z~}}|uvxtwwz|y|}w{}tyvu{~}y|{xyzrvz{zqupqulv~|y|}yz}yu{}y~vrtvxvtwxzy}{x{|utq~~twwxy~|u{~{vyz|~y}}{z}}y{{txop{xhpsy{{}}|v|||}{|}}|w~~|xy{y~}xz}{}|{z~}~~{z|x{~zv~|xx}y|zzz~{~~|~z}|z~|y|z||zzy}}{|~~~}}~{|y||z|}~}{}}~x~{~|}}|~x~yz|zz|{||{}{}}~~~|||xzyuyuuwvtxssstprollkiprr}|w}|}|~~{}|~~}}{{|}|{zzyyzxxwvxuwtqropnkigdeknqxxv}{}~~}~~~|~~~}}}}|{zywxvvvtssuroplnigdfnoszxw~~}~}||}~}~|}~}}}}}|{zyzxxwvvuvwustoprmkihglqqtxvx~{|~}}~~}}~~z~{z{{|{w{zwxzzuvwwsvwvuwyxy{~~~}}|||||||||}}}}~~~~~}}||{{{z{zzyyyxxxxxwxxyyyz{{|}~~~}}}}||||||}}}}~~~~~~~~}}}}||||{|{{{z{{{{{{{||}}~~~}}}}|||||}}}}}}~~}~~~~~~~~~~~~~~~~~}}}}}}}}}}}}|||||||||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~wv}z~}z}~z|}~{~x|}{~~~~{}~yz{y~t~y}z|~|wzz}~y}}}}x~|}}~~~y~y~z~|}~~~~~}}x~}~}}~{~}~~}zy|t{xyy~}~~z|z~~}y}y}~}y~~~z~~~z{{{x}}z~}z{}|z~|{}}~~~}|~zz|||}{yvxz{zwttvuvwwtsuv|~~|{~}{zyz{zwuttuvtrolkjjhb][YVV]k{zpjklnrx~vsuwy{{z{}}~~{voieccca^[XVUUVYf{xtsrrnjhhjr~yssuy{{ywwz}unihhiiheb__aba]YTS]q|ldcjquvusu|}qjioy{uswyzvqkffimpplfa^\ZXSPXl|k`Z^fpz}|zwroorzzrnnqtvurligilonjcZSMIGNbzfYRU`m|rjilpsvz~{{}~{xuttttsqnmlkkkjf_WME@G^ĭ{eTJL[qxe[[dq}vqqv}}xtomkkllkifb\ULD>E_β~qaTKL\wpc\\h{ytsvz{tmhfgkmmje^VMF?v֧yG0:K_yrUABXzƲ}i^_m|rdXRU`nz}nW?."(NƖb3.=QoiM@Hb©tcZasuj]UU]ju}}q_I7*%>rکr;%1A_vYKK[y­yaX`qthZSV_lws_J8+#;o{?%,8Ww]PMZxŰvYOYovhYQU_js}~p^J8)#?sq7"(6[q[QPaĭiUPYp|l`YY^grytgUC3*+QϜ`1'-Bkm]UUgϾ`KPb{tg]X]fow~rcO>/)/]ŌQ+&.Gu|h^Y`yŭkUP^usd\[^eozwjZJ=4.>g㽇Q,(0Kwyia\d}ǻ\MObl_VXaiuqeUG974?gR+&.Ftzke`f|]IF]~i\SX`kyrcUK?::=YѤh9%*6`~ngccoĴx]LRlvh\W^gszl]QHC>CDPw۸|G'&-L|riecjīdPKYwiYUZepteWPNIHKHLlĊM&#?użsjfacw˸sQFMis`WVbo{{ocXRNKIIICa͓M"3lʿ}~||shgeex¶vYHYksbVZcq~ulaWQNLNLRM_̞\-"0a|}}}znmkiqrXTh|zkcbio|~sf\UQPTYYZRX}֫lP|uvuz~~uomt}ropw}wtstvxzyxwspljd_\YVQcȥ]C9E\ysuv~sons|omqw~zxwvvwzywyvsokga]]]ZXlbMGSeyvvvytswxrsy~|xvwwwy{{zzxrlgb_]_ba_peQLXi|}~~xvx|{uv{~}~~|zyywvwvrpnkgeed`]kr[R[f~|~zww~vvw|~|}~~||{wusrqoomkgecb]dzvbW^h}~}yx||xz}}}}~~{{zvutrqonkhfdb`k{we^dm{}~~~~|||{yvutrppplkjfebky{lfjr~~}{|||{|zwusrrqpomjigfp|ymlpw}~~~{{zyyyywvtsssrsqnmjgku|yrtw~|~~{z|~}zwvwxxxxwvuuusrrpnnnszxwz}~|{{~}{yxxxyyyxxxwuvvuttsstw||~~~}|}}~~~}{{{{{||{yxwwwxyzyyxwuvuuw|~~}||{{||}}}}|{zzyz{{{||{{{zyyzz{{||~~~|{zzzz{{{{{{zzz{{{{{{{{{{|||{||}~~~~~~}}}}}}|||||}}}}}|||||}}~~}~}}~~~~~~~~~~~~~~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/slap.wav0000644000175000001440000000556512262415351012726 00000000000000RIFFm WAVEfmt ++dataI Ã=T0FUK-10bbX2f@3CZdSZZz=7_eaGyb{P}avpS|lX^w{rz^gx[{ye|Jcxv[Aobpp|irp[xvgijxrqccZt;aRBǬPAqsdPqydlCv[Pɬs>/>Si_hN^{ltoGcdmL7lsQ\gˮCH\w.=p@6?VNH,X؅)YɌ=/Tp~nlnk`R3mnk`lk9lvf=SbΜg(.h~}p:^-"oۚ4"ӟj^ZsG/~M>nyiQi{IXm|[8Ny]ERҼT4}Ռ=3k_l[iɚ_l38I0=xk.e8AZH`|ZmcW~_;OLj~Y1h¬WSbB_¸l}7\ch{h̠@&Gj>DB}Q!`'kU5T;&<t wsQF !"P$G%$%#!!"r"""![i?d|D6 gbH q4En$(bo~|[0*={Ot-5jcPiwMGnY  1 W ( y P I  M, X| I495J%vu^)uRXbqlv5 Y2+0ek  = : ZO"V/g_h-_U 4 D ~)^mMy-Q_w B+2}Ik4_g-D@  q 1:{I%uc%/g f]  }6) P6fV 5 1mYF|h*BMBhhEy}`}5R)T$t_ UrQXXv!-4E6`)Sy"U7` p 4  H W =  Y Mr#RJhLVS9G4D|X5-k3x0S';/tA_ q 7=-6Hrx=#Ou0bXa0Pe*)"$su=X,y`U*$a8(MljAM6ph4p(NY]uTx;{uxb/rUiOiBm/a80_5G.k-I-%6vU0sGM [BZ jN[pCihFO uNGAFZ`_fyP)NZmt{i!G.ass2]#)9_ AS- aRTdkEnn^bPc9s EZypTQ@(d^OGOB.whX`gccbcVENJ6  $2J`ddqv]NAB?DNT^gmowv[O^gXA05=d,!=++FFAYef_\egh̾vmfdXLMMMJAA770*)'/# !  #)%,.0<<95662/2..2/.,**+*+.0.+///2345756;>@CDGJMQRTY\^bigjmsvy}yvppmfdb_\[XUQNROOMJGEEA@A<::999665533110/-0/.0101257857:<:?ACFHJKLPRSVXX^abcfilpotwx|~~{{zxwwussroppppnnmnmikjhfefcebba_``]^[\X[YWXVVVUWWWVUTTTUSSTTUTUSSUSTVVVYYZ[Z\]_`accehhimlqqruwxzz~}~}||z{zzywwuvtttqqpoonmlllkljkjihighgghfgfhefgffgghfigggggfhhfggghhfigigihijijjjkjkmmmnppqrttuuvxyzy|}}~~}}{|{z{zyyyxxxxxvxvvvuutvtvtvuvuvuvsutusutttstsstrrrrrqqpqoqpppoopnpoonppnppqorprrtrssstusvvwvwwxxxz{zzz{||||~}~~~~~~}}}}{}||||z|{|{zzz{yzzzyyyy{wzzwyzywywxywxvxxwwwwvwuwutvtvtuttttutttttvtuuuwvwuxxvzxxzxzy{z|z}{}}}}~|~~~~~~~~~~}}|}||}}{}}{|{}|{{}{{}{{||{{{||{{{||y{{|{{y|zz{{y|{{z{{|z{z}z|{|{|{{|{|}z||||{|{}{|{}{|||||||||||}|}|}~}}~~}~~~~~~~~~~~}~~~}~~~~}~~~}}|~}}||}|}|}||}|||}{}||}|}||}}|}}}}}~}}}~~}~~~}~}~~~}~~~~~}~~~~~~~~}~}~~~~~~}~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/woodthunk.wav0000644000175000001440000000353612262415351014005 00000000000000RIFFVWAVEfmt VVdata1yyyzzyzzzzyzzyyyyzzzzyxyyz{{{|~n\LA<Uo{^;)*:tg(c϶~gWQVfzɬsU5$Hpr]F,$6I[jwſ|gTC4(*9K]oùwnga]YVSQQSW\bhov{}~{yxvxz|}|xpfYK>1&"'.5;BHMRV[^adfec^YQG>71+('),048=AFJNTZahntwxyxvtqmjgeca_\XTOKHFFIPZgu}vqmieb`__`adhntzzuplhecaaacgmt|zwuttvwy{}xusrqqqrrsttvxz|yrkc]ZXWXZ^eks{}zwtromlkjlosw}~ytokgca`__`cehlptw{~~yupmjfdegiknruxz|~}{{{{z{|}~~~~}zxxwvuttssrrqpppqrtvwxxxwvtrrqqrsuw{|yz||{{zz{{{{|~}||||||}~~||||{{{|}|zyywuromljklnqvz{}{xusrqqpqruwy{}}zxwvuuvxxvwz{|~|{zyzzzz{}~|{zyxwwwwxyz{|}~~}|zywusrqpoopqrstttttssssrsstuuvvwvvvvuuvvwwxyyz{|}~~}|{zyxwvvvwxz|}}ytpmjiijloruwxzz{|}~~~~~~~}}||{zyyxvusrpoooopqrsttuuuuvwxyyyyyyxxwvvuuuuvwxyz{{{{zyxxwwwwxz{}~~}~~~{{|}}~~~~~}|{zyxwvvuuuvvwwwxxxyyxxxxxxxxxxxxxxwvutsrqqqqrrsuvy{~{xusqonnnoqsvy}~{xvtrpnmllkkkkkllmoprux{~{xusqpopqruwy|~~}}}}~~~~~}||{yxxwvvvvvwyz|~~|zxwuttttvx{}~}|yxxwuuvvvvwwxy{~|xvsrppprstvxy{|}~~~}}}|{||}~~~}|||{zyyyyz|~~}|||{{||||}~|yxvuttsrrsstuvwyzz|}~~~}||||}~~~~~}}|{yyyxxwwvvwxxxz{{{|||}||}}}}~~|zywwvvvxboard-4.7.3/sounds/click.wav0000644000175000001440000000420612262415351013043 00000000000000RIFF~WAVEfmt ++dataY||~~|z~t|t|~vrttb~^|pnbd|`phjtpxlnzx|vzxx~xx|xv~xvzv|zzp~vrtxz~|~~|||~zp~vv|z~zz|zz~~|||zzx~|x|~zt~0N.HTT>hvdjbtlp|zxppt~v||x~vvrr~pr~~xfnnhhlrlrrvrjrpprxx|x|~~tzzz|x|~x~zxxxrztp~bzhjnhrpfrdjl^dfnnf`lhlnprrttvztzz|||trtxrjlljhhdbfbbd^\^`^\`\`fd`hjjjlrnttnrxrxz|~~xztxzzxvpnrphlhlllhljjnnlpnjnljjnprttvxz|||~~zzzxxtvvtvttttrntprnprnlpppplnnvrtrttxvtxxzzz~z|z|||~~~~zz~|||~|zxzzzxzxvvtxzzzxxzz|||zzzz||z||~~|~~~~~|~~~~~~~~~~~~~~~~~~~~||~||||||z|zzzzz|z~|z~||z||||||~~~~~~~~~~~~~~~~~~|~~||||~|zz|z||z|||z||||||||z|z|~z|||z|~||||||~z~||~|~||~~|~~~~~~~~~~~~~~~~~~~~~~~~~~|~~||||~||zz|z|||||||z|~||||||z||||~~~~~~~~~~~||~||||~~||~~~~|~|~|~|~~~||~|~~~~~~~~~~~~~~~|~~|~~||||||||||z|zz~|||z~~|~~~~~~~~~~~~|||~~~~~|~~~~~~~~~~~~~~~~~~~~~~~|~~||~|||||||||||||||||||zzzz|||||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||||~||||~|||||||||~|||~~~|~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||||||||||||||~~~~~||~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~||~|~||~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~|~~~~~~~~~~~~|px~xzxv~rv~xtz~~zx|~||~xzx~x~zz~|||~~pxvz|~~|tr~t|r|~rhtt|p~fjphrv||~pxv|v~~x|~z|z|~xzv~t~~z||~|x~~x~px|rz~~t~xzz~v|xz||z~|~~z~~~~z||~|~z~~|~~|~|~z||z~z||~~|~~|~||z~z|~~~||z|zz|zz||z|||||~~~~~~|~~||z|||~|~~~~~~|~|~|~~~~~~~~~~~~~~~~~~~||~|~~~~~|~~|||||||x||||||~~|~||||||zzz|z~~z~~~|~~~|~~~~~~~~~~~~~~~~||~~~~~~~~~~~~~~~~~~~~~~~||~|||||||~~~~~~|zz~|z||||~|~~~~~~~~~~~~~~~~~~~~~~~~~~~|~~~~~~xboard-4.7.3/sounds/request.wav0000644000175000001440000002170012262415351013444 00000000000000RIFF#WAVEfmt ++data#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}|||{{zzyxwwwvvutsrrqrrrrrsstuvwyz{|~~|{yyxwvvvvuuuuuuututsqpomljigeca_]ZWUUVX\_emw|wutvxz{|}~}|{ywussrqomljihggfeca_^^]ZXVUVY^bhq}|yvuvxz|}~}|}~~{xvsqnkihhgghgedefd`^\YVRPPOKGFKT_oü~yvsrrrrsv}~wvy~yqlklmkhfdehlnmjfffec_ZTPOMID@>?CJR^outvvqmou}}xy~zrjgghfcabgjihhiiiheb^XRMIEB<426;:68I^s׹ibkuwqmsȷtv{rnookfbcgknomkmoomic_[WSMID>88;8106?GMUoѫo]fvztnrɷvu|vnklljfbaelpokijmnkfa]YTPLH@::=<746:@GLWyŬwpyxst{}vrnmlkgcbcfihecdgijhgdeknjdbadffd`^agkjffjnsy}~}{zyyzzzyyyyyzyzyxzyyzyxxxyy|zxyz{{{zy{}~~}|{||~~}|~~~~~~~~~~~~~~~~}}}}~~}}~~~~~~~~~~~}}}}}}}}}|}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~vnwyyi]bh{|eXV^qyld`is}rjikr}wplmqw{ussuz~zwvwy||zz{~~~~}~zwtsvx|}yuuuwz~|yxxy{}}~|zzz}}xutvy~~{xuwx|}yyz}}z{{}~~~~}}~~}~|{|{~~|{{}{z{z}|{{||{|}}~}}{{zxyyz{~~~~~~~}~}~|}|}}}}}{zzwxwvwvwywxxvuvsssqsqqrppqpnpooomllljmlmpnqqoppmpqnsrsvuwvxwwxy{{~~}{}{}~}|yxvssrppnlljjljlmllmllkikkknonqrrvwvzxwzwvwsstrsuuwxwz{yz|xyywwvtvutyyy||{}{{}zz}}~~~|{}|}|yuqqpqtuxz{{{zyxvvustuuuutsrrsuvwxxwutronnmmmnonqrsuuvvvutsrqrsux{|}~{{{yy{|}{yyxxyzyyxvtqppoooorstvwxyyyyyyz{{{z{{{}~~xsmic_ZUQKECEM[p׹wpqw~ϵqkoz}{wrkbYPMLKKJF=3' Qƌ_B49EQ_ddcl빃U80@]}|od`cjsvtkYF6--3;AA6!DqSLOU_[K@?Mmۜe?4@\|ĺjUPYrmRA>DS`d]L8!JċcND?GWSN_wQDHXoˬn[Tc|n`ZY`de_SLA6* CΝnXIFA499Bl͓iLGR^im|սg]gz~xqjbWSV]ca[K32ծ}W>(&!,FYbI>GRbsּvigs~seZVX_jrsbM4 pޤYF,# )Njԫ`RBJVezǣh`lnYRYer}}s_E+ }mQD-#1cѬp\TFPbyl`dwxh[V\kz~scP<&KnTE4&&/\ͦnVPOTmϼi_ctwi\Ycv{hV@-  _v_ME7',?w氌obSQUdӹvecn{rieermYH;+% /bXFA-,=b×v`ZQXd~{pgk}wljpz|j[MB92573& pj\TP;-6YsfaYYe~IJroovrvstytcSIILKF=2# ilaTO90Cbuf`W^srpos~xsz}siebb`bdaWK=,&f[PB5;Omӝ{g]UVi}Ÿwa^htyleiwzpgbdltxvri_UH@5)4nZQGDDP_{߮jXS^iv¯zh[duzx}wps{tlhjihffda\TH2 LՕr\SFO]_sѴwd\cnx|sktxz{}{z|zwsprvxurnhaa^YQNMF:5\ѮubZ`jnq{xx|{x}||{}|zzxvroqqrpomkkkmkjkhc`\][bjwvwvz}~~~}||~~}zyyyw{{|{yzxxxwvuwxwx|~|{yuvrsqsy{{}{~~}{{{{{{{~~}|{wwz{yy{x{{wyyvruwsuvwqzqyrqwoupvoxr{q{uysxvtuyr|o{tu|yz{u{r{vxpipwzw~os|yz|x||uyu}stzzww|~z|}}}~~~}y|w{}~}x}}{xz}xx}z{|yx|xu~yxxyuutty~{vt{}{~{pv|{wqzzvx}{yxvsv|~y|~~~{}{vzwrpqu}toty}|xqopt~uqvodo}y}|~wpnq~w|}ytx|~z~vu}w|}{}|~yzz}{w{~xvw}{{{}}~{z{~}wstvv|||}~|y{}zyzytyvurjpxwtumhu|xsx{t{{yvnmy~z{|{wuts{~vqrpdmzrrysr{{soiquhhquuuw}ywwy}~xrssvv{wyxogo|}{~{{{{oanwr|{qg]calvxu|tefvupls~iqphejzzinyyu`nny|y~p_eei|{nnrv|po{~wzon|~xxxwy{xzqw|iryz{|wjs~|su|}svqovrsru}j`[yoW`wvaahzventx|xusy{iOgrtssy}vljlcarsmvsaeox{hfj~xrzzbaistjw{vu}vohqwpx}vsqztw|v~zwuyy~lly|sqrxwtmmovw}~vtgh|{{so{}v|yx|yu~}z~}uy|x}{zz{~{yy{}~{}}ox~~}wx{pw~~~{v|}~z~ztusz|up}vu{zsrx~~uny~ts}}~}~~|x{~}yx{~~~z~~z~}~}}~}}~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~}~~~~~~~~~~zz~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~x~}}}{~~|}wy}ollpmsjl~{|vyhx}|x~x{iqfz}|t~p|nmyz~{{s~vz|~|{}z{y|||~}xsx{{|t}suv~}{}{}z~yy}{y}}}{vyz{ywy}{~x{z}tzyz}~~|~}y~zyy~w}y||{z~|{~{|~yx|v~|x~z~||~{|z}}|{|~|~||{{~zx~{y|}zx~|v}yvz|wy~{y{{z}~yz~||}|}}|}z~}~~~}}}~~~~}}|{~~}~{|~}|~{}|{z||{||}}||{{z{}}||}~~}}|}~}|}}~~~~~~~}~~~}}~}||||~~}~|~}||}||}~{}}~~~|}~~~|||}~}|~}||}}{|zy{zz{{{{||z{z{}}|{}~}~}|zz{{{||||}}|}|{||||}|}|}~~~}~~}|}|{|}}|~}|~|||{z{|z{~}|}}}~}}~~}~~~~}~~~~}}~~}~~~~}~}}~~~}x}~|~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/kibitz.wav0000644000175000001440000001506612262415351013260 00000000000000RIFF.WAVEfmt ++data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~z|}z}}zzyxxzx}|xzvxzy~|y~y||z}z~}|~~}~}~}~}zz~}x|~~y|~~z|z||||||~z||~}||~~|zz~zz~|z|~|y}v~z~~~y|yv||zz~}}}~~~|z}}|z}~~|}~|}}~~|~}}}~}}}~~|}}}~~~~~~}~}~}~}~~}~~~}~~}~}}~~}|~}~~}~}~}~~z|~~|~~~~}}~~~}~}~}}}}~|~}}~~~~}~~}~}}~~~}~z~~~~~~~}~}}~~~}~}~|}|~~~}}~~~}~~~~}~}~~~~~}}~~}}~~~~~~~~~~~~~~~~~~}~~}~~~~~~~~~~~~}}~~}}~~~~}~~~~}~}~~~~~~~~~~~~~~}~~~~~~~}~~~~|}|z|z|zxyyxvvtvxrrvutvutxvxyy}|}~~}zyyvutrqnmjiedd`ZY\VQMFVfnxytuyxnx}|xuplinqpprvz|zzzyvphe`YUMFA<>ya]νmljiprfi~|uqqpjdhqrrtvz|yvune]VMFA8*YrVxΫvee\drparxmimplhmrvz}|~}umhdXPE<5*4vb\˾zzjdZUfzrl}~vieltrqtv|~||zpdZTMD6,!>bfƲrqxlhXPbyvx|xxvqhhmry}zy~|urneXNE<4-5`znlrnihdVXiqtyuqnlmnntz}}}~ztmeZNE>56Pijlytpqjadhipz|rmmmmnpptvx|}yvtpie^XRUbjlnuy~~}|zyxyz~~}zyxvuvvvxxyyyyzzyxvutrrttrtuvxyz|~~}}}||zyyxvuutrrqpqrttuvxyz|}~~}}}}|||zzyyyxxvvutttuuuvxxyy|}~~~}}|||zzzyyyyyxxvvuuuuuuuvvxxyz|}~~~}}}||zzzzzyyyyxxxvvvvvvvxxxyz||}~~~~}}}||zzzzyyxxxvvuuuvvvvvvxxyz}~~~~~~~}}||||||zyyyxxvuuttuvttttvxz}|z||zzzyxxvurnjie^XYdmmjp|}zyyxqmt}zuqpqqplmrtrqpmhb^VMTfpimy}xurtrnjt~ytpquvvuv|~|vrpi`XLA>I^lfnxpjfffffjr}qiilnqvy}zpe]YTNHB>AMjiXVXYaiqz~rmjifdfpyztnlmpnllmmppidb^XY]hvy~vlllhmry~xqnpqpr|}yvuttvxz~zuqnjfda\YYVU\m~~ynhfimv}xpjiimquyyrrrpqvyz~zz|}|z|~~|z|yvtqplea^^\]dp||rqnhfpx~|tmifjnqv}|xurqtyzzzxvvuvxy}|zvvvvvxz|}}}}|zyvrqnlllmqv~yyxrquyz|xvtuvx|~}zyvvxxyz}~~|zyz}||~~|zzzzz||z|}~~~~~~}}}|||||}}}~~~~~~}~~}}}}||}}}}}}~}}}|zzzzyxvvutuy|~}|yyz|}}|zyxyyz|}~~}|||zz||}~~~}}}|||~~~}}}}~|z|}}}}}}~~~~~}~~}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~}~~~~~~~~~}}~~~}~}}~~~}~~~~~~~~~~~~~~~}~~~~~~}}~}~}~~}~}}}}~~~~}~}|~~~}~}}~}~}~~~~}}~~}~~}~~~}}}}~~~}}~}~~|~~}}~}|z|}}~|}}~}}}|}~~}}}~~~~~~}}}}~~~~}}~|~|}}}||}}|zyz~}}}~}}}~~~~~~}~}}~~}}|~}}~|}}~}|}}}}}}}}}~}y||z~~}~~}~~~~|z}~}}~~}}~~||~~~~~~}~~~~}||~~|}~~}}~~~}|zz|||}~}}|}}||zz~~}}||~~}~~~}~~~|}~~}}~}}~~~~~~~~~~~}}}~~~}||~}}~~~~~~}~~~}|}~zz}}|~~~~~}~~~}|}~~}z}}}}}~|z}}}}|}~x|~yxx~||}}|}~~~~}||~~~~}~}|~~~}z}~xy}}~~}}}}~~}z}|z~~~}~~~zx|~~}~~}~}|y|}~}~~}|~}|}~|}~zz|~}|||zy}~~~}}~|y}~}~~~~~|zy~ztxxuyuv}}|}~~~~z|||~~~~z}~zzyx|}}}}~~yyyvy}~|yzyvx|~zzy~zv|yvzz|~|~~~}~}z~||||~~|yztu|}y}~}~zyzxu}|ux}}~}}z}~}}z~|}}}}~||}|z}}zz|zz}}yy}~}}|}}yz~}~~~}z}~~~xx||yyyz|zz}}~~~|z~|xz~~yxy~~}}~z}~~|||~~}~}|}}zz~~~}}zx}|z}~|}~~}~z}}|z|~|}}}}|~|}~||}|yzz}}~}yzyyyz~z|}||~}~}~z|z|~z}~~zzzy~}vy}zz}||~y|~}~~|v~xuzz||}z|~y|~~~}y~|z}~||~~}}}}}zzzz~}}~~~z|~y|}|z}|x~z|}}~~~~||~}|~}}}~}||}~~||~~~|}~z~}||~~}~|~~~}~~~}~~~~}}}zzz|~}~}}}}||}~~}~~~~|}}}}zz}zxyz~y~}zx}}~~~|~~~~}|z~y~z|}}}~}z~||~|}}~}~~|}}~}}}~|~~~~}~~~~~~}~}~~}~~~~~~}~}~~}~~~~~~~~~~~~~~~~~~~~~}~~}~}~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/ding1.wav0000644000175000001440000002374612262415351012772 00000000000000RIFF'WAVEfmt "VDdata'   .]U$-)N6g,=9mc0` %ԼmϨ:5 25D-2ug:u qAQs1C/_*&2y-NXb@:)@HW~fO4Dy%"wj$7 ['6:*QkF<+1$̻7 A{!iN/eO M14^B:Yy4E: .B( V; A9D'!)mc @ڛiH & eD wݬ1B<'208 XbE T | 6 ƒnrH]?w ھA..ʚ t$^` mn`3C 8l! (=(]w7?'1x Tn l50*j .ױ#]<f\"O¿=D0 p9ݥ& 7خgG "R-8@3#B0+-/ /F.hW"A0 NS526t1 8) δA_s 3nòss3p37 #ƾ_ǒ%2j"7,  8uMFX,@3b,Qq5e7{ ZQR(]1zT'c|M6 !EٔX7''fC{d @3Ʃ  !+8ֺL8U!!7 ?.X շ `+?xN Y>.; V!?(}e'D.m w8.8+i/!0d!|QE=FM 9,. ?4 (Yq/=,( , h & %#VFY.n ( -L|=* T% Y,enS2>uZ$Q/ 3&\*j C bܾT1x6g} ,!|\^'Z3% d^`e~ڈW 4 G<2x W'p1fa> 0==7 Hp  Q@8,%Rfe;Z#NB(@1X %luk0 "S)oYzU&J 3;ZP"- $,K tTX f %4z X%z?=z U;< L7^? #=H1 P'`IM*M5v '}N@^#q/9(װW!lN&A5$llIwv!)}N> vF sslBZ l + vL j O$ ^~z-'"l?V3xoQ;nj g! cNr"I 2wu7@@SB>Y9N2 ~u D U  ! xE~>i"G H eS { s "N * #  6cRu :Yi #D"e&31 8 h$ N a{a a)/ !_6%)fB43~C:3w B6=y"9 <6e߭(/YX4O p FE NZ =2 Tha$ P^  s( 'F0@-+37J-} En~vi_P]~*ozD EbmW ea6}Gqu V0sD  Y Yjyq(6w k",.NCO L^ C +ZgU o"BW$( HDjW q+!0]!Zx5 5`6+c%., X;5P)h]U,Nd p@YP@@ 75 vc S! *\d,UD@' ) c"A   K "/G cZ [([ <3?t=VV +\"+Je q *TD8 i~T\l Ydvb0 \)MwG!:Q#N QY v!wOrPv )e a#l a Ag b7x:9*#bX .%  ;/< xtHE: :uv|/*l: 6gR rSq#&. H T 1}( OF}Q 3} D Wg{ XnD#jVX</+6 .[R:x(2n! !cyv3=KMsv?}1v,  }P,_ m ^  I |UWx 0, J TRq U  sebld mo RLi' zm@*y/ 7w(a+^"VxRg: G% S,@  W ,3] cH 6 Gn h No  'Y&dk:1&i~#$5 !H Y4{`g @d*1{ fsllq3?FX -Gs% 4IU y{d12 k: 0 {C# @LZW e}ya l US v)4x Qr 84xmK l hZX]lB#0l@ aQ6;:%*Bb xfl g  w9` +p|s LQ G=/  6h [| 8  E(co\Q +?{  y}Hxr n (i67=]Tpc N gbc9s C ^ 3y\Q  I<C+{j  _ h '!gZ1 X 8  Gl@5F;4M  KAu A~bNwi; p7< FVQc]X4&lB 8rX8D O p M _ x$xK >R= j N { nC  5ZUO \qU` 0r 4=  M27~t nF9 [ Bg-Zr#F; pH /2* xG~~i w#E/ \Q'~JU g* W N7+ \I$ g =``U +xos [L(" 4 "l hg s Eo4F  ~&v FsgF=Xm_;  N|Nn  ^Ae5 <T8zZt YC D z@) U 4,E  Pc\ Sa4 cc + z U eec@dye H= ze_iiyf T31G/= "m)oGL c s rF;"Y( R{4n -)cK 0TU ICL=| Gsg)*] gWm :'FsNLK WO9 ~o-$> u AU@  fscn! 9K?* !B Wh$M  4x$CU (#xW*V($}_ AY+ 9_&U7*xU Fs$Sl_N^: :Sr$cJD -toT3 ^|yxuS ;QL0 BW /93E n$^a(#%#0"i~6o0"Ufh 9[bH\&5cAbfBZ) c;uO-4]V%[c)^R1&zhA\UR`}v1f{>?Hx7 b.Qnjlz@E-t"f\,t=1N+2Q0a(}(f)@npnmT6xGM.8V;N0l CPJEnZ=M^K4hF?[<n@@2m}Az S2[d@(:"?z[)QZ=Y!laQ.vS?%ctNK[4axBZ{+Y"bUf$#`T,:E\;@tOoG f.Rl[boV:~\A6OSk)8a/8!#u}mZ|2.tA KL)UdG@Z8Q8n[Uw|Ey%^ZL%X;?vX7#]6r*2gK!N8,6AGhtG) fK-}t>W+{<k6MX7 GVlb<].v-BUwyvWGE9OWUL f(|A}R Q?Sg82F 3 !/ xboard-4.7.3/sounds/sshout.wav0000644000175000001440000002261612262415351013310 00000000000000RIFF%WAVEfmt ++datab%~~~~~~yxtr{zvw{|wtx~ysquvsrrpqsolfdfhlsz~|stvuvx}vqtvwvxwssvyz|~ywqmlnorswxtqwwnbabd\\`jwvqpprxzttuy}xwxyy|zvokpuwtorvpdYRPNIELQTw²za\^`ejs~gZ]gqy|sifkw}wpmnokgjnkc[WTQJED?7CoǬ_HHTcotzɭcOM\o~wrnhjxumfccfecba_WQIDE?6;94xڣΰxH:=CA;mխsjbRXnŵx~z{}wqkgecdhkkf_ZYRL>;?HC>CEpӽye[h}}zytnhc`beiie`]\WYZN:6@>4)Atldy~|~~~|wtqlid_[__]YX]Z[ZXLD<:GIHd}{zyxyxxxtnjfeb_[][UX]db`TPQTZ\X[o{||xutttsnklmifffdcdfhbdc^_ccfhqoow~~zytvtpuqvptjvplpnoimkjkhsozzvwwxw}~ry~~xuw~|qqsx~xorw{t}zwtzyuzx{~~yx|}||yv{~w~ut{yy}~wx{{}|||{{|{|w~{uutrt|~~zvyy}}}}~xy{}|zv|{~{~{qvxy}{xv~|{|}zy~~v~{y{|}{y~~|~|~~|yx}yw{{}|y~|wy~}xy~~x{}||yz~yz}|v{~|~y~{~|z~{|vw{{|~y}|}y}yvx{{}|}}~y}~z|}z{{wy|}y|~z~~zu{{|~~~|~|ttv|zz}}}ws~w{{u~{{zz~{zy{|~v{|ywwyzy{|{z{{{xrq}|{|}}yr|}y{~}xs~zv}xtz}sz}v}yy{zztuyut~}|~yzwurr~~}zy}|}yy{~~xs||z~~zrs}shv{|~|xqsuz{u{xu{|{|{y|}{s|xrt~yww{~zz{|{{xqwzvuwx}~~xz}~~{x~}{vuyul~wz|qws~~~}~~~x|}~wwxw~~{x|x{xxvy||vz~yyx~}qx}}zuoz}~vx~x{~{wq}zvy}{||t|~wx~yz~w}{z}|}|z~~|w}{||ys}pn~my{xtxxys~uy{nqprotyb{x~vt~xvyzzyy|suz}}yqyszy~v{{xqy}wruww~{}}{z~{z|{vzuyy|zupqvyxzyx~{zv~{y|yz}~~ouuyz~|~{}zxtwuttr|z|||||}y~}|{~~}{wxw{|~~zxvswy~{|zyo}xpexwpxwpppnot}uy|vtuz|y|w}~~y}}{{{}{}{w||vzy}}x}xw}~yvpy|}zwxsr}v|v}w}z}wvy~w}zzz~x}zzr}zxszvuxt}~t~tz}yy|~|~~~}wrxt{}y{x~zuvsy{j|yuu~~~}x~xyzy}xwsytvzzt{|}~{xsx|un}|{~x~w~o|}y}l}xsw~~{trz~{{w}~pzhju{{vpxofx|}z~zoo|w{{ysyry~zq}zuv{~{w{s{|xr}yhxpryv{ou|zusqla||lzoztzyz{tyzxkuuwz}||{~p~iv~r{p{uxuy|joqsr}qq~wuxmnrzzwmkm}p||}y~{zzy{yyp}{thus~{pzp||s{zop{x}{vzyz|~txn~xy}|}x}}{~t|zz}u{pw}yvvy}yyx|tzu{z~zyvyy~{w{o||ypzw~~{uqywxurtqyvyyywx~r~sz{szswr|z~v~m~|x{|vt}}w~t{~}}su~~wo~zo|z~u}~w{ty|r|vzw|u}|}xyytrw{u}}~z|{y}px}w~n}yz~p|uxuszzw~}{zx}zz~~|~rrx}}v{y{|~wtq|xy}}~}|{w~}t~}yxwrx~|w}z~}q~{n}zx~xp|l|tzw|{{xztr|vvyy~wx~{xyxuvor~~x||~}~|xyvty{|wyt~|w{|qsuqxx~|s~xv{sx{}yt||y}}tvzvy~}s~vo{lwts|s|rxrwpz{uwuwqx|zx}s|t{utuv{wk|o|oxvs{lyvqrtowh}zrtjtrmvssr}}yzgwmzoqxx|z|y|~{yrmyw}s|qws}u~v}xz|v{ty~u}x~x|~yzxtywt~zz~v|~ozq||l{ps~vt~p|wx}|}~~y}uxzsxz|z{yz~y{|x~|~}||~|}~z|~~z|{{{~~~|{}}|}|~~||{~~~}~}z}{|~||}}~}~~~~~~}~}}~~||~}{zz||ywwz|wuxwvwvwvutuvtpptwspqrsx}{|||{{{{|{zyyxutuusrrqqqpmlmmjdccb_ZZ\aizyrrz{uqrx}}||~}}}~~~}|{z{|yvvyzyvtvwwwuttvsqqsqkgimjebdhihflyxos}|wsw{~~}|{yx|}|}}|}}|xxyyxxyz|}|yxxxyyxutvwvrqstromoqrpnnopsyyqr|{z||{{}{xwxz~~}~~~}zyz|}|zz|~~}|zyyz|{xvvxz|zxuuuvwtsruwtsponpttrnpsy~~yxyz{}zy{}~~~~}|||z{~~}ywvx{{{|~~}zyvuvxyzzzz{{wsrtvtswvrpqsompssqtx}z|}}~~}|}}~~}}~}|zz||{z{}~||||zy{|{zz|{|zzzvuuy{ywy{wsptsrqnmkmpuywsp{}zux{z}|z|~~~~}{}~|||{||}~}~}||}}|{{|z{}}|z{|{xxzyyvwxwtstuurqpqtvvtrsv}~|}}~~~~~~{{}~~}~|{{zxy|~}~~zz{{zxz~~~}yuuwxz||zwuvtvtsqoqqsuwwuttvy}}~~~}~}~}}||{|}}}|}}|{{{{|{{|||{{{|zxwwxxxyywuvtttqsspqqqrtvz|}||~~~||{{|||}}}|{zzzz{{{{{{{{{zyxwvwyzzyyxwvttsqopqquy~~|}~}}~~~}}|}~~~}}|{{{|}}|||{|{||{zzzyz{}~~~~}|{{{{{{}~~~~~~}|{{z|~}ywvwyyzzyvv|{xwxz~|{{}~~~||{|}}}||zyyyz{{{{zyxxwvutsrqqppomknw~wrqsy{xuuw{~||}}~}}}~}}}~~~}}~~~~~~~~}}}~~~~}}|||||}}~~}~}}}}~~~~~~}}}}~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|~}}||~}~~|||{||}}~}~}}}}~~~~|}|{}~}}~{{}~~|~}|{~|||yz~}{~~}}}~~~~|~}}|}~~||||}~~~~~~~~}~~~}}~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~w}}~~|~~}~z~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/win.wav0000644000175000001440000002054012262415351012552 00000000000000RIFFX!WAVEfmt ++data4!}}~}}}}~~~~}~~}}~~~~~~~~~~}~~~}}~}}}}~~~}}}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}~~~}~~~}~~~}}}~}~}~}~}~~}}}~~}}~}}}~}}~~}}}~}}}~~}}~~}}~~~}~~~~~~~~}~~}~~~~~~~~~~~~~~~~~|}}|||||zzzzyzyyzyyyyxzyyyyyyyyyyyzzz|}}~~~~}}}}}}~~~}~~~}}~}}}}}}||||zzzzyyyyxyyvvxxvvvuuutttttutxzuz}|}|}|z||z|||}}}~~~}~}}||zzzzzyxxxvvvtutsstqpqqpstquxu}z~|}}uv|vtyyvy|x|~~~|~|yzzxxxvvuuttsssopqoomkkooosqt|y~z}}uvzvuxxuy}xz~}~}zzyyvvvutttppqpllmllhghiptli|vzyxzyusuuustvxzyy~~~}y|yvvvtstopqollkhkhbcgksm`q}o~vzxquyxutv|~yy~~~~zvxyusqssolmmkihgfd__s}^Uiqztusx}|vu|zz}}|~~~zxx|xqttqqolooihkiffcc_`ySWbt}}}vu~uvy~}y~}}z}vqsvpkomkligkidfg``c\ZxYMlkt}ymqzpvzz|}}}z|yyvqlpphgffgf`^bb^YY[VbsAk^}s|sgysoy||}|}xvxvqlllihfcdd_^_[VVWUqU=scȺ}tuof|utu|}~}}}zvqqtoghhcbc_[\_ZSSU[~EMqiϽqosdvyoz|}}zxtyxoilmib_cd[V\[QONWBE|iǪˡ|osmmuvq~|~|yvmpuphffff_YZ`\SNQO[|BQu̳̬mmvok~~qyz|zvquxldfikdZW^_YRRRQNOp_@xz̝ͽzsgkv}sgl}}y~vuzytkdhkbZZYWURNNLM`~qObʾus~qghs|ulq~}~tmpqof`_\ZWVSNJEMcuiWcxsy|xmfmvtqvz|~|}|vqlmld_`_WSSROHMbohdiz|vvxvspquvx|}~~yvtpligd`[YYVQNJN`lhgmu}xuqtxxutx}}yxxtpifdb\ZYUOMHM\hdgps~~|xssxzxyz}zuqmkhf`[WUSQLHObggotv~zz|}yssuxz~~|xqkfdb_ZUOIEHWdfhmpzyutuxvsqqtzzxxuqoh`\ZYUQHDM[bgost~~yusstvxuuy|~zxtokhc_\YSNHIS^bksvx|xuvxz|z|~|xuqoid_\ZVQLINY_dovx~~~|xxxyz|~}ytmkfb^YSNJEHQY^itx|}|zyxxxxyz~}zuqlhc^ZSOJHJRY`ltx~~|zz||}}}|}~|yvsolhc^ZSOLLQW^hqv||yz|}~~}}|||}}~}zvsoifdb^ZVQNNSZbktz~|||~~}|zyxvusplgd`\YVRQQUZ`it|~~~}|yvsoligc_[WUOMNRY_hsz~}}}~~~}|xuqmigc`_[YUQOOSY`ku}}}}}||zyuqoid`_[ZWUSSVY^dmu}~}|yxvuspmidb_[YUSSUY^dmv~~|yxvutqolifc`^[WUUVZ^fmu}}zxuspmlkhfdb_\YWVWZ^fmu}|xusolkhgfc`^[YYYZ^dkt|}yvsolkhhgddb^ZYYZ\bhpy~|yxupokiifdcb`^[Z[^_dlt}}zxvspmlihfdcb_^\\^_bgmt|~}zvuspolkihgfcb_^[\^bflsz~|yutpoolkkiggdc`^\\^bdisy~|yvtpoomlmmkkigdb_^\_bflt|}yutsppqqqsqpmkhfc`^[_bgmu~}yusqqsuvxxusokhfdb_\\^cgmv~~zvvuvxyzzzxvqokigfdb_[\`dks|~|xxxx|}}~~|yuqolkkihd`ZUV[`ix~zzyy|}~zvusstsspmic\ULFJU`o~~}}z|||~}|xtpmkifb\UME?DVdsxz~|xvz}yx|}}|xqkc\WSNIE==Oku}~|yvz~~~|usqlhd_YSLFD@89Uy}z}~~yx~}vssplgc^YRNLFA;4Iy}}~uqu||}ztssqlhc\WSQNIB<74Zi||vv|~}tu~zvusmkhfb[WUOJHEB7Epd~x}~zvy}}|xyvqmifdb\YUQONF@7AgU~~}suz~uuyvxvslgffb[WRNONE@5JZj~ĺuT3$)4@N_pƽ|]:%+:ESfxɽ~hH-)7ESfzĹ~a<',;GWk~ʾa?1:GSbvµhH49GP]rʿb<-9EO^tͽ]1!0AK\tϽyK&&:FRg·X1*Wv¬e85Ng̴~I1Eeëa<<[~ȿO/?cҽ{G/Ho{Q9My`DFkiC?\ñW?O~PAYuMHiYG^]FYPDfVFesPZhYmpc}a^tSX|k^tgurxr_kn_kxboard-4.7.3/sounds/honkhonk.wav0000644000175000001440000001176012262415351013600 00000000000000RIFFWAVEfmt ++data~~{z|z|{~~{{z}w{{}|}x|w}r}klo}r~y}}{w{}z~~tt{r}nj|t}vzzxyp~{{x~jtllptzxvv{v|uxyiwXxYiiru{stvoto|{}uf~^riwx{}qf}gyzlu|oevo{q{{tuopw|fr{emkpqu|z~{q}xr~h`}iryruq}z~xtlwwW{dlyvus|qz|zu~{e`gphrvtofyzyqtaxfYyeszylxiux|~{|lhhwZwgos}ukvl~z~|qt`]d`mut}k~h~|}{}zmsP\\if~~l}qbxzy|xqhQlhMv]vkut}lnx|xt}dgRwPkZktlutyczxyww`ryK\[ef}prkhwwy|suijPshVkcxqtjlutwvps`\hvV|ybtwwlvuw}qxsa}hXzTocoyykqwlzq{t{fuwSYe]j}vsjkzqyrzgnLZX\ctwiisu}nwniRr\PfZ~swkmpu{juwbVgdFrUvqpq|pqstpo|[bZmE{~Xnyip~tqwsmcSdZmGv\h{]rtszjq]U{b[qLu\bw^}r{\oTx[}d[tMpSa_bkoqOfVpnl`uKuFiKpuZbZ_foprpUxLv|NeZSr~clulrpMmTe^[aTqwujltz^sn_vz_vtb~v|a}l{|sjvrkyjtzw{|bj]wmylon}|`v\jk}wty{|~my]{~ca]Zn`ru~~~f}`gl\px[~etsrm`xZuySc`eu}r{wk{~dytc`tmj|xzy|xpxpppqxvvxtmzxy}yyywzssr~rrtuxyuy{{}}uwuzn|isjo{qtz~vx~yyvzv}wt{qtumuzkyyvs|r~s{zwzvwkx|kyvvz{tyyw{w}~|{xz}}|{~z~y|~y~zrp~x}xq~yv{y}xzw|y{z|{{{zsv||ty}~{~yu|w|}wwrvutz~z~wy{}{{}{}~u}|x}}y~}~|}}y{uy|}||xx}t|ty{yzz~zw}}zy{vz~wxxyur{uu}wy|zwxux|z}~wztshlcun{ml{wvw~|vu~uuzxnqoknuxvtuv}{qtnevfylyz|}y~tzx~pmWyOu^}lqwhfd~|trtidrq}wypvhdzme|shot{|vz{yyxx}oioo{yl~sz}{zpzx`xlrsmuy|}{}~k_cihzvirw}x~}}o|pWx\rrbjp~y~nkjwXqbh~sdypj{}{yu}\Pi\fzwnm{otu|wqtZTZc_|monjwttotrVu_JrWtnmimqp{jton`ioOUiukgnrs|piz]}d]zPnajtdstn}xxnz_oqQPc_j~qjmlvqzmujmT~WX_a|lpppvlntwjWo]KeSxjkrlxn|oxzifdcHtKppcrmwqxjqkzh^lD~NftanowrrlpiyqYvCwMhy^quvmnljjzwZyFuMexaw|~y|ofj^dytYuDsJdl[}nwkXt[oorSz8sCc[a{^vlOi^}wutRu7uŎ8mHrpV`V[m{uwVx={9|yEbYOx{akjy]rBjM`]YowTcysl]rclP_iRut\de|h[{csqogk~y\o`kzrh]ctllxxhrckdqtv~czs}lnjhihm{x{v|jzypsgy`rg|gjmgz}ksgid|evcecoq{}qy_zY|o_]}vf~uu}}}juftXhmveik{_~o|_rlkw{lghyrTjYyqnod{}`vm||wn{uWMfe~{npeok~wprm_qevxwhq^sceuwjvmp}_xgkg]d^lgf~jgkhrz|hwbu~rzreyp\vi~xau[mllcZakpzmyfrir{iplayvjst{yzr~jk}ybn{ms~vyy}ytn}yoouzywssvp|zz|{zwvv}~omlelkvq~~{z{|usxqz~ptqqspsvrvxuxz{x~~{w}zxrxsyuwxz~zzzw|w|vzz}x{}~x|}|w{uxupprt}vy{~~zzq{zqz~|z{}||~z~~|}y{}z}wr~zrywzz}~zx|x~wx{u}wyyx{ryr~zw{||wx}x}~{xwws{zz~t|su~w}z~~}{|}~}xywzz|tr}t|t}wxyyy||}{w{twsvwvx{|{z~yyxxt{t}x}~}{yz{{x{w}||{~zz{||z{vyvz~wzzw~{{|{~xt~~t~}xz|~z|{~}{{y}xz~~{}{z}|y}{y~z~x{x|z|{y~|z}|zz~x|x}x~}yz||z|yx|vzx{x}}yzz{z{~}|y}x|x~{zz}|~}|~z|x|y|}{~{}{~~{~z~~z}~z}}}~{~~|~}~}{}|~}|~~||~}{}~}~~}~}~}}}}|}~}~~~~~~~~~}~}~~}|~}|~~|}~}~~~~~~~~~~}}}~~}~}~~~}~}~~~~~~~~~~}~~}}~~~~~~~}}}~~~~}~~~}~~~~}}}}}~}~~~~~~~~~~~~}~~~~~}~~~~~~~~~~~~~~~~}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/gong.wav0000644000175000001440000012213012262415351012705 00000000000000RIFFPWAVEfmt @@data,~~~~}{zz{||||}~~}|{{{|||||}~{zz}{uqmkkmquy|{vsrsuy|}{zyz|~~}{zyxwvwyz|~~|zyz|}}}zwtrrstwz}}zwvtuz}~~||}}~~~~{xusrruz}xsqpqsux|}yussttwz{}xokjmsy}|zyywvxyz||||~~}~~}zxvvx}}xvuwz}~xrqsw}|xsnnqv|vle`bgmrux{|zwqkgccfmw~vokknqtvxxwuttw}zy{~~xrqpqstvy{}~}|wrnlloszyqkku|xvxz{}~|yuqrxvsssqlijnu{nXLJR\fntz{xuqmkmoomknt|void^XVXbo~}xx|z{|{ytqqu{}oechpu{}xsojikosu|xux}~{xvwwvyxtqmkjhgho{t^LFLZiqtz|qcXRNRZahmqv{{~ufZXaoz}{}yjfkx~uoljpx{yvxwlgksy~vrv|~{wyyty{sh\TPXfqvtpr{ytvvcct|srx~tdXV\dggjowusw{{vngfly|vyzh\\ajyugbisy{}{sowwqprtwvnkr~~yroni`^eqslny}{phfmvh^\^ds~~ykhox|xt|~qko{ys}{|~wkc^`eozwieqylmyvruz{xtv}}vljm~qkoojghjmuxqmq}o\Xdpjcll^`gotuxwoqlTFBN`p}~}xu|}s~wkcelkjuz|yso|{ien{^NTkyxvno||y}uwxhcmy}ys|ursmdcnwsikzqimw{~|laVV\\fv|}~tddrrmjnzzhTFNgzyi`be^TVhwy}{urwrysoz~kR@@^v\Z^esxtrs|lZXdmnlrz}xoeZdxijuntrvq^Zf~ydRNR\hru{vjk{{~}o\LRf||wi\Zkvlq}ybTVXRN\s~nq}yrq}yswzqVBBTi{q\Xfjhn|{z~p`ZXoo^Zaenznovqyx|whTFPjŮyb\^mzzucLHVkgVPNXuipx^Zhr~nXTdqhczqjiafqmks}ŰeF9DZ`^\humqwtt{mcehdk~sZNjsa`r{rw\FFXyulzfP\yvfxm\Zbn~y\Tbecl|t`dxt`aaexff^\j{objqrgRdr}~ozj^i}zkbZq^^w~c@Hb{{n\flbhsx|sdRJTpwoJNf|wV\xwtjhdXbv`^s{t{|ZRc{xcijvsmgbexud^bgjlko~{VTbjkek~~xjg}fDLvwqVJh|}rmz~qg|xb^ykqnqxrfTHFVxwanrfcl~x\PZfvl\RTl|h\h}XZquZXl{winz~}~{{oX\oveLPn{g^fi`au|fc|{vk^fv|}|vnvmV`xdizxiZVuwpni|eVRZu{w|ultsgNFetaTc}g\l{vy{^i~adp{|gTXhwn{^bx{ojcu|~ifjug=9bnk}^czwZV^vlk{}zojslvzuxpdrou}nlomuksww}zuusnu}V\yzz|g\ZgVDV|~kjupmvfinnjNNzu\^wx~um|ujVZrridnvdojLPmuf\\}{xvysoqsyvmeZq~orhfhv}ruvtlahoyyxvmxkZ^qr}j\izzjj}zp`io\czw{|vrnn||{rvwxwz~ts|x{l\B^~|symPVwxcszsy~ufekmkr|}sqjouup|ooxizuxqty{}vwwsz|cutP\wr`Zg|ymvzjm{g{sovqmns||u~xigoc\~}^toXZziRbwteN\w|e`rxj~y|n`bt|}n||pzvuso~|y{qnukVtr`hvyxzv|{rum|oybef\Xkusdg||zqy~ruwuulbt|syu^rthnnLcu^~l^}tn|`psZ=P~\a{zvpu{iXd{x||c^{ttvvowolufZfzxvv~umojmf\dhf|ekzz{i`mgkozs{m^^xyfvgjgZirRnqJ=hxj~ruo|wj}{bet|hotuwxsqgt~vo{}tzji|x}vhr}njukaoz}yro{|v}~yw}ucaovdaktgjiozvyne~x~m~olbegj\PZx{flnbrq}ykZ^efXbrox{tm^b}ykxɶ}X\aXzyk}mojhuuzsdenT\lo^~sz|xhkkDLtwosmxhemlhxw|}v~~Z\urqwbqrkTqVFtojswwy~t{ob`o\Xzwt}aFNnlXliqhfvy~~vvkjvxogs~ZXi`tnZkbytfunlnfwwrzssydac~}yj{vxwal|~y~}mRXoy}mlzqlfu~s}xp|suuf}oeo|vx}lcuhXsixz^h|~guveq|{}yuxn}{eoshvpfkw^l{t`alh}r^exztcfjzqo\k}qiXn}{uohuvm^^|orxzxwx}|{}z~z\yjZrqm~f^zkbvzla{sn|}fNknbvkxkf~~u^nzqNLvto{~{^vtrno|}|z{jtuZbsxJPryunosicz~lev|ryrbuZTrgXmtn~v\i~XmcHJxxavz}wql{o^bjyunNg~wos|{q~{yrtlisdZvj|wll~qZJbhHV~~y{mtuoq^`z}rl{{o}NP{yr{ynstl\k}nrq~z{wphswNVg\u|vvihqjoyveZjwwrwrwslmVl{}rfmqgkx}{wcs|uqv}{zyucTr{wufi}nVvy^^VXvmqyp{vnnhi|nxrh{tvlyns`~|VLawc}xcz~NNqdvq}r|{yg|im{tofXVuc\e}wuqvkVuh`inyl~ilzgxzyoev{{yvtv^gzioe^nwvZ\{aerhqnRdv~{jrTFw|jjdlrvd^a\lxntxyleZlsyzyrsxrq{h`cz{rhismmkTclevszqZvkdq~o{{vru{yu~sisv\cnm{}immafN^kpzzzdi|nlmwu{{gNZjZhvzyeg{y^kpTmy}rxsuymvyqy{|~yyZXkrt~upvcoyhH^emucXdxdzqqsxsfzv}txfjllbdfykn}}r{jlxz}xs}s}wjpr{kNezznrmz~naujtxws~{ntl^h{{vtvx{z{ohzlZqtjrckuldyyetiu}lioss{hsq{slmt}mfuyohu}twhrui}fxbiy~fmz\Zr|oxu~^xsvx|rto|k{l`jnlz{l\o}w^qoenx|xacehuoZ^cwxdawk^w~|q}syv}|tyom~pamyq^t{pvzau}qhrjrrswnuvydu^blTZ|~ZX}whyow}qx}vxz}o~vl|m`dwVRudqslkxsnvliZ^mhTcxLc~sjxp^mqp~nXlgHJVZ~hu^Vvd{xgi{jTlgVlnkjzjtyayu\z}n~u|{|n{ZRiw}boqk~jzwzuu|z}xy{crsbn}~xqun^kfXgoXo|lqusz{mzzdvycJrrZVqbb|sty^adZzws~v{suJP}pXjz\hu^gh|~k|ticyvy~ixylc}oT\jfx|gugVf{gu{{qeNVrmDXiVtm^uw`bkyt{irupgm~\ZyqargZ|tqzkxkVn~vv|}k|zeNVft~x}vtmyo^~wwqt\\^NgT\r\Trqe}~uqmrstvwhhV=bhZVi^^}Zc~~qydRm|TZcej~vmggbl}{pfcblojPcfX^cBTrJbwer|{tzcpw\fmjixaX^\zXTn~xpmv|tkZh{ZXzZ^yrfolqtoks}{x~u}sjykfsk`nqLZ{efoha\hjjxpe}ZLu~RJm`ixy|emr^fwziw~ot~pjlmtXZxj\ntymezwefu}ts|{bixzTt~gRZy^dyz}rxjXxxht|t}}eseejaZ{rj~RcZoyvxblugbyrng~s~~^`jpyqk|}ruoZvys~vmxehxqX^zur{}xrfu~qorwznf~vhVqhXgzqvoZqwZ\rw||~f^sihrtw}wuz}}qntohmxzw}rzwsjojXctx{xxqktvrvy}t{s~pir}jus{|qv~uktzqovgtnrtotjv{cg~lZs|nu{usryzt{rmxgd{tx~vae{os`\|sdtsr{ig~qhxuel{ymyrzv}{rskty|~nu{zz{{oi~lRl|nuvnpwyrrqvymtx}|tez~w}q~qlsfaqz|aiogosvn\ushrtzu~adlrtuunk}q~q|phwrwhd{mumXg{{{u}{v{c`o}cptTumfeksl{}tlgy|lvvsgr^krpoamwirwv}}~zx{{{jr|~w}}qny}kttr{~{yqcq}vmuzuky{rwqxzpywsxpjv~~|tnu{~tiq}{vz}|nmxvZfy}edwyuzwt|smvvcesifm~ywy^ohdu{pah~``u}to{xjXjrw~pq{ilywy~v|xz~vungdfytfmz|||uy{||y}ujr~}{e^hlnzqq~tmzyikt}|wvrv}{z{lo~ziqvouo~vg{trvyz~~~tu|zjdnorynxxzzw}xjyyfkujmvwlnxxlrqvym|s^hzr~lj|zrung{nkxqpxuyptux~ljs}yt{~ytjszr|{w{y||pj{zuv{jj|yr~wdl{y{{svjnljmlzmja|jiy{omx|vxtvyqlz|k|ymx{~kqyxz{ohx{umvt|yogxyuqno{pshnz~}vopquv}w|zush\rstliwvpmzjdr|}qprzqn}fhz|z|rku}{sjkis}vygs{{zwiosjoz}}uwiam~u{{mNazlzsss{{qtmmw{ynbb}ohlw\Z}xflzxkurmr|yoxpVTZ{qlqvpche}`gacwwzlb{jbi~{zx~{uixjV^|ghh}kat`Vmtmlkv|sq}uxuj`f~ekxtoysqoxl`vvsiT^{y{vxsh{{}txhZ\skgs~rwin{cgn{|klv~}n{~vt~qf|xqmkytw~}y\Tfq`jrujeunVzvlzfa{~tft`nyzaZ|tb^mrsuw}\PcuVVwzo}~nhi|zkhuwqma^{vaZmyos|mtxmstl{v~~rah|xpssw~epz~yikx}ojxuo|j~sxr{lXc|~ys|qlnzruusqlqz~c\kxm}yr~}sz^Xq}muz~zv{{rzm^e~y^ounxf{egzflu}|ek}|zxon{xz{wwlThyqtjZmvvlgrxq{}uw}|xulk|ytt~uzwfk|ymrzz~nq~wnuetr|odzyxvuwuhnggy}gZyekz~~uwxxrytws~ttzx}p^l{suw~xan{xx^Tqxzsbrrchkxzsk^oxsohvnr}zqjs{tnfo}|npx}~{vvzjpwxzrequm}kzymy~norwqanhdvvzwlyltyy|y}tx|vvx|{c^jueurvtwrntmnakqvsvvmlqslzz}~syyvh^cq}szo^txwszypyyu{n}~{~omv~}vx|gg~nqvwtwwxtrz{ztu}}x~{tuxrrsuvmuqnxywsuvvzru}{s}uw~zs{ry}}wns{zzx}yxdg~|ms{sy{{~}xsnv}zvy||yto}~t|x{{{hqsuo^vzrtxy{ztsvlsv~~qz|{{~}{zts~{suqmqu{||zoitvolw~z}hizsgxszy|rnu}xu~vZZvi`e{}qmvvwugoz}yxom|{}qjo~zws|mwuz~~quwyvyy{uu|~igwy~|xnw}xxs~vuv}xslx|wzw{~xsx~uvyocyupnw{oj{qhqjpwjzx|x{xwnklx||~~}sw}lhqsw}~|xvt~yrforqswnv{tsw|mm{}ytqis}wgZrumdkvrtyr~{wz~vrwv~wvvzxstuliy~xy|tqyvw}|ywuvrv~riq~|}wtntxplo~ia~zxzlk|ii~zxroy}uw~v~zst}}~tswrnr}|zuy|sbmz|}ru~yyzxz}uzqir}pu~|{{sdgmtyzro}|~ninwy~~y{rzxwlo~vx|uv~zxvy||tu}|wvx~|lls||}}u}velxy~||~wz}|xkl{}{~~}stth|u|whv{rzzzz|}vnrwyur|xxqjrzy}vrxr|vwur{ov~u}t{~{}|stytz~{zwov~yzhctzwts~}yqlxxqz}tr~xivuyyqt||u||}yv}{mvx|~~{vwy}}sq}}|syolwgdyr}h\w}nk{|t|mlxmxu{}rsmorqvyxvjfxz|tmqstq{z}}tuzujkqzyw}{{yz~lpz}|rw|uqsolwxo~qnzw{zz}|{v}vn|~{vy~~}vy}y~~~x{|}sryzxp~|~uurhw}|u}yr{nms{~}s{|{~|vy|rk~xwv||ooyolvo{v{}}jnrsy~|}z{utx~yu}}{wrs~~usvxp~|x~||y}zr|}u{xzkiqmwyqxxmxciuenvoqtzwr~rzzw~tnytvmw~tpx~zyx|}wmqqr}t|yqwxw{{{{qxqcjw|~zssxwu~}vov|z}}yw~}{|xm^f~sn{}xswwqnuy}s{nw}pr}ww}lsrgtsvhs|swy{~|yuy|yt|z~~rpu|thp|~}}yloqqqoq~wxbn}|vpswmriqwuzlwvw}xwt|di{uxxw|rv}vty}}{xr{yht|msxkrw|z|xuoeuzuy|}yv{||zvoxs{n^ryuz}~yy{s{uhqy}ytz}uv}~wzilvts{}qzx}{~~slyuzyu{v{~ujprv~qpytp}vosvwu|xylz|sx{|y~xmm|wz~xs|{kq|}~{zzrtyrx~on}sk{zus~{qwwyvy{}{lowjvzwz|yvx~}~{vy{pz{rrx|vs}{|wuwrzyyxs|}|y|ypy}kgztr}~}}yxzstzy~~uvsvyw~ntnl||s~{npzxy}zooytmouz{}{oxwecxvxvklw}zuxw{snvtpz~~wz{|}}|x{{sr~szv|~yzukdm~zyyoty|{wurxyyzx||{vuzzsu}}wy{jku~tqvqoll|}~{|zwunmv{{wy~~tuyqq|yim|~~~|}~~xt}hqs~ztry{qlv~}tnzt{tqwxwvsv|~}tpnswvx|suzrz~z{~tmx~{t}|ibt~lfy~|{w{{qq|zy}{}xywz~}zoqy}sxxnyuzzyxwz|||wtz~}~}yxrvzxz{rz||{z{yz{su|yyut~~z{||y{}{lo|wwzvz~rlp~x}}zy{~|~|wtw}~xlu{y{xy~{|~us{~}~{~wrx~yz{vv~wy{}trtwy{|}zxrlo|x{zty}rtyuwwtw~w||y}y|yqt|wmt{sxx{}mjkkp|nt}yrs||uqvy~}{vv{}}y{~uvw~vwwot~{|udexrq|ynls||ypnw{vttx~yy|~zsrz~}soyyw}{x}|tmqqnlw|xuu~ysjhrx~yvvwzuqw}}{tsx}trw~{yqq|wzz}ut{u{~xuutvsw~}ot{|sxwommv||ttz{xx{ypx~}pruzz}yqs||~|u~}~vllw|{wwysu~~{vw{~z}zx~ysx}~{xyw|xuyxsz{sy{yx{}qt}}upy}zu||{{tv{|zzyz}|z{s{{yypou{u}ww~|xzzzyuw{tx{z{wz~}zxw~}{}hfy~or~}v~yxrwwt~{y{uv|zrr{tkjnvxts{}{xz~ynmwwww{{~~}qiwzqx}~ytvz|xx|sruu{{uy~}~}{yywwtz~tv~{|z{||~zxrq}xytv}wyyv~wnxzpy}}{uw~}x}tox}xw}}|xywt}|y~|{~xjtzvwz{{zpnuuoxzw}zyysorzztv|~yuxzxwz~u|{z{uu~zy}{pnwunynuxzyry~{xw{}rs|x}z}vvx}}qp}}y~~uq|{~}|z~}|ts{{uu}vyzqkt{|w{{x}|}zx{~|z~ywx|~~z{|zupq~zz{~}wy}x~~wvssx}~yvvoq{|zz{z~~wqu}{~y{}yzzxztyyz|xz~|zwv{zux~}|||~{zwz{y~~yy|vy~~}~{uz~~{v{~vysot}~|zvw~yuv{~|{vsz~xx}~|}|xzzuy|y}~uw|~}x}}zuxnxxrw}~y|{sqz}vy{~ux}~z}xw~}ytw}{~|z~||~{|~~|}yxz}vyz}~zx|~}yz~~tu|x}}|}zvz}}ztrz|onz}w{zvz~yz}}y~zzvllsuqy~}|qtz|~wv||}upxzu|{xx||}zruy}sv{|~{z~}uv|{|~{}|vr}~}xikzzu{|}~zsp}|txult~{|~}~|z~rmrw{|u{yqw~{wvw}y|xvwvrv{z{xz~|wvz|zw|{vllyvz}zy}{uoqw}|z~{|xlky~ww}{|}ztpsy~~{{yw~}|zz}y|x{vtx~zyt{~tsx~}~~}hezxpt}}s~}xvvx~}{{~{kn}y{{xux~~up||wuvzzw}~y}~ztwxtzyw}wv~uuvz|}~~ss{{z{~{w{~zxzywuyz||{yz~|wruyz~}xst{yz~y{{tyywzw~yv~vyvtyv~{}z}x{xnu|vw}~qjmvxqlq|{u|trv~}qgtxvu~~wx~|w{vzwoy|vno~~yvy}}lr|~wy|y~vvxvw{|~{w}ptxwwuu~{z}y}yz~}m|z|~yxwrry{v}vz{vroy}vrwx|~yx||uyypt}~~{swyntxs{|w~|sz}~}{}w}{zz|yovxwzrnt}~}~}~~y}zwx{{{xzss}}|yijzzoz~y~~~|xx{ytwtr|yv|vyqjtyqzxr}~yvu{}}zouuuvq{to~yrt|t{ysz|txwsw}{}xz}z}yz{|xos}~ww~vv||tr|~||~||{svv|rnwzsxz{~|yyyupt{vqw|z{ruvv~~|~|}rq{{vov~sltzr{|mn~}|~|z}{v|}z|{y{|uw~su~}}~yv|wnz|ru{~wx|~yxx|y}}x|~pjy~{~zwy{xzxx}}~}uu{uo{x}wv}vw{|{ty|wx|~|x}smuzrt{{}}}vuxx{}||uqoryzz|ps{vxy{{y|z~z}{suxwx}}~{wty~zxy|{|}uz|{|~vz~xyzvprx~zx}yy{~vpy~zor}}rmv~~|{~}sov|{y|srvy}~yw}~xxxt~|wx|vy{uxxuy}~}||{wz}xsu~{x~xpow|{~xsyzxwzxvtglzwqqxuqww{~yoow{vu~{ywsz{~|||yux}yz~x}vps~}|vu{~xy{~z|yw|wqu{~{rnxsjow~|{{|}{z||xw|{uty}{xx~}yusy~yx|~||}xu|}z~}|}~~}}xrw}vu|||usz{y~|uyzwy}}|{}{xx{tqw~yuz|xwx|~z{||xx{~~|yx~|wxy|}w{xst|}xw{~yw}{}wwww~z|}|ulr}xrsx~||~~}~|}~zyz~{{|vuz~|||x{~}zxwyz}v{zwz|}}z{vrzzsu|~yz}~xx}{xzyquyqr{~~~us|}yz~~zy}~|}{y}{y{}~zx}~~}~}vuz|}|}|vz}vw~zyz~}y|~~z{ysnq{}~}zx~yz}tt||z|}zwy||}~xv}{vwwx|~zuz|z}}|zvz}|yw|~xy||{z|||{w|zts{||~z|}zvuz|y}~||}|}yz{}xuuvwz~~{~{|~yww~zxx{~z{~~}z~|usv{zwzy~zxz{}}{~yv|ux}}xsqt|~}|}}{y{||}{|~{y}yuv}|~wu||srw|{xz{vsyxwyu}}{{}~|xz}z{zxxx~{zzx~}{|}}uy|{{}~wy|wz}wt{~vvxz}}}|}|x{wy~yy{|}||~z}}wqr{vt}|wt{yvwxy}|}{{}zy|~y}{|{wxxp{~}sls|uw{w|}|y{vyz~}x}||}}wx~soy~z}~z|{xz}}~{x{yy}srz{{tpr}twzqqv}nl{yrz}vowvs|yy~x||{}{{~x}uw{zzvuzxxy{}ww}xz|~}yzz{woywtzx~{}ytu|~y~yxzuz}or~{{w{~uu}yrs{~||zslt}|vz~yx{}{y}}yztrttwxxtz{ty}yz~xor}ysv~~v|yx~y|~wsxvv|ttzzrx|}vnouy}|nlr{z|}x{{wwy{}~ywy~}wy{zwsvw}}rq~{~|wy|y~xvwv}~try}}{xutssvy}}z{x{}|{}{y~~vtx|yspwzywvz{}x|zsv~}}}yxxzyz|||x{z}|wx{~}zz}{y~~|}~~yx{wvz~~}}}}~yy}{tu{{xxw|~}~z}zy}~}~}}~}}~zw|~tu{xz~}~xw{~~xv|~|wsrw|~}}{}{{~{{}}~~~{{|y}yx~}xx~}}zxx}}~}}z|zvz|wv|zz~{y|vv|~}}~}{}}~{xz~|xw}z{}~~~yxz}{v|}yww}zy{}~}y}zw|||vx~~{~~}z}}{z|{wy|}~~|{}}~}xrw~vsxyv}zyxzz~w}zw|~{|w{|vx|}{ww~{{xy~z}}{}~~zyytw|{wy}{|~{z}}{|~uvyu}|x{~}xv|}zyyvyx|yu{|z|}zx{~{{~z}~{y~~{z{|}|}{zz{{yvy~}yz~}|}}zyuy|y~yzyx~|x}}~|xvy~}zx{|ywvz|vy~~~}|zz}zv|~|ywy}}~|x}|xx~~|z|}tsz|yzz|}yx~}us{~{uv{}|xv}}}||{~|wty~zww{~{xy~~|yvrty{|~~{||z|}~}}{z|}~}}yvy|~~|~zw{{w}~|}{}~{}}yz~{|vvz|~yz~~~~}{{~z{}xz|{~{xx{}|z}zw}z{}}}wvy}~}|z{}~{xz~x{xvyztsy{}uu|{{{{zwz~vsx~{xw{}}~~{}|}{|{~|xzzx}|}}||z}}|}{uy}}y}|}xx{||~}yw{~y{||{{~}y|z{~|~~zxz|}|~}}~~~zy{~{|}yx|zz}|}~zz}}}~~~zy{}~|zyxwyz|~~}yw{}}}~}~z||yxxz}ywy~~||}xzzx~||}|}|xx|~yy~~{y|~}|}}{|~{|||}}y||~}zy|}{y|}|}}~}{xvx~~{z~{yz~}yy|}~~~{y|}y{}zz~}}z~}z{{yz}|~~~}|}~}|{}zy~}}|}xvw}||wuw}|zzz~|}~{}yz}z{~~}zy|{z~~}~~}xx{|||yy}}z|~}~{}~}~~|~~|~~}~~}~|{}}yvx}~{zz~~yy|ytv}}|{|~~{{}|z{}|{~~~|y|}|~~~~zx}|wyxvy}}}{~~zvwz~zz~||~~{{y{{ww{~|x|}zz~~~~~yv|}||~|{}{{~~~||}||xv|}}~}}z|{}~zsv||yy~}}|zxz||~}|}xy~}{wx~}zwx~|~|{{xz}}||~{zz{vtz}xy}zx}}y}zuuz}{~yw{ytu|}|}|x}||~|z}{}{zz{~|z~{||yz~z{|{}~~}yy|~~}yz|~~}|yy}ysw~~~yxyz|~zz~~~||}|yyzvx}{~}vw{y{|z|~{{{{}|}~|z|~z{zwz}~zyz~}zz|{{~}{}~~~zwy~yz~|~|}|~~z}zwy}{}~~zux|y||~}{{{~~~~~}~|||~}~}{zyz~~~~zz|||~xz~z~~~{|~}{~}~zvz||}}|{yuv|wu}|{|}}zy~~xvz~}}~~{|~{z{}|y{|z}~}{}}{}~~}{{}~||}~}}}}~~}~}}||~|~|}~yvx~}}||~}|||~~}~ztv|~}|{~~~|xsv~}~}~{y|}{}}|~|y|~~~zy~{||x{}|~}{zy{yuy~~}~}~||{z~zxww{~{}~|z|~}||{|~|~}}~{yz|}~}}~}~~~~}|}||}}~|}}{|{z}~}~~}}|z~{}|yx{~~~~z{||~|z|z{}|}~~|{~||~}~|||z}~}}}~}||}||}~~||~~~z}}zz}zwz~y{}~}{~~}{z~~{}}zx{{|||}x{||}yy}|{|{}}~~~~~~~zy}}{zz{~~|xz|~}~~~z}||{}|yz}~}}}~||yz}~~}|{}}}{}~}z{~{xz~xz}~~|}}{xx{~}~}~{|}}}||}{}||||}|{~|z~~|||}{xy}~~~~{{}y{~}|zz|}}||}|{{~~}{}{z~zvz~}{{~}||~{|~~|zx{~}~}|}|{}}~~zz}~||~~}}}~~{z||{}{{~~~~{z~~{|yz{|}~}xvx|z~~}{y~|}~~~z|~wtw|~~{y{{x}|z~{z~~}|}}~|xy}}z|{x|z|}z|{y}~}~~}~y{}z|~}xx|zzzz}|zzy}~|~zx}~|~}~}}~}}wu}|z|z{}{}}~}zyy|~~}z|uyzsw|~~~~~|xw~}|~yw{{~}}}|~}{}~wx{z~|z}|{~||xx|}y{~z|}wy~wv|}|{|~{}zy}|yt{{{~~}}{}|}xvz~|{||z{}~}{|}zz}{y{}z}y|}wx|y{||~}}~zz~{uxxw~~|{~}{}}|}zx|}zz}~~|y|}|~||~z||}~~zz{xy}~|~~x{yx~|{|~~|wxyw}~|~~||~~~zw}}{|~}z}}|~{{|~}~~}}|ux~|}z|}wvw{|}~|~~{|{xy~{~zz{}}zz~~}}yx}||||}~~}{{}~|}~}xzzxz~|zz}}{}~zwx}~~}{zxy~~vqv}~}{z|~}~{z{}}|~|z|}|}~|{}~|}~zx{~|}~{~zz|~~}}}|z}yx}||}}{yzvz~}{zz}~}{~}xx~~~~~}~}~{y{|{||~~}|wy~~{~}}~{{}~yxy}}}|yz}zw{{z|||{z|y{~yx||ww{}{z{}{wz|~|{|||}}|~~|}~~||~}~{zz|~}}}}}~~zy}z{~yy||z}}x{|wx~}{||}~{zzz~~|}zz}~~yy~|y{~~}zz}z{~~|||||}}|~~z{{yxz~~{}{zyxz}{{~}{|~|~~|{}|{|~}{z|}yvx|~}}}~z{~~~}|{~~zy{|x{~}}{~~{{~zvw|~yx}}}|{}~~~}}~~~}}~{{~~{{~|yz|{|~|{|}|{~}{|~}yx|}||}}yz{|~zz|~{{|~~{|{xy|~}~{{}~|yy}}~|z|}yy}|}~zx|{z}}|}{xy~~xx||z|~}|||}|{}|xwy}{xy~{|~z{~~~~|}~zz|||zwx{{y||z{}}}{yz}~yz}{{|ywx|}{|}{~||~~|{}}xx|{y|~}~xtv|~|}~}}~~~|||zy{~~~}~}xxxy~|}}}~|~{xz||{xy}~{{}~yuw~}|}|yz{~~~{y|~{z{}~}~~~|{}|{wz~~|ywy}}}yux}z{|y||z}yuv{|yz}~~{{vy~||}~~|z|||~~{|}}~|{}}{}}}~{yz~~}~}yxy{~~~}|xwz~~|}zx{~~~}||~~~|}|||{~~{yxz~~|~}|zwx}~|y|~|xx||z|}}}~~{|~xv|~{|}}z{~~}}~|~~}}~~~~~~|}||~{}~{z}}{z|~~~{}}zz}~yw|zwz}}}|z{~}|~~~}}~|~|zy|~}}}}~|}~}~~~~|{}~~}|zz}~~|~}z{~~~}}{{}}~}|~~~~~|wx}y{||}z}}}}||{|~~~~{z|{y|{|~||}y|~}|}}|}}{{|~~}~~}~{{~||~}||}{|~~||~~{{||~~}||}~}~~~~|}|{|~~|}~~~|~|xy{}}{|}{|~}|}~{y||}|z|~~}}}|{~}~||~}|}~}{|~|}{z|}}}}~~||~}|}~}~}}~~~}~}~}}~{x{}zwx~|}|{~~}~~yz~|{~~~~}zy||}}{|}}}~}z|~~~yx}}}~{|~~}||}~~}~{|~{z~~|zz|~}||{|~}}~|{|~{||y{|}}~}|~|}||~~~}}}|||zz~~}}{z{}~~|{}}~{xy~|{{}~~}~}|}~}}~|||xxz}}~{{|~~|{}~~~}}~~||~~~|z{|}~~zyz|{xz~~|y{{wy~yxz~}{~~{{}~}|}~~~}|~}|}~|yz}|}}{}}|}}|~}z|~~~~~{{|~{{}~~~|~~yz}|z{}}~~}|}~~}|}}~~~|}~~|||}}~}~~~~~}|zz~~}~|ywx|~~||{{|~}}}yvx~~~}|yx{~~~||~~{xx{~|}~}~}~~}ww{~~}~~~}{{~|}~|{}}|{|}}{|~~}{|{||{|~~|{}~||{{|}~}}~~|{}~~{yxxz}~||{{|}~~}}||~~{zvy~~~~}|{{|~~~||~}~{xy{ywy}~||{|~|}~~}{}{z}|z{||z{~{z{~}{|}|}}|}~}~~~zx}~~~{}~|||~}zz}~~~~~}{z}{z}~}z{|{}|z~}z|}{z|~|}|~}~~{{{{|z{~|{{zw}||~|{}|}~{}~{|}{z{}}}|||}}~~~|{}~|||}}~zz~~|||}~|}~|}}~}{||}}~~~~~~|||}~~|{~~{{{wx|~~~}~|z{}~}~~~~~}}~}|||~~}|}}}~{z|~}ywz~|}~}{}||}}~zy{|}~}~~~}|}}}~~}|{~}|}|{}~~~}{{}{x{{x{~~}{|~~|}~~}{}{}~~}~~||~}{{}~}||}~~}}~~~~}{|~}}~}~}~~{z}{|}|}}{}~}|}}||~|{~{zz{}~||||}~}zz}~}~}{z{~~~}}}~~|}~}{xy~~{|}~~|{|}}||~~~{|~~~~}~~~~~~~~~}}~~}~~~}}}~||}~}||~}}~~~~~{z}~|}~~|~~~~~}{}}}}~}||}}}~~}{|}}}|}~~~~~~~|z{|z|~}}|}~~~}}~~~~|}}{|~|}~}}}{|~~~~~~~~~}}~~~{z}~||}~~~}~~}|}~~~}~~}~z{}}~|{~~|}~}{{|}{|~~~~{|~|{}}||~}~}||}|}~}}~}}|}}}|~~~~~~{{}~}{|~~}~}|}~~}~}{{}}}~~~~|||~~}~}~|z~}|}{~}}~~|{}||~}}~~~~~~~}z{~}~~}~}{z|~}}||~~~~}}}~}{|~{z|~}~~~}}}~~}}|{}~}}~}}~~~}|}~~z{~~}z}}}}~}~~}~~}~~~~~}|}~|}~}}~~|~~}~}}~~}z|~~|}~~~{z|~~~~~||~~}~|{~}|~{}}~}~~~}|~}~~|}~}~}|}~}~~}}~}~}{|~~}~~~||~|{~~|}}~~}|~}}~~}{}}|~~~~}~}~~~~~}}~~~~~~~||~|}~~}}~~~}}~}|~~~~~~}~~~~}~}~|}~~~~~~~~~~}~~~~}}}}~}~}}~}}}{}~~~|}~~}~}~}}~~}~}}~~~~}}~~~~~~~~}~}}}|{}~}}~~}}~~}~~~~{|~~~~~~~~}}~~|~~~~~~~}~~}}}~~~~~~~~}|~~~~}~~||~~|{|~~~~~~~}~~}~||}~}}}}}~~~~~~~~~~~~}{|~|~~~}}~~~~~~}~~}|}~~~~~~~~}|}~~~}~~||~~~}~~~~}~~~~~~}~~~~~~~~~~~}}~~~~~~~~~~}~~~}}}}~~}~~}}~~~}~~~~~~}~~~~~~}|~}~~}~~~~~~~~~~}~~~~~~~~~~~~~}~~~~~~}}~~~~~~~~~}}~~~}~~~}}~}~~~|{{}~}~~|||~~|}~~~~~~~~}||~}~~~~~~~}}~||}~~}~~~}~~}~~|}~}~}{z|~~~~|}~~~~~~~~~}}~}}~~}}~~}}}~}~~}~~~~}}}}~~~~~~~~~~~~~~}{|~~}|}~~~~|{|}~}}~{|~~~~~~~~}~~~~~~~~~}}~~~~~}~~}~~|}~~~~~}~~~~~}~~~~~~~~~~~~~~~}}~}}~}|~~}~~~}}~~~~~~~}~~~}~~~~~~~}|}~~~~~}|}~}~~||~~}}~~~~~}~~}~~}|~~~~~~~||~~}~}}~}|}~~}~}~~~~}}~~}}}~}}~~}~~~~}}}}~}~~}}~~}}~}}}}~~~~~}}~~}}~~~~~~~~}}~~~~~~}~}~~~}|}}~~~~~}~~}}}}~~~~~~~~}}~}}~~~~}~~~~}}~}~~~~~~~}}~~~|}~~~~}}~~}~~}}~~}|}~~~}~}}~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~}~~~~~~~~~~~~~}|~~}~~~~~~~~}~~~~}~~~~}}~~}~~~~~}}}~}}}}~}}~~~~~~~~~~}~~~~~}~~}~~~~~~~|}~~~~~~}}~~~~~}}~~~~}~~~~~~~~~~~~~~~~}|}~~~}}~~~~~~~~~~~~~~~~|}}}~~}}~~~~~~~~~~~~~~~~~~}{}~}~~~~~~~~}~~}~~~~}~}~~~}~~}~~~~~}~~~~}|~~}~~}~~~~~~~~~~~~~~~~~~}}~~}}~}~~~~}~~~~}~~~~~~~}~~~~~~~}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~}}~~~~~}}|~~}~~~~~~~~~~~~~~~~~~~~}~~~}}~~~~~~~~~~~~~~~~~~~~~~}~~~~|}~~~~~|}~}~~~~~~~}}~~~}}~~~~}}~}}~~~~~~~~~~}}~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~}~~~~}}~~}}~~~~~~~~~~~~~~~}}~~~~~~~}|}~~~~~~~~~~~}~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~}~~~}}~~}~~~~}~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~}|}~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~}}~}}}~~~~~~~~~~~~~}}~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~}~~~~~~~~~~~~}}~}}~~~~~~~~~~~~~~~~~~~}}~~}}~~~~~~~~~~~~~~~~~~~~~}~~}}}}~~~~~~~~~~~~~}}~~~~~~~~~~~}}~~}~~~~~~~~~~~~~~~~~~~}}}~}}~~~~~~~~~~~}~~~~~~}~~}}~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xboard-4.7.3/sounds/penalty.wav0000644000175000001440000001420612262415351013433 00000000000000RIFF~WAVEfmt ++dataZtz}wf===KtqN=?[qa^dvo]JFTok_afpzhmzsjjq}rdi³yvdTQQ\}zS==DZmxvmb[caWawvkptpp{wsvw{ykn~kaag¼vt¯{tqsa===KtwO=>Ys^ZbvzfNDSkpklhommqmhmytjgy¼~zaTTZqpM=EZjtqjbddVVezyjhsspzqrsy|vs|{aZ^s¬muxqx{X===YfG=Eem^^gz~jWHGZv}gadixzkt}ukmvqdm³xwgXUTazT?>I_s|vod_gaVavqhotmnzyvxx}ykp}mcagws±~s}qnd===Hs{S==Vzc[at|iQCNdohigismssmlvxmhu¿{jZUXjzT?DWgrvnffj]Tax{lhrtmsqpquzvr}|f_at¹tw°{q}wxU===XkK>Ffqa_kjXHGZv{d[_dq{~sfnwndfpl_l¯v|dVSQaqK==G]mzsma^f^Td|qktvmo{uvxz}wlx~la`k¸tt¿zrorZ===VsK=Dcta]hwdLGXrzkjhfq}mmqmhjwsijºv`UU_|^C=K^itzqjdidUZntiowsr}{rstxztw|q^Za{ znwºtsvsF==Cj]A>Qz{e[cws_NGQjsa_di}pmzylgmxxecz¹}vv_WTYtaD>EWlx{qj_ccTZq{nmvtnwvyxz}sm|e_`tªpyºus}mtT===XmG=Ddo[[hs`KFWqzjhhfqsqtqknztjj|¸~xcWU^xfKDO_kvrkegcVZotilspoz{srquxtw{~zgdkz·zxzqJ==MoaIDVz}h_dvqaOITko_^ch}}nlwvkgmywfd{·}vr[SQVrZB=ASgtzqj_a`T[txkltqmx|tuswznl}va[az¢~s·uyzoqA==?i\==Mu}aU]q~jSAJdqffgh~wmpojgo}zkem²lWQVitO>CSckywqhdeWPa||ngoqktutrtyxt~zfZZl¸tt²sz}{W===XmK=Cam][jiTEI^{f[afs{ou{qhktmai°x~iXSTdtRC@J^mztod^aWQd}sjqtmrzxwv{wmv}n_\f¼vst|sob===Jw}T==Vv^WaxvdKAQmofffjzqqqkjszmfp½~m[TXkwWEGWeo}ypgffTPdzlfmpjtrqqqutq}{i_^m¼wxµt{}zW===XmJ=Can^[j}hTDFZx~dW[al}xmqwpfgp|rdh´z}mYTT`qM==GYhswpg`c\Sa}vlqtno{{vwsvvkm}t`Z`}ž{rµquwmj===AmT==Oyx^T\s{jTDNgsfdcd~{srqjis{mgr´lWQXmtQ@FVckyzqhegYPa~{mgpslsvsssvurzyiZXd½sn²}ot}x\===SsN=?\o\WfjTDFZwm[^cn}sw}tihq}scd~²z}o^WWfvSDCK\jutmf_aWO`{rjptmnz}yxuxxnq~vaY^x |qµtzzqm>==Ak]==Ltx^SZpzgQBKc}tgdef{zwvpimzqgkvaTTd~\DDQ`hq|qhdeYKWqqgmtmm}zttsvwsvztc^dœ}v¸xz{d===OzyQ==T~q\T_ynWDDVsm[Z_h}}{zqrythcdqqaaz¶zt^TR[zZC>CSdm}}rkcb[NWttmqwqjs~uwtwxml{ze]\r¬qz¶sxynuG===d^==JoyaV]s}hTCKdwjecavxwwphjushjvaTTa]DCQ_gptkgj^NYtqgmvqmw}sqptwuwyzzaWZq¦rx»squpB==Do[>=KryaUZrz`JCPjxd^bg{}{tknx|f_r·zxgcdjpQHT[dutgpvmvsg^DA^kZ[dz~t`^etspvzqjs~z^E=DWq|slgd_\dqtvz|sk`_jx|jhgqgbm}zwx{xldosvw}tc[bqaJAHXe}gcjm}shRHcwYMTcy}jjwvmq}w{k[TZq|qgcafv}}qf^PQ^q}md^azdXap|}vqmntzzwrs}}w~}|mbVWdwn_am~{gZYjwbUWbs}wvyzy}zx}x|wf]^m}x{{{~}wvwvx|wnhdfquk_[dqxtkglz{qw{skhs}olwnjwmXHHSbw{jcjxtmqvos}zy}utzzkc`gz~hVNQ\kz{xvstvwz}}thddjz}}zwmeekswyyvqkkvoo{qaUT\k~wonq{vpq{}}{}}}}zojgm~zsjhkqwz~~{xtz}~ztmjjq}}wx|xrw{}{xusokltz}|vmktzyqe[Y^k{wrv{~{vx}zz|~||~vppt~|xztjjqyzx|}vv{~|zxvqhccnsknz~|xtxznjmv~~}}||~}xxzztqooqvyzxx|}{}|utz~}}}{vtvyzwz~{}}xzxqppsx|}{z||{vqlmt|onzzuw{zokq{wtz~{vmkjkqxxutw{}|{wqns|}zzz{{tsv}|zzwstuw|~}zy|{tojkuvsv{}zzz{z|~wsvzrt}umlpstxzxvtvz|}}}}~}}{z{~{yz{|}tqtwzyusrsv|}zwzztrqqty}~tmox{~{{}xpov|vyztokjkqwzyxz}}{}}~~||}}{z{~{}~{{}{}}{z}{z{}}}}~zwtpjgiqz}wtuwwtqt}z{~{zxvx~}}xqtzuvxxxyy{}zxww{zwz}}}}yvwz}z}zz}vtv}|xw{zxy}}}{z}}}}vqnptx~}usw|}|xvx}}}yvw}xst}~~}zwuw|}vrtz{vx}~}|ywy}~|}}}||~~{ww{}}zsootx|~{zz}}}{xvy}{xx{}{zyz}{vtw{{z{|{}~zxwxy|ztsvy{}}{{|}}}}|}}~}z}}{|}|zzzzyy{~ztstx{}}|zvsstvwvuvz}{||zxvuwz}}}}}|}{~~~|ww{}|{zzz}{}|{}}|{zzz}{vttvxzzzxvtvy{{yvux~yz{}}z{}}yvwz}~}zxwwyz{}}~|wvy}}yvuvy}}zwx~~}}~}{z{|}{z{}~}}}{{{z{}}|{zz}~~{wttw{xboard-4.7.3/sounds/ching.wav0000644000175000001440000001277112262415351013054 00000000000000RIFFWAVEfmt ++data~}y~zyvzzttpquwrjsuf|ileyj`SmoYZeyXbatPzaKLckMęHJk3kV=ʆ?XY9ė@Km@w§IH}?iZN8Zo>tƬSKIanOxT`]|ik}a~gfo]|g^]n{hnlqchixcoozqv||txv~qzq~jt~dzneoug{grxaicsrxqwyv~ty}u|{|{qv~{}y{{qe}esxVi]{TqdHicrZa^vReXKROc?rOM@[ML=`WMȐ9jf4xЙ;Py)n̦N=ۈ.fĻX(َ2K_yխC5o(qͶ?.ގ)8__F.IM+ܑ7TȿH:ƈ7bƦHFz.sӦFHn(xӲH&@m u<-vuL!xVQ$Ձ4JI4מ3B[+vط9Gq-jҢ)CvdB(/Sy@oZun>>~-ELcώ{қǏ@#a-XD(Fտ"k~ O;$",nAG{6)Y(zb،A'j<j֔]5^*l}Wm`m8=VYIQPk֯NAɗ$[Y7(mě7lRyƆD_o.xiTzE{oKs@WR$H`D[IҗYNL:|QQr_|d\Pxb4Q̐MD}1wȿq<9ErZX8ތH\HBs&aWK&N\&xکOZx-gTCĈFonkgm+z(E@յ/YȈ'=rJGÃVR83l°--bѱ"l;2d,&bMo=rTUvE*NWO_KQIA>LޑB2e5Oژ.g7؄kmE?tPDօG֟"c[=i}+tjg,]0αI*KܹV9*H:k;aƧC6LW}?/ufkư9st;gד5WÎnӠd@z}#d|tf(|*dn2yFcp2_JMSWz՜19y lѴ`4~ܠ8E¦9SƽpIlҹDOĕ0MbRiTy`zVkImLmJ/y3L_<ҳC:s;fƺOLGQdRyK_zkU|kI~N\{+dP4ܘ:\z)qХLDՁ;qc?ńNd]Cd|Xjd=mOQ˖4Ro:l˦FMƒ7_u= 1.2.0 librsvg-2.0 >= 2.14.0 ]) AC_SUBST(CAIRO_CFLAGS) AC_SUBST(CAIRO_LIBS) dnl | check which front end to use dnl | first check for gtk dnl | then for Xaw3d dnl | and then for Xaw FRONTEND_CFLAGS="" FRONTEND_LIBS="" AC_ARG_WITH([gtk], [AS_HELP_STRING([--with-gtk],[use GTK front-end (experimental)])], [with_GTK=yes], [with_GTK=no]) AC_ARG_WITH([Xaw3d], [AS_HELP_STRING([--with-Xaw3d],[use Xaw3d front-end (not fully supported anymore)])], [with_Xaw3d=yes], [with_Xaw3d=no]) AC_ARG_WITH([Xaw], [AS_HELP_STRING([--with-Xaw],[use Xaw front-end (default)])], [with_Xaw=yes], [with_Xaw=no]) dnl | check for libraries if test x"$with_GTK" = x"yes" ; then PKG_CHECK_MODULES([GTK], [ gtk+-2.0 >= 2.16.0 gmodule-2.0 ]) FRONTEND_CFLAGS=$GTK_CFLAGS FRONTEND_LIBS=$GTK_LIBS fi if test x"$with_GTK" = x"no" ; then dnl | general check for Xaw and Xaw3d AC_PATH_XTRA if test -n "$no_x" ; then AC_MSG_ERROR([ " $PACKAGE requires the X Window System header files and libraries! They were not found on your system. See FAQ topic C.2. configure failed"]) fi save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADER([X11/Intrinsic.h],[xt="yes"],[xt="no"]) CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test "$xt" = "no" ; then AC_MSG_ERROR([Xt headers not found. Please install the X11 packages.]) fi dnl | check availability of Xaw3d FRONTEND_LIBS= AS_IF([test x"$with_Xaw3d" != x"no"], [AC_CHECK_LIB([Xaw3d], [XawTextReplace], [ FRONTEND_LIBS="-lXaw3d" AC_DEFINE([USE_XAW3D], [1], [Define if you want to use Xaw3d])], [AC_MSG_ERROR([--with-Xaw3d was given, but test for Xaw3d failed. Make sure that you have Xaw3d installed, else you might want to try the configure option --without-Xaw3d])], [-lXaw])]) dnl | no Xaw3d, check for Xaw; make it the default if test x"$with_Xaw3d" = x"no" ; then with_Xaw=yes save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADER([X11/Xaw/Dialog.h],[xaw_headers="yes"], [xaw_headers="no"]) CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test x"$xaw_headers" = x"no" ; then AC_MSG_ERROR([Xaw headers not found. Please install the Xaw package and headers.]) fi FRONTEND_LIBS="-lXaw" fi fi dnl | make results available in Makefile.am AM_CONDITIONAL([withGTK], [test x"$with_GTK" = x"yes"]) AM_CONDITIONAL([withXaw], [test x"$with_Xaw3d" = x"yes"]) AM_CONDITIONAL([withXaw], [test x"$with_Xaw" = x"yes"]) AC_SUBST(FRONTEND_CFLAGS) AC_SUBST(FRONTEND_LIBS) dnl | end Front-end check AC_CANONICAL_HOST dnl| The following info is mostly gathered from GNU Emacs 19.24. Basically, dnl| we are trying to find out whether this is a System-V derivative in dnl| which pipes don't work with select() and if so, whether there is anything dnl| strange about the way to open a pty. Some of the work was done above dnl| by looking for _getpty, grantpt, and getpseudotty. A few other strange dnl| properties of particular systems are also handled here. dnl| 4/6/97 I'm not sure there really are any systems where pipes dnl| don't work with select(), and ptys cause problems on many dnl| systems, so I'm changing the default to disable ptys in all dnl| cases. I will change it back if I get bug reports that are fixed dnl| by doing a "configure --enable-ptys" USE_PTYS=0 case "$host" in *-*-hpux* ) AC_DEFINE(PTY_TTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/pty/tty%c%x", c, i);]) AC_DEFINE(PTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/ptym/pty%c%x", c, i);]) dnl| USE_PTYS=1 if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" else dnl| Note: You might be able to build xboard even if your compiler does not dnl| support ANSI C (-Aa). xboard itself does not require ANSI C. I don't dnl| know whether the X header files on HP-UX require it. CONF_CFLAGS="-Aa -D_HPUX_SOURCE" fi dnl| HP doesn't supply a full set of X header files and libraries. People dnl| often have some things installed in one place and some in another. dnl| AC_PATH_XTRA will find only one place, so we try to add all the dnl| likely ones that might be missing here. It might be better to dnl| change AC_PATH_XTRA to try to extract this information from imake, dnl| since folks who install the missing bits often configure their dnl| imake to find them, but I don't want to delve into autoconf and dnl| hack on its internals. if test -d /opt/hppd/include/X11; then X_CFLAGS="$X_CFLAGS -I/opt/hppd/include" X_LIBS="$X_LIBS -L/opt/hppd/lib" elif test -d /usr/contrib/X11R5/include; then X_CFLAGS="$X_CFLAGS -I/usr/contrib/X11R5/include" X_LIBS="$X_LIBS -L/usr/contrib/X11R5/lib" elif test -d /usr/contrib/mitX11R5/include; then X_CFLAGS="$X_CFLAGS -I/usr/contrib/mitX11R5/include" X_LIBS="$X_LIBS -L/usr/contrib/mitX11R5/lib" elif test -d /MIT/X11R5/include; then X_CFLAGS="$X_CFLAGS -I/MIT/X11R5/include" X_LIBS="$X_LIBS -L/MIT/X11R5/lib" elif test -d /usr/local/include/X11R5; then X_CFLAGS="$X_CFLAGS -I/usr/local/include/X11R5" X_LIBS="$X_LIBS -L/usr/local/lib/X11R5" fi if test -d /usr/include/X11R5; then X_CFLAGS="$X_CFLAGS -I/usr/include/X11R5" X_LIBS="$X_LIBS -L/usr/lib/X11R5 -L/usr/lib/X11R4" elif test -d /usr/include/X11R4; then X_CFLAGS="$X_CFLAGS -I/usr/include/X11R4" X_LIBS="$X_LIBS -L/usr/lib/X11R4" fi ;; romp-ibm-aix* ) AC_DEFINE(IBMRTAIX, 1) dnl| USE_PTYS=1 ;; i386-ibm-aix ) dnl| USE_PTYS=1 if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" fi ;; *-*-aix3* | *-*-bosx* ) AC_DEFINE(PTY_ITERATION, [for (c = 0; !c; c++)]) AC_DEFINE(PTY_NAME_SPRINTF, [strcpy (pty_name, "/dev/ptc");]) AC_DEFINE(PTY_TTY_NAME_SPRINTF, [strcpy (pty_name, ttyname (fd));]) dnl| USE_PTYS=1 ;; *-*-cxux* ) AC_DEFINE(FIRST_PTY_LETTER, 'A') AC_DEFINE(LAST_PTY_LETTER, 'P') dnl| USE_PTYS=1 ;; *-*-uniplus* ) AC_DEFINE(UNIPLUS, 1) dnl| USE_PTYS=1 ;; *-*-rtu* ) AC_DEFINE(FIRST_PTY_LETTER, 'z') AC_DEFINE(PTY_TTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/ttyp%x", i);]) AC_DEFINE(PTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/pty%x", i);]) AC_DEFINE(RTU, 1) dnl| USE_PTYS=1 ;; *-*-iris* | *-*-irix3* ) AC_DEFINE(PTY_ITERATION, [for (c = 0; !c; c++)]) AC_DEFINE(PTY_NAME_SPRINTF, [strcpy (pty_name, "/dev/ptc");]) AC_DEFINE(PTY_TTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/ttyq%d", minor(stb.st_rdev));]) dnl| USE_PTYS=1 ;; *-*-irix* ) dnl| USE_PTYS=1 ;; *-*-sunos4* | *-*-solaris1* ) dnl| Work around a bug in the SunOS 4.x linker. Not needed if you have patches dnl| 100512-02 and 100573-03 from Sun. The X FAQ says that the following is dnl| "overkill," but doesn't explain what should be done instead. if test "$GCC" = yes; then PRE_XMULIB="-static" POST_XMULIB="-dynamic" else PRE_XMULIB="-Bstatic" POST_XMULIB="-Bdynamic" fi ;; *-*-sunos5* | *-*-solaris2* ) dnl| USE_PTYS=1 dnl| I'm not sure -lelf is needed, but it was in the old Imakefile. dnl| The other libraries should all be found by Ac_PATH_XTRA or other dnl| code above. X_LIBS="$X_LIBS -lelf" ;; *-*-sco* ) AC_DEFINE(PTY_ITERATION, [for (i = 0; ; i++)]) AC_DEFINE(PTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/ptyp%d", i);]) AC_DEFINE(PTY_TTY_NAME_SPRINTF, [sprintf (pty_name, "/dev/ttyp%d", i);]) dnl| USE_PTYS=1 ;; *-*-dynix* | *-*-ptx* ) dnl| USE_PTYS=1 ;; *-*-esix* ) dnl| USE_PTYS=1 ;; *-*-usg5-4* | *-*-sysvr4* ) dnl| USE_PTYS=1 ;; *-*-usg* | *-*-sysv* | *-*-aix* ) dnl| USE_PTYS=1 ;; vax-*-ultrix ) if test "$GCC" = yes; then CONF_CFLAGS="-fwritable-strings" fi ;; dnl| add some libs for OS X *-apple-* ) ;; esac AC_ARG_ENABLE( [xpm], [AS_HELP_STRING([--enable-xpm],[libXpm will be used if found (default)])], [enable_xpm="$enableval"], [enable_xpm="yes"]) if test x"$enable_xpm" != "xno"; then save_cflags="$CFLAGS" save_cppflags="$CPPFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" AC_CHECK_HEADERS(X11/xpm.h) CFLAGS="$save_cflags" CPPFLAGS="$save_cppflags" if test "$ac_cv_header_X11_xpm_h" = "yes"; then save_ldflags="$LDFLAGS" LDFLAGS="$LDFLAGS $X_LIBS" AC_CHECK_LIB(Xpm, XpmReadFileToPixmap, [X_PRE_LIBS="-lXpm $X_PRE_LIBS"; AC_DEFINE(HAVE_LIBXPM)], [], [$X_PRE_LIBS -lX11 $X_EXTRA_LIBS]) LDFLAGS="$save_ldflags" fi fi AC_SUBST(PRE_XMULIB) AC_SUBST(POST_XMULIB) AC_SUBST(CONF_CFLAGS) AC_SUBST(CONF_LDFLAGS) AC_MSG_CHECKING(whether ptys or pipes should be used) AC_ARG_ENABLE( [ptys], [AS_HELP_STRING([--enable-ptys],[force use of pseudo-ttys with child processes])], [if test "$enableval" = yes; then USE_PTYS=1 enable_ptys="ptys" AC_MSG_RESULT([ptys (user override)]) fi if test "$enableval" = no; then USE_PTYS=0 enable_ptys="pipes" AC_MSG_RESULT([pipes (user override)]) fi], [if test "$USE_PTYS" = 1; then AC_MSG_RESULT(ptys) enable_ptys="ptys" else AC_MSG_RESULT(pipes) enable_ptys="pipes" fi]) AC_DEFINE_UNQUOTED(USE_PTYS, $USE_PTYS) dnl | define not to build zippy as a default, so that autoheader is happy AC_ARG_ENABLE( [zippy], [AS_HELP_STRING([--enable-zippy],[support interfacing a chess program to ICS (default)])], [], [enable_zippy="no"]) if test x"$enable_zippy" != xno; then AC_DEFINE(ZIPPY, 1,[should zippy be enabled]) else AC_DEFINE(ZIPPY, 0,[should zippy be enabled]) fi AM_CONDITIONAL([ZIPPY], [test x$enable_zippy != xno]) AC_ARG_ENABLE(sigint, [AS_HELP_STRING([--enable-sigint],[sending SIGINT (^C) wakes up GNU Chess (default)])], [if test "$enableval" = yes; then AC_DEFINE(ATTENTION, 1) fi enable_sigint=$enableval ], [enable_sigint="yes" AC_DEFINE(ATTENTION, 1)]) if test x"$with_Xaw3d" = x"yes" -o x"$with_Xaw" = x"yes" ; then dnl | save all information for X in X_LIBS, also add the libraries themself dnl | since AC_PATH_XTRA only adds the paths X_LIBS="$X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS -lXmu -lX11 -lXt " AC_SUBST(X_CFLAGS) AC_SUBST(X_LIBS) fi dnl | should we install desktop icons and mime associations? AC_ARG_ENABLE( [update-mimedb], [AS_HELP_STRING([--disable-update-mimedb],[disable the update-mime-database after install [default=no]])], [enable_mimedb="no"], [enable_mimedb="yes"]) AM_CONDITIONAL(ENABLE_UPDATE_MIMEDB, test x"$enable_mimedb" = "xyes") if test x"$enable_mimedb" = "xyes"; then AC_PATH_PROG([XDG_MIME],[xdg-mime]) AC_SUBST(XDG_MIME) AC_PATH_PROG([XDG_DESKTOP_MENU],[xdg-desktop-menu]) AC_SUBST(XDG_DESKTOP_MENU) AC_PATH_PROG([XDG_ICON_RESOURCE],[xdg-icon-resource]) AC_SUBST(XDG_ICON_RESOURCE) fi dnl | output Makefile AC_CONFIG_FILES([Makefile cmail po/Makefile.in]) AC_CONFIG_COMMANDS([test-stamp-h],[test -z "$CONFIG_HEADERS" || date > stamp-h]) AC_CONFIG_COMMANDS([chmod-cmail],[chmod 755 cmail]) AC_OUTPUT dnl dnl Output a summary dnl echo "" echo " Configurations summary:" echo "" echo " prefix: $prefix " echo " datarootdir: $datarootdir " echo " datadir: $datadir (icons will go in \$datadir/icons/hicolor/...)" echo " (bitmaps will go in \$datadir/games/xboard/...)" echo " infodir: $infodir (info files will go here)" echo " sysconfdir: $sysconfdir (xboard.conf will go here)" echo "" echo " update mimedb: $enable_mimedb" echo "" echo " NLS support: $USE_NLS" echo "" echo " GTK: $with_GTK" echo " Xaw3d: $with_Xaw3d" echo " Xaw: $with_Xaw" echo "" echo " xpm: $enable_xpm" echo " ptys: $enable_ptys" echo " zippy: $enable_zippy" echo " sigint: $enable_sigint" xboard-4.7.3/Makefile.in0000644000175000001440000021327412262562275012010 00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = xboard$(EXEEXT) subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/cmail.in \ ABOUT-NLS depcomp $(xboard_TEXINFOS) mdate-sh \ $(srcdir)/version.texi $(srcdir)/stamp-vti texinfo.tex \ $(dist_icon_DATA) $(dist_pixmaps_DATA) $(dist_png_DATA) \ $(dist_shogi_DATA) $(dist_sounds_DATA) $(dist_svg_DATA) \ $(dist_svgicon_DATA) $(dist_xiangqi_DATA) COPYING TODO compile \ config.guess config.rpath config.sub install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/nls.m4 \ $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = cmail CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" \ "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(Applicationsdir)" \ "$(DESTDIR)$(icondir)" "$(DESTDIR)$(pixmapsdir)" \ "$(DESTDIR)$(pngdir)" "$(DESTDIR)$(shogidir)" \ "$(DESTDIR)$(soundsdir)" "$(DESTDIR)$(svgdir)" \ "$(DESTDIR)$(svgicondir)" "$(DESTDIR)$(xiangqidir)" \ "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(sysconfdir)" PROGRAMS = $(bin_PROGRAMS) am__xboard_SOURCES_DIST = backend.c backend.h backendz.h book.c \ childio.c childio.h common.h frontend.h gamelist.c ngamelist.c \ gettext.h lists.c lists.h moves.c moves.h parser.c parser.h \ pgntags.c uci.c args.h xboard2.h board.c board.h draw.c draw.h \ dialogs.c dialogs.h engineoutput.c nengineoutput.c \ engineoutput.h evalgraph.c nevalgraph.c evalgraph.h history.c \ nhistory.c menus.c menus.h usounds.c usystem.c usystem.h \ zippy.c zippy.h gtk/xboard.c gtk/xboard.h gtk/xoptions.c \ gtk/xtimer.c gtk/xengineoutput.c xaw/xboard.c xaw/xboard.h \ xaw/xengineoutput.c xaw/xgamelist.c xaw/xgamelist.h \ xaw/xhistory.c xaw/xhistory.h xaw/xoptions.c \ bitmaps/checkmark.bm bitmaps/icon_black.bm \ bitmaps/icon_white.bm @ZIPPY_TRUE@am__objects_1 = zippy.$(OBJEXT) am__dirstamp = $(am__leading_dot)dirstamp am__objects_2 = gtk/xboard.$(OBJEXT) gtk/xoptions.$(OBJEXT) \ gtk/xtimer.$(OBJEXT) gtk/xengineoutput.$(OBJEXT) am__objects_3 = xaw/xboard.$(OBJEXT) xaw/xengineoutput.$(OBJEXT) \ xaw/xgamelist.$(OBJEXT) xaw/xhistory.$(OBJEXT) \ xaw/xoptions.$(OBJEXT) @withGTK_FALSE@@withXaw_TRUE@am__objects_4 = $(am__objects_3) @withGTK_TRUE@am__objects_4 = $(am__objects_2) am_xboard_OBJECTS = backend.$(OBJEXT) book.$(OBJEXT) childio.$(OBJEXT) \ gamelist.$(OBJEXT) ngamelist.$(OBJEXT) lists.$(OBJEXT) \ moves.$(OBJEXT) parser.$(OBJEXT) pgntags.$(OBJEXT) \ uci.$(OBJEXT) board.$(OBJEXT) draw.$(OBJEXT) dialogs.$(OBJEXT) \ engineoutput.$(OBJEXT) nengineoutput.$(OBJEXT) \ evalgraph.$(OBJEXT) nevalgraph.$(OBJEXT) history.$(OBJEXT) \ nhistory.$(OBJEXT) menus.$(OBJEXT) usounds.$(OBJEXT) \ usystem.$(OBJEXT) $(am__objects_1) $(am__objects_4) xboard_OBJECTS = $(am_xboard_OBJECTS) xboard_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(xboard_SOURCES) DIST_SOURCES = $(am__xboard_SOURCES_DIST) AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/xboard.info am__TEXINFO_TEX_DIR = $(srcdir) DVIS = xboard.dvi PDFS = xboard.pdf PSS = xboard.ps HTMLS = xboard.html TEXINFOS = xboard.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man6dir = $(mandir)/man6 MANS = $(man6_MANS) DATA = $(Applications_DATA) $(dist_icon_DATA) $(dist_pixmaps_DATA) \ $(dist_png_DATA) $(dist_shogi_DATA) $(dist_sounds_DATA) \ $(dist_svg_DATA) $(dist_svgicon_DATA) $(dist_xiangqi_DATA) \ $(mime_DATA) $(sysconf_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ AWKPATH = @AWKPATH@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONF_CFLAGS = @CONF_CFLAGS@ CONF_LDFLAGS = @CONF_LDFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FRONTEND_CFLAGS = @FRONTEND_CFLAGS@ FRONTEND_LIBS = @FRONTEND_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MINFO = @MINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ NROFF = @NROFF@ NROFFFLAGS = @NROFFFLAGS@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERLPATH = @PERLPATH@ PKGCONFIG = @PKGCONFIG@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POST_XMULIB = @POST_XMULIB@ POSUB = @POSUB@ PRE_XMULIB = @PRE_XMULIB@ RSH = @RSH@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XDG_DESKTOP_MENU = @XDG_DESKTOP_MENU@ XDG_ICON_RESOURCE = @XDG_ICON_RESOURCE@ XDG_MIME = @XDG_MIME@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @ZIPPY_FALSE@ZPY = ### if we are compiling with ZIPPY we need some extra source files @ZIPPY_TRUE@ZPY = zippy.c zippy.h ### define sources for the front-end and backend GTKsources = gtk/xboard.c gtk/xboard.h \ gtk/xoptions.c gtk/xtimer.c \ gtk/xengineoutput.c Xsources = xaw/xboard.c xaw/xboard.h \ xaw/xengineoutput.c \ xaw/xgamelist.c xaw/xgamelist.h \ xaw/xhistory.c xaw/xhistory.h \ xaw/xoptions.c \ bitmaps/checkmark.bm bitmaps/icon_black.bm bitmaps/icon_white.bm @withGTK_TRUE@FRONTENDsources = $(GTKsources) @withXaw_TRUE@FRONTENDsources = $(Xsources) @withGTK_TRUE@FRONTENDextras = $(Xsources) @withXaw_TRUE@FRONTENDextras = $(GTKsources) @withGTK_TRUE@headers = -I gtk @withXaw_TRUE@headers = -I xaw -DX11 xboard_SOURCES = backend.c backend.h backendz.h \ book.c \ childio.c childio.h \ common.h \ frontend.h \ gamelist.c ngamelist.c \ gettext.h \ lists.c lists.h \ moves.c moves.h \ parser.c parser.h \ pgntags.c \ uci.c \ args.h xboard2.h \ board.c board.h \ draw.c draw.h \ dialogs.c dialogs.h \ engineoutput.c nengineoutput.c engineoutput.h \ evalgraph.c nevalgraph.c evalgraph.h \ history.c nhistory.c \ menus.c menus.h \ usounds.c usystem.c usystem.h \ $(ZPY) $(FRONTENDsources) ### SUBDIRS = po xboard_LDADD = -lm @FRONTEND_LIBS@ @X_LIBS@ @LIBINTL@ @CAIRO_LIBS@ EXTRA_DIST = pixmaps themes png sounds winboard \ xboard.texi gpl.texinfo texi2man texinfo.tex xboard.man xboard.desktop xboard-config.desktop \ xboard-fen-viewer.desktop xboard-pgn-viewer.desktop xboard-tourney.desktop xboard.xml \ COPYRIGHT FAQ.html engine-intf.html ics-parsing.txt readme.htm zippy.README \ xboard.conf.in SHORTLOG DIFFSTAT history.c ABOUT-NLS $(FRONTENDextras) DISTCLEANFILES = stamp-h GITVERSION = $(shell sh -c 'git describe --dirty --always 2>/dev/null') AM_CPPFLAGS = -DINFODIR='"$(infodir)"' @X_CFLAGS@ @CAIRO_CFLAGS@ @FRONTEND_CFLAGS@ -DSYSCONFDIR='"$(sysconfdir)"' \ -DLOCALEDIR='"$(localedir)"' -DSVGDIR='"$(svgdir)"' -D__GIT_VERSION='"$(GITVERSION)"' $(headers) ACLOCAL_AMFLAGS = -I m4 info_TEXINFOS = xboard.texi xboard_TEXINFOS = copyright.texi man6_MANS = xboard.man ### config file sysconf_DATA = xboard.conf ### icon files icondir = $(datadir)/icons/hicolor/48x48/apps dist_icon_DATA = xboard.png svgicondir = $(datadir)/icons/hicolor/scalable/apps dist_svgicon_DATA = xboard.svg ### desktop files for KDE and gnome Applicationsdir = $(datadir)/applications Applications_DATA = xboard.desktop xboard-fen-viewer.desktop xboard-pgn-viewer.desktop xboard-tourney.desktop xboard-config.desktop ### mime file mimedir = $(datadir)/mime/packages mime_DATA = xboard.xml ### directory and files for svgs svgdir = $(datadir)/games/xboard/themes/default dist_svg_DATA = svg/icon_white.svg svg/icon_black.svg \ svg/BlackAdvisor.svg svg/WhiteAdvisor.svg \ svg/BlackArchbishop.svg svg/WhiteArchbishop.svg \ svg/BlackBishop.svg svg/WhiteBishop.svg \ svg/BlackCanon.svg svg/WhiteCanon.svg \ svg/BlackChancellor.svg svg/WhiteChancellor.svg \ svg/BlackCobra.svg svg/WhiteCobra.svg \ svg/BlackCommoner.svg svg/WhiteCommoner.svg \ svg/BlackCrownedBishop.svg svg/WhiteCrownedBishop.svg \ svg/BlackCrownedRook.svg svg/WhiteCrownedRook.svg \ svg/BlackElephant.svg svg/WhiteElephant.svg \ svg/BlackGoldKnight.svg svg/WhiteGoldKnight.svg \ svg/BlackGoldLance.svg svg/WhiteGoldLance.svg \ svg/BlackGoldPawn.svg svg/WhiteGoldPawn.svg \ svg/BlackGoldSilver.svg svg/WhiteGoldSilver.svg \ svg/BlackGold.svg svg/WhiteGold.svg \ svg/BlackHawk.svg svg/WhiteHawk.svg \ svg/BlackKing.svg svg/WhiteKing.svg \ svg/BlackKnight.svg svg/WhiteKnight.svg \ svg/BlackLance.svg svg/WhiteLance.svg \ svg/BlackMarshall.svg svg/WhiteMarshall.svg \ svg/BlackNightrider.svg svg/WhiteNightrider.svg \ svg/BlackPawn.svg svg/WhitePawn.svg \ svg/BlackPrincess.svg svg/WhitePrincess.svg \ svg/BlackQueen.svg svg/WhiteQueen.svg \ svg/BlackRook.svg svg/WhiteRook.svg \ svg/BlackUnicorn.svg svg/WhiteUnicorn.svg \ svg/eo_Analyzing.svg svg/eo_Black.svg \ svg/eo_Clear.svg svg/eo_Ponder.svg \ svg/eo_Thinking.svg svg/eo_Unknown.svg \ svg/eo_White.svg shogidir = $(datadir)/games/xboard/themes/shogi dist_shogi_DATA = \ themes/shogi/WhiteGold.svg themes/shogi/WhiteCrownedBishop.svg\ themes/shogi/WhiteBishop.svg themes/shogi/WhiteKing.svg\ themes/shogi/WhiteKnight.svg themes/shogi/WhiteGoldKnight.svg\ themes/shogi/WhiteLance.svg themes/shogi/WhiteGoldLance.svg\ themes/shogi/WhitePawn.svg themes/shogi/WhiteGoldPawn.svg\ themes/shogi/WhiteRook.svg themes/shogi/WhiteCrownedRook.svg\ themes/shogi/WhiteAdvisor.svg themes/shogi/WhiteGoldSilver.svg\ themes/shogi/BlackGold.svg themes/shogi/BlackCrownedBishop.svg\ themes/shogi/BlackBishop.svg themes/shogi/BlackKing.svg\ themes/shogi/BlackKnight.svg themes/shogi/BlackGoldKnight.svg\ themes/shogi/BlackLance.svg themes/shogi/BlackGoldLance.svg\ themes/shogi/BlackPawn.svg themes/shogi/BlackGoldPawn.svg\ themes/shogi/BlackRook.svg themes/shogi/BlackCrownedRook.svg\ themes/shogi/BlackAdvisor.svg themes/shogi/BlackGoldSilver.svg xiangqidir = $(datadir)/games/xboard/themes/xiangqi dist_xiangqi_DATA = themes/xiangqi/BlackAdvisor.svg themes/xiangqi/WhiteAdvisor.svg \ themes/xiangqi/BlackCanon.svg themes/xiangqi/WhiteCanon.svg \ themes/xiangqi/BlackElephant.svg themes/xiangqi/WhiteElephant.svg \ themes/xiangqi/BlackKnight.svg themes/xiangqi/WhiteKnight.svg \ themes/xiangqi/BlackGold.svg themes/xiangqi/WhiteGold.svg \ themes/xiangqi/BlackPawn.svg themes/xiangqi/WhitePawn.svg \ themes/xiangqi/BlackRook.svg themes/xiangqi/WhiteRook.svg ### directory and files for pixmaps pixmapsdir = $(datadir)/games/xboard/pixmaps/textures dist_pixmaps_DATA = pixmaps/cross32.xpm pixmaps/cross48.xpm pixmaps/board32.xpm pixmaps/board48.xpm pixmaps/ini32.xpm pixmaps/ini48.xpm ### directory and files for pngs pngdir = $(datadir)/games/xboard/themes/textures dist_png_DATA = png/hatch.png png/wood_d.png png/wood_l.png png/xqboard.png ### directory and files for sound files soundsdir = $(datadir)/games/xboard/sounds dist_sounds_DATA = \ sounds/cymbal.wav sounds/pop2.wav sounds/slap.wav sounds/ding1.wav sounds/laser.wav \ sounds/woodthunk.wav sounds/gong.wav sounds/penalty.wav sounds/honkhonk.wav sounds/phone.wav ### set correct dir in xboard.conf edit = sed -e 's|@pngdir[@]|$(pngdir)|g' \ -e 's|@soundsdir[@]|$(soundsdir)|g' all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .dvi .html .info .o .obj .pdf .ps .texi am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 cmail: $(top_builddir)/config.status $(srcdir)/cmail.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gtk/$(am__dirstamp): @$(MKDIR_P) gtk @: > gtk/$(am__dirstamp) gtk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gtk/$(DEPDIR) @: > gtk/$(DEPDIR)/$(am__dirstamp) gtk/xboard.$(OBJEXT): gtk/$(am__dirstamp) \ gtk/$(DEPDIR)/$(am__dirstamp) gtk/xoptions.$(OBJEXT): gtk/$(am__dirstamp) \ gtk/$(DEPDIR)/$(am__dirstamp) gtk/xtimer.$(OBJEXT): gtk/$(am__dirstamp) \ gtk/$(DEPDIR)/$(am__dirstamp) gtk/xengineoutput.$(OBJEXT): gtk/$(am__dirstamp) \ gtk/$(DEPDIR)/$(am__dirstamp) xaw/$(am__dirstamp): @$(MKDIR_P) xaw @: > xaw/$(am__dirstamp) xaw/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) xaw/$(DEPDIR) @: > xaw/$(DEPDIR)/$(am__dirstamp) xaw/xboard.$(OBJEXT): xaw/$(am__dirstamp) \ xaw/$(DEPDIR)/$(am__dirstamp) xaw/xengineoutput.$(OBJEXT): xaw/$(am__dirstamp) \ xaw/$(DEPDIR)/$(am__dirstamp) xaw/xgamelist.$(OBJEXT): xaw/$(am__dirstamp) \ xaw/$(DEPDIR)/$(am__dirstamp) xaw/xhistory.$(OBJEXT): xaw/$(am__dirstamp) \ xaw/$(DEPDIR)/$(am__dirstamp) xaw/xoptions.$(OBJEXT): xaw/$(am__dirstamp) \ xaw/$(DEPDIR)/$(am__dirstamp) xboard$(EXEEXT): $(xboard_OBJECTS) $(xboard_DEPENDENCIES) $(EXTRA_xboard_DEPENDENCIES) @rm -f xboard$(EXEEXT) $(AM_V_CCLD)$(LINK) $(xboard_OBJECTS) $(xboard_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f gtk/*.$(OBJEXT) -rm -f xaw/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/backend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/board.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/book.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/childio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialogs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/draw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engineoutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evalgraph.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gamelist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/history.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/menus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/moves.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nengineoutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nevalgraph.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ngamelist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nhistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pgntags.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uci.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usounds.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zippy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gtk/$(DEPDIR)/xboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gtk/$(DEPDIR)/xengineoutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gtk/$(DEPDIR)/xoptions.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gtk/$(DEPDIR)/xtimer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xaw/$(DEPDIR)/xboard.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xaw/$(DEPDIR)/xengineoutput.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xaw/$(DEPDIR)/xgamelist.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xaw/$(DEPDIR)/xhistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@xaw/$(DEPDIR)/xoptions.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ else \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ exit 1; \ fi $(srcdir)/xboard.info: xboard.texi $(srcdir)/version.texi $(xboard_TEXINFOS) xboard.dvi: xboard.texi $(srcdir)/version.texi $(xboard_TEXINFOS) xboard.pdf: xboard.texi $(srcdir)/version.texi $(xboard_TEXINFOS) xboard.html: xboard.texi $(srcdir)/version.texi $(xboard_TEXINFOS) $(srcdir)/version.texi: $(srcdir)/stamp-vti $(srcdir)/stamp-vti: xboard.texi $(top_srcdir)/configure @(dir=.; test -f ./xboard.texi || dir=$(srcdir); \ set `$(SHELL) $(srcdir)/mdate-sh $$dir/xboard.texi`; \ echo "@set UPDATED $$1 $$2 $$3"; \ echo "@set UPDATED-MONTH $$2 $$3"; \ echo "@set EDITION $(VERSION)"; \ echo "@set VERSION $(VERSION)") > vti.tmp @cmp -s vti.tmp $(srcdir)/version.texi \ || (echo "Updating $(srcdir)/version.texi"; \ cp vti.tmp $(srcdir)/version.texi) -@rm -f vti.tmp @cp $(srcdir)/version.texi $@ mostlyclean-vti: -rm -f vti.tmp maintainer-clean-vti: -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf xboard.t2d xboard.t2p clean-aminfo: -test -z "xboard.dvi xboard.pdf xboard.ps xboard.html" \ || rm -rf xboard.dvi xboard.pdf xboard.ps xboard.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done install-man6: $(man6_MANS) @$(NORMAL_INSTALL) @list1='$(man6_MANS)'; \ list2=''; \ test -n "$(man6dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man6dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man6dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.6[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man6dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man6dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man6dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man6dir)" || exit $$?; }; \ done; } uninstall-man6: @$(NORMAL_UNINSTALL) @list='$(man6_MANS)'; test -n "$(man6dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man6dir)'; $(am__uninstall_files_from_dir) install-ApplicationsDATA: $(Applications_DATA) @$(NORMAL_INSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(Applicationsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(Applicationsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(Applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(Applicationsdir)" || exit $$?; \ done uninstall-ApplicationsDATA: @$(NORMAL_UNINSTALL) @list='$(Applications_DATA)'; test -n "$(Applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(Applicationsdir)'; $(am__uninstall_files_from_dir) install-dist_iconDATA: $(dist_icon_DATA) @$(NORMAL_INSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(icondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(icondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-dist_iconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(icondir)'; $(am__uninstall_files_from_dir) install-dist_pixmapsDATA: $(dist_pixmaps_DATA) @$(NORMAL_INSTALL) @list='$(dist_pixmaps_DATA)'; test -n "$(pixmapsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pixmapsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapsdir)" || exit $$?; \ done uninstall-dist_pixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_pixmaps_DATA)'; test -n "$(pixmapsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pixmapsdir)'; $(am__uninstall_files_from_dir) install-dist_pngDATA: $(dist_png_DATA) @$(NORMAL_INSTALL) @list='$(dist_png_DATA)'; test -n "$(pngdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pngdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pngdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pngdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pngdir)" || exit $$?; \ done uninstall-dist_pngDATA: @$(NORMAL_UNINSTALL) @list='$(dist_png_DATA)'; test -n "$(pngdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pngdir)'; $(am__uninstall_files_from_dir) install-dist_shogiDATA: $(dist_shogi_DATA) @$(NORMAL_INSTALL) @list='$(dist_shogi_DATA)'; test -n "$(shogidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(shogidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(shogidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(shogidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(shogidir)" || exit $$?; \ done uninstall-dist_shogiDATA: @$(NORMAL_UNINSTALL) @list='$(dist_shogi_DATA)'; test -n "$(shogidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(shogidir)'; $(am__uninstall_files_from_dir) install-dist_soundsDATA: $(dist_sounds_DATA) @$(NORMAL_INSTALL) @list='$(dist_sounds_DATA)'; test -n "$(soundsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(soundsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(soundsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(soundsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(soundsdir)" || exit $$?; \ done uninstall-dist_soundsDATA: @$(NORMAL_UNINSTALL) @list='$(dist_sounds_DATA)'; test -n "$(soundsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(soundsdir)'; $(am__uninstall_files_from_dir) install-dist_svgDATA: $(dist_svg_DATA) @$(NORMAL_INSTALL) @list='$(dist_svg_DATA)'; test -n "$(svgdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(svgdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(svgdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(svgdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgdir)" || exit $$?; \ done uninstall-dist_svgDATA: @$(NORMAL_UNINSTALL) @list='$(dist_svg_DATA)'; test -n "$(svgdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(svgdir)'; $(am__uninstall_files_from_dir) install-dist_svgiconDATA: $(dist_svgicon_DATA) @$(NORMAL_INSTALL) @list='$(dist_svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(svgicondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(svgicondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(svgicondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgicondir)" || exit $$?; \ done uninstall-dist_svgiconDATA: @$(NORMAL_UNINSTALL) @list='$(dist_svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(svgicondir)'; $(am__uninstall_files_from_dir) install-dist_xiangqiDATA: $(dist_xiangqi_DATA) @$(NORMAL_INSTALL) @list='$(dist_xiangqi_DATA)'; test -n "$(xiangqidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(xiangqidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(xiangqidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xiangqidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(xiangqidir)" || exit $$?; \ done uninstall-dist_xiangqiDATA: @$(NORMAL_UNINSTALL) @list='$(dist_xiangqi_DATA)'; test -n "$(xiangqidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(xiangqidir)'; $(am__uninstall_files_from_dir) install-mimeDATA: $(mime_DATA) @$(NORMAL_INSTALL) @list='$(mime_DATA)'; test -n "$(mimedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(mimedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(mimedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(mimedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(mimedir)" || exit $$?; \ done uninstall-mimeDATA: @$(NORMAL_UNINSTALL) @list='$(mime_DATA)'; test -n "$(mimedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(mimedir)'; $(am__uninstall_files_from_dir) install-sysconfDATA: $(sysconf_DATA) @$(NORMAL_INSTALL) @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ done uninstall-sysconfDATA: @$(NORMAL_UNINSTALL) @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(INFO_DEPS) $(PROGRAMS) $(MANS) $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(Applicationsdir)" "$(DESTDIR)$(icondir)" "$(DESTDIR)$(pixmapsdir)" "$(DESTDIR)$(pngdir)" "$(DESTDIR)$(shogidir)" "$(DESTDIR)$(soundsdir)" "$(DESTDIR)$(svgdir)" "$(DESTDIR)$(svgicondir)" "$(DESTDIR)$(xiangqidir)" "$(DESTDIR)$(mimedir)" "$(DESTDIR)$(sysconfdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f gtk/$(DEPDIR)/$(am__dirstamp) -rm -f gtk/$(am__dirstamp) -rm -f xaw/$(DEPDIR)/$(am__dirstamp) -rm -f xaw/$(am__dirstamp) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-aminfo clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) gtk/$(DEPDIR) xaw/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags dvi: dvi-recursive dvi-am: $(DVIS) html: html-recursive html-am: $(HTMLS) info: info-recursive info-am: $(INFO_DEPS) install-data-am: install-ApplicationsDATA install-dist_iconDATA \ install-dist_pixmapsDATA install-dist_pngDATA \ install-dist_shogiDATA install-dist_soundsDATA \ install-dist_svgDATA install-dist_svgiconDATA \ install-dist_xiangqiDATA install-info-am install-man \ install-mimeDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-recursive install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-binPROGRAMS install-sysconfDATA install-html: install-html-recursive install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-recursive install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-man6 install-pdf: install-pdf-recursive install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-recursive install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) gtk/$(DEPDIR) xaw/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic maintainer-clean-vti mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-aminfo mostlyclean-compile \ mostlyclean-generic mostlyclean-vti pdf: pdf-recursive pdf-am: $(PDFS) ps: ps-recursive ps-am: $(PSS) uninstall-am: uninstall-ApplicationsDATA uninstall-binPROGRAMS \ uninstall-dist_iconDATA uninstall-dist_pixmapsDATA \ uninstall-dist_pngDATA uninstall-dist_shogiDATA \ uninstall-dist_soundsDATA uninstall-dist_svgDATA \ uninstall-dist_svgiconDATA uninstall-dist_xiangqiDATA \ uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-man uninstall-mimeDATA uninstall-pdf-am \ uninstall-ps-am uninstall-sysconfDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man6 .MAKE: $(am__recursive_targets) all install-am install-data-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-aminfo \ clean-binPROGRAMS clean-cscope clean-generic cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-info dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-ApplicationsDATA \ install-am install-binPROGRAMS install-data install-data-am \ install-data-hook install-dist_iconDATA \ install-dist_pixmapsDATA install-dist_pngDATA \ install-dist_shogiDATA install-dist_soundsDATA \ install-dist_svgDATA install-dist_svgiconDATA \ install-dist_xiangqiDATA install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man6 \ install-mimeDATA install-pdf install-pdf-am install-ps \ install-ps-am install-strip install-sysconfDATA installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-aminfo maintainer-clean-generic \ maintainer-clean-vti mostlyclean mostlyclean-aminfo \ mostlyclean-compile mostlyclean-generic mostlyclean-vti pdf \ pdf-am ps ps-am tags tags-am uninstall \ uninstall-ApplicationsDATA uninstall-am uninstall-binPROGRAMS \ uninstall-dist_iconDATA uninstall-dist_pixmapsDATA \ uninstall-dist_pngDATA uninstall-dist_shogiDATA \ uninstall-dist_soundsDATA uninstall-dist_svgDATA \ uninstall-dist_svgiconDATA uninstall-dist_xiangqiDATA \ uninstall-dvi-am uninstall-hook uninstall-html-am \ uninstall-info-am uninstall-man uninstall-man6 \ uninstall-mimeDATA uninstall-pdf-am uninstall-ps-am \ uninstall-sysconfDATA xboard.conf: Makefile $(srcdir)/xboard.conf.in @echo ' 'GEN ' ' $@; @rm -f $@ $@.tmp @$(edit) $(srcdir)/$@.in >$@.tmp @mv $@.tmp $@ distclean-local: -rm -f xboard.conf ### the man page depends on several files, so we add a special rule xboard.man: xboard.texi copyright.texi gpl.texinfo version.texi $(srcdir)/texi2man $(srcdir)/xboard.texi > xboard.man || (rm -f xboard.man ; false) ### install mime-type files and corresponding icons and menu entries if enabled during configure install-data-hook: install-mime-database uninstall-hook: uninstall-mime-database install-mime-database: @ENABLE_UPDATE_MIMEDB_TRUE@ -if test -z "$(DESTDIR)" -a -n "$(XDG_MIME)" -a -n "$(XDG_DESKTOP_MENU)" -a -n "$(XDG_ICON_RESOURCE)" ; then \ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_MIME) install --mode system --novendor xboard.xml ;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-pgn-viewer.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-fen-viewer.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-tourney.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-config.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/board32.xpm application-x-chess-pgn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/cross32.xpm application-x-xboard-trn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/ini32.xpm application-x-xboard-opt;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/board48.xpm application-x-chess-pgn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/cross48.xpm application-x-xboard-trn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/ini48.xpm application-x-xboard-opt;\ @ENABLE_UPDATE_MIMEDB_TRUE@ fi uninstall-mime-database: @ENABLE_UPDATE_MIMEDB_TRUE@ -if test -z "$(DESTDIR)" -a -n "$(XDG_MIME)" -a -n "$(XDG_DESKTOP_MENU)" -a -n "$(XDG_ICON_RESOURCE)" ; then \ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_MIME) uninstall --mode system --novendor xboard.xml;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-pgn-viewer.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-fen-viewer.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-tourney.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-config.desktop;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 board32.xpm application-x-chess-pgn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 cross32.xpm application-x-xboard-trn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 ini32.xpm application-x-xboard-opt;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 board48.xpm application-x-chess-pgn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 cross48.xpm application-x-xboard-trn;\ @ENABLE_UPDATE_MIMEDB_TRUE@ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 ini48.xpm application-x-xboard-opt;\ @ENABLE_UPDATE_MIMEDB_TRUE@ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: xboard-4.7.3/winboard/0000755000175000001440000000000012262562252011612 500000000000000xboard-4.7.3/winboard/winboard.dsw0000644000175000001440000000103512262415351014052 00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "winboard"=".\winboard.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### xboard-4.7.3/winboard/makefile.gcc0000644000175000001440000001210412262415351013760 00000000000000# WinBoard makefile using gcc PROJ=winboard OBJS=backend.o book.o gamelist.o lists.o moves.o pgntags.o uci.o zippy.o\ parser.o wbres.o wclipbrd.o wedittags.o wengineoutput.o wevalgraph.o\ wgamelist.o whistory.o history.o winboard.o wlayout.o woptions.o wsnap.o\ wsockerr.o help.o wsettings.o wchat.o engineoutput.o evalgraph.o # make compiling less spammy compile = @echo "$1"; $(CC) $(CFLAGS) $1 # Debugging? USE_DEBUG=0 # JAWS support? JAWS=0 # set this to 1 unless you don't mind linking with cygwin1.dll USE_MINGW=1 # set up for cygwin or not ifeq ($(USE_MINGW),1) CFCYG = -mno-cygwin -DUSE_I64 LFCYG = -mno-cygwin -lmsvcrt endif CC = gcc FLEX = "flex.exe" # we need version 2.5.4 or later, cygwin's is 2.5.35 # "c:/mingw/mingw32/bin/flex.exe" HC="C:/Program Files/Help Workshop/hcrtf" -xn DEFS = -D_WIN32_IE=0x0300 -DWIN32 ifeq ($(JAWS),1) DEFS += -DJAWS endif WARN = -Wall -Wno-char-subscripts -Wno-parentheses ARCH = ifeq ($(USE_DEBUG),0) CFDEBUG = -DNDEBUG OPTS = -Os -frename-registers -funit-at-a-time -fstrict-aliasing -fstrength-reduce else CFDEBUG = -D_DEBUG -DDEBUG -g endif CF = -c $(WARN) -pipe $(CFDEBUG) $(DEFS) -I. -I.. CFLAGS = $(CF) $(ARCH) $(OPTS) $(CFCYG) LFLAGS = $(LFCYG) $(CFDEBUG) -fpic -s -mwindows -lwsock32 -lwinmm -lcomctl32 all: $(PROJ).exe clean: rm -f *~ $(PROJ).exe $(PROJ).err $(PROJ).rbj $(PROJ).RES $(PROJ).res\ *.sbr *.bsc *.o *.obj *.plg *.opt *.ncb *.debug *.bak *.gid *.GID\ *.map *.pdb *.tmp $(PROJ).ini # Update the help file if necessary $(PROJ).hlp : $(PROJ).rtf $(HC) $(PROJ).hpj && @cat $(PROJ).err && @mv $(PROJ).hlp tmp.hlp && @mv tmp.hlp $(PROJ).hlp || true # these moves to get the case right # Update the resource if necessary wbres.o: $(PROJ).rc $(PROJ).h resource.h config.h windres $(DEFS) --use-temp-file --include-dir .. $< -O coff -o $@ $(PROJ).exe: $(OBJS) $(PROJ).hlp $(CC) $(guiflags) $(OBJS) $(LFLAGS) -o $(PROJ).exe winboard.o: winboard.c config.h winboard.h ../common.h ../frontend.h ../backend.h \ ../moves.h defaults.h resource.h wclipbrd.h \ wsockerr.h woptions.h wsnap.h ../lists.h help.h ../args.h $(call compile, $<) backend.o: ../backend.c config.h ../common.h ../frontend.h ../backend.h \ ../parser.h ../moves.h ../zippy.h ../backendz.h ../gettext.h ../lists.h $(call compile, $<) parser.o: ../parser.c config.h ../common.h ../backend.h ../parser.h \ ../frontend.h ../moves.h ../lists.h $(call compile, $<) moves.o: ../moves.c config.h ../backend.h ../common.h ../parser.h \ ../moves.h ../lists.h $(call compile, $<) lists.o: ../lists.c config.h ../lists.h ../common.h $(call compile, $<) gamelist.o: ../gamelist.c config.h ../lists.h ../common.h ../frontend.h \ ../backend.h ../parser.h $(call compile, $<) wclipbrd.o: wclipbrd.c config.h ../common.h ../frontend.h ../backend.h \ winboard.h resource.h wclipbrd.h ../lists.h $(call compile, $<) wedittags.o: wedittags.c config.h ../common.h winboard.h resource.h ../frontend.h \ ../backend.h ../lists.h $(call compile, $<) wgamelist.o: wgamelist.c config.h ../common.h winboard.h resource.h ../frontend.h \ ../backend.h ../lists.h $(call compile, $<) woptions.o: woptions.c config.h ../common.h ../frontend.h ../backend.h ../lists.h \ defaults.h winboard.h resource.h $(call compile, $<) wengineoutput.o: wengineoutput.c ../engineoutput.h config.h ../common.h \ ../frontend.h ../backend.h ../lists.h winboard.h resource.h wsnap.h $(call compile, $<) engineoutput.o: ../engineoutput.c ../engineoutput.h config.h ../common.h \ ../frontend.h ../backend.h ../lists.h $(call compile, $<) whistory.o: whistory.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h winboard.h resource.h wsnap.h $(call compile, $<) history.o: ../history.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h $(call compile, $<) wevalgraph.o: wevalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \ ../backend.h ../lists.h winboard.h resource.h wsnap.h $(call compile, $<) evalgraph.o: ../evalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \ ../backend.h ../lists.h $(call compile, $<) wlayout.o: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h $(call compile, $<) wsockerr.o: wsockerr.c wsockerr.h $(call compile, $<) help.o: help.c help.h $(call compile, $<) wsnap.o: wsnap.c wsnap.h $(call compile, $<) pgntags.o: ../pgntags.c config.h ../common.h ../frontend.h ../backend.h \ ../parser.h ../lists.h $(call compile, $<) zippy.o: ../zippy.c config.h ../common.h ../zippy.h ../frontend.h \ ../backend.h ../backendz.h ../lists.h $(call compile, $<) book.o: ../book.c ../common.h ../backend.h ../lists.h $(call compile, $<) uci.o: ../uci.c ../common.h ../backend.h ../frontend.h ../lists.h $(call compile, $<) wsettings.o: wsettings.c ../common.h ../backend.h ../frontend.h ../lists.h $(call compile, $<) wchat.o: wchat.c winboard.h wsnap.h ../common.h ../backend.h ../frontend.h ../lists.h $(call compile, $<) %.o: %.c $(call compile, $<) xboard-4.7.3/winboard/wchat.c0000644000175000001440000003202012262415351012776 00000000000000/* * Chat window (PV) * * Author: H.G.Muller (August 2009) * * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "winboard.h" #include "backend.h" #include "wsnap.h" int chatCount; static int onTop; extern char chatPartner[MAX_CHAT][MSG_SIZ]; HANDLE chatHandle[MAX_CHAT]; static WNDPROC chatInputWindowProc; void SendToICS P((char *s)); void ChatPopUp P((char *s)); void ChatPopDown(); /* Imports from backend.c */ extern int opponentKibitzes; /* Imports from winboard.c */ VOID SaveInHistory(char *cmd); char *PrevInHistory(char *cmd); char *NextInHistory(); extern HWND ChatDialog; extern HINSTANCE hInst; extern HWND hwndConsole; extern char ics_handle[]; extern WindowPlacement wpChat[MAX_CHAT]; extern WindowPlacement wpConsole; extern BoardSize boardSize; /* Module variables */ #define H_MARGIN 5 #define V_MARGIN 5 // front end, although we might make GetWindowRect front end instead static int GetControlWidth( HWND hDlg, int id ) { RECT rc; GetWindowRect( GetDlgItem( hDlg, id ), &rc ); return rc.right - rc.left; } // front end? static int GetControlHeight( HWND hDlg, int id ) { RECT rc; GetWindowRect( GetDlgItem( hDlg, id ), &rc ); return rc.bottom - rc.top; } static void SetControlPos( HWND hDlg, int id, int x, int y, int width, int height ) { HWND hControl = GetDlgItem( hDlg, id ); SetWindowPos( hControl, HWND_TOP, x, y, width, height, SWP_NOZORDER ); } // Also here some of the size calculations should go to the back end, and their actual application to a front-end routine static void ResizeWindowControls( HWND hDlg ) { RECT rc; int clientWidth; int clientHeight; int maxControlWidth; int buttonWidth, buttonHeight; /* Initialize variables */ GetClientRect( hDlg, &rc ); clientWidth = rc.right - rc.left; clientHeight = rc.bottom - rc.top; maxControlWidth = clientWidth - 2*H_MARGIN; buttonWidth = GetControlWidth(hDlg, IDC_Send); buttonHeight = GetControlHeight(hDlg, IDC_Send); /* Resize controls */ SetControlPos( hDlg, IDC_Clear, maxControlWidth+H_MARGIN-2*buttonWidth-5, V_MARGIN, buttonWidth, buttonHeight ); SetControlPos( hDlg, IDC_Send, maxControlWidth+H_MARGIN-buttonWidth, V_MARGIN, buttonWidth, buttonHeight ); SetControlPos( hDlg, IDC_ChatMemo, H_MARGIN, 2*V_MARGIN+buttonHeight, maxControlWidth, clientHeight-3*V_MARGIN-2*buttonHeight ); SetControlPos( hDlg, OPT_ChatInput, H_MARGIN, clientHeight-V_MARGIN-buttonHeight, maxControlWidth, buttonHeight ); // InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE ); // InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE ); } // front end. Actual printing of PV lines into the output field static void InsertIntoMemo( HANDLE hDlg, char * text ) { HANDLE hMemo = GetDlgItem(hDlg, IDC_ChatMemo); SendMessage( hMemo, EM_SETSEL, 1000000, 1000000 ); SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); SendMessage( hMemo, EM_SCROLLCARET, 0, 0); } LRESULT CALLBACK InterceptArrowKeys(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; char *p; CHARRANGE sel; switch (message) { case WM_KEYDOWN: // cloned from ConsoleInputSubClass() switch (wParam) { case VK_UP: GetWindowText(hwnd, buf, MSG_SIZ); p = PrevInHistory(buf); if (p != NULL) { SetWindowText(hwnd, p); sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; case VK_DOWN: p = NextInHistory(); if (p != NULL) { SetWindowText(hwnd, p); sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; } } return (*chatInputWindowProc)(hwnd, message, wParam, lParam); } // This seems pure front end LRESULT CALLBACK ChatProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { static SnapData sd; char buf[MSG_SIZ], mess[MSG_SIZ]; int partner = -1, i, x, y; static BOOL filterHasFocus[MAX_CHAT]; WORD wMask; HWND hMemo; for(i=0; ipartner), chatPartner[i]); } else EnableWindow( GetDlgItem(hDlg, IDC_Focus1+i-(i>partner)), 0 ); for(i=0; icode == EN_LINK) { ENLINK *pLink = (ENLINK*)lParam; if (pLink->msg == WM_LBUTTONUP) { TEXTRANGE tr; tr.chrg = pLink->chrg; tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin); SendMessage( GetDlgItem(hDlg, IDC_ChatMemo), EM_GETTEXTRANGE, 0, (LPARAM)&tr); ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW); free(tr.lpstrText); } } break; case WM_COMMAND: /* [AS] If is pressed while editing the filter, it's better to apply the filter rather than selecting the current game. */ if( LOWORD(wParam) == IDC_ChatPartner ) { switch( HIWORD(wParam) ) { case EN_SETFOCUS: filterHasFocus[partner] = TRUE; break; case EN_KILLFOCUS: filterHasFocus[partner] = FALSE; break; } } if( filterHasFocus[partner] && (LOWORD(wParam) == IDC_Send) ) { SetFocus(GetDlgItem(hDlg, OPT_ChatInput)); wParam = IDC_Change; } /* [AS] End command replacement */ switch (LOWORD(wParam)) { case IDCANCEL: /* let Esc key switch focus back to console */ SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput)); break; case IDC_Clear: SendMessage( GetDlgItem(hDlg, IDC_ChatMemo), WM_SETTEXT, 0, (LPARAM) "" ); break; case IDC_Change: GetDlgItemText(hDlg, IDC_ChatPartner, chatPartner[partner], MSG_SIZ); for(i=0; i %s\r\n", mess); // echo only tells to handle, not channel InsertIntoMemo(hDlg, buf); snprintf(buf, MSG_SIZ, "xtell %s %s\n", chatPartner[partner], mess); } else snprintf(buf, MSG_SIZ, "tell %s %s\n", chatPartner[partner], mess); } SendToICS(buf); break; case IDC_Focus1: case IDC_Focus2: case IDC_Focus3: case IDC_Focus4: i = LOWORD(wParam) - IDC_Focus1; if(i >= partner) i++; onTop = i; SetFocus(GetDlgItem(hDlg, IDC_Send)); if(chatHandle[i]) { int j; for(j=0; j # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=winboard - Win32 Jaws Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "winboard.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "winboard.mak" CFG="winboard - Win32 Jaws Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "winboard - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "winboard - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "winboard - Win32 Jaws Debug" (based on "Win32 (x86) Application") !MESSAGE "winboard - Win32 Jaws Release" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "winboard - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /Og /Os /Oy /Gf /I "." /I ".." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /D "YY_NO_UNISTD_H" /YX /Zl /FD /Gs /GA /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /i ".." /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrt.lib /nologo /subsystem:windows /pdb:none /machine:I386 !ELSEIF "$(CFG)" == "winboard - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I ".." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /D "YY_NO_UNISTD_H" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /i ".." /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrtd.lib /nologo /subsystem:windows /map /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "winboard - Win32 Jaws Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "winboard___Win32_Jaws_Debug" # PROP BASE Intermediate_Dir "winboard___Win32_Jaws_Debug" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Jaws-Debug" # PROP Intermediate_Dir "Jaws-Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I ".." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /I ".." /D "_DEBUG" /D "JAWS" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /D "YY_NO_UNISTD_H" /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /i ".." /d "_DEBUG" # ADD RSC /l 0x409 /i ".." /d "_DEBUG" /d "JAWS" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrtd.lib /nologo /subsystem:windows /map /debug /machine:I386 /pdbtype:sept # ADD LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrtd.lib /nologo /subsystem:windows /map /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "winboard - Win32 Jaws Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "winboard___Win32_Jaws_Release" # PROP BASE Intermediate_Dir "winboard___Win32_Jaws_Release" # PROP BASE Ignore_Export_Lib 0 # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Jaws-Release" # PROP Intermediate_Dir "Jaws-Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /Og /Os /Oy /Gf /I "." /I ".." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /YX /Zl /FD /Gs /GA /c # ADD CPP /nologo /MD /W3 /GX /Og /Os /Oy /Gf /I "." /I ".." /D "NDEBUG" /D "JAWS" /D "WIN32" /D "_WINDOWS" /D _WIN32_IE=0x300 /D WINVER=0x400 /D _WIN32_WINDOWS=0x500 /D "YY_NO_UNISTD_H" /YX /Zl /FD /Gs /GA /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /i ".." /d "NDEBUG" # ADD RSC /l 0x409 /i ".." /d "NDEBUG" /d "JAWS" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrt.lib /nologo /subsystem:windows /pdb:none /machine:I386 # ADD LINK32 wsock32.lib comctl32.lib winmm.lib shell32.lib oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib msvcrt.lib /nologo /subsystem:windows /pdb:none /machine:I386 !ENDIF # Begin Target # Name "winboard - Win32 Release" # Name "winboard - Win32 Debug" # Name "winboard - Win32 Jaws Debug" # Name "winboard - Win32 Jaws Release" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\backend.c # End Source File # Begin Source File SOURCE=..\book.c # End Source File # Begin Source File SOURCE=..\engineoutput.c # End Source File # Begin Source File SOURCE=..\evalgraph.c # End Source File # Begin Source File SOURCE=..\gamelist.c # End Source File # Begin Source File SOURCE=.\help.c # End Source File # Begin Source File SOURCE=..\history.c # End Source File # Begin Source File SOURCE=..\lists.c # End Source File # Begin Source File SOURCE=..\moves.c # End Source File # Begin Source File SOURCE=..\parser.c # End Source File # Begin Source File SOURCE=..\pgntags.c # End Source File # Begin Source File SOURCE=..\uci.c # End Source File # Begin Source File SOURCE=.\wchat.c # End Source File # Begin Source File SOURCE=.\wclipbrd.c # End Source File # Begin Source File SOURCE=.\wedittags.c # End Source File # Begin Source File SOURCE=.\wengineoutput.c # End Source File # Begin Source File SOURCE=.\wevalgraph.c # End Source File # Begin Source File SOURCE=.\wgamelist.c # End Source File # Begin Source File SOURCE=.\whistory.c # End Source File # Begin Source File SOURCE=.\winboard.c !IF "$(CFG)" == "winboard - Win32 Release" !ELSEIF "$(CFG)" == "winboard - Win32 Debug" !ELSEIF "$(CFG)" == "winboard - Win32 Jaws Debug" # ADD CPP /D WINVER=0x500 # SUBTRACT CPP /D WINVER=0x400 !ELSEIF "$(CFG)" == "winboard - Win32 Jaws Release" # ADD CPP /D WINVER=0x500 # SUBTRACT CPP /D WINVER=0x400 !ENDIF # End Source File # Begin Source File SOURCE=.\winboard.rc # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 # End Source File # Begin Source File SOURCE=.\wlayout.c # End Source File # Begin Source File SOURCE=.\woptions.c # End Source File # Begin Source File SOURCE=.\wsettings.c # End Source File # Begin Source File SOURCE=.\wsnap.c # End Source File # Begin Source File SOURCE=.\wsockerr.c # End Source File # Begin Source File SOURCE=..\zippy.c # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project xboard-4.7.3/winboard/help.c0000644000175000001440000000540712262415351012631 00000000000000/* * help.h * * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* Windows html help function to avoid having to link with the htmlhlp.lib */ #include #include #include "config.h" #include "help.h" FILE *debugFP; HWND WINAPI HtmlHelp( HWND hwnd, LPCSTR helpFile, UINT action, DWORD_PTR data ) { PROCESS_INFORMATION helpProcInfo; STARTUPINFO siStartInfo; char buf[100]; static int status = 0; FILE *f; if(status < 0) return NULL; if(!status) { f = fopen(helpFile, "r"); if(f == NULL) { status = -1; return NULL; } status = 1; fclose(f); } siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.lpReserved = NULL; siStartInfo.lpDesktop = NULL; siStartInfo.lpTitle = NULL; siStartInfo.dwFlags = STARTF_USESTDHANDLES; siStartInfo.cbReserved2 = 0; siStartInfo.lpReserved2 = NULL; siStartInfo.hStdInput = NULL; siStartInfo.hStdOutput = NULL; siStartInfo.hStdError = debugFP; snprintf(buf, sizeof(buf)/sizeof(buf[0]),"Hh.exe %s", helpFile); // ignore the other parameters; just start the viewer with the help file if( CreateProcess(NULL, buf, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attrs */ FALSE, /* handles are inherited */ DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP, NULL, /* use parent's environment */ NULL, &siStartInfo, /* STARTUPINFO pointer */ &helpProcInfo) /* receives PROCESS_INFORMATION */ ) return hwnd; else return NULL; } //HWND WINAPI int MyHelp(HWND hwnd, LPSTR helpFile, UINT action, DWORD_PTR data) { static int status = 0; FILE *f; if(status < 0) return 0; if(!status) { f = fopen(helpFile, "r"); if(f == NULL) { status = -1; return 0; } status = 1; fclose(f); } return WinHelp(hwnd, helpFile, action, data); } xboard-4.7.3/winboard/makefile.ms0000644000175000001440000001413512262415351013651 00000000000000# Command line: nmake /f makefile.ms # Set VCVER=6 for MSVC 4.x through 7.0(aka 2002 aka .NET). # For MSVC 8 (aka 2005) set VCVER=8. Beyond that try 8 first. VCVER=6 # If using MSVC 6.0 or earlier, you will need the latest platform SDK supported. # Set SDK_INC to the include directory after you install it. # See: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm #SDK_INC="C:\Program Files\Microsoft SDK\include" PROJ = winboard OBJS=backend.obj book.obj gamelist.obj lists.obj moves.obj pgntags.obj uci.obj\ zippy.obj parser.obj wclipbrd.obj wedittags.obj wengineoutput.obj wevalgraph.obj\ wgamelist.obj whistory.obj history.obj winboard.obj wlayout.obj woptions.obj wsnap.obj\ wsockerr.obj help.obj wsettings.obj wchat.obj engineoutput.obj evalgraph.obj # Debugging? USE_DEBUG=0 # JAWS support? JAWS=0 CC = @cl RC = @rc LINK = link HC="c:\program files\help workshop\hcrtf.exe" -xn FLEX = "c:/mingw/mingw32/bin/flex.exe" DEFS = -D_WIN32_IE=0x300 -DWIN32 -DWINVER=0x0500 -D_WIN32_WINDOWS=0x500 -D YY_NO_UNISTD_H !if $(JAWS) == 1 DEFS = -DJAWS $(DEFS) !endif #WARN = -W3 ARCH = !if $(VCVER) >= 8 CLIB= libcmt LIBF= -MT DEPRECATE=-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_USE_32BIT_TIME_T !else VSO = -Gf -Og CLIB = msvcrt LIBF = -MD !endif !if $(USE_DEBUG) == 0 CFDEBUG = -DNDEBUG OPTS = -Os -Oy -Gs -GA -Zl $(VSO) $(LIBF) LFDEBUG = $(CLIB).lib !else CFDEBUG = -D_DEBUG -DDEBUG OPTS = -Od -Zi -Fd$(PROJ).pdb $(LIBF)d LFDEBUG = -DEBUG -PDB:$(PROJ).pdb -MAP:$(PROJ).map $(CLIB)d.lib !endif CF = $(CFDEBUG) $(DEFS) $(DEPRECATE) -I. -I.. !if DEFINED(SDK_INC) CF = $(CF) -I$(SDK_INC) !endif CFLAGS = -c -nologo $(WARN) $(CF) $(ARCH) $(OPTS) LFLAGS = -nologo $(LFDEBUG) all: $(PROJ).exe clean: -erase *~ $(PROJ).exe $(PROJ).err $(PROJ).rbj $(PROJ).res *.sbr *.bsc\ *.o *.obj *.plg *.opt *.ncb *.debug *.bak *.gid *.map *.pdb *.ini # Update the help file if necessary $(PROJ).hlp : $(PROJ).rtf $(HC) $(PROJ).hpj -@type $(PROJ).err -@rename $(PROJ).hlp $(PROJ).hlp.tmp -@rename $(PROJ).hlp.tmp $(PROJ).hlp # Update the resource if necessary $(PROJ).res: $(PROJ).rc $(PROJ).h resource.h config.h $(RC) $(CF) -r -fo $(PROJ).res $(PROJ).rc winboard.obj: winboard.c config.h winboard.h ../common.h ../frontend.h \ ../backend.h ../moves.h defaults.h resource.h wclipbrd.h \ wsockerr.h woptions.h wsnap.h ../lists.h help.h ../args.h $(CC) $(CFLAGS) winboard.c backend.obj: ../backend.c config.h ../common.h ../frontend.h ../backend.h \ ../parser.h ../moves.h ../zippy.h ../backendz.h ../gettext.h ../lists.h $(CC) $(CFLAGS) ../backend.c parser.obj: ../parser.c config.h ../common.h ../backend.h ../parser.h \ ../frontend.h ../moves.h ../lists.h $(CC) $(CFLAGS) ../parser.c book.obj: ../book.c ../common.h ../backend.h ../lists.h $(CC) $(CFLAGS) ../book.c gamelist.obj: ../gamelist.c config.h ../lists.h ../common.h ../frontend.h \ ../backend.h ../parser.h $(CC) $(CFLAGS) ../gamelist.c lists.obj: ../lists.c config.h ../lists.h ../common.h $(CC) $(CFLAGS) ../lists.c moves.obj: ../moves.c config.h ../backend.h ../common.h ../parser.h \ ../moves.h ../lists.h $(CC) $(CFLAGS) ../moves.c wclipbrd.obj: wclipbrd.c config.h ../common.h ../frontend.h ../backend.h \ winboard.h resource.h wclipbrd.h ../lists.h $(CC) $(CFLAGS) wclipbrd.c wedittags.obj: wedittags.c config.h ../common.h winboard.h resource.h ../frontend.h \ ../backend.h ../lists.h $(CC) $(CFLAGS) wedittags.c wgamelist.obj: wgamelist.c config.h ../common.h winboard.h resource.h ../frontend.h \ ../backend.h ../lists.h $(CC) $(CFLAGS) wgamelist.c woptions.obj: woptions.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h defaults.h winboard.h resource.h $(CC) $(CFLAGS) woptions.c wengineoutput.obj: wengineoutput.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h winboard.h resource.h wsnap.h $(CC) $(CFLAGS) wengineoutput.c engineoutput.obj: ../engineoutput.c ../engineoutput.h config.h ../common.h \ ../frontend.h ../backend.h ../lists.h $(CC) $(CFLAGS) ../engineoutput.c whistory.obj: whistory.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h winboard.h resource.h wsnap.h $(CC) $(CFLAGS) whistory.c history.obj: ../history.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h $(CC) $(CFLAGS) ../history.c wevalgraph.obj: wevalgraph.c config.h ../common.h ../frontend.h ../backend.h \ ../lists.h winboard.h resource.h wsnap.h $(CC) $(CFLAGS) wevalgraph.c evalgraph.obj: ../evalgraph.c ../evalgraph.h config.h ../common.h ../frontend.h \ ../backend.h ../lists.h $(CC) $(CFLAGS) ../evalgraph.c wlayout.obj: wlayout.c config.h ../common.h ../frontend.h winboard.h resource.h $(CC) $(CFLAGS) wlayout.c wsockerr.obj: wsockerr.c wsockerr.h $(CC) $(CFLAGS) wsockerr.c help.obj: help.c help.h $(CC) $(CFLAGS) help.c wsnap.obj: wsnap.c wsnap.h $(CC) $(CFLAGS) wsnap.c pgntags.obj: ../pgntags.c config.h ../common.h ../frontend.h ../backend.h \ ../parser.h ../lists.h $(CC) $(CFLAGS) ../pgntags.c zippy.obj: ../zippy.c config.h ../common.h ../zippy.h ../frontend.h \ ../backend.h ../backendz.h ../lists.h $(CC) $(CFLAGS) ../zippy.c uci.obj: ../uci.c ../common.h ../backend.h ../frontend.h ../lists.h $(CC) $(CFLAGS) ../uci.c wsettings.obj: wsettings.c ../common.h ../backend.h ../frontend.h ../lists.h $(CC) $(CFLAGS) wsettings.c wchat.obj: wchat.c winboard.h wsnap.h ../common.h ../backend.h ../frontend.h ../lists.h $(CC) $(CFLAGS) wchat.c $(PROJ).exe: $(OBJS) $(PROJ).res $(PROJ).hlp $(LINK) $(LFLAGS) $(OBJS) wsock32.lib comctl32.lib winmm.lib shell32.lib\ oldnames.lib kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib\ $(PROJ).res -out:$(PROJ).exe .c.obj: $(CC) $(CFLAGS) $< xboard-4.7.3/winboard/help.h0000644000175000001440000000045512262415351012634 00000000000000#ifdef VISTA #include "htmlhelp.h" #else #ifdef _MSC_VER #if _MSC_VER <= 1200 #define DWORD_PTR DWORD #endif #endif HWND WINAPI HtmlHelp( HWND hwnd, LPCSTR helpFile, UINT action, DWORD_PTR data ); #endif int MyHelp(HWND hwnd, LPSTR helpFile, UINT action, DWORD_PTR data); xboard-4.7.3/winboard/internationalize0000644000175000001440000000022512262415351015030 00000000000000ed $1 /* required for all Windows applications */ #include #include #include /* [AS] Requires NT 4.0 or Win95 */ #include #include "common.h" #include "frontend.h" #include "winboard.h" #include "backend.h" #include "woptions.h" #include "defaults.h" #include #if __GNUC__ #include #include #endif #define _(s) T_(s) #define N_(s) s /* Imports from winboard.c */ extern MyFont *font[NUM_SIZES][NUM_FONTS]; extern HINSTANCE hInst; /* current instance */ extern HWND hwndMain; /* root window*/ extern BOOLEAN alwaysOnTop; extern RECT boardRect; extern COLORREF lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor, highlightSquareColor, premoveHighlightColor; extern HPALETTE hPal; extern BoardSize boardSize; extern COLORREF consoleBackgroundColor; extern MyColorizeAttribs colorizeAttribs[]; /* do I need the size? */ extern MyTextAttribs textAttribs[]; extern MySound sounds[]; extern ColorClass currentColorClass; extern HWND hwndConsole; extern char *defaultTextAttribs[]; extern HWND commentDialog; extern HWND moveHistoryDialog; extern HWND engineOutputDialog; extern char installDir[]; extern HWND hCommPort; /* currently open comm port */ extern DCB dcb; extern BOOLEAN chessProgram; extern int startedFromPositionFile; /* [HGM] loadPos */ extern int searchTime; /* types */ typedef struct { char *label; unsigned value; } ComboData; typedef struct { char *label; char *name; } SoundComboData; /* module prototypes */ LRESULT CALLBACK GeneralOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK BoardOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NewVariant(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK IcsOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK FontOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK CommPortOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK LoadOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK SaveOptions(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK TimeControl(HWND, UINT, WPARAM, LPARAM); VOID ChangeBoardSize(BoardSize newSize); VOID PaintSampleSquare( HWND hwnd, int ctrlid, COLORREF squareColor, COLORREF pieceColor, COLORREF squareOutlineColor, COLORREF pieceDetailColor, BOOL isWhitePiece, BOOL isMono, HBITMAP pieces[3] ); VOID PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color); VOID SetBoardOptionEnables(HWND hDlg); BoardSize BoardOptionsWhichRadio(HWND hDlg); BOOL APIENTRY MyCreateFont(HWND hwnd, MyFont *font); VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca); LRESULT CALLBACK ColorizeTextDialog(HWND , UINT, WPARAM, LPARAM); VOID ColorizeTextPopup(HWND hwnd, ColorClass cc); VOID SetIcsOptionEnables(HWND hDlg); VOID SetSampleFontText(HWND hwnd, int id, const MyFont *mf); VOID CopyFont(MyFont *dest, const MyFont *src); void InitSoundComboData(SoundComboData *scd); void ResetSoundComboData(SoundComboData *scd); void InitSoundCombo(HWND hwndCombo, SoundComboData *scd); int SoundDialogWhichRadio(HWND hDlg); VOID SoundDialogSetEnables(HWND hDlg, int radio); char * SoundDialogGetName(HWND hDlg, int radio); void DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name); VOID ParseCommSettings(char *arg, DCB *dcb); VOID PrintCommSettings(FILE *f, char *name, DCB *dcb); void InitCombo(HANDLE hwndCombo, ComboData *cd); void SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value); VOID SetLoadOptionEnables(HWND hDlg); VOID SetSaveOptionEnables(HWND hDlg); VOID SetTimeControlEnables(HWND hDlg); char * InterpretFileName(char *buf, char *homeDir) { // [HGM] file name relative to homeDir. (Taken out of SafeOptionsDialog, because it is generally useful) char *result = NULL; if ((isalpha(buf[0]) && buf[1] == ':') || (buf[0] == '\\' && buf[1] == '\\')) { return strdup(buf); } else { char buf2[MSG_SIZ], buf3[MSG_SIZ]; char *dummy; GetCurrentDirectory(MSG_SIZ, buf3); SetCurrentDirectory(homeDir); if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) { result = strdup(buf2); } else { result = strdup(buf); } SetCurrentDirectory(buf3); } return result; } /*---------------------------------------------------------------------------*\ * * General Options Dialog functions * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK GeneralOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static Boolean oldShowCoords; static Boolean oldBlindfold; static Boolean oldShowButtonBar; static Boolean oldAutoLogo; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ oldShowCoords = appData.showCoords; oldBlindfold = appData.blindfold; oldShowButtonBar = appData.showButtonBar; oldAutoLogo = appData.autoLogo; /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_GeneralOptions); /* Initialize the dialog items */ #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y)) CHECK_BOX(OPT_AlwaysOnTop, alwaysOnTop); CHECK_BOX(OPT_AlwaysQueen, appData.alwaysPromoteToQueen); CHECK_BOX(OPT_AnimateDragging, appData.animateDragging); CHECK_BOX(OPT_AnimateMoving, appData.animate); CHECK_BOX(OPT_AutoFlag, appData.autoCallFlag); CHECK_BOX(OPT_AutoFlipView, appData.autoFlipView); CHECK_BOX(OPT_AutoRaiseBoard, appData.autoRaiseBoard); CHECK_BOX(OPT_Blindfold, appData.blindfold); CHECK_BOX(OPT_HighlightDragging, appData.highlightDragging); CHECK_BOX(OPT_HighlightLastMove, appData.highlightLastMove); CHECK_BOX(OPT_PeriodicUpdates, appData.periodicUpdates); CHECK_BOX(OPT_PonderNextMove, appData.ponderNextMove); CHECK_BOX(OPT_PopupExitMessage, appData.popupExitMessage); CHECK_BOX(OPT_PopupMoveErrors, appData.popupMoveErrors); CHECK_BOX(OPT_ShowButtonBar, appData.showButtonBar); CHECK_BOX(OPT_ShowCoordinates, appData.showCoords); CHECK_BOX(OPT_ShowThinking, appData.showThinking); CHECK_BOX(OPT_TestLegality, appData.testLegality); CHECK_BOX(OPT_HideThinkFromHuman, appData.hideThinkingFromHuman); CHECK_BOX(OPT_SaveExtPGN, appData.saveExtendedInfoInPGN); CHECK_BOX(OPT_ExtraInfoInMoveHistory, appData.showEvalInMoveHistory); CHECK_BOX(OPT_HighlightMoveArrow, appData.highlightMoveWithArrow); CHECK_BOX(OPT_AutoLogo, appData.autoLogo); // [HGM] logo CHECK_BOX(OPT_SmartMove, appData.oneClick); // [HGM] one-click #undef CHECK_BOX EnableWindow(GetDlgItem(hDlg, OPT_AutoFlag), appData.icsActive || !appData.noChessProgram); EnableWindow(GetDlgItem(hDlg, OPT_AutoFlipView), appData.icsActive || !appData.noChessProgram); EnableWindow(GetDlgItem(hDlg, OPT_PonderNextMove), !appData.noChessProgram); EnableWindow(GetDlgItem(hDlg, OPT_PeriodicUpdates), !appData.noChessProgram && !appData.icsActive); EnableWindow(GetDlgItem(hDlg, OPT_ShowThinking), !appData.noChessProgram); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x)) alwaysOnTop = IS_CHECKED(OPT_AlwaysOnTop); appData.alwaysPromoteToQueen = IS_CHECKED(OPT_AlwaysQueen); appData.animateDragging = IS_CHECKED(OPT_AnimateDragging); appData.animate = IS_CHECKED(OPT_AnimateMoving); appData.autoCallFlag = IS_CHECKED(OPT_AutoFlag); appData.autoFlipView = IS_CHECKED(OPT_AutoFlipView); appData.autoRaiseBoard = IS_CHECKED(OPT_AutoRaiseBoard); appData.blindfold = IS_CHECKED(OPT_Blindfold); appData.highlightDragging = IS_CHECKED(OPT_HighlightDragging); appData.highlightLastMove = IS_CHECKED(OPT_HighlightLastMove); PeriodicUpdatesEvent( IS_CHECKED(OPT_PeriodicUpdates)); PonderNextMoveEvent( IS_CHECKED(OPT_PonderNextMove)); appData.popupExitMessage = IS_CHECKED(OPT_PopupExitMessage); appData.popupMoveErrors = IS_CHECKED(OPT_PopupMoveErrors); appData.showButtonBar = IS_CHECKED(OPT_ShowButtonBar); appData.showCoords = IS_CHECKED(OPT_ShowCoordinates); // [HGM] thinking: next three moved up appData.saveExtendedInfoInPGN= IS_CHECKED(OPT_SaveExtPGN); appData.hideThinkingFromHuman= IS_CHECKED(OPT_HideThinkFromHuman); appData.showEvalInMoveHistory= IS_CHECKED(OPT_ExtraInfoInMoveHistory); appData.showThinking = IS_CHECKED(OPT_ShowThinking); ShowThinkingEvent(); // [HGM] thinking: tests four options appData.testLegality = IS_CHECKED(OPT_TestLegality); appData.highlightMoveWithArrow=IS_CHECKED(OPT_HighlightMoveArrow); appData.autoLogo =IS_CHECKED(OPT_AutoLogo); // [HGM] logo appData.oneClick =IS_CHECKED(OPT_SmartMove); // [HGM] one-click #undef IS_CHECKED SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); #if AOT_CONSOLE if (hwndConsole) { SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); } #endif if (!appData.highlightLastMove) { ClearHighlights(); DrawPosition(FALSE, NULL); } /* * for some reason the redraw seems smoother when we invalidate * the board rect after the call to EndDialog() */ EndDialog(hDlg, TRUE); if (oldAutoLogo != appData.autoLogo) { // [HGM] logo: remove any logos when we switch autologo off if(oldAutoLogo) first.programLogo = second.programLogo = NULL; InitDrawingSizes(boardSize, 0); } else if (oldShowButtonBar != appData.showButtonBar) { InitDrawingSizes(boardSize, 0); } else if ((oldShowCoords != appData.showCoords) || (oldBlindfold != appData.blindfold)) { InvalidateRect(hwndMain, &boardRect, FALSE); } return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; } break; } return FALSE; } VOID GeneralOptionsPopup(HWND hwnd) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)GeneralOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_GeneralOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Board Options Dialog functions * \*---------------------------------------------------------------------------*/ const int SAMPLE_SQ_SIZE = 54; VOID ChangeBoardSize(BoardSize newSize) { if (newSize != boardSize) { boardSize = newSize; InitDrawingSizes(boardSize, 0); } } VOID PaintSampleSquare( HWND hwnd, int ctrlid, COLORREF squareColor, COLORREF pieceColor, COLORREF squareOutlineColor, COLORREF pieceDetailColor, BOOL isWhitePiece, BOOL isMono, HBITMAP pieces[3] ) { HBRUSH brushSquare; HBRUSH brushSquareOutline; HBRUSH brushPiece; HBRUSH brushPieceDetail; HBRUSH oldBrushPiece = NULL; HBRUSH oldBrushSquare; HBITMAP oldBitmapMem; HBITMAP oldBitmapTemp; HBITMAP bufferBitmap; RECT rect; HDC hdcScreen, hdcMem, hdcTemp; HPEN pen, oldPen; HWND hCtrl = GetDlgItem(hwnd, ctrlid); int x, y; const int SOLID = 0; const int WHITE = 1; const int OUTLINE = 2; const int BORDER = 4; InvalidateRect(hCtrl, NULL, TRUE); UpdateWindow(hCtrl); GetClientRect(hCtrl, &rect); x = rect.left + (BORDER / 2); y = rect.top + (BORDER / 2); hdcScreen = GetDC(hCtrl); hdcMem = CreateCompatibleDC(hdcScreen); hdcTemp = CreateCompatibleDC(hdcScreen); bufferBitmap = CreateCompatibleBitmap(hdcScreen, rect.right-rect.left+1, rect.bottom-rect.top+1); oldBitmapMem = SelectObject(hdcMem, bufferBitmap); if (!isMono) { SelectPalette(hdcMem, hPal, FALSE); } brushSquare = CreateSolidBrush(squareColor); brushSquareOutline = CreateSolidBrush(squareOutlineColor); brushPiece = CreateSolidBrush(pieceColor); brushPieceDetail = CreateSolidBrush(pieceDetailColor); /* * first draw the rectangle */ pen = CreatePen(PS_SOLID, BORDER, squareOutlineColor); oldPen = (HPEN) SelectObject(hdcMem, pen); oldBrushSquare = (HBRUSH)SelectObject(hdcMem, brushSquare); Rectangle(hdcMem, rect.left, rect.top, rect.right, rect.bottom); /* * now draw the piece */ if (isMono) { oldBitmapTemp = SelectObject(hdcTemp, pieces[OUTLINE]); BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0, isWhitePiece ? SRCCOPY : NOTSRCCOPY); SelectObject(hdcTemp, oldBitmapTemp); } else { if (isWhitePiece) { oldBitmapTemp = SelectObject(hdcTemp, pieces[WHITE]); oldBrushPiece = SelectObject(hdcMem, brushPiece); BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0, 0x00B8074A); /* Use black for outline of white pieces */ SelectObject(hdcTemp, pieces[OUTLINE]); BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0, SRCAND); } else { /* Use square color for details of black pieces */ oldBitmapTemp = SelectObject(hdcTemp, pieces[SOLID]); oldBrushPiece = SelectObject(hdcMem, brushPiece); BitBlt(hdcMem, x, y, SAMPLE_SQ_SIZE, SAMPLE_SQ_SIZE, hdcTemp, 0, 0, 0x00B8074A); } SelectObject(hdcMem, oldBrushPiece); SelectObject(hdcTemp, oldBitmapTemp); } /* * copy the memory dc to the screen */ SelectObject(hdcMem, bufferBitmap); BitBlt(hdcScreen, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdcMem, rect.left, rect.top, SRCCOPY); SelectObject(hdcMem, oldBitmapMem); /* * clean up */ SelectObject(hdcMem, oldBrushPiece); SelectObject(hdcMem, oldPen); DeleteObject(brushPiece); DeleteObject(brushPieceDetail); DeleteObject(brushSquare); DeleteObject(brushSquareOutline); DeleteObject(pen); DeleteDC(hdcTemp); DeleteDC(hdcMem); ReleaseDC(hCtrl, hdcScreen); } VOID PaintColorBlock(HWND hwnd, int ctrlid, COLORREF color) { HDC hdc; HBRUSH brush, oldBrush; RECT rect; HWND hCtrl = GetDlgItem(hwnd, ctrlid); hdc = GetDC(hCtrl); InvalidateRect(hCtrl, NULL, TRUE); UpdateWindow(hCtrl); GetClientRect(hCtrl, &rect); brush = CreateSolidBrush(color); oldBrush = (HBRUSH)SelectObject(hdc, brush); Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); SelectObject(hdc, oldBrush); DeleteObject(brush); ReleaseDC(hCtrl, hdc); } VOID SetBoardOptionEnables(HWND hDlg) { if (IsDlgButtonChecked(hDlg, OPT_Monochrome)) { ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_HIDE); ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_HIDE); ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_HIDE); ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_HIDE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), FALSE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), FALSE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), FALSE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), FALSE); } else { ShowWindow(GetDlgItem(hDlg, OPT_LightSquareColor), SW_SHOW); ShowWindow(GetDlgItem(hDlg, OPT_DarkSquareColor), SW_SHOW); ShowWindow(GetDlgItem(hDlg, OPT_WhitePieceColor), SW_SHOW); ShowWindow(GetDlgItem(hDlg, OPT_BlackPieceColor), SW_SHOW); EnableWindow(GetDlgItem(hDlg, OPT_ChooseLightSquareColor), TRUE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseDarkSquareColor), TRUE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseWhitePieceColor), TRUE); EnableWindow(GetDlgItem(hDlg, OPT_ChooseBlackPieceColor), TRUE); } } BoardSize BoardOptionsWhichRadio(HWND hDlg) { return (IsDlgButtonChecked(hDlg, OPT_SizeTiny) ? SizeTiny : (IsDlgButtonChecked(hDlg, OPT_SizeTeeny) ? SizeTeeny : (IsDlgButtonChecked(hDlg, OPT_SizeDinky) ? SizeDinky : (IsDlgButtonChecked(hDlg, OPT_SizePetite) ? SizePetite : (IsDlgButtonChecked(hDlg, OPT_SizeSlim) ? SizeSlim : (IsDlgButtonChecked(hDlg, OPT_SizeSmall) ? SizeSmall : (IsDlgButtonChecked(hDlg, OPT_SizeMediocre) ? SizeMediocre : (IsDlgButtonChecked(hDlg, OPT_SizeMiddling) ? SizeMiddling : (IsDlgButtonChecked(hDlg, OPT_SizeAverage) ? SizeAverage : (IsDlgButtonChecked(hDlg, OPT_SizeModerate) ? SizeModerate : (IsDlgButtonChecked(hDlg, OPT_SizeMedium) ? SizeMedium : (IsDlgButtonChecked(hDlg, OPT_SizeBulky) ? SizeBulky : (IsDlgButtonChecked(hDlg, OPT_SizeLarge) ? SizeLarge : (IsDlgButtonChecked(hDlg, OPT_SizeBig) ? SizeBig : (IsDlgButtonChecked(hDlg, OPT_SizeHuge) ? SizeHuge : (IsDlgButtonChecked(hDlg, OPT_SizeGiant) ? SizeGiant : (IsDlgButtonChecked(hDlg, OPT_SizeColossal) ? SizeColossal : SizeTitanic ))))))))))))))))); } LRESULT CALLBACK BoardOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static Boolean mono, white, flip, fonts, bitmaps, grid; static BoardSize size; static COLORREF lsc, dsc, wpc, bpc, hsc, phc; static HBITMAP pieces[3]; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_BoardOptions); /* Initialize the dialog items */ switch (boardSize) { case SizeTiny: CheckDlgButton(hDlg, OPT_SizeTiny, TRUE); break; case SizeTeeny: CheckDlgButton(hDlg, OPT_SizeTeeny, TRUE); break; case SizeDinky: CheckDlgButton(hDlg, OPT_SizeDinky, TRUE); break; case SizePetite: CheckDlgButton(hDlg, OPT_SizePetite, TRUE); break; case SizeSlim: CheckDlgButton(hDlg, OPT_SizeSlim, TRUE); break; case SizeSmall: CheckDlgButton(hDlg, OPT_SizeSmall, TRUE); break; case SizeMediocre: CheckDlgButton(hDlg, OPT_SizeMediocre, TRUE); break; case SizeMiddling: CheckDlgButton(hDlg, OPT_SizeMiddling, TRUE); break; case SizeAverage: CheckDlgButton(hDlg, OPT_SizeAverage, TRUE); break; case SizeModerate: CheckDlgButton(hDlg, OPT_SizeModerate, TRUE); break; case SizeMedium: CheckDlgButton(hDlg, OPT_SizeMedium, TRUE); break; case SizeBulky: CheckDlgButton(hDlg, OPT_SizeBulky, TRUE); break; case SizeLarge: CheckDlgButton(hDlg, OPT_SizeLarge, TRUE); break; case SizeBig: CheckDlgButton(hDlg, OPT_SizeBig, TRUE); break; case SizeHuge: CheckDlgButton(hDlg, OPT_SizeHuge, TRUE); break; case SizeGiant: CheckDlgButton(hDlg, OPT_SizeGiant, TRUE); break; case SizeColossal: CheckDlgButton(hDlg, OPT_SizeColossal, TRUE); break; case SizeTitanic: CheckDlgButton(hDlg, OPT_SizeTitanic, TRUE); default: ; // should not happen, but suppresses warning on pedantic compilers } if (appData.monoMode) CheckDlgButton(hDlg, OPT_Monochrome, TRUE); if (appData.allWhite) CheckDlgButton(hDlg, OPT_AllWhite, TRUE); if (appData.upsideDown) CheckDlgButton(hDlg, OPT_UpsideDown, TRUE); if (appData.useBitmaps) CheckDlgButton(hDlg, OPT_Bitmaps, TRUE); if (appData.useFont) CheckDlgButton(hDlg, OPT_PieceFont, TRUE); if (appData.overrideLineGap >= 0) CheckDlgButton(hDlg, OPT_Grid, TRUE); pieces[0] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "s"); pieces[1] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "w"); pieces[2] = DoLoadBitmap(hInst, "n", SAMPLE_SQ_SIZE, "o"); lsc = lightSquareColor; dsc = darkSquareColor; fonts = appData.useFont; wpc = fonts ? appData.fontBackColorWhite : whitePieceColor; bpc = fonts ? appData.fontForeColorBlack : blackPieceColor; hsc = highlightSquareColor; phc = premoveHighlightColor; mono = appData.monoMode; white= appData.allWhite; flip = appData.upsideDown; size = boardSize; bitmaps = appData.useBitmaps; grid = appData.overrideLineGap >= 0; SetBoardOptionEnables(hDlg); return TRUE; case WM_PAINT: PaintColorBlock(hDlg, OPT_LightSquareColor, lsc); PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc); PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc); PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc); PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc); PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc); PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc, TRUE, mono, pieces); PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc, FALSE, mono, pieces); return FALSE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* * if we call EndDialog() after the call to ChangeBoardSize(), * then ChangeBoardSize() does not take effect, although the new * boardSize is saved. Go figure... */ EndDialog(hDlg, TRUE); size = BoardOptionsWhichRadio(hDlg); /* * did any settings change? */ if (size != boardSize) { ChangeBoardSize(size); } if (bitmaps && !appData.useBitmaps) InitTextures(); if ((mono != appData.monoMode) || (lsc != lightSquareColor) || (dsc != darkSquareColor) || (wpc != fonts ? appData.fontBackColorWhite : whitePieceColor) || (bpc != fonts ? appData.fontForeColorBlack : blackPieceColor) || (hsc != highlightSquareColor) || (flip != appData.upsideDown) || (white != appData.allWhite) || (fonts != appData.useFont) || (bitmaps != appData.useBitmaps) || (grid != appData.overrideLineGap >= 0) || (phc != premoveHighlightColor)) { lightSquareColor = lsc; darkSquareColor = dsc; if(fonts) { appData.fontBackColorWhite = wpc; appData.fontForeColorBlack = bpc; } else { whitePieceColor = wpc; blackPieceColor = bpc; } highlightSquareColor = hsc; premoveHighlightColor = phc; appData.monoMode = mono; appData.allWhite = white; appData.upsideDown = flip; appData.useFont = fonts; appData.useBitmaps = bitmaps; if(grid != appData.overrideLineGap >= 0) appData.overrideLineGap = grid - 1; InitDrawingColors(); InitDrawingSizes(boardSize, 0); InvalidateRect(hwndMain, &boardRect, FALSE); } DeleteObject(pieces[0]); DeleteObject(pieces[1]); DeleteObject(pieces[2]); return TRUE; case IDCANCEL: DeleteObject(pieces[0]); DeleteObject(pieces[1]); DeleteObject(pieces[2]); EndDialog(hDlg, FALSE); return TRUE; case OPT_ChooseLightSquareColor: if (ChangeColor(hDlg, &lsc)) PaintColorBlock(hDlg, OPT_LightSquareColor, lsc); PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc, TRUE, mono, pieces); break; case OPT_ChooseDarkSquareColor: if (ChangeColor(hDlg, &dsc)) PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc); PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc, FALSE, mono, pieces); break; case OPT_ChooseWhitePieceColor: if (ChangeColor(hDlg, &wpc)) PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc); PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc, TRUE, mono, pieces); break; case OPT_ChooseBlackPieceColor: if (ChangeColor(hDlg, &bpc)) PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc); PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc, FALSE, mono, pieces); break; case OPT_ChooseHighlightSquareColor: if (ChangeColor(hDlg, &hsc)) PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc); PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc, TRUE, mono, pieces); break; case OPT_ChoosePremoveHighlightColor: if (ChangeColor(hDlg, &phc)) PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc); PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc, FALSE, mono, pieces); break; case OPT_DefaultBoardColors: lsc = ParseColorName(LIGHT_SQUARE_COLOR); dsc = ParseColorName(DARK_SQUARE_COLOR); wpc = ParseColorName(WHITE_PIECE_COLOR); bpc = ParseColorName(BLACK_PIECE_COLOR); hsc = ParseColorName(HIGHLIGHT_SQUARE_COLOR); phc = ParseColorName(PREMOVE_HIGHLIGHT_COLOR); mono = FALSE; white= FALSE; flip = FALSE; CheckDlgButton(hDlg, OPT_Monochrome, FALSE); CheckDlgButton(hDlg, OPT_AllWhite, FALSE); CheckDlgButton(hDlg, OPT_UpsideDown, FALSE); PaintColorBlock(hDlg, OPT_LightSquareColor, lsc); PaintColorBlock(hDlg, OPT_DarkSquareColor, dsc); PaintColorBlock(hDlg, OPT_WhitePieceColor, wpc); PaintColorBlock(hDlg, OPT_BlackPieceColor, bpc); PaintColorBlock(hDlg, OPT_HighlightSquareColor, hsc); PaintColorBlock(hDlg, OPT_PremoveHighlightColor, phc); SetBoardOptionEnables(hDlg); PaintSampleSquare(hDlg, OPT_SampleLightSquare, lsc, wpc, hsc, bpc, TRUE, mono, pieces); PaintSampleSquare(hDlg, OPT_SampleDarkSquare, dsc, bpc, phc, wpc, FALSE, mono, pieces); break; case OPT_Monochrome: mono = !mono; SetBoardOptionEnables(hDlg); break; case OPT_AllWhite: white = !white; break; case OPT_UpsideDown: flip = !flip; break; case OPT_Bitmaps: bitmaps = !bitmaps; break; case OPT_PieceFont: fonts = !fonts; break; case OPT_Grid: grid = !grid; break; } break; } return FALSE; } VOID BoardOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)BoardOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_BoardOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } int radioButton[] = { OPT_VariantNormal, -1, // Loadable OPT_VariantWildcastle, OPT_VariantNocastle, OPT_VariantFRC, OPT_VariantBughouse, OPT_VariantCrazyhouse, OPT_VariantLosers, OPT_VariantSuicide, OPT_VariantGiveaway, OPT_VariantTwoKings, -1, //Kriegspiel OPT_VariantAtomic, OPT_Variant3Check, OPT_VariantShatranj, -1, -1, -1, -1, -1, -1, -1, -1, OPT_VariantShogi, OPT_VariantXiangqi, OPT_VariantCourier, OPT_VariantGothic, OPT_VariantCapablanca, OPT_VariantKnightmate, OPT_VariantFairy, OPT_VariantCylinder, OPT_VariantFalcon, OPT_VariantCRC, OPT_VariantBerolina, OPT_VariantJanus, OPT_VariantSuper, OPT_VariantGreat, -1, // Twilight, OPT_VariantMakruk, OPT_VariantSChess, OPT_VariantGrand, OPT_VariantSpartan, // Spartan -2 // sentinel }; VariantClass VariantWhichRadio(HWND hDlg) { int i=0, j; while((j = radioButton[i++]) != -2) { if(j == -1) continue; // no menu button if(IsDlgButtonChecked(hDlg, j) && (appData.noChessProgram || strstr(first.variants, VariantName(i-1)))) return (VariantClass) i-1; } return gameInfo.variant; // If no button checked, keep old } void VariantShowRadio(HWND hDlg) { int i=0, j; CheckDlgButton(hDlg, radioButton[gameInfo.variant], TRUE); while((j = radioButton[i++]) != -2) { if(j == -1) continue; // no menu button EnableWindow(GetDlgItem(hDlg, j), appData.noChessProgram || strstr(first.variants, VariantName(i-1))); } } LRESULT CALLBACK NewVariantDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static VariantClass v; static int n1_ok, n2_ok, n3_ok; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_NewVariant); /* Initialize the dialog items */ VariantShowRadio(hDlg); SetDlgItemInt( hDlg, IDC_Files, -1, TRUE ); SendDlgItemMessage( hDlg, IDC_Files, EM_SETSEL, 0, -1 ); SetDlgItemInt( hDlg, IDC_Ranks, -1, TRUE ); SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 ); SetDlgItemInt( hDlg, IDC_Holdings, -1, TRUE ); SendDlgItemMessage( hDlg, IDC_Ranks, EM_SETSEL, 0, -1 ); n1_ok = n2_ok = n3_ok = FALSE; return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* * if we call EndDialog() after the call to ChangeBoardSize(), * then ChangeBoardSize() does not take effect, although the new * boardSize is saved. Go figure... */ EndDialog(hDlg, TRUE); v = VariantWhichRadio(hDlg); if(!appData.noChessProgram) { char *name = VariantName(v), buf[MSG_SIZ]; if (first.protocolVersion > 1 && StrStr(first.variants, name) == NULL) { /* [HGM] in protocol 2 we check if variant is suported by engine */ snprintf(buf, MSG_SIZ, _("Variant %s not supported by %s"), name, first.tidy); DisplayError(buf, 0); return TRUE; /* treat as _("Cancel") if first engine does not support it */ } else if (second.initDone && second.protocolVersion > 1 && StrStr(second.variants, name) == NULL) { snprintf(buf, MSG_SIZ, _("Warning: second engine (%s) does not support this!"), second.tidy); DisplayError(buf, 0); /* use of second engine is optional; only warn user */ } } gameInfo.variant = v; appData.variant = VariantName(v); appData.NrFiles = (int) GetDlgItemInt(hDlg, IDC_Files, NULL, FALSE ); appData.NrRanks = (int) GetDlgItemInt(hDlg, IDC_Ranks, NULL, FALSE ); appData.holdingsSize = (int) GetDlgItemInt(hDlg, IDC_Holdings, NULL, FALSE ); if(!n1_ok) appData.NrFiles = -1; if(!n2_ok) appData.NrRanks = -1; if(!n3_ok) appData.holdingsSize = -1; shuffleOpenings = FALSE; /* [HGM] shuffle: possible shuffle reset when we switch */ startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */ appData.pieceToCharTable = NULL; Reset(TRUE, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case IDC_Ranks: case IDC_Files: case IDC_Holdings: if( HIWORD(wParam) == EN_CHANGE ) { GetDlgItemInt(hDlg, IDC_Files, &n1_ok, FALSE ); GetDlgItemInt(hDlg, IDC_Ranks, &n2_ok, FALSE ); GetDlgItemInt(hDlg, IDC_Holdings, &n3_ok, FALSE ); /*EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok ? TRUE : FALSE );*/ } return TRUE; } break; } return FALSE; } VOID NewVariantPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)NewVariantDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_NewVariant), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * ICS Options Dialog functions * \*---------------------------------------------------------------------------*/ BOOL APIENTRY MyCreateFont(HWND hwnd, MyFont *font) { CHOOSEFONT cf; HFONT hf; /* Initialize members of the CHOOSEFONT structure. */ cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = hwnd; cf.hDC = (HDC)NULL; cf.lpLogFont = &font->lf; cf.iPointSize = 0; cf.Flags = CF_SCREENFONTS|/*CF_ANSIONLY|*/CF_INITTOLOGFONTSTRUCT; cf.rgbColors = RGB(0,0,0); cf.lCustData = 0L; cf.lpfnHook = (LPCFHOOKPROC)NULL; cf.lpTemplateName = (LPSTR)NULL; cf.hInstance = (HINSTANCE) NULL; cf.lpszStyle = (LPSTR)NULL; cf.nFontType = SCREEN_FONTTYPE; cf.nSizeMin = 0; cf.nSizeMax = 0; /* Display the CHOOSEFONT common-dialog box. */ if (!ChooseFont(&cf)) { return FALSE; } /* Create a logical font based on the user's */ /* selection and return a handle identifying */ /* that font. */ hf = CreateFontIndirect(cf.lpLogFont); if (hf == NULL) { return FALSE; } font->hf = hf; font->mfp.pointSize = (float) (cf.iPointSize / 10.0); font->mfp.bold = (font->lf.lfWeight >= FW_BOLD); font->mfp.italic = font->lf.lfItalic; font->mfp.underline = font->lf.lfUnderline; font->mfp.strikeout = font->lf.lfStrikeOut; font->mfp.charset = font->lf.lfCharSet; safeStrCpy(font->mfp.faceName, font->lf.lfFaceName, sizeof(font->mfp.faceName)/sizeof(font->mfp.faceName[0]) ); return TRUE; } VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca) { CHARFORMAT cf; cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_COLOR|CFM_CHARSET|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT|CFM_FACE|CFM_SIZE; cf.crTextColor = mca->color; cf.dwEffects = mca->effects; safeStrCpy(cf.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName, sizeof(cf.szFaceName)/sizeof(cf.szFaceName[0]) ); /* * The 20.0 below is in fact documented. yHeight is expressed in twips. * A twip is 1/20 of a font's point size. See documentation of CHARFORMAT. * --msw */ cf.yHeight = (int)(font[boardSize][CONSOLE_FONT]->mfp.pointSize * 20.0 + 0.5); cf.bCharSet = DEFAULT_CHARSET; /* should be ignored anyway */ cf.bPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; SendDlgItemMessage(hDlg, id, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); } LRESULT CALLBACK ColorizeTextDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static MyColorizeAttribs mca; static ColorClass cc; COLORREF background = (COLORREF)0; switch (message) { case WM_INITDIALOG: cc = (ColorClass)lParam; mca = colorizeAttribs[cc]; /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_Colorize); /* Initialize the dialog items */ CheckDlgButton(hDlg, OPT_Bold, (mca.effects & CFE_BOLD) != 0); CheckDlgButton(hDlg, OPT_Italic, (mca.effects & CFE_ITALIC) != 0); CheckDlgButton(hDlg, OPT_Underline, (mca.effects & CFE_UNDERLINE) != 0); CheckDlgButton(hDlg, OPT_Strikeout, (mca.effects & CFE_STRIKEOUT) != 0); /* get the current background color from the parent window */ SendMessage(GetWindow(hDlg, GW_OWNER),WM_COMMAND, (WPARAM)WM_USER_GetConsoleBackground, (LPARAM)&background); /* set the background color */ SendDlgItemMessage(hDlg, OPT_Sample, EM_SETBKGNDCOLOR, FALSE, background); SetDlgItemText(hDlg, OPT_Sample, T_(mca.name)); UpdateSampleText(hDlg, OPT_Sample, &mca); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ colorizeAttribs[cc] = mca; textAttribs[cc].color = mca.color; textAttribs[cc].effects = mca.effects; Colorize(currentColorClass, TRUE); if (cc == ColorNormal) { CHARFORMAT cf; cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_COLOR; cf.crTextColor = mca.color; SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case OPT_ChooseColor: ChangeColor(hDlg, &mca.color); UpdateSampleText(hDlg, OPT_Sample, &mca); return TRUE; default: mca.effects = (IsDlgButtonChecked(hDlg, OPT_Bold) ? CFE_BOLD : 0) | (IsDlgButtonChecked(hDlg, OPT_Italic) ? CFE_ITALIC : 0) | (IsDlgButtonChecked(hDlg, OPT_Underline) ? CFE_UNDERLINE : 0) | (IsDlgButtonChecked(hDlg, OPT_Strikeout) ? CFE_STRIKEOUT : 0); UpdateSampleText(hDlg, OPT_Sample, &mca); break; } break; } return FALSE; } VOID ColorizeTextPopup(HWND hwnd, ColorClass cc) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)ColorizeTextDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_Colorize), hwnd, (DLGPROC)lpProc, (LPARAM) cc); FreeProcInstance(lpProc); } VOID SetIcsOptionEnables(HWND hDlg) { #define ENABLE_DLG_ITEM(x,y) EnableWindow(GetDlgItem(hDlg,(x)), (y)) UINT state = IsDlgButtonChecked(hDlg, OPT_Premove); ENABLE_DLG_ITEM(OPT_PremoveWhite, state); ENABLE_DLG_ITEM(OPT_PremoveWhiteText, state); ENABLE_DLG_ITEM(OPT_PremoveBlack, state); ENABLE_DLG_ITEM(OPT_PremoveBlackText, state); ENABLE_DLG_ITEM(OPT_IcsAlarmTime, IsDlgButtonChecked(hDlg, OPT_IcsAlarm)); #undef ENABLE_DLG_ITEM } LRESULT CALLBACK IcsOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; int number; int i; static COLORREF cbc; static MyColorizeAttribs *mca; COLORREF *colorref; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ mca = colorizeAttribs; for (i=0; i < NColorClasses - 1; i++) { mca[i].color = textAttribs[i].color; mca[i].effects = textAttribs[i].effects; } cbc = consoleBackgroundColor; /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_IcsOptions); /* Initialize the dialog items */ #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y)) CHECK_BOX(OPT_AutoKibitz, appData.autoKibitz); CHECK_BOX(OPT_AutoComment, appData.autoComment); CHECK_BOX(OPT_AutoObserve, appData.autoObserve); CHECK_BOX(OPT_AutoCreate, appData.autoCreateLogon); CHECK_BOX(OPT_GetMoveList, appData.getMoveList); CHECK_BOX(OPT_LocalLineEditing, appData.localLineEditing); CHECK_BOX(OPT_QuietPlay, appData.quietPlay); CHECK_BOX(OPT_SeekGraph, appData.seekGraph); CHECK_BOX(OPT_AutoRefresh, appData.autoRefresh); CHECK_BOX(OPT_BgObserve, appData.bgObserve); CHECK_BOX(OPT_DualBoard, appData.dualBoard); CHECK_BOX(OPT_SmartMove, appData.oneClick); CHECK_BOX(OPT_Premove, appData.premove); CHECK_BOX(OPT_PremoveWhite, appData.premoveWhite); CHECK_BOX(OPT_PremoveBlack, appData.premoveBlack); CHECK_BOX(OPT_IcsAlarm, appData.icsAlarm); CHECK_BOX(OPT_DontColorize, !appData.colorize); #undef CHECK_BOX snprintf(buf, MSG_SIZ, "%d", appData.icsAlarmTime / 1000); SetDlgItemText(hDlg, OPT_IcsAlarmTime, buf); SetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText); SetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText); SetDlgItemText(hDlg, OPT_StartupChatBoxes, appData.chatBoxes); SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc); SetDlgItemText(hDlg, OPT_SampleShout, T_(mca[ColorShout].name)); SetDlgItemText(hDlg, OPT_SampleSShout, T_(mca[ColorSShout].name)); SetDlgItemText(hDlg, OPT_SampleChannel1, T_(mca[ColorChannel1].name)); SetDlgItemText(hDlg, OPT_SampleChannel, T_(mca[ColorChannel].name)); SetDlgItemText(hDlg, OPT_SampleKibitz, T_(mca[ColorKibitz].name)); SetDlgItemText(hDlg, OPT_SampleTell, T_(mca[ColorTell].name)); SetDlgItemText(hDlg, OPT_SampleChallenge, T_(mca[ColorChallenge].name)); SetDlgItemText(hDlg, OPT_SampleRequest, T_(mca[ColorRequest].name)); SetDlgItemText(hDlg, OPT_SampleSeek, T_(mca[ColorSeek].name)); SetDlgItemText(hDlg, OPT_SampleNormal, T_(mca[ColorNormal].name)); UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]); UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]); UpdateSampleText(hDlg, OPT_SampleChannel1, &mca[ColorChannel1]); UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]); UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]); UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]); UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]); UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]); UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]); UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]); SetIcsOptionEnables(hDlg); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case WM_USER_GetConsoleBackground: /* the ColorizeTextDialog needs the current background color */ colorref = (COLORREF *)lParam; *colorref = cbc; return FALSE; case IDOK: /* Read changed options from the dialog box */ GetDlgItemText(hDlg, OPT_IcsAlarmTime, buf, MSG_SIZ); if (sscanf(buf, "%d", &number) != 1 || (number < 0)){ MessageBox(hDlg, _("Invalid ICS Alarm Time"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x)) appData.icsAlarm = IS_CHECKED(OPT_IcsAlarm); appData.premove = IS_CHECKED(OPT_Premove); appData.premoveWhite = IS_CHECKED(OPT_PremoveWhite); appData.premoveBlack = IS_CHECKED(OPT_PremoveBlack); appData.autoKibitz = IS_CHECKED(OPT_AutoKibitz); appData.autoComment = IS_CHECKED(OPT_AutoComment); appData.autoObserve = IS_CHECKED(OPT_AutoObserve); appData.autoCreateLogon = IS_CHECKED(OPT_AutoCreate); appData.getMoveList = IS_CHECKED(OPT_GetMoveList); appData.localLineEditing = IS_CHECKED(OPT_LocalLineEditing); appData.quietPlay = IS_CHECKED(OPT_QuietPlay); appData.seekGraph = IS_CHECKED(OPT_SeekGraph); appData.autoRefresh = IS_CHECKED(OPT_AutoRefresh); appData.bgObserve = IS_CHECKED(OPT_BgObserve); appData.dualBoard = IS_CHECKED(OPT_DualBoard); appData.oneClick = IS_CHECKED(OPT_SmartMove); #undef IS_CHECKED appData.icsAlarmTime = number * 1000; GetDlgItemText(hDlg, OPT_PremoveWhiteText, appData.premoveWhiteText, 5); GetDlgItemText(hDlg, OPT_PremoveBlackText, appData.premoveBlackText, 5); GetDlgItemText(hDlg, OPT_StartupChatBoxes, buf, sizeof(buf)); buf[sizeof(buf)-1] = NULLCHAR; appData.chatBoxes = StrSave(buf); // memory leak if (appData.localLineEditing) { DontEcho(); EchoOn(); } else { DoEcho(); EchoOff(); } appData.colorize = (Boolean)!IsDlgButtonChecked(hDlg, OPT_DontColorize); ChangedConsoleFont(); if (!appData.colorize) { CHARFORMAT cf; COLORREF background = ParseColorName(COLOR_BKGD); /* SetDefaultTextAttribs(); Colorize(currentColorClass); */ cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_COLOR; cf.crTextColor = ParseColorName(COLOR_NORMAL); SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); SendDlgItemMessage(hwndConsole, OPT_ConsoleText, EM_SETBKGNDCOLOR, FALSE, background); SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, EM_SETBKGNDCOLOR, FALSE, background); } if (cbc != consoleBackgroundColor) { consoleBackgroundColor = cbc; if (appData.colorize) { SendDlgItemMessage(hwndConsole, OPT_ConsoleText, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor); SendDlgItemMessage(hwndConsole, OPT_ConsoleInput, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor); } } for (i=0; i < NColorClasses - 1; i++) { textAttribs[i].color = mca[i].color; textAttribs[i].effects = mca[i].effects; } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case OPT_ChooseShoutColor: ColorizeTextPopup(hDlg, ColorShout); UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]); break; case OPT_ChooseSShoutColor: ColorizeTextPopup(hDlg, ColorSShout); UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]); break; case OPT_ChooseChannel1Color: ColorizeTextPopup(hDlg, ColorChannel1); UpdateSampleText(hDlg, OPT_SampleChannel1, &colorizeAttribs[ColorChannel1]); break; case OPT_ChooseChannelColor: ColorizeTextPopup(hDlg, ColorChannel); UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]); break; case OPT_ChooseKibitzColor: ColorizeTextPopup(hDlg, ColorKibitz); UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]); break; case OPT_ChooseTellColor: ColorizeTextPopup(hDlg, ColorTell); UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]); break; case OPT_ChooseChallengeColor: ColorizeTextPopup(hDlg, ColorChallenge); UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]); break; case OPT_ChooseRequestColor: ColorizeTextPopup(hDlg, ColorRequest); UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]); break; case OPT_ChooseSeekColor: ColorizeTextPopup(hDlg, ColorSeek); UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]); break; case OPT_ChooseNormalColor: ColorizeTextPopup(hDlg, ColorNormal); UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]); break; case OPT_ChooseBackgroundColor: if (ChangeColor(hDlg, &cbc)) { SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc); } break; case OPT_DefaultColors: for (i=0; i < NColorClasses - 1; i++) ParseAttribs(&mca[i].color, &mca[i].effects, defaultTextAttribs[i]); cbc = ParseColorName(COLOR_BKGD); SendDlgItemMessage(hDlg, OPT_SampleShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSShout, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel1, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChannel, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleKibitz, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleTell, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleChallenge, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleRequest, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleSeek, EM_SETBKGNDCOLOR, 0, cbc); SendDlgItemMessage(hDlg, OPT_SampleNormal, EM_SETBKGNDCOLOR, 0, cbc); UpdateSampleText(hDlg, OPT_SampleShout, &mca[ColorShout]); UpdateSampleText(hDlg, OPT_SampleSShout, &mca[ColorSShout]); UpdateSampleText(hDlg, OPT_SampleChannel1, &mca[ColorChannel1]); UpdateSampleText(hDlg, OPT_SampleChannel, &mca[ColorChannel]); UpdateSampleText(hDlg, OPT_SampleKibitz, &mca[ColorKibitz]); UpdateSampleText(hDlg, OPT_SampleTell, &mca[ColorTell]); UpdateSampleText(hDlg, OPT_SampleChallenge, &mca[ColorChallenge]); UpdateSampleText(hDlg, OPT_SampleRequest, &mca[ColorRequest]); UpdateSampleText(hDlg, OPT_SampleSeek, &mca[ColorSeek]); UpdateSampleText(hDlg, OPT_SampleNormal, &mca[ColorNormal]); break; default: SetIcsOptionEnables(hDlg); break; } break; } return FALSE; } VOID IcsOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)IcsOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_IcsOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Fonts Dialog functions * \*---------------------------------------------------------------------------*/ char *string; // sorry VOID SetSampleFontText(HWND hwnd, int id, const MyFont *mf) { char buf[MSG_SIZ]; HWND hControl; HDC hdc; CHARFORMAT cf; SIZE size; RECT rectClient, rectFormat; HFONT oldFont; POINT center; int len; len = snprintf(buf, MSG_SIZ, "%.0f pt. %s%s%s\n", mf->mfp.pointSize, mf->mfp.faceName, mf->mfp.bold ? " bold" : "", mf->mfp.italic ? " italic" : ""); if(id != OPT_SamplePieceFont) SetDlgItemText(hwnd, id, buf); else SetDlgItemText(hwnd, id, string); hControl = GetDlgItem(hwnd, id); hdc = GetDC(hControl); SetMapMode(hdc, MM_TEXT); /* 1 pixel == 1 logical unit */ oldFont = SelectObject(hdc, mf->hf); /* get number of logical units necessary to display font name */ GetTextExtentPoint32(hdc, buf, len, &size); /* calculate formatting rectangle in the rich edit control. * May be larger or smaller than the actual control. */ GetClientRect(hControl, &rectClient); center.x = (rectClient.left + rectClient.right) / 2; center.y = (rectClient.top + rectClient.bottom) / 2; rectFormat.top = center.y - (size.cy / 2) - 1; rectFormat.bottom = center.y + (size.cy / 2) + 1; rectFormat.left = center.x - (size.cx / 2) - 1; rectFormat.right = center.x + (size.cx / 2) + 1; cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_FACE|CFM_SIZE|CFM_CHARSET|CFM_BOLD|CFM_ITALIC; cf.dwEffects = 0; if (mf->lf.lfWeight == FW_BOLD) cf.dwEffects |= CFE_BOLD; if (mf->lf.lfItalic) cf.dwEffects |= CFE_ITALIC; safeStrCpy(cf.szFaceName, mf->mfp.faceName, sizeof(cf.szFaceName)/sizeof(cf.szFaceName[0]) ); /* * yHeight is expressed in twips. A twip is 1/20 of a font's point * size. See documentation of CHARFORMAT. --msw */ cf.yHeight = (int)(mf->mfp.pointSize * 20.0 + 0.5); cf.bCharSet = mf->lf.lfCharSet; cf.bPitchAndFamily = mf->lf.lfPitchAndFamily; /* format the text in the rich edit control */ SendMessage(hControl, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cf); if(id != OPT_SamplePieceFont) SendMessage(hControl, EM_SETRECT, (WPARAM)0, (LPARAM) &rectFormat); /* clean up */ SelectObject(hdc, oldFont); ReleaseDC(hControl, hdc); } VOID CopyFont(MyFont *dest, const MyFont *src) { dest->mfp.pointSize = src->mfp.pointSize; dest->mfp.bold = src->mfp.bold; dest->mfp.italic = src->mfp.italic; dest->mfp.underline = src->mfp.underline; dest->mfp.strikeout = src->mfp.strikeout; dest->mfp.charset = src->mfp.charset; safeStrCpy(dest->mfp.faceName, src->mfp.faceName, sizeof(dest->mfp.faceName)/sizeof(dest->mfp.faceName[0]) ); CreateFontInMF(dest); } LRESULT CALLBACK FontOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static MyFont workFont[NUM_FONTS+1]; static BOOL firstPaint; static char pieceText[] = "ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz"; int i; RECT rect; switch (message) { case WM_INITDIALOG: /* copy the current font settings into a working copy */ for (i=0; i < NUM_FONTS; i++) CopyFont(&workFont[i], font[boardSize][i]); strncpy(workFont[NUM_FONTS].mfp.faceName, appData.renderPiecesWithFont, sizeof(workFont[NUM_FONTS].mfp.faceName)); workFont[NUM_FONTS].mfp.pointSize = 16.; workFont[NUM_FONTS].mfp.charset = DEFAULT_CHARSET; Translate(hDlg, DLG_Fonts); if (!appData.icsActive) EnableWindow(GetDlgItem(hDlg, OPT_ChooseConsoleFont), FALSE); firstPaint = TRUE; /* see rant below */ /* If I don't call SetFocus(), the dialog won't respond to the keyboard * when first drawn. Why is this the only dialog that behaves this way? Is * is the WM_PAINT stuff below?? Sigh... */ SetFocus(GetDlgItem(hDlg, IDOK)); break; case WM_PAINT: /* This should not be necessary. However, if SetSampleFontText() is called * in response to WM_INITDIALOG, the strings are not properly centered in * the controls when the dialog first appears. I can't figure out why, so * this is the workaround. --msw */ if (firstPaint) { SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]); SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]); SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]); SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]); SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]); SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]); SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]); SetSampleFontText(hDlg, OPT_SampleGameListFont, &workFont[GAMELIST_FONT]); string = appData.fontToPieceTable; SetSampleFontText(hDlg, OPT_SamplePieceFont, &workFont[NUM_FONTS]); firstPaint = FALSE; } break; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* again, it seems to avoid redraw problems if we call EndDialog first */ EndDialog(hDlg, FALSE); /* copy modified settings back to the fonts array */ for (i=0; i < NUM_FONTS; i++) CopyFont(font[boardSize][i], &workFont[i]); { // Make new piece-to-char table char buf[MSG_SIZ]; GetDlgItemText(hDlg, OPT_SamplePieceFont, buf, MSG_SIZ); ASSIGN(appData.fontToPieceTable, buf); } ASSIGN(appData.renderPiecesWithFont, workFont[NUM_FONTS].mfp.faceName); // piece font /* a sad necessity due to the original design of having a separate * console font, tags font, and comment font for each board size. IMHO * these fonts should not be dependent on the current board size. I'm * running out of time, so I am doing this hack rather than redesign the * data structure. Besides, I think if I redesigned the data structure, I * might break backwards compatibility with old winboard.ini files. * --msw */ for (i=0; i < NUM_SIZES; i++) { CopyFont(font[i][EDITTAGS_FONT], &workFont[EDITTAGS_FONT]); CopyFont(font[i][CONSOLE_FONT], &workFont[CONSOLE_FONT]); CopyFont(font[i][COMMENT_FONT], &workFont[COMMENT_FONT]); CopyFont(font[i][MOVEHISTORY_FONT], &workFont[MOVEHISTORY_FONT]); CopyFont(font[i][GAMELIST_FONT], &workFont[GAMELIST_FONT]); } /* end sad necessity */ InitDrawingSizes(boardSize, 0); InvalidateRect(hwndMain, NULL, TRUE); if (commentDialog) { SendDlgItemMessage(commentDialog, OPT_CommentText, WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf, MAKELPARAM(TRUE, 0)); GetClientRect(GetDlgItem(commentDialog, OPT_CommentText), &rect); InvalidateRect(commentDialog, &rect, TRUE); } if (editTagsDialog) { SendDlgItemMessage(editTagsDialog, OPT_TagsText, WM_SETFONT, (WPARAM)font[boardSize][EDITTAGS_FONT]->hf, MAKELPARAM(TRUE, 0)); GetClientRect(GetDlgItem(editTagsDialog, OPT_TagsText), &rect); InvalidateRect(editTagsDialog, &rect, TRUE); } if( moveHistoryDialog != NULL ) { SendDlgItemMessage(moveHistoryDialog, IDC_MoveHistory, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0)); SendMessage( moveHistoryDialog, WM_INITDIALOG, 0, 0 ); // InvalidateRect(editTagsDialog, NULL, TRUE); // [HGM] this ws improperly cloned? } if( engineOutputDialog != NULL ) { SendDlgItemMessage(engineOutputDialog, IDC_EngineMemo1, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0)); SendDlgItemMessage(engineOutputDialog, IDC_EngineMemo2, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0)); } if (hwndConsole) { ChangedConsoleFont(); } for (i=0; idef, &workFont[i].mfp); CreateFontInMF(&workFont[i]); } SetSampleFontText(hDlg, OPT_SampleClockFont, &workFont[CLOCK_FONT]); SetSampleFontText(hDlg, OPT_SampleMessageFont, &workFont[MESSAGE_FONT]); SetSampleFontText(hDlg, OPT_SampleCoordFont, &workFont[COORD_FONT]); SetSampleFontText(hDlg, OPT_SampleTagFont, &workFont[EDITTAGS_FONT]); SetSampleFontText(hDlg, OPT_SampleCommentsFont, &workFont[COMMENT_FONT]); SetSampleFontText(hDlg, OPT_SampleConsoleFont, &workFont[CONSOLE_FONT]); SetSampleFontText(hDlg, OPT_SampleMoveHistoryFont, &workFont[MOVEHISTORY_FONT]); SetSampleFontText(hDlg, OPT_SampleGameListFont, &workFont[GAMELIST_FONT]); break; } } return FALSE; } VOID FontsOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)FontOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_Fonts), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Sounds Dialog functions * \*---------------------------------------------------------------------------*/ SoundComboData soundComboData[] = { {N_("Move"), NULL}, {N_("Bell"), NULL}, {N_("ICS Alarm"), NULL}, {N_("ICS Win"), NULL}, {N_("ICS Loss"), NULL}, {N_("ICS Draw"), NULL}, {N_("ICS Unfinished"), NULL}, {N_("Shout"), NULL}, {N_("SShout/CShout"), NULL}, {N_("Channel 1"), NULL}, {N_("Channel"), NULL}, {N_("Kibitz"), NULL}, {N_("Tell"), NULL}, {N_("Challenge"), NULL}, {N_("Request"), NULL}, {N_("Seek"), NULL}, {NULL, NULL}, }; void InitSoundComboData(SoundComboData *scd) { SoundClass sc; ColorClass cc; int index; /* copy current sound settings to combo array */ for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) { scd[sc].name = strdup(sounds[sc].name); } for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) { index = (int)cc + (int)NSoundClasses; scd[index].name = strdup(textAttribs[cc].sound.name); } } void ResetSoundComboData(SoundComboData *scd) { while (scd->label) { if (scd->name != NULL) { free (scd->name); scd->name = NULL; } scd++; } } void InitSoundCombo(HWND hwndCombo, SoundComboData *scd) { char buf[255]; DWORD err; DWORD cnt = 0; SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); /* send the labels to the combo box */ while (scd->label) { err = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) T_(scd->label)); if (err != cnt++) { snprintf(buf, MSG_SIZ, "InitSoundCombo(): err '%d', cnt '%d'\n", (int)err, (int)cnt); MessageBox(NULL, buf, NULL, MB_OK); } scd++; } SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0); } int SoundDialogWhichRadio(HWND hDlg) { if (IsDlgButtonChecked(hDlg, OPT_NoSound)) return OPT_NoSound; if (IsDlgButtonChecked(hDlg, OPT_DefaultBeep)) return OPT_DefaultBeep; if (IsDlgButtonChecked(hDlg, OPT_BuiltInSound)) return OPT_BuiltInSound; if (IsDlgButtonChecked(hDlg, OPT_WavFile)) return OPT_WavFile; return -1; } VOID SoundDialogSetEnables(HWND hDlg, int radio) { EnableWindow(GetDlgItem(hDlg, OPT_BuiltInSoundName), radio == OPT_BuiltInSound); EnableWindow(GetDlgItem(hDlg, OPT_WavFileName), radio == OPT_WavFile); EnableWindow(GetDlgItem(hDlg, OPT_BrowseSound), radio == OPT_WavFile); } char * SoundDialogGetName(HWND hDlg, int radio) { static char buf[MSG_SIZ], buf2[MSG_SIZ], buf3[MSG_SIZ]; char *dummy, *ret; switch (radio) { case OPT_NoSound: default: return ""; case OPT_DefaultBeep: return "$"; case OPT_BuiltInSound: buf[0] = '!'; GetDlgItemText(hDlg, OPT_BuiltInSoundName, buf + 1, sizeof(buf) - 1); return buf; case OPT_WavFile: GetDlgItemText(hDlg, OPT_WavFileName, buf, sizeof(buf)); GetCurrentDirectory(MSG_SIZ, buf3); SetCurrentDirectory(installDir); if (GetFullPathName(buf, MSG_SIZ, buf2, &dummy)) { ret = buf2; } else { ret = buf; } SetCurrentDirectory(buf3); return ret; } } void DisplaySelectedSound(HWND hDlg, HWND hCombo, const char *name) { int radio; /* * I think it's best to clear the combo and edit boxes. It looks stupid * to have a value from another sound event sitting there grayed out. */ SetDlgItemText(hDlg, OPT_WavFileName, ""); SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); if (appData.debugMode) fprintf(debugFP, "DisplaySelectedSound(,,'%s'):\n", name); switch (name[0]) { case NULLCHAR: radio = OPT_NoSound; break; case '$': if (name[1] == NULLCHAR) { radio = OPT_DefaultBeep; } else { radio = OPT_WavFile; SetDlgItemText(hDlg, OPT_WavFileName, name); } break; case '!': if (name[1] == NULLCHAR) { radio = OPT_NoSound; } else { radio = OPT_BuiltInSound; if (SendMessage(hCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) (name + 1)) == CB_ERR) { SendMessage(hCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); SendMessage(hCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) (name + 1)); } } break; default: radio = OPT_WavFile; SetDlgItemText(hDlg, OPT_WavFileName, name); break; } SoundDialogSetEnables(hDlg, radio); CheckRadioButton(hDlg, OPT_NoSound, OPT_WavFile, radio); } char *builtInSoundNames[] = BUILT_IN_SOUND_NAMES; LRESULT CALLBACK SoundOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hSoundCombo; static DWORD index; static HWND hBISN; int radio; MySound tmp; FILE *f; char buf[MSG_SIZ]; char *newName; SoundClass sc; ColorClass cc; SoundComboData *scd; int oldMute; switch (message) { case WM_INITDIALOG: /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_Sound); /* Initialize the built-in sounds combo */ hBISN = GetDlgItem(hDlg, OPT_BuiltInSoundName); InitComboStrings(hBISN, builtInSoundNames); /* Initialize the sound events combo */ index = 0; InitSoundComboData(soundComboData); hSoundCombo = GetDlgItem(hDlg, CBO_Sounds); InitSoundCombo(hSoundCombo, soundComboData); /* update the dialog */ DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name); return TRUE; case WM_COMMAND: /* message: received a command */ if (((HWND)lParam == hSoundCombo) && (HIWORD(wParam) == CBN_SELCHANGE)) { /* * the user has selected a new sound event. We must store the name for * the previously selected event, then retrieve the name for the * newly selected event and update the dialog. */ radio = SoundDialogWhichRadio(hDlg); newName = strdup(SoundDialogGetName(hDlg, radio)); if (strcmp(newName, soundComboData[index].name) != 0) { free(soundComboData[index].name); soundComboData[index].name = newName; } else { free(newName); newName = NULL; } /* now get the settings for the newly selected event */ index = SendMessage(hSoundCombo, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name); return TRUE; } switch (LOWORD(wParam)) { case IDOK: /* * save the name for the currently selected sound event */ radio = SoundDialogWhichRadio(hDlg); newName = strdup(SoundDialogGetName(hDlg, radio)); if (strcmp(soundComboData[index].name, newName) != 0) { free(soundComboData[index].name); soundComboData[index].name = newName; } else { free(newName); newName = NULL; } /* save all the sound names that changed and load the sounds */ for ( sc = (SoundClass)0; sc < NSoundClasses; sc++) { if (strcmp(soundComboData[sc].name, sounds[sc].name) != 0) { free(sounds[sc].name); sounds[sc].name = strdup(soundComboData[sc].name); MyLoadSound(&sounds[sc]); } } for ( cc = (ColorClass)0; cc < NColorClasses - 2; cc++) { index = (int)cc + (int)NSoundClasses; if (strcmp(soundComboData[index].name, textAttribs[cc].sound.name) != 0) { free(textAttribs[cc].sound.name); textAttribs[cc].sound.name = strdup(soundComboData[index].name); MyLoadSound(&textAttribs[cc].sound); } } mute = FALSE; // [HGM] mute: switch sounds automatically on if we select one CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds,MF_BYCOMMAND|MF_UNCHECKED); ResetSoundComboData(soundComboData); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: ResetSoundComboData(soundComboData); EndDialog(hDlg, FALSE); return TRUE; case OPT_DefaultSounds: /* can't use SetDefaultSounds() because we need to be able to "undo" if * user selects "Cancel" later on. So we do it the hard way here. */ scd = &soundComboData[0]; while (scd->label != NULL) { if (scd->name != NULL) free(scd->name); scd->name = strdup(""); scd++; } free(soundComboData[(int)SoundBell].name); soundComboData[(int)SoundBell].name = strdup(SOUND_BELL); DisplaySelectedSound(hDlg, hBISN, soundComboData[index].name); break; case OPT_PlaySound: radio = SoundDialogWhichRadio(hDlg); tmp.name = strdup(SoundDialogGetName(hDlg, radio)); tmp.data = NULL; MyLoadSound(&tmp); oldMute = mute; mute = FALSE; // [HGM] mute: always sound when user presses play, ignorig mute setting MyPlaySound(&tmp); mute = oldMute; if (tmp.data != NULL) FreeResource(tmp.data); // technically obsolete fn, but tmp.data is NOT malloc'd mem if (tmp.name != NULL) free(tmp.name); return TRUE; case OPT_BrowseSound: f = OpenFileDialog(hDlg, "rb", NULL, "wav", SOUND_FILT, _("Browse for Sound File"), NULL, NULL, buf); if (f != NULL) { fclose(f); SetDlgItemText(hDlg, OPT_WavFileName, buf); } return TRUE; default: radio = SoundDialogWhichRadio(hDlg); SoundDialogSetEnables(hDlg, radio); break; } break; } return FALSE; } VOID SoundOptionsPopup(HWND hwnd) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)SoundOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_Sound), hwnd, (DLGPROC)lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Comm Port dialog functions * \*---------------------------------------------------------------------------*/ #define FLOW_NONE 0 #define FLOW_XOFF 1 #define FLOW_CTS 2 #define FLOW_DSR 3 #define PORT_NONE ComboData cdPort[] = { {"None", PORT_NONE}, {"COM1", 1}, {"COM2", 2}, {"COM3", 3}, {"COM4", 4}, {NULL, 0} }; ComboData cdDataRate[] = { {"110", 110}, {"300", 300}, {"600", 600}, {"1200", 1200}, {"2400", 2400}, {"4800", 4800}, {"9600", 9600}, {"19200", 19200}, {"38400", 38400}, {NULL, 0} }; ComboData cdDataBits[] = { {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {NULL, 0} }; ComboData cdParity[] = { {"None", NOPARITY}, {"Odd", ODDPARITY}, {"Even", EVENPARITY}, {"Mark", MARKPARITY}, {"Space", SPACEPARITY}, {NULL, 0} }; ComboData cdStopBits[] = { {"1", ONESTOPBIT}, {"1.5", ONE5STOPBITS}, {"2", TWOSTOPBITS}, {NULL, 0} }; ComboData cdFlow[] = { {"None", FLOW_NONE}, {"Xoff/Xon", FLOW_XOFF}, {"CTS", FLOW_CTS}, {"DSR", FLOW_DSR}, {NULL, 0} }; VOID ParseCommSettings(char *arg, DCB *dcb) { int dataRate, count; char bits[MSG_SIZ], parity[MSG_SIZ], stopBits[MSG_SIZ], flow[MSG_SIZ]; ComboData *cd; count = sscanf(arg, "%d%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]%*[, ]%[^, ]", &dataRate, bits, parity, stopBits, flow); if (count != 5) goto cant_parse; dcb->BaudRate = dataRate; cd = cdDataBits; while (cd->label != NULL) { if (StrCaseCmp(cd->label, bits) == 0) { dcb->ByteSize = cd->value; break; } cd++; } if (cd->label == NULL) goto cant_parse; cd = cdParity; while (cd->label != NULL) { if (StrCaseCmp(cd->label, parity) == 0) { dcb->Parity = cd->value; break; } cd++; } if (cd->label == NULL) goto cant_parse; cd = cdStopBits; while (cd->label != NULL) { if (StrCaseCmp(cd->label, stopBits) == 0) { dcb->StopBits = cd->value; break; } cd++; } cd = cdFlow; if (cd->label == NULL) goto cant_parse; while (cd->label != NULL) { if (StrCaseCmp(cd->label, flow) == 0) { switch (cd->value) { case FLOW_NONE: dcb->fOutX = FALSE; dcb->fOutxCtsFlow = FALSE; dcb->fOutxDsrFlow = FALSE; break; case FLOW_CTS: dcb->fOutX = FALSE; dcb->fOutxCtsFlow = TRUE; dcb->fOutxDsrFlow = FALSE; break; case FLOW_DSR: dcb->fOutX = FALSE; dcb->fOutxCtsFlow = FALSE; dcb->fOutxDsrFlow = TRUE; break; case FLOW_XOFF: dcb->fOutX = TRUE; dcb->fOutxCtsFlow = FALSE; dcb->fOutxDsrFlow = FALSE; break; } break; } cd++; } if (cd->label == NULL) goto cant_parse; return; cant_parse: ExitArgError(_("Can't parse com port settings"), arg, TRUE); } VOID PrintCommSettings(FILE *f, char *name, DCB *dcb) { char *flow = "??", *parity = "??", *stopBits = "??"; ComboData *cd; cd = cdParity; while (cd->label != NULL) { if (dcb->Parity == cd->value) { parity = cd->label; break; } cd++; } cd = cdStopBits; while (cd->label != NULL) { if (dcb->StopBits == cd->value) { stopBits = cd->label; break; } cd++; } if (dcb->fOutX) { flow = cdFlow[FLOW_XOFF].label; } else if (dcb->fOutxCtsFlow) { flow = cdFlow[FLOW_CTS].label; } else if (dcb->fOutxDsrFlow) { flow = cdFlow[FLOW_DSR].label; } else { flow = cdFlow[FLOW_NONE].label; } fprintf(f, "/%s=%d,%d,%s,%s,%s\n", name, (int)dcb->BaudRate, dcb->ByteSize, parity, stopBits, flow); } void InitCombo(HANDLE hwndCombo, ComboData *cd) { SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); while (cd->label != NULL) { SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) cd->label); cd++; } } void SelectComboValue(HANDLE hwndCombo, ComboData *cd, unsigned value) { int i; i = 0; while (cd->label != NULL) { if (cd->value == value) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) i, (LPARAM) 0); return; } cd++; i++; } } LRESULT CALLBACK CommPortOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; HANDLE hwndCombo; char *p; LRESULT index; unsigned value; int err; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow(hDlg, GW_OWNER)); Translate(hDlg, DLG_CommPort); /* Initialize the dialog items */ /* !! There should probably be some synchronization in accessing hCommPort and dcb. Or does modal nature of this dialog box do it for us? */ hwndCombo = GetDlgItem(hDlg, OPT_Port); InitCombo(hwndCombo, cdPort); p = strrchr(appData.icsCommPort, '\\'); if (p++ == NULL) p = appData.icsCommPort; if ((*p == '\0') || (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) p) == CB_ERR)) { SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) "None"); } EnableWindow(hwndCombo, hCommPort == NULL); /*!! don't allow change for now*/ hwndCombo = GetDlgItem(hDlg, OPT_DataRate); InitCombo(hwndCombo, cdDataRate); snprintf(buf, MSG_SIZ, "%u", (int)dcb.BaudRate); if (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) buf) == CB_ERR) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); SendMessage(hwndCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) buf); } hwndCombo = GetDlgItem(hDlg, OPT_Bits); InitCombo(hwndCombo, cdDataBits); SelectComboValue(hwndCombo, cdDataBits, dcb.ByteSize); hwndCombo = GetDlgItem(hDlg, OPT_Parity); InitCombo(hwndCombo, cdParity); SelectComboValue(hwndCombo, cdParity, dcb.Parity); hwndCombo = GetDlgItem(hDlg, OPT_StopBits); InitCombo(hwndCombo, cdStopBits); SelectComboValue(hwndCombo, cdStopBits, dcb.StopBits); hwndCombo = GetDlgItem(hDlg, OPT_Flow); InitCombo(hwndCombo, cdFlow); if (dcb.fOutX) { SelectComboValue(hwndCombo, cdFlow, FLOW_XOFF); } else if (dcb.fOutxCtsFlow) { SelectComboValue(hwndCombo, cdFlow, FLOW_CTS); } else if (dcb.fOutxDsrFlow) { SelectComboValue(hwndCombo, cdFlow, FLOW_DSR); } else { SelectComboValue(hwndCombo, cdFlow, FLOW_NONE); } return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ #ifdef NOTDEF /* !! Currently we can't change comm ports in midstream */ hwndCombo = GetDlgItem(hDlg, OPT_Port); index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); if (index == PORT_NONE) { appData.icsCommPort = ""; if (hCommPort != NULL) { CloseHandle(hCommPort); hCommPort = NULL; } EndDialog(hDlg, TRUE); return TRUE; } SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf); appData.icsCommPort = strdup(buf); if (hCommPort != NULL) { CloseHandle(hCommPort); hCommPort = NULL; } /* now what?? can't really do this; have to fix up the ChildProc and InputSource records for the comm port that we gave to the back end. */ #endif /*NOTDEF*/ hwndCombo = GetDlgItem(hDlg, OPT_DataRate); SendMessage(hwndCombo, WM_GETTEXT, (WPARAM) MSG_SIZ, (LPARAM) buf); if (sscanf(buf, "%u", &value) != 1) { MessageBox(hDlg, _("Invalid data rate"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return TRUE; } dcb.BaudRate = value; hwndCombo = GetDlgItem(hDlg, OPT_Bits); index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); dcb.ByteSize = cdDataBits[index].value; hwndCombo = GetDlgItem(hDlg, OPT_Parity); index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); dcb.Parity = cdParity[index].value; hwndCombo = GetDlgItem(hDlg, OPT_StopBits); index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); dcb.StopBits = cdStopBits[index].value; hwndCombo = GetDlgItem(hDlg, OPT_Flow); index = SendMessage(hwndCombo, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); switch (cdFlow[index].value) { case FLOW_NONE: dcb.fOutX = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; break; case FLOW_CTS: dcb.fOutX = FALSE; dcb.fOutxCtsFlow = TRUE; dcb.fOutxDsrFlow = FALSE; break; case FLOW_DSR: dcb.fOutX = FALSE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = TRUE; break; case FLOW_XOFF: dcb.fOutX = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; break; } if (!SetCommState(hCommPort, (LPDCB) &dcb)) { err = GetLastError(); switch(MessageBox(hDlg, "Failed to set comm port state;\r\ninvalid options?", _("Option Error"), MB_ABORTRETRYIGNORE|MB_ICONQUESTION)) { case IDABORT: DisplayFatalError(_("Failed to set comm port state"), err, 1); exit(1); /*is it ok to do this from here?*/ case IDRETRY: return TRUE; case IDIGNORE: EndDialog(hDlg, TRUE); return TRUE; } } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; } return FALSE; } VOID CommPortOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)CommPortOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_CommPort), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Load Options dialog functions * \*---------------------------------------------------------------------------*/ int LoadOptionsWhichRadio(HWND hDlg) { return (IsDlgButtonChecked(hDlg, OPT_Exact) ? 1 : (IsDlgButtonChecked(hDlg, OPT_Subset) ? 2 : (IsDlgButtonChecked(hDlg, OPT_Struct) ? 3 : (IsDlgButtonChecked(hDlg, OPT_Material) ? 4 : (IsDlgButtonChecked(hDlg, OPT_Range) ? 5 : (IsDlgButtonChecked(hDlg, OPT_Difference) ? 6 : -1)))))); } VOID SetLoadOptionEnables(HWND hDlg) { UINT state; state = IsDlgButtonChecked(hDlg, OPT_Autostep); EnableWindow(GetDlgItem(hDlg, OPT_ASTimeDelay), state); EnableWindow(GetDlgItem(hDlg, OPT_AStext1), state); } LRESULT CALLBACK LoadOptions(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; float fnumber; int ok; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_LoadOptions); /* Initialize the dialog items */ if (appData.timeDelay >= 0.0) { CheckDlgButton(hDlg, OPT_Autostep, TRUE); snprintf(buf, MSG_SIZ, "%.2g", appData.timeDelay); SetDlgItemText(hDlg, OPT_ASTimeDelay, buf); } else { CheckDlgButton(hDlg, OPT_Autostep, FALSE); } SetLoadOptionEnables(hDlg); SetDlgItemInt(hDlg, OPT_elo1, appData.eloThreshold1, FALSE); SetDlgItemInt(hDlg, OPT_elo2, appData.eloThreshold2, FALSE); SetDlgItemInt(hDlg, OPT_date, appData.dateThreshold, FALSE); SetDlgItemInt(hDlg, OPT_Stretch, appData.stretch, FALSE); CheckDlgButton(hDlg, OPT_Reversed, appData.ignoreColors); CheckDlgButton(hDlg, OPT_Mirror, appData.findMirror); switch (appData.searchMode) { case 1: CheckDlgButton(hDlg, OPT_Exact, TRUE); break; case 2: CheckDlgButton(hDlg, OPT_Subset, TRUE); break; case 3: CheckDlgButton(hDlg, OPT_Struct, TRUE); break; case 4: CheckDlgButton(hDlg, OPT_Material, TRUE); break; case 5: CheckDlgButton(hDlg, OPT_Range, TRUE); break; case 6: CheckDlgButton(hDlg, OPT_Difference, TRUE); break; } return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ if (IsDlgButtonChecked(hDlg, OPT_Autostep)) { GetDlgItemText(hDlg, OPT_ASTimeDelay, buf, MSG_SIZ); if (sscanf(buf, "%f", &fnumber) != 1) { MessageBox(hDlg, _("Invalid load game step rate"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } appData.timeDelay = fnumber; } else { appData.timeDelay = (float) -1.0; } appData.eloThreshold1 = GetDlgItemInt(hDlg, OPT_elo1, &ok, FALSE); appData.eloThreshold2 = GetDlgItemInt(hDlg, OPT_elo2, &ok, FALSE); appData.dateThreshold = GetDlgItemInt(hDlg, OPT_date, &ok, FALSE); appData.stretch = GetDlgItemInt(hDlg, OPT_Stretch, &ok, FALSE); appData.searchMode = LoadOptionsWhichRadio(hDlg); appData.ignoreColors = IsDlgButtonChecked(hDlg, OPT_Reversed); appData.findMirror = IsDlgButtonChecked(hDlg, OPT_Mirror); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: SetLoadOptionEnables(hDlg); break; } break; } return FALSE; } VOID LoadOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)LoadOptions, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_LoadOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Save Options dialog functions * \*---------------------------------------------------------------------------*/ VOID SetSaveOptionEnables(HWND hDlg) { UINT state; state = IsDlgButtonChecked(hDlg, OPT_Autosave); EnableWindow(GetDlgItem(hDlg, OPT_AVPrompt), state); EnableWindow(GetDlgItem(hDlg, OPT_AVToFile), state); if (state && !IsDlgButtonChecked(hDlg, OPT_AVPrompt) && !IsDlgButtonChecked(hDlg, OPT_AVToFile)) { CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt); } state = state && IsDlgButtonChecked(hDlg, OPT_AVToFile); EnableWindow(GetDlgItem(hDlg, OPT_AVFilename), state); EnableWindow(GetDlgItem(hDlg, OPT_AVBrowse), state); } LRESULT CALLBACK SaveOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; FILE *f; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_SaveOptions); /* Initialize the dialog items */ if (*appData.saveGameFile != NULLCHAR) { CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE); CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVToFile); SetDlgItemText(hDlg, OPT_AVFilename, appData.saveGameFile); } else if (appData.autoSaveGames) { CheckDlgButton(hDlg, OPT_Autosave, (UINT) TRUE); CheckRadioButton(hDlg, OPT_AVPrompt, OPT_AVToFile, OPT_AVPrompt); } else { CheckDlgButton(hDlg, OPT_Autosave, (UINT) FALSE); } if (appData.oldSaveStyle) { CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_Old); } else { CheckRadioButton(hDlg, OPT_PGN, OPT_Old, OPT_PGN); } CheckDlgButton( hDlg, OPT_OutOfBookInfo, appData.saveOutOfBookInfo ); SetSaveOptionEnables(hDlg); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ if (IsDlgButtonChecked(hDlg, OPT_Autosave)) { appData.autoSaveGames = TRUE; if (IsDlgButtonChecked(hDlg, OPT_AVPrompt)) { ASSIGN(appData.saveGameFile, ""); // [HGM] make sure value is ALWAYS in allocated memory } else /*if (IsDlgButtonChecked(hDlg, OPT_AVToFile))*/ { GetDlgItemText(hDlg, OPT_AVFilename, buf, MSG_SIZ); if (*buf == NULLCHAR) { MessageBox(hDlg, _("Invalid save game file name"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } FREE(appData.saveGameFile); appData.saveGameFile = InterpretFileName(buf, homeDir); } } else { appData.autoSaveGames = FALSE; ASSIGN(appData.saveGameFile, ""); } appData.oldSaveStyle = IsDlgButtonChecked(hDlg, OPT_Old); appData.saveOutOfBookInfo = IsDlgButtonChecked( hDlg, OPT_OutOfBookInfo ); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case OPT_AVBrowse: f = OpenFileDialog(hDlg, "a", NULL, appData.oldSaveStyle ? "gam" : "pgn", GAME_FILT, _("Browse for Auto Save File"), NULL, NULL, buf); if (f != NULL) { fclose(f); SetDlgItemText(hDlg, OPT_AVFilename, buf); } break; default: SetSaveOptionEnables(hDlg); break; } break; } return FALSE; } VOID SaveOptionsPopup(HWND hwnd) { FARPROC lpProc = MakeProcInstance((FARPROC)SaveOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_SaveOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Time Control Options dialog functions * \*---------------------------------------------------------------------------*/ VOID SetTimeControlEnables(HWND hDlg) { UINT state; state = IsDlgButtonChecked(hDlg, OPT_TCUseMoves) + 2*IsDlgButtonChecked(hDlg, OPT_TCUseFixed); EnableWindow(GetDlgItem(hDlg, OPT_TCTime), state == 1); EnableWindow(GetDlgItem(hDlg, OPT_TCMoves), state == 1); EnableWindow(GetDlgItem(hDlg, OPT_TCtext1), state == 1); EnableWindow(GetDlgItem(hDlg, OPT_TCtext2), state == 1); EnableWindow(GetDlgItem(hDlg, OPT_TCTime2), !state); EnableWindow(GetDlgItem(hDlg, OPT_TCInc), !state); EnableWindow(GetDlgItem(hDlg, OPT_TCitext1), !state); EnableWindow(GetDlgItem(hDlg, OPT_TCitext2), !state); EnableWindow(GetDlgItem(hDlg, OPT_TCitext3), !state); EnableWindow(GetDlgItem(hDlg, OPT_TCFixed), state == 2); EnableWindow(GetDlgItem(hDlg, OPT_TCftext), state == 2); } LRESULT CALLBACK TimeControl(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ], *tc; int mps, odds1, odds2, st; float increment; BOOL ok, ok2; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_TimeControl); /* Initialize the dialog items */ if (/*appData.clockMode &&*/ !appData.icsActive) { // [HGM] even if !clockMode, we could want to set it in tournament dialog if (searchTime) { CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed, OPT_TCUseFixed); SetDlgItemInt(hDlg, OPT_TCFixed, searchTime, FALSE); } else if (appData.timeIncrement == -1) { CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed, OPT_TCUseMoves); SetDlgItemText(hDlg, OPT_TCTime, appData.timeControl); SetDlgItemInt(hDlg, OPT_TCMoves, appData.movesPerSession, FALSE); SetDlgItemText(hDlg, OPT_TCTime2, ""); SetDlgItemText(hDlg, OPT_TCInc, ""); } else { int i = appData.timeIncrement; if(i == appData.timeIncrement) snprintf(buf, MSG_SIZ, "%d", i); else snprintf(buf, MSG_SIZ, "%4.2f", appData.timeIncrement); CheckRadioButton(hDlg, OPT_TCUseMoves, OPT_TCUseFixed, OPT_TCUseInc); SetDlgItemText(hDlg, OPT_TCTime, ""); SetDlgItemText(hDlg, OPT_TCMoves, ""); SetDlgItemText(hDlg, OPT_TCTime2, appData.timeControl); SetDlgItemText(hDlg, OPT_TCInc, buf); } SetDlgItemInt(hDlg, OPT_TCOdds1, 1, FALSE); SetDlgItemInt(hDlg, OPT_TCOdds2, 1, FALSE); SetTimeControlEnables(hDlg); } return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: mps = appData.movesPerSession; increment = appData.timeIncrement; tc = appData.timeControl; st = 0; /* Read changed options from the dialog box */ if (IsDlgButtonChecked(hDlg, OPT_TCUseFixed)) { st = GetDlgItemInt(hDlg, OPT_TCFixed, &ok, FALSE); if (!ok || st <= 0) { MessageBox(hDlg, _("Invalid max time per move"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } } else if (IsDlgButtonChecked(hDlg, OPT_TCUseMoves)) { increment = -1; mps = GetDlgItemInt(hDlg, OPT_TCMoves, &ok, FALSE); if (!ok || mps <= 0) { MessageBox(hDlg, _("Invalid moves per time control"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } GetDlgItemText(hDlg, OPT_TCTime, buf, MSG_SIZ); if (!ParseTimeControl(buf, increment, mps)) { MessageBox(hDlg, _("Invalid minutes per time control"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } tc = buf; } else { GetDlgItemText(hDlg, OPT_TCInc, buf, MSG_SIZ); ok = (sscanf(buf, "%f%c", &increment, buf) == 1); if (!ok || increment < 0) { MessageBox(hDlg, _("Invalid increment"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } GetDlgItemText(hDlg, OPT_TCTime2, buf, MSG_SIZ); if (!ParseTimeControl(buf, increment, mps)) { MessageBox(hDlg, _("Invalid initial time"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } tc = buf; } odds1 = GetDlgItemInt(hDlg, OPT_TCOdds1, &ok, FALSE); odds2 = GetDlgItemInt(hDlg, OPT_TCOdds2, &ok2, FALSE); if (!ok || !ok2 || odds1 <= 0 || odds2 <= 0) { MessageBox(hDlg, _("Invalid time-odds factor"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } searchTime = st; appData.timeControl = strdup(tc); appData.movesPerSession = mps; appData.timeIncrement = increment; appData.firstTimeOdds = first.timeOdds = odds1; appData.secondTimeOdds = second.timeOdds = odds2; Reset(TRUE, TRUE); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: SetTimeControlEnables(hDlg); break; } break; } return FALSE; } VOID TimeControlOptionsPopup(HWND hwnd) { if (gameMode != BeginningOfGame) { DisplayError(_("Changing time control during a game is not implemented"), 0); } else { FARPROC lpProc = MakeProcInstance((FARPROC)TimeControl, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_TimeControl), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } } /*---------------------------------------------------------------------------*\ * * Engine Options Dialog functions * \*---------------------------------------------------------------------------*/ #define CHECK_BOX(x,y) CheckDlgButton(hDlg, (x), (BOOL)(y)) #define IS_CHECKED(x) (Boolean)IsDlgButtonChecked(hDlg, (x)) #define INT_ABS( n ) ((n) >= 0 ? (n) : -(n)) LRESULT CALLBACK EnginePlayOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_EnginePlayOptions); /* Initialize the dialog items */ CHECK_BOX(IDC_EpPeriodicUpdates, appData.periodicUpdates); CHECK_BOX(IDC_EpPonder, appData.ponderNextMove); CHECK_BOX(IDC_EpShowThinking, appData.showThinking); CHECK_BOX(IDC_EpHideThinkingHuman, appData.hideThinkingFromHuman); CHECK_BOX(IDC_TestClaims, appData.testClaims); CHECK_BOX(IDC_DetectMates, appData.checkMates); CHECK_BOX(IDC_MaterialDraws, appData.materialDraws); CHECK_BOX(IDC_TrivialDraws, appData.trivialDraws); CHECK_BOX(IDC_ScoreAbs1, appData.firstScoreIsAbsolute); CHECK_BOX(IDC_ScoreAbs2, appData.secondScoreIsAbsolute); SetDlgItemInt( hDlg, IDC_EpDrawMoveCount, appData.adjudicateDrawMoves, TRUE ); SendDlgItemMessage( hDlg, IDC_EpDrawMoveCount, EM_SETSEL, 0, -1 ); SetDlgItemInt( hDlg, IDC_EpAdjudicationThreshold, INT_ABS(appData.adjudicateLossThreshold), TRUE ); SendDlgItemMessage( hDlg, IDC_EpAdjudicationThreshold, EM_SETSEL, 0, -1 ); SetDlgItemInt( hDlg, IDC_RuleMoves, appData.ruleMoves, TRUE ); SendDlgItemMessage( hDlg, IDC_RuleMoves, EM_SETSEL, 0, -1 ); SetDlgItemInt( hDlg, IDC_DrawRepeats, INT_ABS(appData.drawRepeats), TRUE ); SendDlgItemMessage( hDlg, IDC_DrawRepeats, EM_SETSEL, 0, -1 ); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: /* Read changed options from the dialog box */ PeriodicUpdatesEvent( IS_CHECKED(IDC_EpPeriodicUpdates)); PonderNextMoveEvent( IS_CHECKED(IDC_EpPonder)); appData.hideThinkingFromHuman= IS_CHECKED(IDC_EpHideThinkingHuman); // [HGM] thinking: moved up appData.showThinking = IS_CHECKED(IDC_EpShowThinking); ShowThinkingEvent(); // [HGM] thinking: tests all options that need thinking output appData.testClaims = IS_CHECKED(IDC_TestClaims); appData.checkMates = IS_CHECKED(IDC_DetectMates); appData.materialDraws = IS_CHECKED(IDC_MaterialDraws); appData.trivialDraws = IS_CHECKED(IDC_TrivialDraws); appData.adjudicateDrawMoves = GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, NULL, FALSE ); appData.adjudicateLossThreshold = - (int) GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, NULL, FALSE ); appData.ruleMoves = GetDlgItemInt(hDlg, IDC_RuleMoves, NULL, FALSE ); appData.drawRepeats = (int) GetDlgItemInt(hDlg, IDC_DrawRepeats, NULL, FALSE ); first.scoreIsAbsolute = appData.firstScoreIsAbsolute = IS_CHECKED(IDC_ScoreAbs1); second.scoreIsAbsolute = appData.secondScoreIsAbsolute = IS_CHECKED(IDC_ScoreAbs2); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case IDC_EpDrawMoveCount: case IDC_EpAdjudicationThreshold: case IDC_DrawRepeats: case IDC_RuleMoves: if( HIWORD(wParam) == EN_CHANGE ) { int n1_ok; int n2_ok; int n3_ok; int n4_ok; GetDlgItemInt(hDlg, IDC_EpDrawMoveCount, &n1_ok, FALSE ); GetDlgItemInt(hDlg, IDC_EpAdjudicationThreshold, &n2_ok, FALSE ); GetDlgItemInt(hDlg, IDC_RuleMoves, &n3_ok, FALSE ); GetDlgItemInt(hDlg, IDC_DrawRepeats, &n4_ok, FALSE ); EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok && n3_ok && n4_ok ? TRUE : FALSE ); } return TRUE; } break; } return FALSE; } VOID EnginePlayOptionsPopup(HWND hwnd) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)EnginePlayOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_EnginePlayOptions), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * UCI Options Dialog functions * \*---------------------------------------------------------------------------*/ INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) { switch(uMsg) { case BFFM_INITIALIZED: SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)pData); break; } return 0; } BOOL BrowseForFolder( const char * title, char * path ) { BOOL result = FALSE; BROWSEINFO bi; LPITEMIDLIST pidl; ZeroMemory( &bi, sizeof(bi) ); bi.lpszTitle = title == 0 ? _("Choose Folder") : title; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM) path; pidl = SHBrowseForFolder( &bi ); if( pidl != 0 ) { IMalloc * imalloc = 0; if( SHGetPathFromIDList( pidl, path ) ) { result = TRUE; } if( SUCCEEDED( SHGetMalloc ( &imalloc ) ) ) { imalloc->lpVtbl->Free(imalloc,pidl); imalloc->lpVtbl->Release(imalloc); } } return result; } LRESULT CALLBACK UciOptionsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MAX_PATH]; int oldCores; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, DLG_OptionsUCI); /* Initialize the dialog items */ SetDlgItemText( hDlg, IDC_PolyglotDir, appData.polyglotDir ); SetDlgItemInt( hDlg, IDC_HashSize, appData.defaultHashSize, TRUE ); SetDlgItemText( hDlg, IDC_PathToEGTB, appData.defaultPathEGTB ); SetDlgItemInt( hDlg, IDC_SizeOfEGTB, appData.defaultCacheSizeEGTB, TRUE ); CheckDlgButton( hDlg, IDC_UseBook, (BOOL) appData.usePolyglotBook ); SetDlgItemText( hDlg, IDC_BookFile, appData.polyglotBook ); // [HGM] smp: input field for nr of cores: SetDlgItemInt( hDlg, IDC_Cores, appData.smpCores, TRUE ); // [HGM] book: tick boxes for own book use CheckDlgButton( hDlg, IDC_OwnBook1, (BOOL) appData.firstHasOwnBookUCI ); CheckDlgButton( hDlg, IDC_OwnBook2, (BOOL) appData.secondHasOwnBookUCI ); SetDlgItemInt( hDlg, IDC_BookDep, appData.bookDepth, TRUE ); SetDlgItemInt( hDlg, IDC_BookStr, appData.bookStrength, TRUE ); SetDlgItemInt( hDlg, IDC_Games, appData.defaultMatchGames, TRUE ); SendDlgItemMessage( hDlg, IDC_PolyglotDir, EM_SETSEL, 0, -1 ); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: GetDlgItemText( hDlg, IDC_PolyglotDir, buf, sizeof(buf) ); appData.polyglotDir = strdup(buf); appData.defaultHashSize = GetDlgItemInt(hDlg, IDC_HashSize, NULL, FALSE ); appData.defaultCacheSizeEGTB = GetDlgItemInt(hDlg, IDC_SizeOfEGTB, NULL, FALSE ); GetDlgItemText( hDlg, IDC_PathToEGTB, buf, sizeof(buf) ); appData.defaultPathEGTB = strdup(buf); GetDlgItemText( hDlg, IDC_BookFile, buf, sizeof(buf) ); appData.polyglotBook = strdup(buf); appData.usePolyglotBook = (Boolean) IsDlgButtonChecked( hDlg, IDC_UseBook ); // [HGM] smp: get nr of cores: oldCores = appData.smpCores; appData.smpCores = GetDlgItemInt(hDlg, IDC_Cores, NULL, FALSE ); if(appData.smpCores != oldCores) NewSettingEvent(FALSE, &(first.maxCores), "cores", appData.smpCores); // [HGM] book: read tick boxes for own book use appData.firstHasOwnBookUCI = (Boolean) IsDlgButtonChecked( hDlg, IDC_OwnBook1 ); appData.secondHasOwnBookUCI = (Boolean) IsDlgButtonChecked( hDlg, IDC_OwnBook2 ); appData.bookDepth = GetDlgItemInt(hDlg, IDC_BookDep, NULL, FALSE ); appData.bookStrength = GetDlgItemInt(hDlg, IDC_BookStr, NULL, FALSE ); appData.defaultMatchGames = GetDlgItemInt(hDlg, IDC_Games, NULL, FALSE ); if(gameMode == BeginningOfGame) Reset(TRUE, TRUE); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; case IDC_BrowseForBook: { char filter[] = { 'A','l','l',' ','F','i','l','e','s', 0, '*','.','*', 0, 'B','I','N',' ','F','i','l','e','s', 0, '*','.','b','i','n', 0, 0 }; OPENFILENAME ofn; safeStrCpy( buf, "" , sizeof( buf)/sizeof( buf[0]) ); ZeroMemory( &ofn, sizeof(ofn) ); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = hInst; ofn.lpstrFilter = filter; ofn.lpstrFile = buf; ofn.nMaxFile = sizeof(buf); ofn.lpstrTitle = _("Choose Book"); ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; if( GetOpenFileName( &ofn ) ) { SetDlgItemText( hDlg, IDC_BookFile, buf ); } } return TRUE; case IDC_BrowseForPolyglotDir: if( BrowseForFolder( _("Choose Polyglot Directory"), buf ) ) { SetDlgItemText( hDlg, IDC_PolyglotDir, buf ); strcat( buf, "\\polyglot.exe" ); if( GetFileAttributes(buf) == 0xFFFFFFFF ) { MessageBox( hDlg, _("Polyglot was not found in the specified folder!"), "Warning", MB_OK | MB_ICONWARNING ); } } return TRUE; case IDC_BrowseForEGTB: if( BrowseForFolder( _("Choose EGTB Directory:"), buf ) ) { SetDlgItemText( hDlg, IDC_PathToEGTB, buf ); } return TRUE; case IDC_HashSize: case IDC_SizeOfEGTB: if( HIWORD(wParam) == EN_CHANGE ) { int n1_ok; int n2_ok; GetDlgItemInt(hDlg, IDC_HashSize, &n1_ok, FALSE ); GetDlgItemInt(hDlg, IDC_SizeOfEGTB, &n2_ok, FALSE ); EnableWindow( GetDlgItem(hDlg, IDOK), n1_ok && n2_ok ? TRUE : FALSE ); } return TRUE; } break; } return FALSE; } VOID UciOptionsPopup(HWND hwnd) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)UciOptionsDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_OptionsUCI), hwnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); } xboard-4.7.3/winboard/Winboard.dev0000644000175000001440000000777012262415351014007 00000000000000[Project] FileName=Winboard.dev Name=Winboard UnitCount=27 Type=0 Ver=1 ObjFiles= Includes= Libs= PrivateResource=Winboard_private.rc ResourceIncludes=.. MakeIncludes= Compiler=-I.._@@_-I._@@_-DNDEBUG_@@_ CppCompiler= Linker=-fpic_@@_-s_@@_-mwindows_@@_-lwsock32_@@_-lwinmm_@@_-lcomctl32_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=./objs OverrideOutput=0 OverrideOutputName=Winboard.exe HostApplication= Folders= CommandLine= UseCustomMakefile=0 CustomMakefile=makefile.gcc IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000001000000100 [Unit1] FileName=wsockerr.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit2] FileName=..\parser.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=wclipbrd.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=wedittags.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=wevalgraph.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=wgamelist.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=whistory.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=winboard.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=wlayout.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=woptions.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=wsnap.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\uci.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\backend.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\book.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\gamelist.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit16] FileName=..\lists.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\moves.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\pgntags.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=winboard.rc CompileCpp=0 Folder=Winboard Compile=1 Link=0 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\zippy.c Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CompileCpp=0 [Unit21] FileName=help.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=wsettings.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=wchat.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=wengineoutput.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\evalgraph.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=..\engineoutput.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\history.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= xboard-4.7.3/winboard/winboard.hpj0000644000175000001440000000056112262415351014041 00000000000000; This file is maintained by HCW. Do not modify this file directly. ; This help project requires hc 3.1 [OPTIONS] ERRORLOG=winboard.err LCID=0x409 0x0 0x0 ; English (United States) REPORT=Yes TITLE=WinBoard Help BMROOT=bitmaps HLP=.\winboard.hlp [FILES] winboard.rtf [WINDOWS] main="WinBoard Help",,60676,,(r12632256),f2 [CONFIG] BrowseButtons() xboard-4.7.3/winboard/wedittags.c0000644000175000001440000001470212262562252013675 00000000000000/* * wedittags.c -- EditTags window for WinBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #define _(s) T_(s) /* Module globals */ static char *editTagsText, **resPtr; BOOL editTagsUp = FALSE; BOOL canEditTags = FALSE; /* Imports from winboard.c */ extern HINSTANCE hInst; extern HWND hwndMain; extern BoardSize boardSize; LRESULT CALLBACK EditTagsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HANDLE hwndText; static int sizeX, sizeY; int len, newSizeX, newSizeY, flags; char *str; RECT rect; MINMAXINFO *mmi; int err; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Initialize the dialog items */ Translate(hDlg, DLG_EditTags); hwndText = GetDlgItem(hDlg, OPT_TagsText); SendMessage(hwndText, WM_SETFONT, (WPARAM)font[boardSize][EDITTAGS_FONT]->hf, MAKELPARAM(FALSE, 0)); SetDlgItemText(hDlg, OPT_TagsText, editTagsText); EnableWindow(GetDlgItem(hDlg, OPT_TagsCancel), canEditTags); EnableWindow(GetDlgItem(hDlg, OPT_EditTags), !canEditTags); SendMessage(hwndText, EM_SETREADONLY, !canEditTags, 0); if (bookUp) { SetWindowText(hDlg, _("Edit Book")); SetFocus(hwndText); } else if (canEditTags) { SetWindowText(hDlg, _("Edit Tags")); SetFocus(hwndText); } else { SetWindowText(hDlg, _("Tags")); SetFocus(GetDlgItem(hDlg, IDOK)); } if (!editTagsDialog) { editTagsDialog = hDlg; flags = SWP_NOZORDER; GetClientRect(hDlg, &rect); sizeX = rect.right; sizeY = rect.bottom; if (wpTags.x != CW_USEDEFAULT && wpTags.y != CW_USEDEFAULT && wpTags.width != CW_USEDEFAULT && wpTags.height != CW_USEDEFAULT) { WINDOWPLACEMENT wp; EnsureOnScreen(&wpTags.x, &wpTags.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = SW_SHOW; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpTags.x; wp.rcNormalPosition.right = wpTags.x + wpTags.width; wp.rcNormalPosition.top = wpTags.y; wp.rcNormalPosition.bottom = wpTags.y + wpTags.height; SetWindowPlacement(hDlg, &wp); GetClientRect(hDlg, &rect); newSizeX = rect.right; newSizeY = rect.bottom; ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; } } return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (canEditTags) { char *p, *q; /* Read changed options from the dialog box */ len = GetWindowTextLength(hwndText); str = (char *) malloc(len + 1); GetWindowText(hwndText, str, len + 1); p = q = str; while (*q) { if (*q == '\r') q++; else *p++ = *q++; } *p = NULLCHAR; err = 0; if(resPtr) *resPtr = strdup(str); else if(bookUp) SaveToBook(str); else err = ReplaceTags(str, &gameInfo); if (err) DisplayError(_("Error replacing tags."), err); free(str); } TagsPopDown(); return TRUE; case IDCANCEL: case OPT_TagsCancel: TagsPopDown(); return TRUE; case OPT_EditTags: EditTagsEvent(); return TRUE; default: break; } break; case WM_SIZE: newSizeX = LOWORD(lParam); newSizeY = HIWORD(lParam); ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; break; case WM_GETMINMAXINFO: /* Prevent resizing window too small */ mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; break; } return FALSE; } VOID TagsPopDown(void) { if (editTagsDialog) ShowWindow(editTagsDialog, SW_HIDE); CheckMenuItem(GetMenu(hwndMain), IDM_Tags, MF_UNCHECKED); editTagsUp = bookUp = FALSE; } VOID EitherTagsPopUp(char *tags, char *msg, BOOLEAN edit) { FARPROC lpProc; char *p, *q; if (msg == NULL) msg = ""; p = (char *) malloc(2 * (strlen(tags) + strlen(msg)) + 2); q = p; while (*tags) { if (*tags == '\n') *q++ = '\r'; *q++ = *tags++; } if (*msg != NULLCHAR) { *q++ = '\r'; *q++ = '\n'; while (*msg) { if (*msg == '\n') *q++ = '\r'; *q++ = *msg++; } } *q = NULLCHAR; if (editTagsText != NULL) free(editTagsText); editTagsText = p; canEditTags = edit; CheckMenuItem(GetMenu(hwndMain), IDM_Tags, MF_CHECKED); if (editTagsDialog) { SendMessage(editTagsDialog, WM_INITDIALOG, 0, 0); ShowWindow(editTagsDialog, SW_SHOW); if(bookUp) SetFocus(hwndMain); } else { lpProc = MakeProcInstance((FARPROC)EditTagsDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditTags), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } editTagsUp = TRUE; } VOID TagsPopUp(char *tags, char *msg) { HWND hwnd = GetActiveWindow(); EitherTagsPopUp(tags, msg, FALSE); SetActiveWindow(hwnd); } VOID EditTagsPopUp(char *tags, char **dest) { resPtr = dest; EitherTagsPopUp(tags, "", TRUE); } VOID EditTagsProc() { if (editTagsUp && !bookUp) { TagsPopDown(); } else { EditTagsEvent(); } } xboard-4.7.3/winboard/wsettings.c0000644000175000001440000012167712262562252013743 00000000000000/* * woptions.h -- Options dialog box routines for WinBoard * * Copyright 2003, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* * Engine-settings dialog. The complexity come from an attempt to present the engine-defined options * in a nicey formatted layout. To this end we first run a back-end pre-formatter, which will distribute * the controls over two columns (the minimum required, as some are double width). It also takes care of * grouping options that start with the same word (mainly for "Polyglot ..." options). It assigns relative * suitability to break points between lines, and in the end decides if and where to break up the list * for display in multiple (2*N) columns. * The thus obtained list representing the topology of the layout is then passed to a front-end routine * that generates the actual dialog box from it. */ #include "config.h" #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "backendz.h" #define _(s) T_(s) #define N_(s) s int layoutList[2*MAX_OPTIONS]; int checkList[2*MAX_OPTIONS]; int comboList[2*MAX_OPTIONS]; int buttonList[2*MAX_OPTIONS]; int boxList[2*MAX_OPTIONS]; int groupNameList[2*MAX_OPTIONS]; int breaks[MAX_OPTIONS]; int checks, combos, buttons, layout, groups; char title[MSG_SIZ]; char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params; Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick, isUCCI; extern Option installOptions[], matchOptions[]; char *engineList[MAXENGINES] = {""}, *engineMnemonic[MAXENGINES] = {""}; void (*okFunc)(); ChessProgramState *activeCps; Option *activeList; int InstallOK P((void)); typedef int ButtonCallback(HWND h); ButtonCallback *comboCallback; void PrintOpt(int i, int right, Option *optionList) { if(i<0) { if(!right) fprintf(debugFP, "%30s", ""); } else { Option opt = optionList[i]; switch(opt.type) { case Slider: case Spin: fprintf(debugFP, "%20.20s [ +/-]", opt.name); break; case TextBox: case FileName: case PathName: fprintf(debugFP, "%20.20s [______________________________________]", opt.name); break; case Label: fprintf(debugFP, "%41.41s", opt.name); break; case CheckBox: fprintf(debugFP, "[x] %-26.25s", opt.name); break; case ComboBox: fprintf(debugFP, "%20.20s [ COMBO ]", opt.name); break; case Button: case SaveButton: case ResetButton: fprintf(debugFP, "[ %26.26s ]", opt.name); case Message: default: break; } } fprintf(debugFP, right ? "\n" : " "); } void CreateOptionDialogTest(int *list, int nr, Option *optionList) { int line; for(line = 0; line < nr; line+=2) { PrintOpt(list[line+1], 0, optionList); PrintOpt(list[line], 1, optionList); } } void LayoutOptions(int firstOption, int endOption, char *groupName, Option *optionList) { int i, b = strlen(groupName), stop, prefix, right, nextOption, firstButton = buttons; Control lastType, nextType; nextOption = firstOption; while(nextOption < endOption) { checks = combos = 0; stop = 0; lastType = Button; // kludge to make sure leading Spin will not be prefixed // first separate out buttons for later treatment, and collect consecutive checks and combos while(nextOption < endOption && !stop) { switch(nextType = optionList[nextOption].type) { case CheckBox: checkList[checks++] = nextOption; lastType = CheckBox; break; case ComboBox: comboList[combos++] = nextOption; lastType = ComboBox; break; case ResetButton: case SaveButton: case Button: buttonList[buttons++] = nextOption; lastType = Button; break; case TextBox: case ListBox: case FileName: case PathName: case Slider: case Label: case Spin: stop++; default: case Message: ; // cannot happen } nextOption++; } // We now must be at the end, or looking at a spin or textbox (in nextType) if(!stop) nextType = Button; // kudge to flush remaining checks and combos undistorted // Take a new line if a spin follows combos or checks, or when we encounter a textbox if((combos+checks || nextType == TextBox || nextType == ListBox || nextType == FileName || nextType == PathName || nextType == Label) && layout&1) { layoutList[layout++] = -1; } // The last check or combo before a spin will be put on the same line as that spin (prefix) // and will thus not be grouped with other checks and combos prefix = -1; if(nextType == Spin && lastType != Button) { if(lastType == CheckBox) prefix = checkList[--checks]; else if(lastType == ComboBox) prefix = comboList[--combos]; } // if a combo is followed by a textbox, it must stay at the end of the combo/checks list to appear // immediately above the textbox, so treat it as check. (A check would automatically be and remain there.) if((nextType == TextBox || nextType == ListBox || nextType == FileName || nextType == PathName) && lastType == ComboBox) checkList[checks++] = comboList[--combos]; // Now append the checks behind the (remaining) combos to treat them as one group for(i=0; i< checks; i++) comboList[combos++] = checkList[i]; // emit the consecutive checks and combos in two columns right = combos/2; // rounded down if odd! for(i=0; i0; i--) { // extra high text edit breaks[layout/2] = -1; layoutList[layout++] = -1; layoutList[layout++] = -1; } } else if(nextType == TextBox || nextType == FileName || nextType == PathName || nextType == Label) { // A textBox is double width, so must be left-adjusted, and the right column remains empty breaks[layout/2] = lastType == Button ? 0 : 100; layoutList[layout++] = -1; layoutList[layout++] = nextOption - 1; if(optionList[nextOption-1].min) { // extra high text edit: goes right of existing listbox layout -= 2; // remove layoutList[layout-2*optionList[nextOption-1].min-2] = nextOption - 1; } } else if(nextType == Spin) { // A spin will go in the next available position (right to left!). If it had to be prefixed with // a check or combo, this next position must be to the right, and the prefix goes left to it. layoutList[layout++] = nextOption - 1; if(prefix >= 0) layoutList[layout++] = prefix; } } // take a new line if needed if(layout&1) layoutList[layout++] = -1; // emit the buttons belonging in this group; loose buttons are saved for last, to appear at bottom of dialog if(b) { while(buttons > firstButton) layoutList[layout++] = buttonList[--buttons]; if(layout&1) layoutList[layout++] = -1; } } char * EndMatch(char *s1, char *s2) { char *p, *q; p = s1; while(*p) p++; q = s2; while(*q) q++; while(p > s1 && q > s2 && *p == *q) { p--; q--; } if(p[1] == 0) return NULL; return p+1; } void DesignOptionDialog(int nrOpt, Option *optionList) { int k=0, n=0; char buf[MSG_SIZ]; layout = 0; buttons = groups = 0; while(k < nrOpt) { // k steps through 'solitary' options // look if we hit a group of options having names that start with the same word int groupSize = 1, groupNameLength = 50; sscanf(optionList[k].name, "%s", buf); // get first word of option name while(k + groupSize < nrOpt && strstr(optionList[k+groupSize].name, buf) == optionList[k+groupSize].name) { int j; for(j=0; j 3) { // We found a group to terminates the current section LayoutOptions(n, k, "", optionList); // flush all solitary options appearing before the group groupNameList[groups] = groupNameLength; boxList[groups++] = layout; // group start in even entries LayoutOptions(k, k+groupSize, buf, optionList); // flush the group boxList[groups++] = layout; // group end in odd entries k = n = k + groupSize; } else k += groupSize; // small groups are grouped with the solitary options } if(n != k) LayoutOptions(n, k, "", optionList); // flush remaining solitary options // decide if and where we break into two column pairs // Emit buttons and add OK and cancel // for(k=0; k extern HINSTANCE hInst; typedef struct { DLGITEMTEMPLATE item; WORD code; WORD controlType; wchar_t d1, data; WORD creationData; } Item; struct { DLGTEMPLATE header; WORD menu; WORD winClass; wchar_t title[20]; WORD pointSize; wchar_t fontName[14]; Item control[MAX_OPTIONS]; } template = { { DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT, 0, 0, 0, 0, 295, 300 }, 0x0000, 0x0000, L"Engine #1 Settings ", 8, L"MS Sans Serif" }; char * AddCR(char *s) { char *p=s, *q; int n=0; while(p = strchr(p, '\n')) p++, n++; // count linefeeds p = q = malloc(strlen(s) + n + 1); while(*p++ = *s++) if(p[-1] == '\n') p[-1] = '\r', *p++ = '\n'; return q; } void SetOptionValues(HWND hDlg, ChessProgramState *cps, Option *optionList) // Put all current option values in controls, and write option names next to them { HANDLE hwndCombo; int i, k; char **choices, *name; for(i=0; i optionList[j].max) new = optionList[j].max; if(!cps) { *(int*)optionList[j].target = new; break; } changed = 2*(optionList[j].value != new); optionList[j].value = new; break; case TextBox: case FileName: case PathName: if(cps) len = MSG_SIZ - strlen(optionList[j].name) - 9, text = newText; else len = GetWindowTextLength(GetDlgItem(hDlg, 2001+2*i)) + 1, text = (char*) malloc(len); success = GetDlgItemText( hDlg, 2001+2*i, text, len ); if(!success) text[0] = NULLCHAR; // empty string can be valid input if(!cps) { char *p; p = (optionList[j].type != FileName ? strdup(text) : InterpretFileName(text, homeDir)); // all files relative to homeDir! FREE(*(char**)optionList[j].target); *(char**)optionList[j].target = p; free(text); text = p; while(*p++ = *text++) if(p[-1] == '\r') p--; // crush CR break; } changed = strcmp(optionList[j].textValue, newText) != 0; safeStrCpy(optionList[j].textValue, newText, MSG_SIZ - (optionList[j].textValue - optionList[j].name) ); break; case CheckBox: new = IsDlgButtonChecked( hDlg, 2000+2*i ); if(!cps) { *(Boolean*)optionList[j].target = new; break; } changed = 2*(optionList[j].value != new); optionList[j].value = new; break; case ComboBox: choices = (char**) optionList[j].textValue; hwndCombo = GetDlgItem(hDlg, 2001+2*i); success = GetDlgItemText( hDlg, 2001+2*i, newText, MSG_SIZ ); if(!success) break; new = -1; for(k=0; k 0) { if(*(char**)optionList[j].target) free(*(char**)optionList[j].target); *(char**)optionList[j].target = strdup(optionList[j].choice[new]); break; } changed = new >= 0 && (optionList[j].value != new); if(changed) optionList[j].value = new; break; case ListBox: if(optionList[j].textValue) *(int*) optionList[j].textValue = SendDlgItemMessage(hDlg, 2001+2*i, LB_GETCURSEL, 0, 0); case Button: default: break; // are treated instantly, so they have been sent already } if(changed == 2) snprintf(buf, MSG_SIZ, "option %s=%d\n", optionList[j].name, new); else if(changed == 1) snprintf(buf, MSG_SIZ, "option %s=%s\n", optionList[j].name, newText); if(changed) SendToProgram(buf, cps); } if(!cps && okFunc) return ((ButtonCallback*) okFunc)(0); return 1; } char *defaultExt[] = { NULL, "pgn", "fen", "exe", "trn", "bin", "log", "ini" }; LRESULT CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; int i, j, ext; switch( message ) { case WM_INITDIALOG: // CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); SetOptionValues(hDlg, activeCps, activeList); SetFocus(GetDlgItem(hDlg, IDCANCEL)); break; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: if(!GetOptionValues(hDlg, activeCps, activeList)) return FALSE; EndDialog( hDlg, 0 ); comboCallback = NULL; activeCps = NULL; return TRUE; case IDCANCEL: EndDialog( hDlg, 1 ); comboCallback = NULL; activeCps = NULL; return TRUE; default: // program-defined push buttons i = LOWORD(wParam); if( i>=2000 && i < 2000+2*(layout+buttons)) { j = layoutList[(i - 2000)/2]; if(j == -2) { char filter[] = "All files\0*.*\0Game files\0*.pgn;*.gam\0Position files\0*.fen;*.epd;*.pos\0" "EXE files\0*.exe\0Tournament files (*.trn)\0*.trn\0" "BIN Files\0*.bin\0LOG Files\0*.log\0INI Files\0*.ini\0" "Image files\0*.bmp\0\0"; OPENFILENAME ofn; GetDlgItemText( hDlg, i+3, buf, MSG_SIZ ); ZeroMemory( &ofn, sizeof(ofn) ); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hDlg; ofn.hInstance = hInst; ofn.lpstrFilter = filter; ofn.nFilterIndex = 1L + (ext = activeCps ? 0 : activeList[layoutList[(i-2000)/2+1]].max & 31); ofn.lpstrDefExt = defaultExt[ext]; ofn.lpstrFile = buf; ofn.nMaxFile = sizeof(buf); ofn.lpstrTitle = _("Choose File"); ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; if( activeList[layoutList[(i-2000)/2+1]].max & 32 ? GetOpenFileName( &ofn ) : GetSaveFileName( &ofn ) ) { SetDlgItemText( hDlg, i+3, buf ); } } else if(j == -3) { GetDlgItemText( hDlg, i+3, buf, MSG_SIZ ); if( BrowseForFolder( _("Choose Folder:"), buf ) ) { SetDlgItemText( hDlg, i+3, buf ); } } if(j < 0) break; if(comboCallback && activeList[j].type == ComboBox && HIWORD(wParam) == CBN_SELCHANGE) { if(j > 5) break; // Yegh! Must solve problem with more than one combobox in dialog (*comboCallback)(hDlg); break; } else if(activeList[j].type == ListBox && HIWORD(wParam) == /*LBN_SELCHANGE*/ LBN_DBLCLK) { ((ButtonCallback *) activeList[j].target)(hDlg); break; } else if( activeList[j].type == SaveButton) GetOptionValues(hDlg, activeCps, activeList); else if( activeList[j].type != Button) break; else if( !activeCps ) { (*(ButtonCallback*) activeList[j].target)(hDlg); break; } snprintf(buf, MSG_SIZ, "option %s\n", activeList[j].name); SendToProgram(buf, activeCps); } break; } break; } return FALSE; } void AddControl(int x, int y, int w, int h, int type, int style, int n) { int i; i = template.header.cdit++; template.control[i].item.style = style; template.control[i].item.dwExtendedStyle = 0; template.control[i].item.x = x; template.control[i].item.y = y; template.control[i].item.cx = w; template.control[i].item.cy = h; template.control[i].item.id = 2000 + n; template.control[i].code = 0xFFFF; template.control[i].controlType = type; template.control[i].d1 = ' '; template.control[i].data = 0; template.control[i].creationData = 0; } void AddOption(int x, int y, Control type, int i) { int extra, num = ES_NUMBER; switch(type) { case Slider+100: num = 0; // needs text control for accepting negative numbers case Slider: case Spin: AddControl(x, y+1, 95, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, i); AddControl(x+95, y, 50, 11, 0x0081, ES_AUTOHSCROLL | num | WS_BORDER | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i+1); break; case TextBox: extra = 13*activeList[layoutList[i/2]].min; // when extra high, left-align and put description text above it AddControl(x+(extra?50:0), y+1, 95, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, i); AddControl(x+(extra?50:95), y+(extra?13:0), extra?105:200, 11+(extra?extra-13:0), 0x0081, ES_AUTOHSCROLL | WS_BORDER | WS_VISIBLE | WS_CHILD | WS_TABSTOP | (extra ? ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL :0), i+1); break; case ListBox: AddControl(x, y+1, 95, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, i); extra = 13*activeList[layoutList[i/2]].min; AddControl(x, y+13, 105, 11+extra-13, 0x0083, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_BORDER | LBS_NOTIFY | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i+1); break; case Label: extra = activeList[layoutList[i/2]].value; AddControl(x+extra, y+1, 290-extra, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i); break; case FileName: case PathName: AddControl(x, y+1, 95, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, i); AddControl(x+95, y, 180, 11, 0x0081, ES_AUTOHSCROLL | WS_BORDER | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i+1); AddControl(x+275, y, 20, 12, 0x0080, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i-2); layoutList[i/2-1] = -2 - (type == PathName); break; case CheckBox: AddControl(x, y, 145, 11, 0x0080, BS_AUTOCHECKBOX | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i); break; case ComboBox: AddControl(x, y+1, 95, 9, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, i); AddControl(x+95, y-1, !activeCps && x<10 ? 120 : 50, 500, 0x0085, CBS_AUTOHSCROLL | CBS_DROPDOWN | WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL, i+1); break; case Button: case ResetButton: case SaveButton: AddControl(x-2, y, 65, 13, 0x0080, BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP, i); case Message: default: break; } } void CreateDialogTemplate(int *layoutList, int nr, Option *optionList) { int i, ii, j, x=1, y=0, maxY=0, buttonRows, breakPoint = 1000, k=0; template.header.cdit = 0; template.header.cx = 307; buttonRows = (buttons + 1 + 3)/4; // 4 per row, rounded up if(nr > 50) { breakPoint = (nr+2*buttonRows+1)/2 & ~1; template.header.cx = 625; } for(ii=0; ii>1)-2, 301, 13*(boxList[k+1]-boxList[k]>>1)+8, 0x0082, WS_VISIBLE | WS_CHILD | SS_BLACKFRAME, 2400); AddControl(x+60, y+13*(i>>1)-6, 10*groupNameList[k]/3, 10, 0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, 2*(ii+MAX_OPTIONS)); } j = layoutList[i]; if(j >= 0) { int neg = (optionList[j].type == Spin && optionList[j].min < 0 ? 100 : 0); // flags spin with negative range AddOption(x+155-150*(i&1), y+13*(i>>1)+5, optionList[j].type + neg, 2*i); // listboxes have the special power to adjust the width of the column they are in if(optionList[j].type == ListBox) x -= optionList[j].value, template.header.cx -= optionList[j].value; } if(k < groups && ii+1 == boxList[k+1]) { k += 2; y += 4; } if(ii+1 >= breakPoint && breaks[ii+1>>1] >= 0) { x += 318; maxY = y+13*(ii+1>>1)+5; y = -13*(ii+1>>1); breakPoint = 1000; } } // add butons at the bottom of dialog window y += 13*(nr>>1)+5; for(i=0; ioption; snprintf(title, MSG_SIZ, _("%s Engine Settings (%s)"), T_(cps->which), cps->tidy); DesignOptionDialog(cps->nrOptions, cps->option); CreateDialogTemplate(layoutList, layout, cps->option); DialogBoxIndirect( hInst, &template.header, hwnd, (DLGPROC)lpProc ); FreeProcInstance(lpProc); return; } int EnterGroup P((HWND hDlg)); static int engineNr, selected; int InstallOK() { if(selected >= 0) { ASSIGN(engineLine, engineList[selected]); } if(engineLine[0] == '#') { DisplayError(_("Select single engine from the group"), 0); return 0; } if(isUCCI) isUCI = 2; if(!engineNr) Load(&first, 0); else Load(&second, 1); return 1; } Option installOptions[] = { // { 0, 0, 0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") }, { 195, 14, 0, NULL, (void*) &EnterGroup, (char*) &selected, engineMnemonic, ListBox, N_("Select engine from list:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") }, { 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 tag") }, { 0, 0, 32+3, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine (*.exe):") }, { 0, 0, 0, NULL, (void*) ¶ms, NULL, NULL, TextBox, N_("command-line parameters:") }, { 0, 0, 0, NULL, (void*) &wbOptions, NULL, NULL, TextBox, N_("Special WinBoard options:") }, { 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("directory:") }, { 95, 0, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when left empty)") }, { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") }, { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") }, { 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") }, { 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") }, { 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (skip waiting for features)") }, { 0, 0, 0, NULL, (void*) &isUCCI, NULL, NULL, CheckBox, N_("UCCI / USI (uses specified /uxiAdapter)") }, { 0, 1, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" } }; void GenericPopup(HWND hwnd, Option *optionList) { FARPROC lpProc = MakeProcInstance( (FARPROC) SettingsProc, hInst ); int n=0; while(optionList[n].type != EndMark) n++; activeCps = NULL; activeList = optionList; DesignOptionDialog(n, optionList); CreateDialogTemplate(layoutList, layout, optionList); DialogBoxIndirect( hInst, &template.header, hwnd, (DLGPROC)lpProc ); FreeProcInstance(lpProc); return; } int EnterGroup(HWND hDlg) { char buf[MSG_SIZ]; HANDLE hwndCombo = GetDlgItem(hDlg, 2001+2*1); int i = SendDlgItemMessage(hDlg, 2001+2*1, LB_GETCURSEL, 0, 0); if(i == 0) buf[0] = NULLCHAR; // back to top level else if(engineList[i][0] == '#') safeStrCpy(buf, engineList[i], MSG_SIZ); // group header, open group else { ASSIGN(engineLine, engineList[i]); if(isUCCI) isUCI = 2; if(!engineNr) Load(&first, 0); else Load(&second, 1); EndDialog( hDlg, 0 ); return 0; // normal line, select engine } installOptions[0].max = NamesToList(firstChessProgramNames, engineList, engineMnemonic, buf); // replace list by only the group contents SendMessage(hwndCombo, LB_RESETCONTENT, 0, 0); SendMessage(hwndCombo, LB_ADDSTRING, 0, (LPARAM) buf); for(i=1; i= 0) { ASSIGN(engineLine, engineList[selected]); } if(engineLine[0] == '#') { DisplayError(_("Select single theme from the group"), 0); return 0; } LoadTheme(); return 1; } Option themeOptions[] = { { 195, 14, 0, NULL, (void*) &PickTheme, (char*) &selected, engineMnemonic, ListBox, N_("Select theme from list:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("or specify new theme below:") }, { 0, 0, 0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Theme name:") }, { 0, 0, 0, NULL, (void*) &appData.useBitmaps, NULL, NULL, CheckBox, N_("Use board textures") }, { 0, 0, 32+0, NULL, (void*) &appData.liteBackTextureFile, NULL, NULL, FileName, N_("Light-square texture:") }, { 0, 0, 32+0, NULL, (void*) &appData.darkBackTextureFile, NULL, NULL, FileName, N_("Dark-square texture:") }, { 0, 0, 3, NULL, (void*) &appData.darkBackTextureMode, "", NULL, Spin, N_("Dark reorientation mode:") }, { 0, 0, 3, NULL, (void*) &appData.liteBackTextureMode, "", NULL, Spin, N_("Light reorientation mode:") }, { 0, 0, 0, NULL, (void*) &appData.useBorder, NULL, NULL, CheckBox, N_("Draw border around board") }, { 0, 0, 32+0, NULL, (void*) &appData.border, NULL, NULL, FileName, N_("Optional border bitmap:") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_(" Beware: a specified piece font will prevail over piece bitmaps") }, { 0, 0, 0, NULL, (void*) &appData.pieceDirectory, NULL, NULL, PathName, N_("Directory with piece bitmaps:") }, { 0, 0, 0, NULL, (void*) &appData.useFont, NULL, NULL, CheckBox, N_("Use piece font") }, { 0, 50, 150, NULL, (void*) &appData.fontPieceSize, "", NULL, Spin, N_("Font size (%):") }, { 0, 0, 0, NULL, (void*) &appData.renderPiecesWithFont, NULL, NULL, TextBox, N_("Font name:") }, { 0, 0, 0, NULL, (void*) &appData.fontToPieceTable, NULL, NULL, TextBox, N_("Font piece to char:") }, // { 0, 0, 0, NULL, (void*) &DeleteTheme, NULL, NULL, Button, N_("Up") }, // { 0, 0, 0, NULL, (void*) &DeleteTheme, NULL, NULL, Button, N_("Down") }, { 0, 0, 0, NULL, (void*) &DeleteTheme, NULL, NULL, Button, N_("Delete Theme") }, { 0, 1, 0, NULL, (void*) &ThemeOK, "", NULL, EndMark , "" } }; void DeleteTheme (HWND hDlg) { char *p, *q; int i, selected = SendDlgItemMessage(hDlg, 2001+2*1, LB_GETCURSEL, 0, 0); HANDLE hwndCombo = GetDlgItem(hDlg, 2001+2*1); if(selected < 0) return; if(p = strstr(appData.themeNames, engineList[selected])) { if(q = strchr(p, '\n')) strcpy(p, q+1); } themeOptions[0].max = NamesToList(appData.themeNames, engineList, engineMnemonic, ""); // replace list by only the group contents SendMessage(hwndCombo, LB_RESETCONTENT, 0, 0); SendMessage(hwndCombo, LB_ADDSTRING, 0, (LPARAM) ""); for(i=1; i(::?ϙ1c~@~x@~x@~@`??<???xboard-4.7.3/winboard/shogibitmaps/sb58o.bmp0000644000175000001440000000101612262415351015656 00000000000000BM>(::<|o~{y|s'OO?0??ϟ??xboard-4.7.3/winboard/shogibitmaps/sa58o.bmp0000644000175000001440000000101612262415351015655 00000000000000BM>(::????~?y9ߘy?ϟO Cq??????????xboard-4.7.3/winboard/shogibitmaps/README0000644000175000001440000000012712262415351015100 00000000000000These bitmaps are distributed under the GNU GENERAL PUBLIC LICENSE coming with xboard. xboard-4.7.3/winboard/shogibitmaps/largeking.bmp0000644000175000001440000042746212262415351016702 00000000000000BM2/6(.xboard-4.7.3/winboard/shogibitmaps/sl58w.bmp0000644000175000001440000000101612262415351015700 00000000000000BM>(::??????xboard-4.7.3/winboard/shogibitmaps/sn58w.bmp0000644000175000001440000000101612262415351015702 00000000000000BM>(::??????xboard-4.7.3/winboard/shogibitmaps/sf58o.bmp0000644000175000001440000000101612262415351015662 00000000000000BM>(::?|D|  `Fbqx|Ic1{x{8ss'qs7''3Hs?>???xboard-4.7.3/winboard/shogibitmaps/sp58o.bmp0000644000175000001440000000101612262415351015674 00000000000000BM>(::??????p|?x?38?9>~??xboard-4.7.3/winboard/shogibitmaps/sp58w.bmp0000644000175000001440000000101612262415351015704 00000000000000BM>(::???????xboard-4.7.3/winboard/shogibitmaps/sc58o.bmp0000644000175000001440000000101612262415351015657 00000000000000BM>(::??x?~~>G>c~|}|0 |<|<8?(::??<~???88qǏ?????xboard-4.7.3/winboard/shogibitmaps/sr58o.bmp0000644000175000001440000000101612262415351015676 00000000000000BM>(::|oggc??9a<f{fGf3&3dć????xboard-4.7.3/winboard/shogibitmaps/sk58w.bmp0000644000175000001440000000101612262415351015677 00000000000000BM>(::?????????xboard-4.7.3/winboard/shogibitmaps/sg58o.bmp0000644000175000001440000000101612262415351015663 00000000000000BM>(::?988??xboard-4.7.3/winboard/shogibitmaps/sw58o.bmp0000644000175000001440000000101612262415351015703 00000000000000BM>(::?qlj! 9998>߸~~}1 @`<|0#Ǐ?????xboard-4.7.3/winboard/shogibitmaps/sw58w.bmp0000644000175000001440000000101612262415351015713 00000000000000BM>(::??????xboard-4.7.3/winboard/shogibitmaps/king.bmp0000644000175000001440000000624612262415351015660 00000000000000BM 6(--pxdWHm1:7TgooodccZZZ@@A877/*.##$                                                 xboard-4.7.3/winboard/shogibitmaps/su58o.bmp0000644000175000001440000000101612262415351015701 00000000000000BM>(::???xboard-4.7.3/winboard/shogibitmaps/ss58o.bmp0000644000175000001440000000101612262415351015677 00000000000000BM>(::?{9??9<1@c??????xboard-4.7.3/winboard/shogibitmaps/sr58w.bmp0000644000175000001440000000101612262415351015706 00000000000000BM>(::?????????xboard-4.7.3/winboard/shogibitmaps/sk58o.bmp0000644000175000001440000000101612262415351015667 00000000000000BM>(::x0$<<<~|gC?I?Lb?fcs{ߎpx?????xboard-4.7.3/winboard/shogibitmaps/sl58o.bmp0000644000175000001440000000101612262415351015670 00000000000000BM>(::}''33?@@9Crx|xs??xboard-4.7.3/winboard/wsockerr.c0000644000175000001440000000714112262415351013535 00000000000000/* * wsockerr.c * * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* Windows sockets error map */ /* These messages ought to be in the Windows message catalog! */ #include #include #include "wsockerr.h" ErrorMap errmap[] = { {WSAEINTR, "Interrupted system call"}, {WSAEBADF, "Bad file number"}, {WSAEACCES, "Permission denied"}, {WSAEFAULT, "Bad address"}, {WSAEINVAL, "Invalid argument"}, {WSAEMFILE, "Too many open files"}, {WSAEWOULDBLOCK, "Operation would block"}, {WSAEINPROGRESS, "Operation now in progress"}, {WSAEALREADY, "Operation already in progress"}, {WSAENOTSOCK, "Socket operation on non-socket"}, {WSAEMSGSIZE, "Message too long"}, {WSAEPROTOTYPE, "Protocol wrong type for socket"}, {WSAENOPROTOOPT, "Protocol not available"}, {WSAEPROTONOSUPPORT, "Protocol not supported"}, {WSAESOCKTNOSUPPORT, "Socket type not supported"}, {WSAEOPNOTSUPP, "Operation not supported on socket"}, {WSAEPFNOSUPPORT, "Protocol family not supported"}, {WSAEAFNOSUPPORT, "Address family not supported by protocol family"}, {WSAEADDRINUSE, "Address already in use"}, {WSAEADDRNOTAVAIL, "Can't assign requested address"}, {WSAENETDOWN, "Network is down"}, {WSAENETUNREACH, "Network is unreachable"}, {WSAENETRESET, "Network dropped connection on reset"}, {WSAECONNABORTED, "Software caused connection abort"}, {WSAECONNRESET, "Connection reset by peer"}, {WSAENOBUFS, "No buffer space available"}, {WSAEISCONN, "Socket is already connected"}, {WSAENOTCONN, "Socket is not connected"}, {WSAESHUTDOWN, "Can't send after socket shutdown"}, {WSAETOOMANYREFS, "Too many references: can't splice"}, {WSAETIMEDOUT, "Connection timed out"}, {WSAECONNREFUSED, "Connection refused"}, {WSAELOOP, "Too many levels of symbolic links"}, {WSAENAMETOOLONG, "File name too long"}, {WSAEHOSTDOWN, "Host is down"}, {WSAEHOSTUNREACH, "No route to host"}, {WSAENOTEMPTY, "Directory not empty"}, {WSAEPROCLIM, "Too many processes"}, {WSAEUSERS, "Too many users"}, {WSAEDQUOT, "Disc quota exceeded"}, {WSAESTALE, "Stale NFS file handle"}, {WSAEREMOTE, "Too many levels of remote in path"}, {WSAEDISCON, "Undocumented Winsock error code WSAEDISCON"}, {WSASYSNOTREADY, "Winsock subsystem unusable"}, {WSAVERNOTSUPPORTED, "Required Winsock version is not supported"}, {WSANOTINITIALISED, "Winsock not initialized"}, {WSAHOST_NOT_FOUND, "Host name not found by name server (authoritative)"}, {WSATRY_AGAIN, "Host name not found by name server (nonauthoritative), or name server failure"}, {WSANO_RECOVERY, "Nonrecoverable name server error"}, {WSANO_DATA, "Host name has no address data of required type"}, {0, NULL} }; xboard-4.7.3/winboard/jaws.c0000644000175000001440000013261412262415351012646 00000000000000/* * JAWS.c -- Code for Windows front end to XBoard to use it with JAWS * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * XBoard borrows its colors and the bitmaps.xchess bitmap set from XChess, * which was written and is copyrighted by Wayne Christopher. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // This file collects all patches for the JAWS version, so they can all be included in winboard.c // in one big swoop. At the bottom of this file you can read instructions for how to patch // WinBoard to work with JAWS with the aid of this file. Note that the code in this file // is for WinBoard 4.3 and later; for older WB versions you would have to throw out the // piece names for all pieces from Guard to Unicorn, #define ONE as '1', AAA as 'a', // BOARD_LEFT as 0, BOARD_RGHT and BOARD_HEIGHT as 8, and set holdingssizes to 0. // You will need to build with jaws.rc in stead of winboard.rc. // from resource.h #define IDM_PossibleAttackMove 1800 #define IDM_PossibleAttacked 1801 #define IDM_SayMachineMove 1802 #define IDM_ReadRow 1803 #define IDM_ReadColumn 1804 #define IDM_SayCurrentPos 1805 #define IDM_SayAllBoard 1806 #define IDM_SayUpperDiagnols 1807 #define IDM_SayLowerDiagnols 1808 #define IDM_SayClockTime 1810 #define IDM_SayWhosTurn 1811 #define IDM_SayKnightMoves 1812 #define ID_SHITTY_HI 1813 #define IDM_SayWhitePieces 1816 #define IDM_SayBlackPieces 1817 // from common.h, but 'extern' added to it, so the actual declaraton can remain in backend.c extern long whiteTimeRemaining, blackTimeRemaining, timeControl, timeIncrement; // from moves.c, added WinBoard_F piece types and ranks / files char *squareToChar[] = { "ay", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" }; char *squareToNum[] = {"naught", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; char *ordinals[] = {"zeroth", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "nineth"}; char *pieceToName[] = { "White Pawn", "White Knight", "White Bishop", "White Rook", "White Queen", "White Guard", "White Elephant", "White Arch Bishop", "White Chancellor", "White General", "White Man", "White Cannon", "White Night Rider", "White Crowned Bishop", "White Crowned Rook", "White Grass Hopper", "White Veteran", "White Falcon", "White Amazon", "White Snake", "White Unicorn", "White King", "Black Pawn", "Black Knight", "Black Bishop", "Black Rook", "Black Queen", "Black Guard", "Black Elephant", "Black Arch Bishop", "Black Chancellor", "Black General", "Black Man", "Black Cannon", "Black Night Rider", "Black Crowned Bishop", "Black Crowned Rook", "Black Grass Hopper", "Black Veteran", "Black Falcon", "Black Amazon", "Black Snake", "Black Unicorn", "Black King", "Empty" }; char *pieceTypeName[] = { "Pawn", "Knight", "Bishop", "Rook", "Queen", "Guard", "Elephant", "Arch Bishop", "Chancellor", "General", "Man", "Cannon", "Night Rider", "Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran", "Falcon", "Amazon", "Snake", "Unicorn", "King", "Pawn", "Knight", "Bishop", "Rook", "Queen", "Guard", "Elephant", "Arch Bishop", "Chancellor", "General", "Man", "Cannon", "Night Rider", "Crowned Bishop", "Crowned Rook", "Grass Hopper", "Veteran", "Falcon", "Amazon", "Snake", "Unicorn", "King", "Empty" }; int CoordToNum(c) char c; { if(isdigit(c)) return c - ONE; if(c >= 'a') return c - AAA; return 0; } char* PieceToName(p, i) ChessSquare p; int i; { if(i) return pieceToName[(int) p]; return pieceTypeName[(int) p]; } char* SquareToChar(x) int x; { return squareToChar[x - BOARD_LEFT]; } char* SquareToNum(y) int y; { return squareToNum[y + (gameInfo.boardHeight < 10)]; } // from winboard.c: all new routines #define JFWAPI __declspec(dllimport) JFWAPI BOOL WINAPI JFWSayString (LPCTSTR lpszStrinToSpeak, BOOL bInterrupt); typedef JFWAPI BOOL (WINAPI *PSAYSTRING)(LPCTSTR lpszStrinToSpeak, BOOL bInterrupt); PSAYSTRING RealSayString; VOID SayString(char *mess, BOOL flag) { // for debug file static char buf[8000], *p; int l = strlen(buf); if(appData.debugMode) fprintf(debugFP, "SAY '%s'\n", mess); if(l) buf[l++] = ' '; // separate by space from previous safeStrCpy(buf+l, _(mess), 8000-1-l); // buffer if(!flag) return; // wait for flush if(p = StrCaseStr(buf, "Xboard adjudication:")) { int i; for(i=19; i>1; i--) p[i] = p[i-1]; p[1] = ' '; } RealSayString(buf, !strcmp(mess, " ")); // kludge to indicate flushing of interruptable speach if(appData.debugMode) fprintf(debugFP, "SPEAK '%s'\n", buf); buf[0] = NULLCHAR; } //static int fromX = 0, fromY = 0; static int oldFromX, oldFromY; static int timeflag; static int suppressClocks = 0; static int suppressOneKey = 0; static HANDLE hAccelJAWS; typedef struct { char *name; int code; } MenuItemDesc; MenuItemDesc menuItemJAWS[] = { {"Say Clock &Time\tAlt+T", IDM_SayClockTime }, {"-", 0 }, {"Say Last &Move\tAlt+M", IDM_SayMachineMove }, {"Say W&ho's Turn\tAlt+X", IDM_SayWhosTurn }, {"-", 0 }, {"Say Complete &Position\tAlt+P",IDM_SayAllBoard }, {"Say &White Pieces\tAlt+W", IDM_SayWhitePieces }, {"Say &Black Pieces\tAlt+B", IDM_SayBlackPieces }, {"Say Board &Rank\tAlt+R", IDM_ReadRow }, {"Say Board &File\tAlt+F", IDM_ReadColumn }, {"-", 0 }, {"Say &Upper Diagonals\tAlt+U", IDM_SayUpperDiagnols }, {"Say &Lower Diagonals\tAlt+L", IDM_SayLowerDiagnols }, {"Say K&night Moves\tAlt+N", IDM_SayKnightMoves }, {"Say Current &Square\tAlt+S", IDM_SayCurrentPos }, {"Say &Attacks\tAlt+A", IDM_PossibleAttackMove }, {"Say Attacke&d\tAlt+D", IDM_PossibleAttacked }, {NULL, 0} }; ACCEL acceleratorsJAWS[] = { {FVIRTKEY|FALT, 'T', IDM_SayClockTime }, {FVIRTKEY|FALT, 'M', IDM_SayMachineMove }, {FVIRTKEY|FALT, 'X', IDM_SayWhosTurn }, {FVIRTKEY|FALT, 'P', IDM_SayAllBoard }, {FVIRTKEY|FALT, 'W', IDM_SayWhitePieces }, {FVIRTKEY|FALT, 'B', IDM_SayBlackPieces }, {FVIRTKEY|FALT, 'R', IDM_ReadRow }, {FVIRTKEY|FALT, 'F', IDM_ReadColumn }, {FVIRTKEY|FALT, 'U', IDM_SayUpperDiagnols }, {FVIRTKEY|FALT, 'L', IDM_SayLowerDiagnols }, {FVIRTKEY|FALT, 'N', IDM_SayKnightMoves }, {FVIRTKEY|FALT, 'S', IDM_SayCurrentPos }, {FVIRTKEY|FALT, 'A', IDM_PossibleAttackMove }, {FVIRTKEY|FALT, 'D', IDM_PossibleAttacked } }; void AdaptMenu() { HMENU menuMain, menuJAWS; MENUBARINFO helpMenuInfo; int i; helpMenuInfo.cbSize = sizeof(helpMenuInfo); menuMain = GetMenu(hwndMain); menuJAWS = CreatePopupMenu(); for(i=0; menuItemJAWS[i].name; i++) { if(menuItemJAWS[i].name[0] == '-') AppendMenu(menuJAWS, MF_SEPARATOR, (UINT_PTR) 0, NULL); else AppendMenu(menuJAWS, MF_ENABLED|MF_STRING, (UINT_PTR) menuItemJAWS[i].code, (LPCTSTR) _(menuItemJAWS[i].name)); } InsertMenu(menuMain, 7, MF_BYPOSITION|MF_POPUP|MF_ENABLED|MF_STRING, (UINT_PTR) menuJAWS, "&JAWS"); oldMenuItemState[8] = oldMenuItemState[7]; DrawMenuBar(hwndMain); } BOOL InitJAWS() { // to be called at beginning of WinMain, after InitApplication and InitInstance HINSTANCE hApi = LoadLibrary("jfwapi32.dll"); if(!hApi) { DisplayInformation("Missing jfwapi32.dll"); return (FALSE); } RealSayString = (PSAYSTRING)GetProcAddress(hApi, "JFWSayString"); if(!RealSayString) { DisplayInformation("SayString returned a null pointer"); return (FALSE); } { // [HGM] kludge to reduce need for modification of winboard.c: make tinyLayout menu identical // to standard layout, so that code for switching between them does not have to be deleted int i; AdaptMenu(); menuBarText[0][8] = menuBarText[0][7]; menuBarText[0][7] = "&JAWS"; for(i=0; i<9; i++) menuBarText[1][i] = menuBarText[0][i]; } hAccelJAWS = CreateAcceleratorTable(acceleratorsJAWS, 14); /* initialize cursor position */ fromX = fromY = 0; SetHighlights(fromX, fromY, -1, -1); DrawPosition(FALSE, NULL); oldFromX = oldFromY = -1; if(hwndConsole) SetFocus(hwndConsole); return TRUE; } int beeps[] = { 1, 0, 0, 0, 0 }; int beepCodes[] = { 0, MB_OK, MB_ICONERROR, MB_ICONQUESTION, MB_ICONEXCLAMATION, MB_ICONASTERISK }; static int dropX = -1, dropY = -1; VOID KeyboardEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { ChessSquare currentPiece; char *piece, *xchar, *ynum ; int n, beepType = 1; // empty beep if(fromX == -1 || fromY == -1) { // if we just dropped piece, stay at that square fromX = dropX; fromY = dropY; dropX = dropY = -1; // but only once } if(fromX == -1 || fromY == -1) { fromX = BOARD_LEFT; fromY = 0; } switch(wParam) { case VK_LEFT: if(fromX == BOARD_RGHT+1) fromX -= 2; else if(fromX == BOARD_LEFT) { if(fromY >= BOARD_HEIGHT - gameInfo.holdingsSize) fromX -= 2; else beepType = 0; } else if(fromX > BOARD_LEFT) fromX--; else beepType = 0; // off-board beep break; case VK_RIGHT: if(fromX == BOARD_LEFT-2) fromX += 2; else if(fromX == BOARD_RGHT-1) { if(fromY < gameInfo.holdingsSize) fromX += 2; else beepType = 0; } else if(fromX < BOARD_RGHT-1) fromX++; else beepType = 0; break; case VK_UP: if(fromX == BOARD_RGHT+1) { if(fromY < gameInfo.holdingsSize - 1) fromY++; else beepType = 0; } else if(fromY < BOARD_HEIGHT-1) fromY++; else beepType = 0; break; case VK_DOWN: if(fromX == BOARD_LEFT-2) { if(fromY > BOARD_HEIGHT - gameInfo.holdingsSize) fromY--; else beepType = 0; } else if(fromY > 0) fromY--; else beepType = 0; break; } SetHighlights(fromX, fromY, -1, -1); DrawPosition(FALSE, NULL); currentPiece = boards[currentMove][fromY][fromX]; piece = PieceToName(currentPiece,1); if(beepType == 1 && currentPiece != EmptySquare) beepType = currentPiece < (int) BlackPawn ? 2 : 3; // white or black beep if(beeps[beepType] == beeps[1] && (fromX == BOARD_RGHT+1 || fromX == BOARD_LEFT-2)) beepType = 4; // holdings beep beepType = beeps[beepType]%6; if(beepType) MessageBeep(beepCodes[beepType]); if(fromX == BOARD_LEFT - 2) { SayString("black holdings", FALSE); if(currentPiece != EmptySquare) { char buf[MSG_SIZ]; n = boards[currentMove][fromY][1]; snprintf(buf, MSG_SIZ, "%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s"); SayString(buf, FALSE); } SayString(" ", TRUE); } else if(fromX == BOARD_RGHT + 1) { SayString("white holdings", FALSE); if(currentPiece != EmptySquare) { char buf[MSG_SIZ]; n = boards[currentMove][fromY][BOARD_WIDTH-2]; snprintf(buf, MSG_SIZ,"%d %s%s", n, PieceToName(currentPiece,0), n == 1 ? "" : "s"); SayString(buf, FALSE); } SayString(" ", TRUE); } else if(fromX >= BOARD_LEFT && fromX < BOARD_RGHT) { char buf[MSG_SIZ]; xchar = SquareToChar(fromX); ynum = SquareToNum(fromY); if(currentPiece != EmptySquare) { snprintf(buf, MSG_SIZ, "%s %s %s", xchar, ynum, piece); } else snprintf(buf, MSG_SIZ, "%s %s", xchar, ynum); SayString(buf, FALSE); SayString(" ", TRUE); } return; } int PosFlags(int nr); typedef struct { int rf, ff, rt, ft; int onlyCaptures; int count; } ReadClosure; extern void ReadCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void ReadCallback(board, flags, kind, rf, ff, rt, ft, closure) Board board; int flags; ChessMove kind; int rf, ff, rt, ft; VOIDSTAR closure; { register ReadClosure *cl = (ReadClosure *) closure; ChessSquare possiblepiece; char *piece, *xchar, *ynum ; //if(appData.debugMode) fprintf(debugFP, "%c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE); if(cl->ff == ff && cl->rf == rf) { possiblepiece = board[rt][ft]; if(possiblepiece != EmptySquare) { piece = PieceToName(possiblepiece,1); xchar = SquareToChar(ft); ynum = SquareToNum(rt); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); cl->count++; } } if(cl->ft == ft && cl->rt == rt) { possiblepiece = board[rf][ff]; piece = PieceToName(possiblepiece,1); xchar = SquareToChar(ff); ynum = SquareToNum(rf); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); cl->count++; } } VOID PossibleAttackMove() { ReadClosure cl; ChessSquare piece, victim; int removedSelectedPiece = 0, swapColor; //if(appData.debugMode) fprintf(debugFP, "PossibleAttackMove %d %d %d %d\n", fromX, fromY, oldFromX, oldFromY); if(fromY < 0 || fromY >= BOARD_HEIGHT) return; if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",TRUE); return; } piece = boards[currentMove][fromY][fromX]; if(piece == EmptySquare) { // if square is empty, try to substitute selected piece if(oldFromX >= 0 && oldFromY >= 0) { piece = boards[currentMove][oldFromY][oldFromX]; boards[currentMove][oldFromY][oldFromX] = EmptySquare; removedSelectedPiece = 1; SayString("Your", FALSE); SayString(PieceToName(piece, 0), FALSE); SayString("would have", FALSE); } else { SayString("You must select a piece first", TRUE); return; } } victim = boards[currentMove][fromY][fromX]; boards[currentMove][fromY][fromX] = piece; // make sure piece is actally there SayString("possible captures from here are", FALSE); swapColor = piece < (int)BlackPawn && !WhiteOnMove(currentMove) || piece >= (int)BlackPawn && WhiteOnMove(currentMove); cl.count = 0; cl.rf = fromY; cl.ff = fromX; cl.rt = cl.ft = -1; GenLegal(boards[currentMove], PosFlags(currentMove + swapColor), ReadCallback, (VOIDSTAR) &cl); if(cl.count == 0) SayString("None", FALSE); SayString("", TRUE); // flush boards[currentMove][fromY][fromX] = victim; // repair if( removedSelectedPiece ) boards[currentMove][oldFromY][oldFromX] = piece; } VOID PossibleAttacked() { ReadClosure cl; ChessSquare piece = EmptySquare, victim; if(fromY < 0 || fromY >= BOARD_HEIGHT) return; if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) { SayString("holdings",TRUE); return; } if(oldFromX >= 0 && oldFromY >= 0) { // if piece is selected, remove it piece = boards[currentMove][oldFromY][oldFromX]; boards[currentMove][oldFromY][oldFromX] = EmptySquare; } SayString("Pieces that can capture you are", FALSE); victim = boards[currentMove][fromY][fromX]; // put dummy piece on target square, to activate Pawn captures boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen; cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1; GenLegal(boards[currentMove], PosFlags(currentMove+1), ReadCallback, (VOIDSTAR) &cl); if(cl.count == 0) SayString("None", FALSE); SayString("You are defended by", FALSE); boards[currentMove][fromY][fromX] = WhiteOnMove(currentMove) ? BlackQueen : WhiteQueen; cl.count = 0; cl.rt = fromY; cl.ft = fromX; cl.rf = cl.ff = -1; GenLegal(boards[currentMove], PosFlags(currentMove), ReadCallback, (VOIDSTAR) &cl); if(cl.count == 0) SayString("None", FALSE); SayString("", TRUE); // flush boards[currentMove][fromY][fromX] = victim; // put back original occupant if(oldFromX >= 0 && oldFromY >= 0) { // put back possibl selected piece boards[currentMove][oldFromY][oldFromX] = piece; } } VOID ReadRow() { ChessSquare currentpiece; char *piece, *xchar, *ynum ; int xPos, count=0; ynum = SquareToNum(fromY); if(fromY < 0) return; for (xPos=BOARD_LEFT; xPos BOARD_LEFT && fromY < BOARD_HEIGHT-1) { SayString("The diagnol squares to your upper left contain", FALSE); yPos = fromY+1; xPos = fromX-1; while(yPos=BOARD_LEFT) { currentpiece = boards[currentMove][yPos][xPos]; piece = PieceToName(currentpiece,1); xchar = SquareToChar(xPos); ynum = SquareToNum(yPos); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); yPos++; xPos--; } } else SayString("There is no squares to your upper left", FALSE); SayString("", TRUE); // flush } VOID SayLowerDiagnols() { ChessSquare currentpiece; char *piece, *xchar, *ynum ; int yPos, xPos; if(fromX < 0 || fromY < 0) return; if(fromX < BOARD_RGHT-1 && fromY > 0) { SayString("The diagnol squares to your lower right contain", FALSE); yPos = fromY-1; xPos = fromX+1; while(yPos>=0 && xPos BOARD_LEFT && fromY > 0) { SayString("The diagnol squares to your lower left contain", FALSE); yPos = fromY-1; xPos = fromX-1; while(yPos>=0 && xPos>=BOARD_LEFT) { currentpiece = boards[currentMove][yPos][xPos]; piece = PieceToName(currentpiece,1); xchar = SquareToChar(xPos); ynum = SquareToNum(yPos); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); yPos--; xPos--; } } else SayString("There is no squares to your lower left", FALSE); SayString("", TRUE); // flush } VOID SayKnightMoves() { ChessSquare currentpiece, oldpiece; char *piece, *xchar, *ynum ; oldpiece = boards[currentMove][fromY][fromX]; if(oldpiece == WhiteKnight || oldpiece == BlackKnight) SayString("The possible squares a Knight could move to are", FALSE); else SayString("The squares a Knight could possibly attack from are", FALSE); if (fromY+2 < BOARD_HEIGHT && fromX-1 >= BOARD_LEFT) { currentpiece = boards[currentMove][fromY+2][fromX-1]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX-1); ynum = SquareToNum(fromY+2); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY+2 < BOARD_HEIGHT && fromX+1 < BOARD_RGHT) { currentpiece = boards[currentMove][fromY+2][fromX+1]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX+1); ynum = SquareToNum(fromY+2); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY+1 < BOARD_HEIGHT && fromX+2 < BOARD_RGHT) { currentpiece = boards[currentMove][fromY+1][fromX+2]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX+2); ynum = SquareToNum(fromY+1); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY-1 >= 0 && fromX+2 < BOARD_RGHT) { currentpiece = boards[currentMove][fromY-1][fromX+2]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX+2); ynum = SquareToNum(fromY-1); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY-2 >= 0 && fromX+1 < BOARD_RGHT) { currentpiece = boards[currentMove][fromY-2][fromX+1]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX+1); ynum = SquareToNum(fromY-2); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY-2 >= 0 && fromX-1 >= BOARD_LEFT) { currentpiece = boards[currentMove][fromY-2][fromX-1]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX-1); ynum = SquareToNum(fromY-2); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY-1 >= 0 && fromX-2 >= BOARD_LEFT) { currentpiece = boards[currentMove][fromY-1][fromX-2]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX-2); ynum = SquareToNum(fromY-1); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } if (fromY+1 < BOARD_HEIGHT && fromX-2 >= BOARD_LEFT) { currentpiece = boards[currentMove][fromY+1][fromX-2]; if(((oldpiece == WhiteKnight) && (currentpiece > WhiteKing)) || ((oldpiece == BlackKnight) && (currentpiece < BlackPawn || currentpiece == EmptySquare)) || (oldpiece == EmptySquare) && (currentpiece == WhiteKnight || currentpiece == BlackKnight)) { piece = PieceToName(currentpiece,1); xchar = SquareToChar(fromX-2); ynum = SquareToNum(fromY+1); SayString(xchar , FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); } } SayString("", TRUE); // flush } VOID SayPieces(ChessSquare p) { ChessSquare currentpiece; char *piece, *xchar, *ynum ; int yPos, xPos, count = 0; char buf[50]; if(p == WhitePlay) SayString("White pieces", FALSE); else if(p == BlackPlay) SayString("Black pieces", FALSE); else if(p == EmptySquare) SayString("Pieces", FALSE); else { snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%ss", PieceToName(p,1)); SayString(buf, FALSE); } SayString("are located", FALSE); for(yPos=0; yPos= BlackPawn && currentpiece <= BlackKing || p == WhitePlay && currentpiece >= WhitePawn && currentpiece <= WhiteKing ) piece = PieceToName(currentpiece,0); else if(p == EmptySquare && currentpiece != EmptySquare) piece = PieceToName(currentpiece,1); else if(p == currentpiece) piece = NULL; else continue; if(count == 0) SayString("at", FALSE); xchar = SquareToChar(xPos); ynum = SquareToNum(yPos); SayString(xchar , FALSE); SayString(ynum, FALSE); if(piece) SayString(piece, FALSE); count++; } } if(count == 0) SayString("nowhere", FALSE); SayString("", TRUE); // flush } VOID SayCurrentPos() { ChessSquare currentpiece; char *piece, *xchar, *ynum ; if(fromX < BOARD_LEFT) { SayString("You strayed into the white holdings", FALSE); return; } if(fromX >= BOARD_RGHT) { SayString("You strayed into the black holdings", FALSE); return; } currentpiece = boards[currentMove][fromY][fromX]; piece = PieceToName(currentpiece,1); ynum = SquareToNum(fromY); xchar = SquareToChar(fromX); SayString("Your current position is", FALSE); SayString(xchar, FALSE); SayString(ynum, FALSE); SayString(piece, FALSE); if(((fromX-BOARD_LEFT) ^ fromY)&1) SayString("on a light square",FALSE); else SayString("on a dark square",FALSE); PossibleAttacked(); SayString("", TRUE); // flush } VOID SayAllBoard() { int Xpos, Ypos; ChessSquare currentpiece; char *piece, *ynum ; if(gameInfo.holdingsWidth) { int first = 0; for(Ypos=0; Ypos=BOARD_HEIGHT - gameInfo.holdingsSize; Ypos--) { int n = boards[currentMove][Ypos][1]; if(n) { char buf[MSG_SIZ]; if(!first++) SayString("black holds", FALSE); currentpiece = boards[currentMove][Ypos][0]; piece = PieceToName(currentpiece,0); snprintf(buf, MSG_SIZ, "%d %s%s", n, piece, (n==1 ? "" : "s") ); SayString(buf, FALSE); } } } for(Ypos=BOARD_HEIGHT-1; Ypos>=0; Ypos--) { ynum = ordinals[Ypos + (gameInfo.boardHeight < 10)]; SayString(ynum, FALSE); SayString("rank", FALSE); for(Xpos=BOARD_LEFT; Xpos 1) snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%d %ss", count, piece); else snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s", piece); Xpos--; SayString(buf, FALSE); } else { int count = 0, oldX = Xpos; while(Xpos < BOARD_RGHT && boards[currentMove][Ypos][Xpos] == EmptySquare) Xpos++, count++; if(Xpos == BOARD_RGHT && oldX == BOARD_LEFT) SayString("all", FALSE); else{ if(count > 1) { char buf[10]; snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%d", count); SayString(buf, FALSE); } Xpos--; } SayString("empty", FALSE); } } } SayString("", TRUE); // flush } VOID SayWhosTurn() { if(gameMode == MachinePlaysBlack || gameMode == IcsPlayingWhite) { if(WhiteOnMove(currentMove)) SayString("It is your turn", FALSE); else SayString("It is your opponents turn", FALSE); } else if(gameMode == MachinePlaysWhite || gameMode == IcsPlayingBlack) { if(WhiteOnMove(currentMove)) SayString("It is your opponents turn", FALSE); else SayString("It is your turn", FALSE); } else { if(WhiteOnMove(currentMove)) SayString("White is on move here", FALSE); else SayString("Black is on move here", FALSE); } SayString("", TRUE); // flush } extern char *commentList[]; VOID SayMachineMove(int evenIfDuplicate) { int len, xPos, yPos, moveNr, secondSpace = 0, castle = 0, n; ChessSquare currentpiece; char *piece, *xchar, *ynum, *p, checkMark = 0; char c, buf[MSG_SIZ], comment[MSG_SIZ]; static char disambiguation[2]; static int previousMove = 0; if(appData.debugMode) fprintf(debugFP, "Message = '%s'\n", messageText); if(gameMode == BeginningOfGame) return; if(messageText[0] == '[') return; comment[0]= 0; if(isdigit(messageText[0])) { // message is move, possibly with thinking output int dotCount = 0, spaceCount = 0; sscanf(messageText, "%d", &moveNr); len = 0; // [HGM] show: better extraction of move while (messageText[len] != NULLCHAR) { if(messageText[len] == '.' && spaceCount == 0) dotCount++; if(messageText[len] == ' ') { if(++spaceCount == 2) secondSpace = len; } if(messageText[len] == '{') { // we detected a comment if(isalpha(messageText[len+1]) ) sscanf(messageText+len, "{%[^}]}", comment); break; } if(messageText[len] == '[') { // we detected thinking output int depth; float score=0; char c, lastMover = (dotCount == 3 ? 'B' : 'W'); if(sscanf(messageText+len+1, "%d]%c%f", &depth, &c, &score) > 1) { if(c == ' ') { // if not explicitly specified, figure out source of thinking output switch(gameMode) { case MachinePlaysWhite: case IcsPlayingWhite: c = 'W'; break; case IcsPlayingBlack: case MachinePlaysBlack: c = 'B'; default: break; } } if(c != lastMover && !evenIfDuplicate) return; // line is thinking output of future move, ignore. if(2*moveNr - (dotCount < 2) == previousMove) return; // do not repeat same move; likely ponder output snprintf(buf, MSG_SIZ, "score %s %d at %d ply", score > 0 ? "plus" : score < 0 ? "minus" : "", (int) (fabs(score)*100+0.5), depth ); SayString(buf, FALSE); // move + thinking output describing it; say it. } while(messageText[len-1] == ' ') len--; // position just behind move; break; } if(messageText[len] == '(') { // ICS time printed behind move while(messageText[len+1] && messageText[len] != ')') len++; // skip it } len++; } if(secondSpace) len = secondSpace; // position behind move if(messageText[len-1] == '+' || messageText[len-1] == '#') { /* you are in checkmate */ len--; // strip off check or mate indicator checkMark = messageText[len]; // make sure still seen after we stip off promo piece } if(messageText[len-2] == '=') { /* promotion */ len-=2; // strip off promotion piece SayString("promotion", FALSE); } n = 2*moveNr - (dotCount < 2); if(previousMove != 2*moveNr + (dotCount > 1) || evenIfDuplicate) { char number[20]; previousMove = 2*moveNr + (dotCount > 1); // remember move nr of move last spoken snprintf(number, sizeof(number)/sizeof(number[0]),"%d", moveNr); yPos = CoordToNum(messageText[len-1]); /* turn char coords to ints */ xPos = CoordToNum(messageText[len-2]); if(xPos < 0 || xPos > 11) return; // prevent crashes if no coord string available to speak if(yPos < 0 || yPos > 9) return; currentpiece = boards[n][yPos][xPos]; piece = PieceToName(currentpiece,0); ynum = SquareToNum(yPos); xchar = SquareToChar(xPos); c = messageText[len-3]; if(c == 'x') c = messageText[len-4]; if(!isdigit(c) && c < 'a' && c != '@') c = 0; disambiguation[0] = c; SayString(WhiteOnMove(n) ? "Black" : "White", FALSE); SayString("move", FALSE); SayString(number, FALSE); // if(c==0 || c=='@') SayString("a", FALSE); // intercept castling moves p = StrStr(messageText, "O-O-O"); if(p && p-messageText < len) { SayString("queen side castling",FALSE); castle = 1; } else { p = StrStr(messageText, "O-O"); if(p && p-messageText < len) { SayString("king side castling",FALSE); castle = 1; } } if(!castle) { SayString(piece, FALSE); if(c == '@') SayString("dropped on", FALSE); else if(c) SayString(disambiguation, FALSE); SayString("to", FALSE); SayString(xchar, FALSE); SayString(ynum, FALSE); if(messageText[len-3] == 'x') { currentpiece = boards[n-1][yPos][xPos]; if(currentpiece != EmptySquare) { piece = PieceToName(currentpiece,0); SayString("Capturing a",FALSE); SayString(piece, FALSE); } else SayString("Capturing onn passann",FALSE); } } if(checkMark == '+') SayString("check", FALSE); else if(checkMark == '#') { SayString("finishing off", FALSE); SayString(WhiteOnMove(n) ? "White" : "Black", FALSE); } } /* say comment after move, possibly with result */ p = NULL; if(StrStr(messageText, " 1-0")) p = "white wins"; else if(StrStr(messageText, " 0-1")) p = "black wins"; else if(StrStr(messageText, " 1/2-1/2")) p = "game ends in a draw"; if(comment[0]) { if(p) { if(!StrCaseStr(comment, "draw") && !StrCaseStr(comment, "white") && !StrCaseStr(comment, "black") ) { SayString(p, FALSE); SayString("due to", FALSE); } } SayString(comment, FALSE); // alphabetic comment (usually game end) } else if(p) SayString(p, FALSE); if(commentDialog && commentList[currentMove]) SetFocus(commentDialog); } else { /* starts not with digit */ if(StrCaseStr(messageText, "illegal")) PlayIcsUnfinishedSound(); SayString(messageText, FALSE); } SayString("", TRUE); // flush } VOID SayClockTime() { char buf1[50], buf2[50]; char *str1, *str2; static long int lastWhiteTime, lastBlackTime; suppressClocks = 1; // if user is using alt+T command, no reason to display them if(abs(lastWhiteTime - whiteTimeRemaining) < 1000 && abs(lastBlackTime - blackTimeRemaining) < 1000) suppressClocks = 0; // back on after two requests in rapid succession snprintf(buf1, sizeof(buf1)/sizeof(buf1[0]),"%s", TimeString(whiteTimeRemaining)); str1 = buf1; SayString("White clock", FALSE); SayString(str1, FALSE); snprintf(buf2, sizeof(buf2)/sizeof(buf2[0]), "%s", TimeString(blackTimeRemaining)); str2 = buf2; SayString("Black clock", FALSE); SayString(str2, FALSE); lastWhiteTime = whiteTimeRemaining; lastBlackTime = blackTimeRemaining; SayString("", TRUE); // flush } VOID Toggle(Boolean *b, char *mess) { *b = !*b; SayString(mess, FALSE); SayString("is now", FALSE); SayString(*b ? "on" : "off", FALSE); SayString("", TRUE); // flush } /* handles keyboard moves in a click-click fashion */ VOID KeyboardMove(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { ChessSquare currentpiece; char *piece; static BOOLEAN sameAgain = FALSE; switch (message) { case WM_KEYDOWN: sameAgain = FALSE; if(oldFromX == fromX && oldFromY == fromY) { sameAgain = TRUE; /* click on same square */ break; } else if(oldFromX != -1) { ChessSquare pdown, pup; pdown = boards[currentMove][oldFromY][oldFromX]; pup = boards[currentMove][fromY][fromX]; if (gameMode == EditPosition || !((WhitePawn <= pdown && pdown <= WhiteKing && WhitePawn <= pup && pup <= WhiteKing) || (BlackPawn <= pdown && pdown <= BlackKing && BlackPawn <= pup && pup <= BlackKing))) { /* EditPosition, empty square, or different color piece; click-click move is possible */ char promoChoice = NULLCHAR; if (HasPromotionChoice(oldFromX, oldFromY, fromX, fromY, &promoChoice)) { if (appData.alwaysPromoteToQueen) { UserMoveEvent(oldFromX, oldFromY, fromX, fromY, 'q'); } else { toX = fromX; toY = fromY; fromX = oldFromX; fromY = oldFromY; PromotionPopup(hwnd); fromX = toX; fromY = toY; } } else { UserMoveEvent(oldFromX, oldFromY, fromX, fromY, promoChoice); } oldFromX = oldFromY = -1; break; } } /* First downclick, or restart on a square with same color piece */ if (OKToStartUserMove(fromX, fromY)) { oldFromX = fromX; oldFromY = fromY; currentpiece = boards[currentMove][fromY][fromX]; piece = PieceToName(currentpiece,1); SayString(piece, FALSE); SayString("selected", TRUE); } else { oldFromX = oldFromY = -1; } break; case WM_KEYUP: if (oldFromX == fromX && oldFromY == fromY) { /* Upclick on same square */ if (sameAgain) { /* Clicked same square twice: abort click-click move */ oldFromX = oldFromY = -1; currentpiece = boards[currentMove][fromY][fromX]; piece = PieceToName(currentpiece,0); SayString(piece, FALSE); SayString("unselected", TRUE); } } } } int NiceTime(int x) { // return TRUE for times we want to announce if(x<0) return 0; x = (x+50)/100; // tenth of seconds if(x <= 100) return (x%10 == 0); if(x <= 600) return (x%100 == 0); if(x <= 6000) return (x%600 == 0); return (x%3000 == 0); } #define JAWS_ARGS \ { "beepOffBoard", ArgInt, (LPVOID) beeps, TRUE, (ArgIniType) 1 },\ { "beepEmpty", ArgInt, (LPVOID) (beeps+1), TRUE, (ArgIniType) 0 },\ { "beepWhite", ArgInt, (LPVOID) (beeps+2), TRUE, (ArgIniType) 0 },\ { "beepBlack", ArgInt, (LPVOID) (beeps+3), TRUE, (ArgIniType) 0 },\ { "beepHoldings", ArgInt, (LPVOID) (beeps+4), TRUE, (ArgIniType) 0 },\ #define JAWS_ALT_INTERCEPT \ if(suppressOneKey) {\ suppressOneKey = 0;\ if(GetKeyState(VK_MENU) < 0 && GetKeyState(VK_CONTROL) < 0) break;\ }\ if ((char)wParam == 022 && gameMode == EditPosition) { /* . Pop up piece menu */\ POINT pt; int x, y;\ SquareToPos(fromY, fromX, &x, &y);\ dropX = fromX; dropY = fromY;\ pt.x = x; pt.y = y;\ if(gameInfo.variant != VariantShogi)\ MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1);\ else\ MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1);\ break;\ }\ #define JAWS_REPLAY \ case '\020': /* ctrl P */\ { char buf[MSG_SIZ];\ if(GetWindowText(hwnd, buf, MSG_SIZ-1))\ SayString(buf, TRUE);\ }\ return 0;\ #define JAWS_KBDOWN_NAVIGATION \ \ \ if(GetKeyState(VK_MENU) < 0 && GetKeyState(VK_CONTROL) < 0) {\ /* Control + Alt + letter used for speaking piece positions */\ static int lastTime; static char lastChar;\ int mine = 0, time = GetTickCount(); char c;\ \ if((char)wParam == lastChar && time-lastTime < 250) mine = 1;\ lastChar = wParam; lastTime = time;\ c = wParam;\ \ if(gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) mine = !mine;\ \ if(ToLower(c) == 'x') {\ SayPieces(mine ? WhitePlay : BlackPlay);\ suppressOneKey = 1;\ break;\ } else\ if(CharToPiece(c) != EmptySquare) {\ SayPieces(CharToPiece(mine ? ToUpper(c) : ToLower(c)));\ suppressOneKey = 1;\ break;\ }\ }\ \ switch (wParam) {\ case VK_LEFT:\ case VK_RIGHT:\ case VK_UP:\ case VK_DOWN:\ KeyboardEvent(hwnd, message, wParam, lParam);\ break;\ case VK_SPACE:\ shiftKey = GetKeyState(VK_SHIFT) < 0;\ KeyboardMove(hwnd, message, wParam, lParam);\ break;\ }\ #define JAWS_KBUP_NAVIGATION \ switch (wParam) {\ case VK_SPACE:\ KeyboardMove(hwnd, message, wParam, lParam);\ break;\ }\ #define JAWS_MENU_ITEMS \ case IDM_PossibleAttackMove: /*What can I possible attack from here */\ PossibleAttackMove();\ break;\ \ case IDM_PossibleAttacked: /*what can possible attack this square*/\ PossibleAttacked();\ break;\ \ case IDM_ReadRow: /* Read the current row of pieces */\ ReadRow();\ break;\ \ case IDM_ReadColumn: /* Read the current column of pieces */\ ReadColumn();\ break;\ \ case IDM_SayCurrentPos: /* Say current position including color */\ SayCurrentPos();\ break;\ \ case IDM_SayAllBoard: /* Say the whole board from bottom to top */\ SayAllBoard();\ break;\ \ case IDM_SayMachineMove: /* Say the last move made */\ timeflag = 1;\ SayMachineMove(1);\ break;\ \ case IDM_SayUpperDiagnols: /* Says the diagnol positions above you */\ SayUpperDiagnols();\ break;\ \ case IDM_SayLowerDiagnols: /* Say the diagnol positions below you */\ SayLowerDiagnols();\ break;\ \ case IDM_SayBlackPieces: /*Say the opponents pieces */\ SayPieces(BlackPlay);\ break;\ \ case IDM_SayWhitePieces: /*Say the opponents pieces */\ SayPieces(WhitePlay);\ break;\ \ case IDM_SayClockTime: /*Say the clock time */\ SayClockTime();\ break;\ \ case IDM_SayWhosTurn: /* Say whos turn it its */\ SayWhosTurn();\ break;\ \ case IDM_SayKnightMoves: /* Say Knights (L-shaped) move */\ SayKnightMoves();\ break;\ \ case OPT_PonderNextMove: /* Toggle option setting */\ Toggle(&appData.ponderNextMove, "ponder");\ break;\ \ case OPT_AnimateMoving: /* Toggle option setting */\ Toggle(&appData.animate, "animate moving");\ break;\ \ case OPT_AutoFlag: /* Toggle option setting */\ Toggle(&appData.autoCallFlag, "auto flag");\ break;\ \ case OPT_AlwaysQueen: /* Toggle option setting */\ Toggle(&appData.alwaysPromoteToQueen, "always promote to queen");\ break;\ \ case OPT_TestLegality: /* Toggle option setting */\ Toggle(&appData.testLegality, "legality testing");\ break;\ \ case OPT_HideThinkFromHuman: /* Toggle option setting */\ Toggle(&appData.hideThinkingFromHuman, "hide thinking");\ ShowThinkingEvent();\ break;\ \ case OPT_SaveExtPGN: /* Toggle option setting */\ Toggle(&appData.saveExtendedInfoInPGN, "extended P G N info");\ break;\ \ case OPT_ExtraInfoInMoveHistory: /* Toggle option setting */\ Toggle(&appData.showEvalInMoveHistory, "extra info in move histoty");\ break;\ \ #define JAWS_ACCEL \ !(!frozen && TranslateAccelerator(hwndMain, hAccelJAWS, &msg)) && #define JAWS_INIT if (!InitJAWS()) return (FALSE); #define JAWS_DELETE(X) #define JAWS_SILENCE if(suppressClocks) return; #define JAWS_COPYRIGHT \ SetDlgItemText(hDlg, OPT_MESS, "Auditory/Keyboard Enhancements By: Ed Rodriguez (sort of)"); #define SAY(S) SayString((S), TRUE) #define SAYMACHINEMOVE() SayMachineMove(0) // After inclusion of this file somewhere early in winboard.c, the remaining part of the patch // is scattered over winboard.c for actually calling the routines. xboard-4.7.3/winboard/resource.h0000644000175000001440000006611612262562252013544 00000000000000//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by winboard.rc // #define MANIFEST_RESOURCE_ID 1 #define IDM_NewGame 100 #define IDM_LoadGame 101 #define IDM_SaveGame 102 #define IDM_Exit 103 #define IDM_LoadPosition 104 #define IDM_SavePosition 105 #define IDM_EditPosition 106 #define IDM_FlipView 107 #define IDM_MachineWhite 108 #define IDM_MachineBlack 109 #define IDM_TwoMachines 110 #define IDM_EditGame 111 #define IDM_Forward 112 #define IDM_Backward 113 #define IDM_ToEnd 114 #define IDM_ToStart 115 #define IDM_Pause 116 #define IDM_CallFlag 117 #define IDM_Draw 118 #define IDM_SaveDiagram 119 #define IDM_Abort 120 #define IDM_Adjourn 122 #define IDM_Resign 124 #define IDM_Hint 125 #define IDM_IcsClient 126 #define IDM_TimeControl 131 #define IDM_LoadOptions 132 #define IDM_SaveOptions 133 #define IDM_EditGame2 134 #define IDM_EditPosition2 135 #define IDM_CommPort 147 #define IDM_EditComment 148 #define IDM_LoadNextGame 149 #define IDM_LoadPrevGame 150 #define IDM_ReloadGame 151 #define IDM_Accept 153 #define IDM_Decline 154 #define IDM_StopObserving 155 #define IDM_StopExamining 156 #define IDM_Revert 157 #define IDM_TruncateGame 158 #define IDM_MoveNow 159 #define IDM_RetractMove 160 #define IDM_Upload 161 #define IDM_MailMove 164 #define IDM_ReloadCMailMsg 165 #define IDM_Book 166 #define IDM_AboutGame 167 #define IDM_EditServers 169 #define IDM_ShowGameList 170 #define IDM_EditTags 171 #define IDM_Tags 172 #define IDM_Comment 173 #define IDM_Debug 174 #define IDM_EditProgs1 175 #define IDM_LoadProg1 176 #define IDM_AnalysisMode 177 #define IDM_AnalyzeFile 178 #define IDM_Annotate 179 #define IDM_CopyGame 180 #define IDM_PasteGame 181 #define IDM_CopyPosition 182 #define IDM_PastePosition 183 #define IDM_NewVariant 184 #define IDM_TypeInName 185 #define IDM_MachineBoth 186 #define IDM_MuteSounds 187 #define IDM_Match 188 #define IDM_CreateBook 189 #define OPT_TCtext1 202 #define OPT_TCTime 203 #define OPT_TCtext2 204 #define OPT_Autosave 206 #define OPT_AVPrompt 208 #define OPT_AVToFile 209 #define OPT_AVFilename 210 #define OPT_Autostep 214 #define OPT_ASTimeDelay 215 #define OPT_AStext1 216 #define OPT_TCMoves 217 #define IDM_HELPCONTENTS 300 #define IDM_HELPSEARCH 301 #define IDM_HELPHELP 302 #define IDM_ABOUT 303 #define IDM_CommandX 310 #define IDM_CommandXLast 399 #define DLG_TimeControl 400 #define ABOUTBOX_Version 401 #define OPT_TCUseMoves 402 #define OPT_TCUseInc 403 #define OPT_TCitext1 405 #define OPT_TCitext2 406 #define OPT_TCInc 407 #define OPT_TCitext3 408 #define OPT_TCTime2 409 #define OPT_TCOdds1 410 #define OPT_TCOdds2 411 #define OPT_TCUseFixed 412 #define OPT_TCFixed 413 #define OPT_TCftext 414 #define DLG_PremoveOptions 450 #define DLG_GeneralOptions 453 #define DLG_IcsOptions 454 #define DLG_BoardOptions 455 #define DLG_Fonts 456 #define DLG_NewGameFRC 457 #define DLG_GameListOptions 458 #define DLG_MoveHistory 459 #define IDM_ThemeOptions 460 #define DLG_EvalGraph 461 #define DLG_EngineOutput 463 #define DLG_EnginePlayOptions 464 #define IDI_WHITE_14 466 #define IDI_BLACK_14 467 #define DLG_OptionsUCI 467 #define IDI_PONDER_14 468 #define IDI_TRANS_14 469 #define IDI_CLOCK_14 470 #define IDI_UNKNOWN_14 471 #define IDI_BALOON_14 472 #define IDI_ANALYZE_14 473 #define IDI_ANALYZE2_14 474 #define DLG_Promotion 500 #define PB_Queen 502 #define PB_Rook 503 #define PB_Bishop 504 #define PB_Knight 505 #define PB_Chancellor 506 /* [HGM] Capablanca pieces */ #define PB_Archbishop 507 #define IDC_Yes 520 #define IDC_No 521 #define IDC_Centaur 522 #define EP_White 600 #define EP_WhitePawn 601 #define EP_WhiteKnight 602 #define EP_WhiteBishop 603 #define EP_WhiteRook 604 #define EP_WhiteQueen 605 #define EP_Black 606 #define EP_BlackPawn 607 #define EP_BlackKnight 608 #define EP_BlackBishop 609 #define EP_BlackRook 610 #define EP_BlackQueen 611 #define EP_EmptySquare 612 #define EP_ClearBoard 613 #define EP_WhiteKing 614 #define EP_BlackKing 615 #define DP_Pawn 616 #define DP_Knight 617 #define DP_Bishop 618 #define DP_Rook 619 #define DP_Queen 620 #define EP_WhiteCardinal 630 #define EP_WhiteMarshall 631 #define EP_WhiteAlfil 632 #define EP_WhiteCannon 633 #define EP_WhiteFerz 634 #define EP_WhiteWazir 635 #define EP_BlackCardinal 640 #define EP_BlackMarshall 641 #define EP_BlackAlfil 642 #define EP_BlackCannon 643 #define EP_BlackFerz 644 #define EP_BlackWazir 645 #define EP_Promote 650 #define EP_Demote 651 #define DLG_LoadOptions 700 #define DLG_SaveOptions 800 #define OPT_PGN 802 #define OPT_Old 803 #define DLG_CommPort 900 #define OPT_Port 901 #define OPT_DataRate 902 #define OPT_Bits 903 #define OPT_Parity 904 #define OPT_StopBits 905 #define OPT_Flow 910 #define OPT_SerialHelp 911 #define DLG_BoardSize 1000 #define OPT_Small 1001 #define OPT_SizeSmall 1001 #define OPT_Medium 1002 #define OPT_SizeBulky 1002 #define OPT_Large 1003 #define DLG_EditComment 1004 #define OPT_ClearComment 1005 #define OPT_EditComment 1006 #define OPT_CommentText 1007 #define DLG_ViewComment 1008 #define DLG_GameList 1009 #define OPT_GameListPrev 1010 #define OPT_GameListText 1011 #define OPT_GameListLoad 1012 #define OPT_GameListNarrow 1010 #define OPT_GameListNext 1013 #define OPT_GameListClose 1014 #define DLG_EditTags 1015 #define OPT_TagsText 1016 #define DLG_Analysis 1017 #define OPT_AnalysisText 1018 #define DLG_Error 1019 #define OPT_ErrorIcon 1020 #define IDD_DIALOG1 1021 #define DLG_ConsoleRich 1022 #define IDC_EDIT1 1023 #define OPT_DarkSquareColor 1023 #define IDC_GameListFilter 1023 #define IDC_NFG_Edit 1023 #define IDC_EpDrawMoveCount 1023 #define IDC_PolyglotDir 1023 #define OPT_ConsoleText 1024 #define OPT_LightSquareColor 1024 #define OPT_CommandInput 1025 #define OPT_WhitePieceColor 1025 #define OPT_QuestionInput 1026 #define OPT_BlackPieceColor 1026 #define OPT_ChessEngineName 1027 #define OPT_HighlightSquareColor 1027 #define OPT_WavFileName 1028 #define OPT_PremoveHighlightColor 1028 #define OPT_IndexNumber 1029 #define OPT_SampleLightSquare 1029 #define OPT_Move 1030 #define OPT_SampleDarkSquare 1030 #define OPT_PremoveWhiteText 1031 #define IDC_EDIT2 1032 #define IDC_EpAdjudicationThreshold 1032 #define IDC_HashSize 1032 #define OPT_ConsoleInput 1033 #define OPT_AdditionalOptions 1034 #define OPT_PremoveBlackText 1035 #define OPT_ErrorText 1036 #define OPT_IcsAlarmTime 1037 #define OPT_Name 1038 #define DLG_Console 1100 #define DLG_PromotionKing 1102 #define DLG_Colorize 1106 #define DLG_Command 1122 #define DLG_Question 1123 #define DLG_Startup 1124 #define DLG_Sound 1127 #define DLG_IndexNumber 1149 #define DLG_TypeInMove 1151 #define DLG_TypeInName 1152 #define OPT_IndexNumberOld 1155 #define IDM_Rematch 1203 #define IDA_PAGEUP 1216 #define IDA_PAGEDOWN 1217 #define IDA_CTRLHOME 1218 #define IDA_CTRLEND 1219 #define IDA_TAB 1221 #define IDM_SaveSettings 1223 #define IDM_Iconize 1224 #define IDM_DirectCommand1 1226 #define IDM_DirectCommand2 1227 #define IDM_Copy 1229 #define IDM_Paste 1230 #define IDM_MatchX 1231 #define IDM_ObserveX 1232 #define IDM_FingerX 1233 #define IDM_TellX 1234 #define IDM_QuickPaste 1235 #define IDM_MessageX 1237 #define IDM_VarsX 1238 #define IDM_Cut 1240 #define IDM_Undo 1242 #define IDM_SelectAll 1243 #define IDM_SaveSettingsOnExit 1280 #define IDM_LoadNextPosition 1286 #define IDM_ReloadPosition 1287 #define IDM_LoadPrevPosition 1288 #define IDM_TypeInMove 1291 #define IDM_PopupExitMessage 1292 #define IDM_Training 1293 #define IDM_GeneralOptions 1299 #define IDM_BoardOptions 1300 #define IDM_Fonts 1301 #define IDM_UserAdjudication_White 1302 #define IDM_UserAdjudication_Black 1303 #define IDM_UserAdjudication_Draw 1304 #define IDM_NewGameFRC 1305 #define IDM_GameListOptions 1306 #define PB_King 1307 #define IDM_ShowMoveHistory 1307 #define IDM_PasteAny 1309 #define IDM_ShowEvalGraph 1310 #define IDM_CopyGameListToClipboard 1311 #define OPT_Bold 1312 #define IDM_ShowEngineOutput 1312 #define OPT_Italic 1313 #define IDM_EnginePlayOptions 1313 #define OPT_Underline 1314 #define IDM_OptionsUCI 1314 #define OPT_Strikeout 1315 #define OPT_ChooseColor 1316 #define OPT_Sample 1318 #define OPT_SampleSShout 1319 #define OPT_CancelComment 1320 #define OPT_SampleChannel1 1320 #define OPT_SampleChannel 1321 #define OPT_SampleKibitz 1322 #define OPT_SampleTell 1324 #define OPT_EditTags 1325 #define OPT_SampleChallenge 1325 #define OPT_TagsCancel 1326 #define OPT_SampleRequest 1326 #define OPT_CommandText 1327 #define OPT_QuestionText 1327 #define OPT_SampleSeek 1327 #define OPT_ChessEngine 1328 #define OPT_SampleNormal 1328 #define OPT_ChessServer 1329 #define OPT_View 1330 #define OPT_ChessServerName 1331 #define OPT_NoSound 1333 #define OPT_DefaultBeep 1334 #define OPT_SystemSound 1335 #define OPT_BuiltInSound 1336 #define OPT_WavFile 1337 #define OPT_BuiltInSoundName 1339 #define OPT_SystemSoundName 1340 #define OPT_BrowseSound 1341 #define OPT_PlaySound 1342 #define OPT_AVBrowse 1343 #define OPT_SecondChessEngineName 1344 #define OPT_AnyAdditional 1345 #define OPT_Premove 1346 #define OPT_PremoveWhite 1347 #define OPT_PremoveBlack 1348 #define OPT_IcsAlarm 1349 #define CBO_Sounds 1350 #define OPT_DefaultSounds 1351 #define OPT_AlwaysOnTop 1352 #define OPT_AutoCreate 1352 #define OPT_AutoFlag 1353 #define OPT_AlwaysQueen 1354 #define OPT_AutoComment 1354 #define OPT_AnimateDragging 1355 #define OPT_AutoObserve 1355 #define OPT_AnimateMoving 1356 #define OPT_GetMoveList 1356 #define OPT_AutoFlipView 1357 #define OPT_LocalLineEditing 1357 #define OPT_HighlightDragging 1358 #define OPT_QuietPlay 1358 #define OPT_HighlightLastMove 1359 #define OPT_PeriodicUpdates 1360 #define OPT_ChooseLightSquareColor 1360 #define OPT_PonderNextMove 1361 #define OPT_ChooseDarkSquareColor 1361 #define OPT_PopupExitMessage 1362 #define OPT_ChooseWhitePieceColor 1362 #define OPT_PopupMoveErrors 1363 #define OPT_ChooseBlackPieceColor 1363 #define OPT_ShowCoordinates 1364 #define OPT_ChooseHighlightSquareColor 1364 #define OPT_ShowThinking 1365 #define OPT_ChoosePremoveHighlightColor 1365 #define OPT_TestLegality 1366 #define OPT_Blindfold 1367 #define OPT_SizeTiny 1368 #define OPT_SizeTeeny 1369 #define OPT_SizeDinky 1370 #define OPT_SizePetite 1371 #define OPT_SizeSlim 1372 #define OPT_SizeMediocre 1374 #define OPT_SizeMiddling 1375 #define OPT_SizeAverage 1376 #define OPT_SizeModerate 1377 #define OPT_SizeMedium 1378 #define OPT_SizeLarge 1379 #define OPT_SizeBig 1380 #define OPT_SizeHuge 1381 #define OPT_SizeGiant 1382 #define OPT_SizeColossal 1383 #define OPT_SizeTitanic 1384 #define OPT_Monochrome 1385 #define OPT_DefaultBoardColors 1386 #define OPT_ChooseShoutColor 1387 #define OPT_ChooseSShoutColor 1388 #define OPT_ChooseChannel1Color 1389 #define OPT_ChooseChannelColor 1390 #define OPT_ChooseKibitzColor 1391 #define OPT_ChooseBackgroundColor 1392 #define OPT_ChooseTellColor 1393 #define OPT_ChooseChallengeColor 1394 #define OPT_ChooseRequestColor 1395 #define OPT_ChooseSeekColor 1396 #define OPT_ChooseNormalColor 1397 #define OPT_DefaultColors 1398 #define IDM_Minimize 1400 #define OPT_SampleShout 1400 #define IDM_Sounds 1401 #define OPT_SampleClockFont 1401 #define IDM_IcsOptions 1402 #define OPT_SampleCoordFont 1402 #define OPT_DontColorize 1403 #define OPT_SampleMessageFont 1403 #define OPT_SampleTagFont 1404 #define OPT_SampleCommentsFont 1405 #define OPT_SampleConsoleFont 1406 #define OPT_MessageFont 1407 #define OPT_ClockFont 1408 #define OPT_CoordFont 1409 #define OPT_EditTagsFont 1410 #define OPT_CommentsFont 1411 #define OPT_MessageFont5 1412 #define OPT_ChooseClockFont 1413 #define OPT_ChooseMessageFont 1414 #define OPT_ChooseCoordFont 1415 #define OPT_ChooseTagFont 1416 #define OPT_ChooseCommentsFont 1417 #define OPT_ChooseConsoleFont 1418 #define OPT_DefaultFonts 1419 #define OPT_ChooseMoveHistoryFont 1420 #define OPT_AutoRaiseBoard 1421 #define OPT_SampleMoveHistoryFont 1421 #define OPT_ShowButtonBar 1422 #define OPT_MessageFont6 1422 #define OPT_SaveExtPGN 1423 #define OPT_HideThinkFromHuman 1424 #define IDC_GameListDoFilter 1425 #define IDC_NFG_Random 1426 #define IDC_NFG_Label 1427 #define IDC_GameListTags 1428 #define IDC_GLT 1429 #define IDC_GLT_Up 1430 #define IDC_GLT_Down 1431 #define IDC_GLT_Restore 1432 #define IDC_GLT_Default 1433 #define IDC_GLT_RestoreTo 1434 #define IDC_MoveHistory 1435 #define OPT_OutOfBookInfo 1436 #define OPT_ExtraInfoInMoveHistory 1437 #define OPT_HighlightMoveArrow 1438 #define OPT_AutoLogo 1439 #define IDC_BUTTON1 1440 #define IDC_BrowseForPolyglotDir 1440 #define IDC_BrowseForEGTB 1441 #define IDC_BrowseForBook 1442 #define IDC_EngineMemo1 1443 #define IDC_EngineMemo2 1444 #define IDC_EngineLabel1 1445 #define IDC_EngineLabel2 1446 #define IDC_EpShowThinking 1447 #define IDC_EpHideThinkingHuman 1448 #define IDC_EpPonder 1449 #define IDC_EpPeriodicUpdates 1450 #define IDC_Engine1_NPS 1451 #define IDC_Engine2_NPS 1452 #define IDC_Color1 1459 #define IDC_Color2 1460 #define IDC_StateIcon1 1461 #define IDC_StateData1 1462 #define IDC_StateData2 1463 #define IDC_StateIcon2 1464 #define IDC_PathToEGTB 1466 #define IDC_SizeOfEGTB 1467 #define IDC_BookFile 1469 #define IDC_UseBook 1470 #define IDC_OwnBook1 1471 #define IDC_OwnBook2 1472 #define IDC_Cores 1473 #define IDC_BookDep 1474 #define IDC_BookStr 1475 #define IDC_Games 1476 #define DLG_NewVariant 1500 #define OPT_VariantGothic 1501 #define OPT_VariantCrazyhouse 1502 #define OPT_VariantBughouse 1503 #define OPT_VariantCourier 1504 #define OPT_VariantShatranj 1505 #define OPT_VariantShogi 1506 #define OPT_VariantXiangqi 1507 #define OPT_VariantCapablanca 1508 #define OPT_VariantTwoKings 1509 #define OPT_VariantKnightmate 1510 #define OPT_VariantLosers 1511 #define OPT_VariantSuicide 1512 #define OPT_VariantAtomic 1513 #define OPT_VariantNormal 1514 #define OPT_VariantFairy 1515 #define OPT_VariantFRC 1516 #define OPT_VariantCylinder 1517 #define OPT_VariantFalcon 1518 #define OPT_VariantCRC 1519 #define OPT_VariantBerolina 1520 #define OPT_VariantSuper 1521 #define OPT_VariantJanus 1522 #define OPT_VariantWildcastle 1523 #define OPT_VariantNocastle 1524 #define OPT_VariantGiveaway 1525 #define OPT_Variant3Check 1526 #define OPT_VariantGreat 1527 #define OPT_VariantTwilight 1528 #define OPT_VariantMakruk 1529 #define OPT_VariantSChess 1530 #define OPT_VariantSpartan 1531 #define OPT_VariantGrand 1534 #define IDC_Files 1550 #define IDC_Ranks 1551 #define IDC_Holdings 1552 #define IDC_TestClaims 1600 #define IDC_DetectMates 1601 #define IDC_MaterialDraws 1602 #define IDC_TrivialDraws 1603 #define IDC_RuleMoves 1604 #define IDC_DrawRepeats 1605 #define IDC_ScoreAbs1 1606 #define IDC_ScoreAbs2 1607 #define IDM_FlipClock 1700 #define OPT_AllWhite 1701 #define OPT_UpsideDown 1702 #define DLG_Chat 1720 #define IDC_Change 1721 #define IDC_ChatPartner 1722 #define IDC_ChatMemo 1723 #define OPT_ChatInput 1724 #define IDC_Clear 1725 #define IDC_Send 1726 #define IDM_NewChat 1727 #define IDC_Focus1 1730 #define IDC_Focus2 1731 #define IDC_Focus3 1732 #define IDC_Focus4 1733 #define OPT_SeekGraph 1750 #define OPT_AutoRefresh 1751 #define OPT_BgObserve 1752 #define OPT_DualBoard 1753 #define OPT_SmartMove 1754 #define OPT_StartupChatBoxes 1755 #define OPT_AutoKibitz 1756 #define IDC_SPECIFY_ENG_STATIC 1814 #define IDC_SPECIFY_SERVER_STATIC 1815 #define OPT_MESS 1818 #define IDM_Engine1Options 1890 #define IDM_Engine2Options 1891 #define IDM_EditBook 1892 #define IDM_Tourney 1894 #define IDC_STATIC -1 // static strings that were made dynamic to allow run-time translation #define IDC_Babble 1900 #define GPB_Factors 1901 #define IDC_Factor1 1902 #define IDC_Factor2 1903 #define IDC_Directories 1904 #define IDC_IndexNr 1905 #define IDC_Port 1906 #define IDC_Rate 1907 #define IDC_Bits 1908 #define IDC_Parity 1909 #define IDC_Stop 1910 #define IDC_Flow 1911 #define IDC_ChessBoard 1912 #define IDC_Welcome 1913 #define IDC_Index 1914 #define IDC_Event 1915 #define IDC_Sec 1916 #define IDC_Boxes 1917 #define GPB_Premove 1918 #define GPB_General 1919 #define GPB_Colors 1920 #define GPB_Alarm 1921 #define IDC_Light 1922 #define IDC_Dark 1923 #define IDC_White 1924 #define IDC_Black 1925 #define IDC_High 1926 #define IDC_PreHigh 1927 #define GPB_Size 1928 #define IDC_Height 1929 #define IDC_Width 1930 #define IDC_Hand 1931 #define IDC_Pieces 1932 #define IDC_Def 1933 #define GPB_Board 1934 #define GPB_Current 1935 #define GPB_All 1936 #define IDC_Partner 1937 #define IDC_Draw 1938 #define IDC_Threshold 1939 #define IDC_Moves 1940 #define IDC_Centi 1941 #define IDC_Rule 1942 #define IDC_Repeats 1943 #define GPB_Adjudications 1944 #define GPB_Apply 1945 #define IDC_PolyDir 1946 #define IDC_Hash 1947 #define IDC_Path 1948 #define IDC_Cache 1949 #define IDC_CPU 1950 #define IDC_Depth 1951 #define IDC_Variation 1952 #define IDC_DefGames 1953 #define GPB_Variant 1954 #define OPT_MessageFont7 1955 #define OPT_SampleGameListFont 1956 #define OPT_ChooseGameListFont 1957 #define OPT_elo1 1958 #define OPT_elo2 1959 #define OPT_date 1960 #define OPT_elo1t 1961 #define OPT_elo2t 1962 #define OPT_datet 1963 #define OPT_thresholds 1964 #define OPT_Exact 1965 #define OPT_Subset 1966 #define OPT_Struct 1967 #define OPT_Material 1968 #define OPT_Range 1969 #define OPT_Difference 1970 #define OPT_Stretch 1971 #define OPT_Stretcht 1972 #define OPT_Reversed 1973 #define OPT_SearchMode 1974 #define OPT_Mirror 1975 #define OPT_Bitmaps 1976 #define OPT_PieceFont 1977 #define OPT_MessageFont8 1978 #define OPT_SamplePieceFont 1979 #define OPT_ChoosePieceFont 1980 #define OPT_GameListFind 1981 #define OPT_Grid 1983 #define IDM_LoadProg2 1984 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 468 #define _APS_NEXT_COMMAND_VALUE 1315 #define _APS_NEXT_CONTROL_VALUE 1471 #define _APS_NEXT_SYMED_VALUE 1404 #endif #endif xboard-4.7.3/winboard/language/0000755000175000001440000000000012262415351013372 500000000000000xboard-4.7.3/winboard/language/romanian.lng0000644000175000001440000013404112262415351015623 00000000000000## WinBoard language file ## ## LANGUAGE NAME IN ENGLISH / TRANSLATED ## v1.0 beta 1 ## ## Translation by NAME (DATE) ## SAME AS ABOVE, TRANSLATED ## WEB ADDRESS OF TRANSLATOR ## ## If you revise this, please insert your date, name and description. ## TRANSLATION OF MESSAGE ABOVE ## TRANSLATION BY 11-oct-2011. Dl Silvian Rucsandescu din Iasi. ## Of duplicats, only the first occurrence will be used, even if it was in ## a different dialog! For this reason you will only see an 'OK' in the ## About Box. After you translated it there, this translation will be used ## for all other dialogs as well. ## o Use ## for comments, to make iteasy to find them scattered throughout the translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. ## preferably it should be unique in the applicable menu, so it depends on translation of other items! winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "&New Game\tCtrl-N" === "Partida Noua" "New Sh&uffle Game..." === "Partida Noua Shuffle" "New &Variant...\tAlt+Shift+V" === "Varianta Noua" "&Load Game...\tCtrl-O" === "Incarca Partida" "&Save Game...\tCtrl-S" === "Salveaza Partida" "L&oad Position...\tCtrl+Shift+O" === "Incarca Pozitia" "S&ave Position...\tCtrl+Shift+S" === "Salveaza Pozitia" "Save as &Diagram..." === "Salveaza ca Diagrama" "&Quit" === "Inchide" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === "Incarca Partida Urmatoare" "Load &Previous Game\tAlt+PgUp" === "Incarca Partida Precedenta" "&Reload Same Game" === "Reincarca Aceeasi Partida" "Load N&ext Position\tAlt+Shift+PgDn" === "Incarca Urmatoarea Pozitie" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Incarca Precedenta Pozitie" "Reload Sa&me Position" === "Reincarca Aceeasi Pozitie" "&Copy Game To Clipboard\tCtrl+C" === "Copie Partida pe Clipboard" "C&opy Position To Clipboard\tCtrl+Shift+C" === "Copie Pozitia pe Clipboard" "Copy Game List to Clipboard" === "Copie Lista Partidelor pe Clipboard" "&Paste Game From Clipboard\tCtrl+V" === "Copie Partida din Clipboard" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Copie Pozitia din Clipboard" "&Edit Game\tCtrl+E" === "Editeaza Partida" "E&dit Position\tCtrl+Shift+E" === "Editeaza Pozitia" "Edit Ta&gs..." === "Editeaza Eticheta" "Edit Co&mment..." === "Editeaza Comentariul" "Enter &Username..." === "Introdu Nume Utilizator" "&Revert\tHome" === "Revenire" "&Annotate" === "Adnotare" "&Truncate Game\tEnd" === "Scurteaza Partida" "&Backward\tAlt+Left" === "Inapoi" "&Forward\tAlt+Right" === "Inainte" "Back to &Start\tAlt+Home" === "Inapoi la Start" "For&ward to End\tAlt+End" === "Inainte la Sfarsit" "Flip &View\tF2" === "Vizualizare Inversa" "&Swap Clocks" === "Schimba Ceasurile" "Engine &Output\tAlt+Shift+O" === "Calculatia Motorului" "Move &History\tAlt+Shift+H" === "Istoricul Mutarilor" "Evaluation &Graph\tAlt+Shift+E" === "Graficul Evaluarii" "Game &List\tAlt+Shift+G" === "Lista Partidelor" "Open &New Chat Window" === "Deschide Fereastra Noua de Chat" "Type In &Move...\tAlt+I" === "Introdu Mutari" "&Tags" === "Eticheta" "&Comments" === "Comentarii" "&Game List Tags..." === "Eticheta Partidei" "&Board..." === "Tabla" "&Fonts..." === "Fonturi" "Machine &White\tCtrl+W" === "Motorul la Alb" "Machine &Black\tCtrl+B" === "Motorul la Negru" "&Two Machines\tCtrl+T" === "Doua Motoare" "Machine Both" === "Ambele Motoare" "&Analysis Mode\tCtrl+A" === "Modul de Analiza" "Analyze &File\tCtrl+F" === "Fisierul de Analizat" "&Edit Game\tCtrl+E" === "Editeaza Partida" "E&dit Position\tCtrl+Shift+E" === "Editeaza Pozitia" "Trai&ning" === "Antrenament" "&ICS Client" === "ICS Client" "&Machine Match" === "Partida Intre Motoare" "&Pause\tPause" === "Pauza" "&Accept\tF3" === "Accept" "D&ecline\tF4" === "Refuz" "Re&match\tF12" === "Rejucare" "Call &Flag\tF5" === "Caderea Steagului" "&Draw\tF6" === "Remiza" "Ad&journ\tF7" === "Intrerupere" "A&bort\tF8" === "Renunt" "&Resign\tF9" === "Cedez" "Stop &Observing\tF10" === "Opreste Observarea" "Stop E&xamining\tF11" === "Opreste Examinarea" "&Upload to Examine" === "Incarca spre Examinare" "Adjudicate to &White" === "Adjudecat la Alb" "Adjudicate to &Black" === "Adjudecat la Negru" "Adjudicate &Draw" === "Adjudecat Remiza" "Install 1st..." === "Instaleaza motorul 1" "Install 2nd..." === "Instaleaza motorul 2" "Engine #&1 Settings..." === "Setare Motorul nr 1" "Engine #&2 Settings..." === "Setare Motorul nr 2" "&Hint..." === "Sugestie" "&Book..." === "Carte de Deschideri" "&Move Now\tCtrl+M" === "Muta Acum" "&Retract Move\tCtrl+X" === "Retrage Mutarea" "&Mute all Sounds" === "Fara Sunet" "&General..." === "Optiuni Generale" "&Time Control...\tAlt+Shift+T" === "Controlul Timpului" "Common &Engine...\tAlt+Shift+U" === "Setari Comune Enginelor UCI" "Ad&judications...\tAlt+Shift+J" === "Adjudecarea" "&Load Game...\tAlt+Shift+L" === "Incarca Partida" "&Save Game...\tAlt+Shift+S" === "Salveaza Partida" "G&ame List..." === "Optiunile Listei de Partide" "Soun&ds..." === "Sunetul" "&ICS..." === "ICS" "Add ICS..." === "Adauga ICS" "Comm&unications..." === "Comunicatii" "Save Settings &Now" === "Salveaza Setarile Acum" "Save Settings on E&xit" === "Salveaza Setarile la Iesire" "Help &Contents\tF1" === "Continutul Ajutorului" "Help &Index" === "Indexul Ajutorului" "How to &Use Help" === "Cum se Foloseste Ajutorul" "&About WinBoard" === "Despre WinBoard" "White" === "Albul" "Promote" === "Transforma" "Pawn" === "Pion" "Knight" === "Cal" "Bishop" === "Nebun" "Rook" === "Tura" "Queen" === "Dama" "King" === "Rege" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "Arhiepiscop" "Chancellor" === "Cancelar" ## Next 2 Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === "Elefant" "Cannon" === "Tun" "Empty Square" === "Camp Liber" "Black" === "Negru" "Demote" === "Degradeaza" "Clear Board " === "Curata Tabla" ## Next 3: Shogi pieces. "Gold" === "Aur" "Silver" === "Argint" "Lance" === "Lancie" "Drop" === "Cadere" "Cop&y and Paste" === "Copie si Scrie" "&Copy" === "Copie" "&Paste" === "Scrie" "&Undo" === "Revenire" "Cu&t" === "Taie" "&Copy" === "Copie" "&Paste" === "Scrie" "Select &All" === "Selecteaza Totul" DIALOGS: ABOUTBOX ## Pehaps copyright notices best left untranslated? "About WinBoard" === "Despre Winboard" "OK" === "OK" "Chessboard for Windows" === "WinBoard GUI pentru Windows" "Copyright 1991 Digital Equipment Corporation" === "" "Enhancements Copyright 1992-2014 Free Software Foundation" === "" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccin por scar Toledo G.". "Tradus de Dl Silvian Rucsandescu Iasi" === "Tradus de Dl Silvian Rucsandescu Iasi " "WinBoard 0.0.0" === "WinBoard 4.5.3" ABOUTBOX2 ## Weird, it is needed? [Normally not. It is a built-in 'Easter Egg' joke.] "galactic" === "galactic" TIME CONTROL DIALOG "Time Control" === "Controlul Timpului" "Conventional chess clock" === "Ceas Conventional" "Incremental clock" === "Ceas cu Incrementare" "Cancel" === "Anuleaza" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Foloseste sagetile pentru a specifica setarile ceasului, apoi apsai butonul pentru a modifica valorile." "Fixed time per move" === "Timp fix pe mutare" "Number of moves:" === "Numarul de mutari" "Within number of minutes:" === "In numarul de minute " "Initial number of minutes:" === "Numarul initial de minute" "Plus number of seconds per move:" === "Plus numarul de secunde pe mutare" "Maximum seconds per move:" === "Maximul de secunde pe mutare" "Time-Odds Factors:" === "Timpi Diferiti" "Engine #1:" === "Motorul nr 1" "Engine #2:" === "Motorul nr 2" LOAD OPTIONS "Load Game Options" === "Incarca Optiunile Partidei" "Load games with &automatic stepping" === "Incarca partidele cu rulare automata" "&seconds per move" === "secunde pe mutare" "when filtering game list on position, use thresholds:" === "cand se filtreaza lista de partide dupa pozitie , foloseste limitele" "Search Mode: " === "Modul de Cautare" "Match exact &position" === "Cauta pozitia exacta" "Match if position is s&ubset" === "Cauta daca pozitia este continuta" "Match material with e&xact pawn structure" === "Cauta pozitii cu aceeasi structura de pioni" "Match &material" === "Cauta material" "Material &range (upper board-half is optional)" === "Gama de material (jumtatea de sus a tablei este opionala)" "Material &difference (optional material balanced)" === "Diferenta materiala (material optional echilibrat)" "Also match reversed &colors" === "Cauta de asemenea culorile inversate" "Also match &left-right mirror image" === "Cauta de asemenea imaginea in oglinda stanga-dreapta" "minimum Elo for &best player" === "ELO minim pentru cel mai bun jucator" "minimum Elo for &weakest players" === "ELO minim pentru cel mai slab jucator" "or later &year" === "sau mai tarziu anul" "co&nsecutive positions" === "pozitii consecutive" SAVE OPTIONS DIALOG "Save Game Options" === "Salveaza Optiunile Partidei" "Save As: " === "Salveaza ca" "Save games automatically" === "Salveaza partidele automat" "Prompt for filename" === "Prompter pentru numele fisierului" "To file:" === "Spre fisierul" "PGN" === "PGN" "Old" === "Vechi" "Browse..." === "Cauta" "Save out of book info in PGN" === "Salveaza iesirea din cartea de deschideri in PGN" 1536 ## This dialog is only used in some older Windows versions, so you might not be ableto test it. "Open" === "Deschide" "File &Name:" === "Denumirea Fisierului" "&Directories:" === "Directorul" "List Files of &Type:" === "Listeaza Fisierele de Tipul" "Dri&ves:" === "Partitia" "&Help" === "Ajutor" "&Index number:" === "Numarul de index" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === "Setarile Portului de Comunicare" "Net&work..." === "Reteaua" "&Port:" === "Port" "Data &Rate:" === "Rata de Transfer a Datelor" "Data &Bits:" === "Numarul de Biti ai datelor" "P&arity:" === "Paritatea" "&Stop Bits:" === "Stop Biti" "F&low:" === "Functionare" EDIT COMMENT "Edit Comment" === "Editeaza Comentariul" "&Clear" === "Sterge" "&Edit" === "Editeaza" PROMOTION POPUP "Promote to:" === "Transforma in" ## next used in Shogi as promotion-popup header "Promote?" === "Transformi?" "Promotion" === "Transformare" "&Queen" === "Regina" "&Rook" === "Turn" "&Bishop" === "Nebun" "K&night" === "Cal" "&King" === "Rege" "&Cancel" === "Anuleaza" "Chance&llor" === "Cancelar" "&Archbishop" === "Arhiepiscop" "YES" === "DA" "NO" === "NU" "C&entaur" === "Centaur" GAME LIST "Game List" === "Lista Partidelor" "&Load" === "Incarca" "&Prev" === "Precedenta" "&Next" === "Urmatoarea" "&Close" === "Inchide" "Filter" === "Filtreaza" EDIT TAGS "Edit Tags" === "Editeaza Eticheta" ERROR "ICS Interaction" === "Interactiune ICS" "Dialog" === "Dialog" "Error" === "Eroare" ## I don't think the next will really appear ever. "Sorry Charlie" === "Imi pare rau Charlie" COLORIZE "I C S Interaction Colors" === "Interactiunea culorilor I C S" "Interaction Colors" === "Interactiunea Culorilor" "Premove" === "Mutare Anticipata" "Alarm" === "Alarma" "Colors" === "Culori" "&Choose Color..." === "Alege Culoarea" "&Bold" === "" "&Italic" === "" "&Underline" === "Subliniaza" "&Strikeout" === "Barat" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === "Abracadabra" "Question" === "Intrebare" "Enter" === "Introdu" STARTUP DIALOG "WinBoard Startup" === "Pornire WinBoard" "What would you like to do?" === "Ce ai dori s facei ?" "&Play against a chess engine or match two engines" === "Joaca contra unui motor de sah sau meci inte doua motoare" "&Use an Internet Chess Server" === "Foloseste un Server de Sah pe Internet" "Just &view or edit game files" === "Vizualizeaza sau editeaza fisierele partidelor" "Specify Chess &Engines:" === "Specifica Motoarele de Sah" "Specify Chess &Server:" === "Specifica Serverul de Sah" "&Additional options" === "Optiuni Suplimentare" INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === "Numarul de index" MOVE TYPE-IN "Type in a move" === "Introdu o mutare" USER-NAME TYPE-IN "Type in your name" === "Scriei numele Dvs" SOUND DIALOG "Sounds" === "Sunetul" "&Event:" === "Evenimentul" "&No sound" === "Fara sunet" "&Default beep" === "Bip default" "&Built-in sound:" === "Sunetul continut de program " "&WAV file:" === "Fisier WAV" "B&rowse..." === "Cauta" "&Play" === "Joaca" "&Defaults" === "Defaults" GENERAL OPTIONS DIALOG ## pleace keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === "Optiuni Generale" "Always on &Top" === "Intotdeauna Deasupra" "Always &Queen Ctrl+Shift+Q" === "Intotdeauna Dama" "Animate &Dragging" === "Tragere Animata" "&Animate Moving Ctrl+Shift+A" === "Mutare Animata" "Auto &Flag Ctrl+Shift+F" === "Steag Automat" "Auto Flip &View" === "Intoarce Tabla Automat" "Auto &Raise Board" === "Fereastra Deasupra" "&Blindfold" === "Sah Orb" "Highlight Dra&gging" === "Marcheaza campurile de plecare - sosire" "Highlight Last &Move" === "Marcheaza ultima mutare" "Periodic &Updates" === "Updateuri periodice" "Ponder &Next Move Ctrl+Shift+P" === "Motorul permanent" "&Popup Exit Message" === "Afiseaza un mesaj inainte de iesire" "Popup Move &Errors" === "Afiseaza un mesaj la mutarile gresite" "Show Butt&on Bar" === "Afiseaza bara cu butoanele de comanda" "Show &Coordinates" === "Afiseaza coordonatele" "&Show Thinking" === "Arata calculatia motorului" "Test &Legality Ctrl+Shift+L" === "Testeaza legalitatea mutarii" "&Hide Thinking Ctrl+Shift+H" === "Ascunde calculatia motorului" "&Info in Move History Ctrl+Shift+I" === "Informatii in lista de mutari" "&Send Engine Think" === "Transmite calculatia motorului" "E&xtended PGN Info Ctrl+Shift+X" === "Informatii PGN extinse" "Highlight with Arro&w" === "Marcheaza cu sageata" "Displa&y Logos" === "Afiseaza logourile motoarelor" "One-Click Move" === "Mutare printr-un click" ICS OPTIONS "ICS Options" === "Optiunile ICS" "&Auto Comment" === "Comentariu Automat" "Auto &Observe" === "Observatie Automata" "&Get Move List" === "Primeste Lista de Mutari" "&Local Line Editing" === "Editarea Liniei Locale" "&Quiet Play" === "Joc Tacut" "&Premove" === "Mutare Anticipata" "&White first move" === "Albul are prima mutare" "&Black first move" === "Negrul are prima mutare" "&Sound alarm at" === "Suna alarma la" "seconds" === "secunde" "Choose..." === "Alege" "Do ¬ colorize messages" === "Nu colora mesajele" "&Auto Kibitz" === "Auto Kibitz" "Auto Kibit&z" === "Auto Kibitz" "See&k Graph" === "Cerceteaza Graficul" "auto-&Refresh" === "Auto-Refresh" "Bckgnd Obser&ve" === "Observare din background" "&Dual Board" === "Tabla duala" "One-Click &Move" === "Mutare printr-un click" "Background..." === "In spate" "&Defaults..." === "Implicite" "Startup &Chat Boxes:" === "Porneste Boxele de Conversatie" "General" === "General" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === "Optiunile Tablei" "Defaults" === "Implicite" "Light Squares" === "Campuri deschise" "Dark Squares" === "Campuri inchise" "White Pieces" === "Piesele Albe" "Black Pieces" === "Piesele Negre" "Square Highlights" === "Marcheaza Campul" "Premove Highlights" === "Marcheaza Anticipata" "Monochrome" === "Monocrom" "All White" === "Totul Alb" "Flip Black" === "Intoarce Negrele" "Size" === "Marimea" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "Foarte Mica" "T&eeny" === "Mititica" "&Dinky" === "Micuta" "&Petite" === "Mica 1" "Sl&im" === "Mica 2" "&Small" === "Mica" "Medi&ocre" === "Nu chiar mica" "&Middling" === "Mijlocie" "&Average" === "Normala" "Mode&rate" === "Moderata" "Medi&um" === "Medie" "Bul&ky" === "Groasa" "&Large" === "Larga" "&Big" === "Mare" "&Huge" === "Enorma" "&Giant" === "Giganta" "&Colossal" === "Colosala" "Tita&nic" === "Titanica" FONTS "Fonts" === "Fonturi" "Current Board Size" === "Marimea curenta a Tablei" "All Board Sizes" === "Toate marimile Tablei" "&Revert to Defaults" === "Revenire la Implicite" "Clocks" === "Ceasurile" "Messages" === "Mesajele" "Coordinates" === "Coordonatele" "Tags" === "Etichetele" "Comments" === "Comentariile" "I C S Interaction" === "Interactiune I C S" "&Color..." === "Culoarea..." "Move History, Engine Output" === "Lista Mutarilor,Calculatia Motorului" ADJUDICATIONS DIALOG "Adjudications" === "Adjudecarea" "Ponder Next Move" === "Calculeaza Urmatoarea Mutare" "Enable and Show Thinking (recommended)" === "Comuteaza si Arata Calculatia (recomandat)" "Hide Thinking when Playing against Human" === "Ascunde Calculatia la Jocul contra Oamenilor " "Periodic Updates (for Analysis Mode)" === "Updateuri Periodice (pentru Modul de Analiza)" "Adjudications in non-ICS games" === "Adjudecarea in partidele non-ICS" "Adjudicate draw after:" === "Adjudeca remiza dupa" "moves" === "mutari" "Win/loss adjudication threshold:" === "limita de adjudecare castig/pierdere" "centipawns" === "centipioni" "&Verify Engine Claims" === "Verifica Solicitarile Motorului" "Detect &Mates" === "Detecteaza Maturile" "Draw if &Insufficient Material" === "Remiza daca Materialul este Insuficient" "Adjudicate &Trivial Draws" === "Adjudeca Remizele Clare" "Apply" === "Aplica" ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === "-regula celor 50" "-fold repeats" === "-a repetare" "Engine #1 Score is Absolute" === "Motorul 1 Scorul este Absolut" "Engine #2 Score is Absolute" === "Motorul 2 Scorul este Absolut" COMMON ENGINE DIALOG "Common Engine Settings" === "Setari Comune Enginelor UCI" "Polyglot Directory:" === "Directorul pt. Polyglot" "Hash Size (MB):" === "Marimea Hashului (MB)" "EGTB Path:" === "Adresa bazelor de final" "EGTB Size (MB):" === "Hashul bazelor de final (MB)" "Use Book:" === "Utilizeaza Cartea" "Max nr of CPUs:" === "Nr. max. de CPUs" "First has Own Book" === "Albul are cartea sa" "Second has Own Book" === "Negrul are cartea sa" "Book Depth:" === "Profunzimea Cartii" "Book Variation:" === "Variatia Cartii" "Default Match Games:" === "Meciuri Implicite" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "Variantele de Sah" "Variant" === "Varianta" "Board size:" === "Marimea tablei" "ranks" === "randuri" "files" === "coloane" "Holdings with room for:" === "Pegatiti-va pentru" "pieces" === "piese" "('-1' means defaults for selected variant)" === "('-1' inseamna "implicit" pentru varianta selectata)" VARIANT NAMES: "&normal" === "" "&FRC" === "" "&wildcastle" === "" "&nocastle" === "" "&losers" === "" "&giveaway" === "" "s&uicide" === "" "&3Check" === "" "&twokings" === "" "&atomic" === "" "cra&zyhouse" === "" "&bughouse" === "" "&Twilight" === "" "Sp&artan" === "" "&shogi" === "" "su&per" === "" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "" "&fairy" === "" "&makruk" === "" "&gothic" === "" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "&xiangqi" === "" NEW SHUFFLE GAME "New Shuffle Game" === "Partida Noua Shuffle" "&Start Position Number:" === "Pozitia de Start Numarul" "Random" === "La Intamplare" GAME-LIST OPTIONS DIALOG "Game List Options" === "Optiunile Listei Partidei" "PGN &Tags:" === "PGN si Etichete" "&Up" === "Sus" "&Down" === "Jos" "Default" === "Implicit" "Factory" === "Fabrica" "Restore to:" === "Restaureaza" MOVE HISTORY WINDOW "Move History" === "Istoricul Mutarilor" EVALUATION GRAPH "Evaluation Graph" === "Graficul de Evaluare" ENGINE OUTPUT WINDOW "Engine output" === "Calculatia Motorului" "Engine #1" === "Motorul nr. 1" "NPS" === "NPS" "Engine #2" === "Motorul nr. 2" CHAT BOXES "Chat Window" === "Fereastra de Conversatie" "Chat partner:" === "Partenerul de Conversatie" "Clear" === "Sterge" "Send" === "Trimite" winboard.c "&File" === "Fisier" "&Edit" === "Editeaza" "&View" === "Vizualizare" "&Mode" === "Mod" "&Action" === "Actiune " "&Step" === "Pas" "E&ngine" === "Motor" "&Options" === "Optiuni" "&Help" === "Ajutor" "You can only start a match from the initial position." === "Puteti incepe o partida doar din pozitia initiala" "Font name too long:" === "Denumirea fontului prea lunga" "Font point size missing:" === "Lipseste marimea fontului" "Can't parse color name %s" === "Nu poate analiza numele culorii %s" "Unrecognized board size value" === "Marimea tablei necunoscuta" "Unrecognized argument" === "Argument necunoscut" "No value provided for argument" === "Nici o valoare alocata argumentului" "Incomplete \\ escape in value for" === "Incomplet \\ pierdere in valoare pentru" "Failed to open indirection file" === "Ratata deschiderea fisierului incorect " "Unrecognized boolean argument value" === "Valoarea argumentului boolean necunoscuta" "Unrecognized argument" === "Argument necunoscut" "Too many colors" === "Prea multe culori" "&Minimize\tCtrl+F4" === "Micsoreaza" "White: %s" === "Albul: %s" "We only care about the height here" === "Avem grija doar de inaltime aici" "Cannot build game list" === "Nu se poate construi lista de partide" "Load Game from File" === "Incarca Partida din Fisierul" "Load Position from File" === "Incarca Pozitia din Fisierul" "Save Game to File" === "Salveaza Partida in Fisierul" "Save Diagram to File" === "Salveaza Diagrama in Fisierul" "Save Position to File" === "Salveaza Pozitia in Fisierul" "%s does not support analysis" === "%s nu suporta analiza" "Analyze Game from File" === "Analizeaza Partida din Fisierul" "Unable to activate help" === "Imposibil sa activeze ajutorul" "Send to chess program:" === "Trimite programului de sah" "Send to second chess program:" === "Trimite programului de sah nr 2" "Direct Command" === "Comanda Directa" "Error loading sound %s" === "Eroare la incarcarea sunetului %s" "Error playing sound %s" === "Eroare la rularea sunetului %s" "File open failed" === "Deschiderea fisierului ratata" "Internal error in file dialog box" === "Eroare interna in casuta de dialog a fisierului" "Option Error" === "Optiunea Eroare" "Choose an option, or cancel to exit" === "Alege o optiune, ori anuleaza pentru iesire" "Unable to activate help" === "Imposibil de activat ajutorul" "Displayed move is not current" === "Mutarea afisata nu este cea curenta" "Could not parse move" === "Nu s-a putut interpreta mutarea" "%s:\nError code %d" === "%s:\nEroare de cod %d" "Error" === "Eroare" "Fatal Error" === "Eroare Fatala" "Exiting" === "Iesind" "%s:\nError code %d" === "%s:\nEroare de cod %d" "Note" === "Nota" "Error writing to chess program" === "Eroare de scris catre programul de sah" "User" === "Utilizator" "Unknown" === "Necunoscut" "White" === "Albul" "Black" === "Negrul" "Save Game to File" === "Salveaza Partida in Fisierul" "Not implemented" === "Neimplementat" "Shout Text" === "Text de Iesire" "SShout/CShout" === "" "Channel 1 Text" === "Text Canal 1" "Channel Text" === "Text Canal" "Kibitz Text" === "Text Kibitz" "Tell Text" === "Spune Textul" "Challenge Text" === "Textul pentru Intrecere" "Request Text" === "Cerere" "Seek Text" === "Textul de Cautare" "Normal Text" === "Text Normal" "None" === "Nimic" "Pawn" === "Pion" "Knight" === "Cal" "Bishop" === "Nebun" "Rook" === "Turn" "Queen" === "Dama" "Information" === "Informatie" wclipbrd.c "Unable to convert position to FEN." === "Imposibil sa transform pozitia in FEN" "Unable to copy FEN to clipboard." === "Imposibil sa copii FEN-ul spre clipboard " "Cannot create temporary file name." === "Nu pot creia un nume de fisier temporar " "Cannot open temporary file." === "Nu pot deschide un fisier temporar" "Cannot write to temporary file." === "Nu pot scrie catre un fisier temporar" "Cannot reopen temporary file." === "Nu pot redeschide fisierul temporar" "Cannot determine size of file." === "Nu pot determina marimea fisierului" "Cannot allocate clipboard buffer." === "Nu pot aloca buferul clipboardului" "Cannot read from temporary file." === "Nu pot citi din fisierul temporar" "Error reading from temporary file." === "Eroare de citire din fisierul temporar" "Cannot copy text to clipboard" === "Nu pot copia textul pe clipboard" "Unable to allocate memory for clipboard." === "Incapabil sa aloc memorie pentru clipboard" "Unable to lock clipboard memory." === "Imposibil sa blochez memoria clipboardului" "Cannot unlock clipboard memory." === "Imposibil sa deblochez memoria clipboardului" "Cannot open clipboard." === "Nu pot deschide clipboardul" "Cannot empty clipboard." === "Nu pot sterge clipboardul" "Cannot copy text to clipboard." === "Nu pot copia textul pe clipboard" "Cannot close clipboard." === "Nu pot inchide clipboardul" "Unable to paste FEN from clipboard." === "Imposibil sa copii FENul din clipboard" "Unable to create temporary file." === "Imposibil sa creiez un fisier temporar" "Error writing to temporary file." === "Eroare de scris in fisierul temporar" "Unable to open clipboard." === "Imposibil sa deschid clipboardul" "No text in clipboard." === "Nici un text in clipboard" "Unable to lock clipboard memory." === "Imposibil sa blochez memoria clipboardului" "Unable to allocate memory for text string." === "Imposibil sa aloc memorie pentru stringul urmator" "Unable to unlock clipboard memory." === "Imposibil sa deblochez memoria clipboardului" "Unable to close clipboard." === "Imposibil sa inchid clipboardul" woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === "Cauta Fisierul de Sunet" "Can't parse com port settings" === "Nu se pot analiza setarile portului de comunicare" "Option Error" === "Optiunea Eroare" "Invalid data rate" === "Rata de date invalida" "Option Error" === "Optiunea Eroare" "Failed to set comm port state;\r\ninvalid options?" === "Esuat in setarea portului de comunicatii;\r\ninvalid options?" "Failed to set comm port state" === "Esuat in setarea portului de comunicatii" "Invalid load game step rate" === "Rata de derulare a incarcarii partidei invalida" "Invalid save game file name" === "Numele fisierului de salvare a partidei invalid" "Browse for Auto Save File" === "Cauta Auto Salvarea Fisierului" "Invalid moves per time control" === "Mutari pe timpul de control invalide" "Invalid minutes per time control" === "Minute pe timpul de control invalide" "Invalid increment" === "Increment invalid" "Invalid initial time" === "Timp initial invalid" "Changing time control during a game is not implemented" === "Schimbarea timpului de control in timpul partidei nu este implementata" "Variant %s not supported by %s" === "Varianta %s nu este suportata de %s" "Warning: second engine (%s) does not support this!" === "Atentie: al doielea motor (%s) nu suporta aceasta" "Invalid ICS Alarm Time" === "Timp de Alarma ICS Invalid" "Invalid max time per move" === "Timp maxim pe mutare invalid" "Invalid time-odds factor" === "Factorul de diferenta de timp invalid" "Choose Folder" === "Alege Folderul" "Choose Book" === "Alege Cartea de Deschideri" "Choose Polyglot Directory" === "Alege Directorul pentru Polyglot" "Choose EGTB Directory:" === "Alege Directorul pentru EGTB" "Polyglot was not found in the specified folder!" === "Polyglot nu a fost gasit in directorul specificat!" wgamelist.c "No game selected" === "Nici o partida selectata" "Can't go forward any further" === "Nu poate merge mai departe" "Can't back up any further" === "Nu se poate inapoi mai mult" "No game list" === "Fara lista de partide" "Game List" === "Lista de Partide" "Game list not loaded or empty" === "Lista de partide neincarcata sau goala" "%s - %d/%d games" === "%d (%d,%d-%d,%d) partide" wedittags.c "Edit Tags" === "Editeaza Eticheta" "Tags" === "Eticheta" "Error replacing tags." === "Eroare la inlocuirea etichetei" wsettings.c "%s Engine Settings (%s)" === "%s Setarile Motorului (%s)" "OK" === "OK" "Cancel" === "Inchide" wchat.c "Chat Window %s" === "Fereastra de Conversatie %s" backend.c "bad timeControl option %s" === "optiune incorecta de timp %s" "bad searchTime option %s" === "optiune incotecta de timp de cautare %s " ## following to will appear in combinationslike "first engine" "first" === "primul" "second" === "al doielea" "protocol version %d not supported" === "versiunea de protocol %d nu este suportata" "Variant %s supported only in ICS mode" === "Varianta %s suportata doar in modul ICS" "Unknown variant name %s" === "Numele variantei necunoscut %s" "Starting chess program" === "Porneste programul de sah" "Could not open comm port %s" === "Nu se poate deschide portul de comunicatii %s" "Could not connect to host %s, port %s" === "Nu se poate conecta la gazda %s, portul %s" "Unknown initialMode %s" === "Modul initial necunoscut %s" "Can't have a match with no chess programs" === "Nu putem avea un meci fara programe de sah" "Bad game file" === "Fisierul partidei incorect" "Bad position file" === "Fisierul pozitiei incorect" "AnalyzeFile mode requires a game file" === "Modul AnalizaFisierului cere un fisier de partida" "Analysis mode requires a chess engine" === "Modul de analiza cere un motor de sah " "Analysis mode does not work with ICS mode" === "Analiza nu lucreaza cu modul ICS" "MachineWhite mode requires a chess engine" === "Modul MasinaAlba cere un motor de sah" "MachineWhite mode does not work with ICS mode" === "Modul MasinaAlba nu merge cu modul ICS" "MachineBlack mode requires a chess engine" === "Modul MasinaNeagra cere un motor de sah" "MachineBlack mode does not work with ICS mode" === "Modul MasinaNeagra nu merge cu modul ICS" "TwoMachines mode does not work with ICS mode" === "Modul DouaMasini nu merge cu modul ICS" "TwoMachines mode requires a chess engine" === "Modul DouaMasini cere un motor de sah" "Training mode requires a game file" === "Modul de antrenamernt cere un fisier de partide" "Error writing to ICS" === "Eroare de scris catre ICS" "Error reading from keyboard" === "Eroare de citit din claviatura" "Got end of file from keyboard" === "Scoate textul din claviatura" "Error writing to ICS" === "Eroare de scris catre ICS" "Error writing to display" === "Eroare de scris catre afisaj" "Error gathering move list: two headers" === "Eroare de colectare la lista mutarilor: doua anteturi" "Error gathering move list: nested" === "Eroare de colectare la lista mutarilor: imbricate" "Connection closed by ICS" === "Conexiune inchisa de ICS" "Error reading from ICS" === "Eroare de citire de la ICS" "Failed to parse board string:\n\"%s\"" === "Esuat in analiza stringului tablei:\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "Partida prea lunga: mareste MAX_MOVES si recompileaza" "Error gathering move list: extra board" === "Eroare colectare lista mutari: extra board" "Illegal move \"%s\" from ICS" === "Mutare ilegala \"%s\" de la ICS " "Couldn't parse move \"%s\" from ICS" === "Nu se poate analiza mutarea \"%s\" de la ICS" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "Eroare interna :tip de mutare gresit %d (%d,%d-%d,%d)" "You are playing Black" === "Tu joci cu Negrul" "You are playing White" === "Tu joci cu Albul" "It is White's turn" === "Este randul Albului" "It is Black's turn" === "Este randul Negrului" "Displayed position is not current" === "Pozitia afisata nu este cea curenta" "Illegal move" === "Mutare ilegala" "End of game" === "Sfarsitul partidei" "Incorrect move" === "Mutare incorecta" ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === "Mutare ilegala \"%s\" de la primul calculator" "Illegal move \"%s\" (rejected by %s chess program)" === "Mutare ilegala \"%s\" (respinsa de de catre primul program de sah)" "Failed to start %s chess program %s on %s: %s\n" === "Esuat in pornirea %s primului program de sah pe %s: %s\n" "Error writing to %s chess program" === "Eroare de scris catre primul program de sah" "Error: %s chess program (%s) exited unexpectedly" === "Eroare primul program de sah a iesit neasteptat" "Error reading from %s chess program (%s)" === "Eroare de citire de la primul program de sah" "Forfeit due to illegal move" === "Forfait datorat unei mutari ilegale" "%s does not support analysis" === "%s nu suporta analiza" "Hint: %s" === "Ajutor: %s" "Machine accepts your draw offer" === "Computerul accepta oferta Dvs de remiza" "Machine offers a draw\nSelect Action / Draw to agree" === "Computerul ofera o remiza\nSelecteaza Actiunea / Agreati remiza " "%s (only move)" === "%s (doar mutarea)" "Ambiguous move in ICS output: \"%s\"" === "Mutare ICS ambigua: \"%s\"" "Illegal move in ICS output: \"%s\"" === "Mutare ICS ilegala: \"%s\"" "Gap in move list" === "Decalaj in lista de mutari" "Game too long; increase MAX_MOVES and recompile" === "Partida prea lunga; mariti MAX_MOVES si recompilati" "Variant %s not supported by %s" === "Varianta %s nu este suportata de catre %s" "Startup failure on '%s'" === "Start esuat pentru'%s'" "Waiting for first chess program" === "Asteptam primul program de sah" "Waiting for second chess program" === "Asteptam al doilea program de sah" "Match %s vs. %s: final score %d-%d-%d" === "Partida %s vs. %s: scorul final %d-%d-%d" "Stalemate" === "Remiza" "Illegal move: %d.%s%s" === "Mutare ilegala: %d.%s%s" "Ambiguous move: %d.%s%s" === "Mutare ambigua: %d.%s%s" "Can't open \"%s\"" === "Nu pot deschide \"%s\"" "Cannot build game list" === "Nu pot construi lista de partide" "No more games in this message" === "Nici o partida in acest mesaj" "No game has been loaded yet" === "Nici o partida nu a fost inca incarcata" "Can't back up any further" === "Fara revenire la mutari mai departe" "Game number out of range" === "Numarul partidei in afara seriei" "Can't seek on game file" === "Nu se poate cauta in fisierul partidei" "Game not found in file" === "Partida negasita in fisier" "Bad FEN position in file" === "FEN incorect in fisier" "No moves in game" === "Nu mai sunt mutari in partida" "No position has been loaded yet" === "Nici o pozitie nu a fost inca incarcata" "Can't back up any further" === "Fara revenire la mutari mai departe" "Can't open \"%s\"" === "Nu pot deschide \"%s\"" "Can't seek on position file" === "Nu se poate cauta in fisierul pozitiei" "Position not found in file" === "Pozitie negasita in fisier" "Bad FEN position in file" === "FEN incorect in fisier" "Black to play" === "Negrul la mutare" "White to play" === "Albul la mutare" "Can't open \"%s\"" === "Can't open \"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === "Ai editat istoria partidei.\nFoloseste Reincarca Aceeasi Partida si fa mutarea ta din nou." "You have entered too many moves.\nBack up to the correct position and try again." === "Ai introdus prea multe mutari.\nRevino la pozitia corecta si incearca din nou." "Displayed position is not current.\nStep forward to the correct position and try again." === "Pozitia afisata nu este curenta.\nMergi inainte spre pozitia corecta si incearca din nou." "You have not made a move yet" === "Nu ai facut inca o mutare" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "Mesajul de CMail nu este incarcat.\nFoloseste Reincarca Mesajul de CMail si fa mutarea din nou." "No unfinished games" === "Nu exista partide neterminate" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "Ai trimis deja o mutare.\nAsteapta pana o mutare soseste de la oponent.\nPentru a retrimite mutarea, tipareste\n\"cmail -remail -partida %s\"\nu linia de comanda." "Failed to invoke cmail" === "Esuat in invocarea cmail" "Waiting for reply from opponent\n" === "Asteptand replica de la oponent\n" "Still need to make move for game\n" === "Inca trebuie facuta mutarea pentru partida\n" "Still need to make moves for both games\n" === "Inca trebuiesc facute mutarile pentru ambele partide\n" "Still need to make moves for all %d games\n" === "Inca trebuiesc facute mutari pentru toate %d partidele\n" "Still need to make a move for game %s\n" === "Inca trebuie facuta o mutare pentru partida %s\n" "No unfinished games\n" === "Nu exista partide neterminate\n" "Ready to send mail\n" === "Gata sa trimit mailul\n" "Still need to make moves for games %s\n" === "Inca trebuiesc facute mutari pentru partidele %s\n" "Edit comment" === "Editeaza comentariul" "Edit comment on %d.%s%s" === "Editeaza comentariul pentru %d.%s%s" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "Declansata analiza...\nDaca acest mesaj ramane, programul Dvs de sah nu suporta analiza." "It is not White's turn" === "Nu este randul Albului" "It is not Black's turn" === "Nu este randul Negrului" "Wait until your turn,\nor select Move Now" === "Asteapta pana este randul tau,\sau selecteaza Muta Acum" "Starting second chess program" === "Porneste al doilea program de sah" "Training mode off" === "Inchide Modul de antrenament" "Training mode on" === "Deschide Modul de antrenament" "Already at end of game" === "Deja la finalul partidei" "Warning: You are still playing a game" === "Atentie: inca joci o partida" "Warning: You are still observing a game" === "Atentie: inca observi o partida" "Warning: You are still examining a game" === "Atentie: inca examinezi o partida" "It is Black's turn" === "Este randul Negrului" "It is White's turn" === "Este randul Albului" "That square is occupied" === "Acel camp este ocupat" "There is no pending offer on this move" === "Nu exist nici o ofert n curs pe aceast mutare" "Your opponent is not out of time" === "Adversarul tau nu a depasit timpul" "Black offers a draw" === "Negrul ofera o remiza" "White offers a draw" === "Albul ofera o remiza" "You must make your move before offering a draw" === "Trebuie sa faci o mutare inainte de a oferi o remiza" "You are not examining a game" === "Nu examinezi o partida" "You can't revert while pausing" === "Nu putei reveni n timp ce asteptati" "Wait until your turn,\nor select Move Now" === "Asteapta pana iti vine randul,\sau selecteaza Muta Acum" "It is your turn" === "Este randul tau" "Wait until your turn" === "Asteapta pana este randul tau" "No hint available" === "Nici un ajutor disponibil" "Analysis (%s)" === "Analiza (%s)" "Comment" === "Comentariu" "Comment on %d.%s%s" === "Conentariu despre %d.%s%s" "Both flags fell" === "Cad ambele steaguri" "White's flag fell" === "Cade steagul albului" "Black's flag fell" === "Cade steagul negrului" "Bad FEN position in clipboard" === "Positie FEN incorecta in clipboard" "No response from ICS" === "Niciun raspuns de la ICS" "You cannot do this while you are playing or observing" === "Nu poti face asta cand joci sau observi" "Click in holdings to choose piece" === "Faceti click pentru a alege piesa" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === "Partida esuata" "White wins on time" === "Albul castiga la timp" "Black wins on time" === "Negrul castiga la timp" "Both players ran out of time" === "Ambii jucatori au depasit timpul" "White resigns" === "Albul cedeaza" "Black resigns" === "Negrul cedeaza" "White mates" === "Albul da mat" "Black mates" === "Negrul da mat" "Draw" === "Remiza" "Draw agreed" === "Remiza prin intelegere" "Xboard adjudication: King destroyed" === "Adjudecare Xboard: Regele distrus" "Xboard adjudication: Bare king" === "Rege singur" "Xboard adjudication: 3rd check" === "Adjudecare Xboard: al treilea sah" "Xboard adjudication: Stalemate" === "Adjudecare Xboard: Pat" "Xboard adjudication: Checkmate" === "Adjudecare Xboard: Mat" "Xboard adjudication: Insufficient mating material" === "Adjudecare Xboard: material insuficient" "Xboard adjudication: Trivial draw" === "Adjudecare Xboard: Remiza banala" "XBoard adjudication: repetition draw" === "Adjudecare Xboard: remiza prin repetitie" "Xboard adjudication: perpetual checking" === "Adjudecare Xboard: sah etern" "Xboard adjudication: perpetual chasing" === "Adjudecare Xboard: alungare continua" "%Xboard adjudication: perpetual chasing of" === "Adjudecare Xboard: alungare continua" "Xboard adjudication: 50-move rule" === "Adjudecare Xboard: regula celor 50 de mutari" "Draw claim: 50-move rule" === "Cerere de remiza: regula celor 50 de mutari" "Draw claim: 3-fold repetition" === "Cerere de remiza: a treia repetitie" "Draw claim: insufficient mating material" === "Cerere de remiza: material insuficient pentru mat" "Xboard adjudication: long game" === "Adjudecare Xboard: partida lunga" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "Xboard: Forfait datorat unei mutari ilegale: %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "Xboard: Forfait datoratunei mutari ilegale: %s (%c%c%c%c)%c" "Xboard adjudication" === "Adjudecare Xboard" "User adjudication" === "Adjudecare utilizator" "False win claim: '%s'" === "Cerere de castig falsa: '%s'" "False draw claim: '%s'" === "Cerere de remiza falsa: '%s'" "xboard exit" === "Iesire Xboard" # NEW STRINGS FOR EXPERIMENTAL TM VERSION: # MENU "Edit Boo&k..." === "Editeaza Cartea" "Edit Engine List..." === "Editeaza Lista Motoarelor" "Load Engine..." === "Incarca Motorul" "Tournament..." === "Turneu" # LOAD ENGINE DIALOG "First" === "Primul" "Second" === "Al doilea" "Choose File" === "Alege Fisierul" "Choose Folder:" === "Alege Folderul" "Select engine from list:" === "Alege motorul din lista" "or specify one below:" === "sau specifica unul mai jos" "Nickname (optional):" === "Pseudonim (optional)" "Use nickname in PGN tag" === "Foloseste pseudonimul in eticheta PGN" "Engine (*.exe):" === "Motor (*.exe)" "command-line parameters:" === "parametrii liniei de comanda" "directory:" === "directorul" "(Directory will be derived from engine path when left empty)" === "(Directorul va deriva din adresa motorului cand nu se completeaza)" "Add this engine to the list" === "Adauga aceasta engina in lista" "Must not use GUI book" === "Trebuie sa nu foloseasca cartea GUIului" "UCI" === "UCI" "WB protocol v1 (skip waiting for features)" === "WB protocol v1 (sari peste asteptarea caracteristicilor)" "UCCI / USI (uses specified /uxiAdapter)" === "UCCI / USI (foloseste specificatele /uxiAdapter)" "Force current variant with this engine" === "Forteaza varianta curenta cu acest motor" "Load mentioned engine as" === "Incarca Motorul mentionat ca" "Load Engine" === "Incarca Motorul" # TOURNAMENT OPTIONS DIALOG "Tournament file:" === "Fisierul de turneu" "If you specify an existing file, the rest of this dialog will be ignored." === "Daca specificati un fisier existent, restul acestui dialog va fi ignorat." "Otherwise, the file will be created, with the settings you specify below:" === "Altfel, fisierul va fi creat, cu setarile pe care le specificati mai jos" "Select Engine:" === "Alege Motorul" "Use Swiss pairing engine (cycles = rounds)" === "Utilizai motorul de asociere elveian (cicluri = runde)" "Tourney type (0=RR, 1=gauntlet):" === "Tipul Turneului (0=RR, 1=gauntlet)" "Sync after cycle" === "Sincronizare dupa ciclu" "Number of tourney cycles:" === "Numarul de cicluri" "Sync after round" === "Sincronizare dupa runda" "Games per Match / Pairing:" === "Partide pe Meci/Pereche" "File for saving tourney games:" === "Fisier de salvat partidele turneului" "Game File with Opening Lines:" === "Fisierul de Partide cu Liniile de Deschidere" "Game Number:" === "Partida Numarul" "File with Start Positions:" === "Fisier cu Pozitiile de Start" "Position Number:" === "Pozitia Numarul" "Step through lines/positions in file" === "Mergi printre linii/pozitii in fisier" "Rewind after (0 = never):" === "Deruleaza dupa (0 = niciodata)" "Use each line/position twice" === "Foloseste fiecare linie/pozitie de doua ori" "Pause between Games (ms):" === "Pauza intre Partide (ms)" "Tournament and Match Options" === "Optiunile pentru Turneu si Meci" "Tourney participants:" === "Participantii la turneu" "Replace Engine" === "Inlocuieste Motorul" "Upgrade Engine" === "Upgradeaza Motorul" "Time Control..." === "Timpul de control" "Common Engine..." === "Motor comun" "Clone Tourney" === "Turneu de Clone" xboard-4.7.3/winboard/language/chinese(trad).lng0000644000175000001440000007641312262415351016441 00000000000000winboard.rc " " === "Translation by Morning Yellow && Liuzy" MENUS "&New Game\tCtrl-N" === "}sѧ(&N)\tCtrl-N" "New Sh&uffle Game..." === "~PC(&u)..." "New &Variant...\tAlt+Shift+V" === "sܺ(&V)...\tAlt+Shift+V" "&Load Game...\tCtrl-O" === "Jѧ(&L)...\tCtrl-O" "Load &Next Game\tAlt+PgDn" === "JU@ѧ(&N)\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "JW@ѧ(&P)\tAlt+PgUp" "&Reload Same Game" === "sJP@ѧ(&R)" "&Save Game...\tCtrl-S" === "xsѧ(&S)...\tCtrl-S" "&Copy Game To Clipboard\tCtrl+C" === "ƻsѧŶKï(&C)\tCtrl+C" "&Paste Game From Clipboard\tCtrl+V" === "KWѧ۰ŶKï(&P)\tCtrl+V" "Copy Game List to Clipboard" === "ƻsCCŶKï" "L&oad Position...\tCtrl+Shift+O" === "J(&O)...\tCtrl+Shift+O" "Load N&ext Position\tAlt+Shift+PgDn" === "JU@(&E)\tAlt+Shift+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "JW@(&V)\tAlt+Shift+PgUp" "Reload Sa&me Position" === "sJP@(&M)" "S&ave Position...\tCtrl+Shift+S" === "xs(&A)...\tCtrl+Shift+S" "Save as &Diagram..." === "xsϪ...(&D)" "C&opy Position To Clipboard\tCtrl+Shift+C" === "ƻsŶKï(&Y)\tCtrl+Shift+C" "P&aste Position From Clipboard\tCtrl+Shift+V" === "qŶKïKW(&T)\tCtrl+Shift+V" "E&xit" === "}(&X)" "&Quit" === "}(&Q)" "&Edit Game\tCtrl+E" === "sѧ(&E)\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "s觽(&d)\tCtrl+Shift+E" "&Tags" === "s(&T)" "&Comments" === "s(&C)..." "&Game List Tags..." === "CC..." "Machine &White\tCtrl+W" === "q(&W)\tCtrl+W" "Machine &Black\tCtrl+B" === "q(&B)\tCtrl+B" "Two &Machines\tCtrl+T" === "q(&M)\tCtrl+T" "Machine Both" === "qM" "&Machine Match" === "q(&M)" "&Analysis Mode\tCtrl+A" === "RҦ(&A)\tCtrl+A" "Analyze &File\tCtrl+F" === "Rɮ(&F)\tCtrl+F" "&ICS Client" === "&ICSȤ" "Edit &Game\tCtrl+E" === "sѧ(&G)\tCtrl+E" "&Edit Position\tShift+Ctrl+E" === "s觽(&E)\tShift+Ctrl+E" "Trai&ning" === "Vm(&N)" "Engine &Output\tAlt+Shift+O" === "ܤX\tAlt+Shift+O" "Evaluation &Graph\tAlt+Shift+E" === "ܵ\tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "ܴѧC(&L)\tAlt+Shift+G" "Move &History\tAlt+Shift+H" === "ܾv۪k\tAlt+Shift+H" "Open &New Chat Window" === "}ѵ" "Edit Ta&gs..." === "s(&T)" "Edit Co&mment..." === "s(&C)..." "Enter &Username..." === "JΤW(&U)" "&Pause\tPause" === "Ȱ(&P)\tPause" "&Accept\tF3" === "(&A)\tF3" "D&ecline\tF4" === "ڵ(&C)\tF4" "Re&match\tF12" === "(&M)\tF12" "Call &Flag\tF5" === "WɧPt(&F)\tF5" "&Draw\tF6" === "M(&D)\tF6" "Ad&journ\tF7" === "ʽL(&J)\tF7" "A&bort\tF8" === "(&B)\tF8" "&Resign\tF9" === "{(&R)\tF9" "Stop &Observing\tF10" === "[(&O)\tF10" "Stop E&xamining\tF11" === "s(&X)\tF11" "&Upload to Examine" === "Wˬd(&U)" "Adjudicate to &White" === "MĹ (&W)" "Adjudicate to &Black" === "MĹ (&B)" "Adjudicate &Draw" === "Х(&D)" "Type In &Move...\tAlt+I" === "J۪k(&Y)...\tAlt+I" "&Backward\tAlt+Left" === "U@(&B)\tAlt+Left" "&Forward\tAlt+Right" === "W@(&F)\tAlt+Right" "Back to &Start\tAlt+Home" === "_l(&S)\tAlt+Home" "For&ward to End\tAlt+End" === "̫᧽(&E)\tAlt+End" "&Revert\tHome" === "_(&V)" "&Annotate" === "(&A)" "&Truncate Game\tEnd" === "I_۪᭱k(&T)" "&Move Now\tCtrl+M" === "ߧY(&M)\tCtrl+M" "&Retract Move\tCtrl+X" === "(&R)\tCtrl+X" "Flip &View\tF2" === "½ѽL(&V)\tF2" "&Swap Clocks" === "洫(&C)" "&Mute all Sounds" === "ҦnR(&M)" "&General..." === "@ﶵ(&G)..." "&Board..." === "ѽLﶵ(&B)..." "Ad&judications...\tAlt+Shift+J" === "PM(&j)...\tAlt+Shift+J" "Common &Engine...\tAlt+Shift+U" === "qΤ]w(&E)...\tAlt+Shift+U" "Engine #&1 Settings..." === " #1 ]w" "Engine #&2 Settings..." === " #2 ]w" "&ICS..." === "&ICSﶵ..." "&Fonts..." === "rﶵ(&F)..." "Soun&ds..." === "nﶵ(&D)..." "G&ame List..." === "CC..." "Comm&unications..." === "qT]w(&U)..." "&Load Game...\tAlt+Shift+L" === "Jѧﶵ(&L)...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "xsѧﶵ(&S)...\tAlt+Shift+S" "&Time Control...\tAlt+Shift+T" === "ɶ]w(&T)...\tAlt+Shift+T" "Save Settings &Now" === "ߧYxs]w(&N)" "Save Settings on E&xit" === "}xs]w(&X)" "Help &Contents\tF1" === "DD(&C)\tF1" "Help &Index" === "(&I)" "How to &Use Help" === "pϥλ(&U)" "&Hint..." === "(&H)..." "&Book..." === "}w(&B)..." "&About WinBoard" === "WinBoard(&A)" "White" === "" "Promote" === "" "Pawn" === "L" "Knight" === "" "Bishop" === "H" "Rook" === "" "Queen" === "Z" "King" === "" "Archbishop" === "v" "Chancellor" === "_" "Elephant" === "H" "Cannon" === "" "Empty Square" === "MŮl" "Black" === "¤" "Demote" === "" "Clear Board " === "MŴѽL" "Drop" === "" "Cop&y and Paste" === "ƻsöKW(&Y)" "&Copy" === "ƻs(&C)" "&Paste" === "KW(&P)" "&Undo" === "_(&U)" "Cu&t" === "ŤU(&T)" "&Copy" === "ƻs(&C)" "&Paste" === "KW(&P)" "Select &All" === "(&A)" DIALOGS "&Animate Moving Ctrl+Shift+A" === "ʵe(&A) Ctrl+Shift+A" "&Auto Comment" === "۰ʵ(&A)" "&Average" === "54" "&Big" === "87" "&Bishop" === "H(&B)" "&Black first move" === "¤(&B)" "&Blindfold" === "(&B)" "&Bold" === "[(&B)" "&Cancel" === "(&C)" "&Choose Background Color..." === "ܭIC(&C)..." "&Choose Color..." === "C(&C)..." "&Clear" === "M(&C)" "&Close" === "(&C)" "&Colossal" === "116" "&Default ICS Colors" === "w]ICSC(&D)" "&Dinky" === "29" "&Directories:" === "Ƨ(&D)" "&Edit" === "s(&E)" "&Edit" === "s(&E)" "&Get Move List" === "o۪kC(&G)" "&Giant" === "108" "&Help" === "(&H)" "Highlight Dra&gging" === "즲ش(&H)" "&Huge" === "95" "&Index number:" === "Ǹ(&I)" "&Italic" === "(&I)" "&King" === "(&K)" "&Large" === "80" "&Load" === "J(&L)" "&Local Line Editing" === "aݽs(&L)" "&Middling" === "49" "&Next" === "U@(&N)" "&Petite" === "33" "&Popup Exit Message" === "}ɴ(&P)" "&Port:" === "s(&P)" "&Premove" === "w(&P)" "&Prev" === "W@(&P)" "&Queen" === "Z(&Q)" "&Quiet Play" === "lLn(&Q)" "&Revert to Defaults" === "_w](&R)" "&Rook" === "(&R)" "&Show Thinking" === "ܫҲӸ`(&S)" "&Small" === "40" "&Sound alarm at" === "nĵi(&S)" "&Stop Bits:" === "줸(&S)" "&Strikeout" === "Ru(&S)" "&Tiny" === "21" "&Underline" === "u(&U)" "&White first move" === "(&W)" "&Additional options" === "[ﶵ(&A)" "Always &Queen Ctrl+Shift+Q" === "`OܬӦZ(&Q) Ctrl+Shift+Q" "Always on &Top" === "`b̫e(&T)" "Animate &Dragging" === "ʵe즲(&D)" "Auto &Flag Ctrl+Shift+F" === "۰ʶWɧPt(&F) Ctrl+Shift+F" "Auto &Observe" === "۰[(&O)" "Auto &Raise Board" === "۰ʧܴѽLjp(&R)" "Auto Flip &View" === "۰½ѽL(&V)" "Black Pieces" === "¤l" "Browse..." === "s..." "Built-in sound:" === "n" "Bul&ky" === "72" "Cancel" === "" "Chessboard for Windows" === "WindowsUqlڶHѴѽL" "Choose..." === "..." "Clocks" === "" "Comments" === "" "Conventional chess clock" === "ɬq" "Coordinates" === "" "Copyright 1991 Digital Equipment Corporation" === "Copyright 1991 Digital Equipment Corporation" "Dark Squares" === "®" "Data &Bits:" === "Ʀ줸(&B)" "Data &Rate:" === "ǿv(&R)" "Default beep" === "w]n" "Defaults" === "w]" "Do ¬ colorize messages" === "nTۦ(&N)" "Dri&ves:" === "Ϻо(&V)" "Enter" === "J" "Event:" === "ƥ" "F&low:" === "(&L)" "File &Name:" === "ɮצW(&N)" "Help" === "" "Highlight Last &Move" === "аOW@۪k(&M)" "ICS Interaction" === "ICS" "Incremental clock" === "[ɨ" "Inde&x number:" === "Ǹ(&X)" "Just &view or edit game files" === "u[ݩνsѧ(&v)" "K&night" === "(&N)" "Light Squares" === "ծ" "List Files of &Type:" === "ɮ(&T)" "Load games with automatic stepping" === "Jѧ۰ʨ" "Medi&ocre" === "45" "Medi&um" === "64" "Messages" === "T" "Mode&rate" === "58" "Monochrome" === "¥" "Net&work..." === "(&W)..." "No sound" === "Ln" "OK" === "Tw" "Old" === "®榡" "P&arity:" === "(&A)" "PGN" === "PGN榡" "Periodic &Updates" === "ws(&U)" "Play" === "" "Ponder &Next Move Ctrl+Shift+P" === "PB(&N) Ctrl+Shift+P" "Popup Move &Errors" === "ܿ~۪k(&E)" "Premove Highlights" === "wѼаO" "Promote pawn to:" === "Lܬ" "Prompt for filename" === "ɮצW" "Save As: " === "xs" "Save games automatically" === "۰xsѧ" "Show &Coordinates" === "ܧ(&C)" "Show Butt&on Bar" === "ܫs(&O)" "Sl&im" === "37" "Sorry Charlie" === "藍_AդU" "Square Highlights" === "lаO" "T&eeny" === "25" "Tags" === "" "Test &Legality Ctrl+Shift+L" === "ˬd۪kXz(&L) Cl+Sh+L" "Tita&nic" === "129" "To file:" === "ɮ" "Use an Internet Chess Server" === "nWڶHѪAȾ" "WAV file:" === "WAVɮ" "White Pieces" === "l" "WinBoard 0.0.0" === "WinBoard 0.0.0" "galactic" === "galactic" "minutes initially," === "_lɶ" "minutes" === "" "moves in" === "B" "plus" === "" "seconds per move" === "C@B[" "seconds per move" === "@B" "seconds" === "" "Save As:" === "xs" "What would you like to do?" === "pϥΡH" "Interaction Colors" === "ʲ" "Premove" === "w" "Alarm" === "" "Colors" === "C" "Size" === "jp" "Current Board Size" === "eѽLjp" "All Board Sizes" === "ҦѽLjp" "Number of moves:" === "B" "Within number of minutes:" === "" "Initial number of minutes:" === "_lɶ" "Plus number of seconds per move:" === "C@B[" "Ponder Next Move" === "PB(&N)" "Enable and Show Thinking (recommended)" === "ܫҲӸ`" "Periodic Updates (for Analysis Mode)" === "ws(RҦ)" "Game List Options" === "ѧCﶵ" "PGN &Tags:" === "PGN(&T)" "Default" === "w]" "Sounds" === "n" "&Event:" === "ƥ(&E)" "&No sound" === "Ln(&N)" "&Default beep" === "w]n(&D)" "&Built-in sound:" === "n(&B)" "&WAV file:" === "&WAVɮ" "B&rowse..." === "s...(&B)" "&Play" === "(&P)" "&Defaults" === "w](&D)" "I C S Interaction" === "I C S 椬" "About WinBoard" === "WinBoard" "Time Control" === "ɶ]w" "Load Game Options" === "Jѧﶵ" "Save Game Options" === "xsѧﶵ" "Open" === "}" "Communication Port Settings" === "qTs]w" "Edit Comment" === "s" "Promotion" === "" "Game List" === "ѧC" "Edit Tags" === "s" "ICS Interaction" === "ICS椬" "Dialog" === "" "Error" === "~" "ICS Interaction Colors" === "ICS椬C" "Question" === "" "WinBoard Startup" === "WinBoardҰ" "Type in a move" === "J۪k" "General Options" === "@ﶵ" "ICS Options" === "ICS]w" "Board Options" === "ѽLﶵ" "Fonts" === "r" NEW "&Up" === "VW" "&Down" === "VU" "Filter" === "Lo" "All White" === "" "Flip Black" === "¦" "Specify Chess &Engines:" === "w(&E)" "Specify Chess &Server:" === "wAȾ(&S)" "New Shuffle Game..." === "~PC..." "New Variant...\tAlt+Shift+V" === "sܺ...\tAlt+Shift+V" "Copy Game List to Clipboard" === "ƻsCCŶKï" "Save &Diagram..." === "xsϪ...(&D)" "Machine Both" === "M" "Machine Matc&h" === "(&h)" "Show Engine &Output\tAlt+Shift+O" === "ܤX\tAlt+Shift+O" "Show Evaluation Graph\tAlt+Shift+E" === "ܵ\tAlt+Shift+E" "Show Move History\tAlt+Shift+H" === "۪ܵk\tAlt+Shift+H" "Open Chat Window" === "}ѵ" "Enter &Username..." === "JΤW(&U)" "&Upload to Examine" === "Wˬd(&U)" "Adjudicate to &White" === "MĹ (&W)" "Adjudicate to &Black" === "MĹ (&B)" "Adjudicate &Draw" === "Х(&D)" "&Annotate" === "(&A)" "&Truncate Game" === "I_(&T)" "Swap &Clocks" === "洫(&C)" "&Mute all Sounds" === "ҦnR(&M)" "Adjudications...\tAlt+Shift+J" === "PM...\tAlt+Shift+J" "Common Engine...\tAlt+Shift+U" === "qΤ]w...\tAlt+Shift+U" "Engine #1 Settings..." === " #1 ]w" "Engine #2 Settings..." === " #2 ]w" "Game List..." === "CC..." "Promote" === "" "Archbishop" === "v" "Chancellor" === "_" "Elephant" === "H" "Cannon" === "" "Demote" === "" "Lance" === "" "Silver" === "ȱN" "Gold" === "N" "Fixed time per move" === "TwB" "Maximum seconds per move:" === "̤jB()" "Time-Odds Factors:" === "ɶ" "Engine #1:" === " #1" "Engine #2:" === " #2" "Save out of book info in PGN" === "bPGNxswT" "&Send Engine Think" === "oe(&S)" "E&xtended PGN Info Ctrl+Shift+X" === "XiPGNT Ctrl+Shift+X" "&Hide Thinking Ctrl+Shift+H" === "ä Ctrl+Shift+H" "&Info in Move History Ctrl+Shift+I" === "۪kCܰT Cl+Sh+I" "Highlight with Arro&w" === "νbYX" "Displa&y Logos" === "ܤлx(&y)" "&Auto Kibitz" === "۰\"kibitz\"(&A)" "See&k Graph" === "iϪ(&k)" "auto-&Refresh" === "۰ʨsϪ(&R)" "Bckgnd Obser&ve" === "I[(&v)" "&Dual Board" === "ѽL(&D)" "One-Click &Move" === "(&M)" "Background..." === "I..." "&Defaults..." === "w](&D)" "Startup &Chat Boxes:" === "ҰʲѮ(&C)" "General" === "@" " YES" === "O" " NO" === "_" "Move History, Engine Output" === "vk,X" "New Shuffle Game" === "~PC" "&Start Position Number:" === "ҰʦmX(&S)" "Random" === "H" "Move History" === "vk" "Evaluation Graph" === "f" "Engine output" === "X" "Engine #1" === " #1" "NPS" === "NPS" "Engine #2" === " #2" "Chat Window" === "ѵ" "Chat partner:" === "ѹ٦" "Clear" === "M" "Send" === "oe" "Adjudications" === "PM" "Hide Thinking when Playing against Human" === "PHٮëҲӸ`" "Adjudications in non-ICS games" === "PMDICSC" "Adjudicate draw after:" === "X۫PM" "moves" === "۪k" "Win/loss adjudication threshold:" === "/ĹPMe" "centipawns" === "ʤ@L" "&Verify Engine Claims" === "Ҥn(&V)" "Detect &Mates" === "˴N(&M)" "Draw if &Insufficient Material" === "lOɧPM(&I)" "Adjudicate &Trivial Draws" === "²MѧPM(&T)" "Apply" === "M" "-move rule" === "kWh" "-fold repeats" === "" "Engine #1 Score is Absolute" === " #1 O" "Engine #2 Score is Absolute" === " #2 O" "Common Engine Settings" === "qΤ]w" "Polyglot Directory:" === " Polyglot Ƨ" "Hash Size (MB):" === "jp(MB)" "EGTB Path:" === "EGTB |" "EGTB Size (MB):" === "EGTB jp(MB)" "Use Book:" === "ϥήw" "Max nr of CPUs:" === "̤jCPU" "First has Own Book" === "1ۥήw" "Second has Own Book" === "2ۥήw" "Book Depth:" === "w۪k`" "Book Variation:" === "wܨ" "Default Match Games:" === "w]ɹ什" "Variants" === "ܺ" "Variant" === "ܺ" "Board size:" === "ѽLjp" "ranks" === "" "files" === "C" "Holdings with room for:" === "i֦Ѥlƥ" "('-1' means defaults for selected variant)" === "-1ܹw]" "Type In Your Name" === "Je Naam, Sufferd!" "&Play against a chess engine or match two engines" === "H٩ιq(&P)" "&Use an Internet Chess Server" === "nWڶHѪAȾ(&U)" winboard.c "&File" === "ɮ(&F)" "&Mode" === "Ҧ(&M)" "&Action" === "欰(&A)" "&Step" === "۪k(&S)" "&Options" === "ﶵ(&O)" "&Help" === "(&H)" "Font name too long:" === "rW٤Ӫ" "Font point size missing:" === "Srjp" "Can't parse color name %s" === "LkѧOCW %s" "Unrecognized board size value" === "LkѧOѽLjp" "Unrecognized argument" === "LkѧOѼ" "No value provided for argument" === "SȴѵѼ" "Incomplete \\ escape in value for" === "Τ_" "Failed to open indirection file" === "Lk}ɮ" "Unrecognized boolean argument value" === "LkѧO޿Ѽƭ" "Unrecognized argument" === "LkѧOѼ" "Too many colors" === "CӦh" "&Minimize\tCtrl+F4" === "̤p(&M)\tCtrl+F4" "White: %s" === " %s" "We only care about the height here" === "o̧ڭ̥u`" "Cannot build game list" === "LkإߴѧC" "Load Game from File" === "qɮ׸Jѧ" "Load Position from File" === "qɮ׸JL" "Save Game to File" === "xsѧɮ" "Save Position to File" === "xsLɮ" "%s does not support analysis" === "%s R\" "Analyze Game from File" === "qɮפRѧ" "Unable to activate help" === "Lk}" "Send to chess program:" === "oeĤ@ӰڶHѵ{" "Send to second chess program:" === "oeĤGӰڶHѵ{" "Direct Command" === "JRO" "Error loading sound %s" === "Jn %s ~" "Error playing sound %s" === "n %s ~" "File open failed" === "Lk}ɮ" "Internal error in file dialog box" === "ɮ׹ܮت~" "Option Error" === "ﶵ~" "Choose an option, or cancel to exit" === "ܤ@ӿﶵAΪ̫s}" "Unable to activate help" === "Lk}" "Displayed move is not current" === "ܪ۪kOe۪k" "Could not parse move" === "LkѪR۪k" "%s:\nError code %d" === "%s:\n~ %d" "Error" === "~" "Fatal Error" === "Y~" "Exiting" === "}" "%s:\nError code %d" === "%s:\n~ %d" "ܰT" === "ܰT" "Note" === "" "Error writing to chess program" === "oeTڶHѵ{ɥX" "User" === "Τ" "Unknown" === "" "White" === "" "Black" === "¤" "Save Game to File" === "xsѧɮ" "Not implemented" === "\|@" "Shout Text" === "qsr" "SShout/CShout" === "jnqsr" "Channel 1 Text" === "WDIr" "Channel Text" === "WDr" "Kibitz Text" === "Lr" "Tell Text" === "Dr" "Challenge Text" === "DԤr" "Request Text" === "ܽФr" "Seek Text" === "jMr" "Normal Text" === "`r" "None" === "L" "Pawn" === "L" "Knight" === "" "Bishop" === "H" "Rook" === "" "Queen" === "Z" "Information" === "T" wclipbrd.c "Unable to convert position to FEN." === "LkLƬFEN" "Unable to copy FEN to clipboard." === "LkƻsFENŶKï" "Cannot create temporary file name." === "Lkإ{ɮ" "Cannot open temporary file." === "Lk}{ɮ" "Cannot write to temporary file." === "LkgJ{ɮ" "Cannot reopen temporary file." === "LkA}{ɮ" "Cannot determine size of file." === "LkTwɮפjp" "Cannot determine size of file." === "LkTwɮפjp" "Cannot allocate clipboard buffer." === "LktŶKïwİ" "Cannot read from temporary file." === "LkŪX{ɮ" "Error reading from temporary file." === "ŪX{ɮ׮ɥX" "Cannot copy text to clipboard" === "LkƻsrŶKï" "Unable to allocate memory for clipboard." === "LkŶKïtxsŶ" "Unable to lock clipboard memory." === "LkwŶKïxsŶ" "Cannot unlock clipboard memory." === "LkŶKïxsŶ" "Cannot open clipboard." === "Lk}ŶKï" "Cannot empty clipboard." === "LkMŰŶKï" "Cannot copy text to clipboard." === "LkƻsrŶKï" "Cannot close clipboard." === "LkŶKï" "Unable to paste FEN from clipboard." === "LkqŶKïKWFEN" "Unable to create temporary file." === "Lkإ{ɮ" "Error writing to temporary file." === "gJ{ɮ׮ɥX" "Unable to open clipboard." === "Lk}ŶKï" "No text in clipboard." === "ŶKïSr" "Unable to lock clipboard memory." === "LkwŶKïxsŶ" "Unable to allocate memory for text string." === "LkrtxsŶ" "Unable to unlock clipboard memory." === "LkŶKïxsŶ" "Unable to close clipboard." === "LkŶKï" woptions.c "Variant %s not supported by %s" === " %s Q %s Ҥ" "Warning: second engine (%s) does not support this!" === "ĵi: ĤGӤ(%s) !" "Invalid ICS Alarm Time" === "ICSDk" "Invalid max time per move" === "Xk̤jB" "Invalid time-odds factor" === "Xkɶ" "Choose Folder" === "ܸƧ" "Choose Book" === "ܥήw" "Choose Polyglot Directory" === " Polyglot Ƨ" "Choose EGTB Directory:" === " EGTB Ƨ" "Polyglot was not found in the specified folder!" === "wƧo{ Polyglot " wgamelist.c "No game selected" === "S襤ѧ" "Can't go forward any further" === "LkAeiF" "Can't back up any further" === "LkAhF" "No game list" === "SѧC" "Game List" === "ѧC" "Game list not loaded or empty" === "ѧCJΪť" "%s - %d/%d games" === "%s - %d/%d ѧ" "Game list not loaded or empty" === "ѧCJΪť" wedittags.c "Edit Tags" === "s" "Tags" === "" "Error replacing tags." === "ҿ~" wsettings.c "%s Engine Settings (%s)" === "%s ]w (%s)" "OK" === "Tw" "Cancel" === "" backend.c "bad timeControl option %s" === "Dk\"timeControl\"(ɶ)ﶵ %s" "bad searchTime option %s" === "Dk\"searchTime\"(jMɶ)ﶵ %s" "first" === "Ĥ@" "second" === "ĤG" "protocol version %d not supported" === "qTw %d Q" "Variant %s supported only in ICS mode" === " %s ubICSҦU" "Unknown variant name %s" === "W %s" "Starting chess program" === "ҰʰڶHѵ{" "Could not open comm port %s" === "Lk}qTs %s" "Could not connect to host %s, port %s" === "LksD %s s %s" "Unknown initialMode %s" === "\"initialMode\"(lҦ)ﶵ %s" "Can't have a match with no chess programs" === "SHѵ{ɵLki" "Bad game file" === "ѧɮ׿~" "Bad position file" === "Lɮ׿~" "AnalyzeFile mode requires a game file" === "\"AnalyzeFile\"(Rɮ)Ҧw@Ӵѧɮ" "Analysis mode requires a chess engine" === "\"Analysis\"(R)ҦҰʰڶHѤ" "Analysis mode does not work with ICS mode" === "\"Analysis\"(R)ҦLkbICSҦUu@" "MachineWhite mode requires a chess engine" === "\"MachineWhite\"(q)ҦҰʰڶHѤ" "MachineWhite mode does not work with ICS mode" === "\"MachineWhite\"(q)ҦLkbICSҦUB" "MachineBlack mode requires a chess engine" === "\"MachineBlack\"(q)ҦҰʰڶHѤ" "MachineBlack mode does not work with ICS mode" === "\"MachineBlack\"(q)ҦLkbICSҦUB" "TwoMachines mode does not work with ICS mode" === "\"TwoMachines\"(q)ҦLkbICSҦUB" "TwoMachines mode requires a chess engine" === "\"TwoMachines\"(R)ҦҰʰڶHѤ" "Training mode requires a game file" === "\"Training\"(Vm)Ҧw@Ӵѧɮ" "Error writing to ICS" === "oeTICSɥX" "Error reading from keyboard" === "ŪLɥX" "Got end of file from keyboard" === "ŪLɹJɮק" "Error writing to ICS" === "oeTICSɥX" "Error writing to display" === "oeTܾɥX" "Error gathering move list: two headers" === "Ū۪kɥXAX{Ӷ}Y" "Error gathering move list: nested" === "Ū۪kɥXA_~" "Connection closed by ICS" === "sQICS" "Error reading from ICS" === "ŪICSTɥX" "Failed to parse board string:\n\"%s\"" === "LkѪRѽLr\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "ѧӪAݭnW[\"MAX_MOVES\"íssĶ" "Error gathering move list: extra board" === "Ū۪kɥXAWXѽL" "Illegal move \"%s\" from ICS" === "qICSŪ줣Xk۪k\"%s\"" "Couldn't parse move \"%s\" from ICS" === "LkѪRqICSŪ쪺۪k\"%s\"" "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "say ~ADk\"moveType\"(۪k) %d (%d,%d-%d,%d)" "You are playing Black" === "Ab" "You are playing White" === "Ab" "It is White's turn" === "訫" "It is Black's turn" === "¤訫" "Displayed position is not current" === "ܪLOeL" "Illegal move" === "۪k~" "End of game" === "ѧ" "Incorrect move" === "۪k~" "Illegal move \"%s\" from %s machine" === "q%sŪ줣Xk۪k\"%s\"" "Forfeit due to illegal move" === "]Xz۪kӥdzW" "%s does not support analysis" === "%s R\" "Illegal move \"%s\" (rejected by %s chess program)" === "Xk۪k\"%s\" (%sڶHѵ{ڵӵ۪k)" "Failed to start %s chess program %s on %s: %s\n" === "LkҰ%sڶHѵ{ %s(bD %s W)A%s\n" "Hint: %s" === " %s" "White resigns" === "{" "Black resigns" === "¤{" "White mates" === "谵" "Black mates" === "¤谵" "Draw" === "M" "Draw agreed" === "өM" "Machine accepts your draw offer" === "qPNM" "Machine offers a draw\nSelect Action / Draw to agree" === "qM\nܬO_M" "%s (only move)" === "%s (ߤ@۪k)" "Ambiguous move in ICS output: \"%s\"" === "ICSXT۪k\"%s\"" "Illegal move in ICS output: \"%s\"" === "ICSXT۪k\"%s\"" "Gap in move list" === "۪k_}" "Game too long; increase MAX_MOVES and recompile" === "ѧӪAݭnW[\"MAX_MOVES\"íssĶ" "Variant %s not supported by %s" === " %s Q %s " "Startup failure on '%s'" === "LkҰ'%s'" "Waiting for first chess program" === "ݲĤ@ӰڶHѵ{" "Waiting for second chess program" === "ݲĤGӰڶHѵ{" "Match %s vs. %s: final score %d-%d-%d" === " %s vs. %s: ̲פ %d-%d-%d" "Stalemate" === "x" "Illegal move: %d.%s%s" === "Xk۪k %d.%s%s" "Ambiguous move: %d.%s%s" === "T۪k %d.%s%s" "Can't open \"%s\"" === "Lk}\"%s\"" "Cannot build game list" === "LkإߴѧC" "No more games in this message" === "oT]thѧ" "No game has been loaded yet" === "|ѧJ" "Can't back up any further" === "LkAhF" "Game number out of range" === "ѧƶqWXd" "Can't seek on game file" === "LkjMѧɮ" "Game not found in file" === "ɮפSѧ" "Bad FEN position in file" === "ɮפFENL~" "No moves in game" === "ѧS۪k" "No position has been loaded yet" === "|LJ" "Can't back up any further" === "LkAhF" "Can't open \"%s\"" === "Lk}\"%s\"" "Can't seek on position file" === "LkjMLɮ" "Position not found in file" === "ɮפSL" "Bad FEN position in file" === "ɮפFENL~" "Black to play" === "¤訫" "White to play" === "訫" "Can't open \"%s\"" === "Lk}\"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === "ѧwgsLF\n\"sJP@ѧ\"~ਫ" "You have entered too many moves.\nBack up to the correct position and try again." === "AJFLh۪k\nh^쥿TLAդ@" "Displayed position is not current.\nStep forward to the correct position and try again." === "ܪLOeL\neieLAդ@" "You have not made a move yet" === "A|" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "|JcmailT.\nsJCMailTís." "No unfinished games" === "sbѧ" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "AwHeX@ӵ۪k\nе۪kǰeܹ\nYsHe۪k, bROCJ\n\"cmail -remail -game %s\"\n" "Failed to invoke cmail" === "Iscmail" "Waiting for reply from opponent\n" === "ݹ^\n" "Still need to make move for game\n" === "ѧݨ\n" "Still need to make moves for both games\n" === "ѧҤݨ\n" "Still need to make moves for all %d games\n" === "Ҧ %d ѧҤݨ\n" "Still need to make a move for game %s\n" === "ѧ %s ݨ\n" "No unfinished games\n" === "sbѧ\n" "Ready to send mail\n" === "dzưeHN\n" "Still need to make moves for games %s\n" === "ѧ %s ݨ\n" "Edit comment" === "s" "Edit comment on %d.%s%s" === "s %d.%s%s" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "ҰʤRҦ...\npGoT@dۡANAڶHѵ{RC" "It is not White's turn" === "S訫" "It is not Black's turn" === "S¤訫" "Wait until your turn,\nor select Move Now" === "ݦܽA\nΪ̿\"ߧY\"" "Starting second chess program" === "ҰʲĤGӰڶHѵ{" "Training mode off" === "VmҦw" "Training mode on" === "VmҦw}" "Already at end of game" === "ѧwg" "Warning: You are still playing a game" === "`NGAbiѧ" "Warning: You are still observing a game" === "`NGAb[Ѵѧ" "Warning: You are still examining a game" === "`NGAbsѧ" "It is Black's turn" === "¤訫" "It is White's turn" === "訫" "That square is occupied" === "lwѤl" "Draw agreed" === "өM" "There is no pending offer on this move" === "ӵ۪kSݩwij" "Both players ran out of time" === "賣WɤF" "Black wins on time" === "WɧPt" "Your opponent is not out of time" === "SW" "Both players ran out of time" === "賣WɤF" "White wins on time" === "¤WɧPt" "Your opponent is not out of time" === "SW" "Draw agreed" === "өM"1,$g/=== ""/d "Black offers a draw" === "¤责M" "White offers a draw" === "责M" "You must make your move before offering a draw" === "Ѥ~ണM" "Draw agreed" === "өM" "Game aborted" === "ѧ_" "You are not examining a game" === "SRѧ" "You can't revert while pausing" === "Ȱɤ_ѧ" "Wait until your turn,\nor select Move Now" === "ݹ⨫\nΪ̿\"ߧYl\"" "It is your turn" === "A" "Wait until your turn" === "ݹ⨫" "No hint available" === "SiΪ" "Error writing to %s chess program" === "oeT%sڶHѵ{ɥX" "Error: %s chess program (%s) exited unexpectedly" === "~G%sڶHѵ{(%s)`פ" "Error reading from %s chess program (%s)" === "q%sڶHѵ{(%s)TɥX" "Analysis (%s)" === "R(%s)" "Comment" === "" "Comment on %d.%s%s" === " %d.%s%s" "Both flags fell" === "賣WɤF" "White's flag fell" === "W" "Black wins on time" === "WɧPt" "Black's flag fell" === "¤W" "White wins on time" === "¤WɧPt" "Bad FEN position in clipboard" === "ŶKïFENL~" "No response from ICS" === "ICS T" "You cannot do this while you are playing or observing" === "Uѩ[Ѯɤi榹ާ@" "Click in holdings to choose piece" === "IܤѤl" END-OF-GAME MESSAGES (should they be translated? You can translate it as "ѧGT") "Xboard adjudication: King destroyed" === "Xboard PMGQ" "Xboard adjudication: Bare king" === "Xboard PMGN" "Xboard adjudication: 3rd check" === "Xboard PMG3Nx" "Xboard adjudication: Stalemate" === "Xboard PMGx" "Xboard adjudication: Checkmate" === "Xboard PMGN" "Xboard adjudication: Insufficient mating material" === "Xboard PMGlO" "Xboard adjudication: Trivial draw" === "Xboard PMG@M" "XBoard adjudication: repetition draw" === "Xboard PMG`M" "Xboard adjudication: perpetual checking" === "Xboard PMGN" "Xboard adjudication: perpetual chasing" === "Xboard PMG" "%Xboard adjudication: perpetual chasing of" === "Xboard PMG" "Xboard adjudication: 50-move rule" === "Xboard PMG50^XPMWh" "Draw claim: 50-move rule" === "MnG50^XPMWh" "Draw claim: 3-fold repetition" === "MnG3`" "Draw claim: insufficient mating material" === "MnGlO" "Xboard adjudication: long game" === "Xboard PMG什L" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "XboardGѧOѨBdzW %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "XboardGDkѨBdzW %s (%c%c%c%c)%c" "Xboard adjudication" === "Xboard PM" "User adjudication" === "ΤPM" "False win claim: '%s'" === "Ĺn" "False draw claim: '%s'" === "Mn" "xboard exit" === "xboard }" xboard-4.7.3/winboard/language/deutsch.lng0000644000175000001440000010563612262415351015466 00000000000000## WinBoard 4.5.0 language file ## German/Deutsch v1.0 beta 1 ## Translation by Oliver Uwira ## ## If you revise this, please insert your date, name and description. ## Falls Sie diese Datei berarbeiten, tragen Sie bitte Ihren Namen, ## das Datum und eine kurze Beschreibung hier ein. ## ## 07. November 2010 Oliver Uwira ## Ersterstellung ## Anmerkungen fr bersetzer: (empfohlen auch fr lang450.txt) ## o Benutzen Sie ## Kommentare fr erklrungsbedrftige Eintrge. ## o Beachten Sie, dass wortwrtliche bersetzungen in der Zielsprache ungewhnlich klingen knnen, z.B. "Knigin" anstatt dem richtigen "Dame". ## o Versuchen Sie, kurze bersetzungen zu finden. Mehr Text fhrt nicht automatisch zu besserem Verstndnis. ## o berprfen Sie Ihre bersetzung. Gibt sie die Bedeutung des Ursprungstext klar wieder? ## o Testen Sie Ihre bersetzung. ## o Vergeben Sie Shortcuts (ber das Zeichen &). " " === "bersetzung: Oliver Uwira" winboard.rc MENUS: "&New Game\tCtrl-N" === "&Neue Partie\tCtrl+N" "New Sh&uffle Game..." === "Neue Partie - Shuffleschach..." "New &Variant...\tAlt+Shift+V" === "Neue Partie - Variante...\tAlt+Umschalt+V" "&Load Game...\tCtrl-O" === "Partie &laden...\tCtrl+O" "Load &Next Game\tAlt+PgDn" === "Nchste Partie laden\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "Vorherige Partie laden\tAlt+PgUp" "&Reload Same Game" === "Partie erneut laden" "&Save Game...\tCtrl-S" === "Partie &speichern...\tCtrl+S" "&Copy Game To Clipboard\tCtrl+C" === "Partie &kopieren\tCtrl+C" "&Paste Game From Clipboard\tCtrl+V" === "Partie &einfgen\tCtrl+V" "Copy Game List to Clipboard" === "Partieliste kopieren" "L&oad Position...\tCtrl+Shift+O" === "Stellung laden...\tCtrl+Umschalt+O" "Load N&ext Position\tAlt+Shift+PgDn" === "Nchste Stellung laden\tAlt+Umschalt+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Vorherige Stellung laden\tAlt+Umschalt+PgUp" "Reload Sa&me Position" === "Stellung erneut laden" "S&ave Position...\tCtrl+Shift+S" === "Stellung speichern...\tCtrl+Umschalt+S" "Save as &Diagram..." === "Diagramm speichern..." "C&opy Position To Clipboard\tCtrl+Shift+C" === "Stellung kopieren\tAlt+Umschalt+C" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Stellung einfgen\tAlt+Umschalt+V" "&Quit" === "Beenden" "Machine &White\tCtrl+W" === "Engine Wei\tCtrl+W" "Machine &Black\tCtrl+B" === "Engine Schwarz\tCtrl+B" "&Two Machines\tCtrl+T" === "Zwei Engines\tCtrl+T" "Machine Both" === "Engine gegen sich selbst" "&Machine Match" === "Turnier" "&Analysis Mode\tCtrl+A" === "Analysemodus\tCtrl+A" "Analyze &File\tCtrl+F" === "Datei analysieren\tCtrl+F" "&ICS Client" === "Mit ICS verbinden" "&Edit Game\tCtrl+E" === "Partie bearbeiten\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "Stellung bearbeiten\tCtrl+Umschalt+E" "Trai&ning" === "Trai&ning" "Engine &Output\tAlt+Shift+O" === "Engineausgabe anzeigen\tAlt+Umschalt+O" "Evaluation &Graph\tAlt+Shift+E" === "Bewertungsgraph anzeigen\tAlt+Umschalt+E" "Game &List\tAlt+Shift+G" === "Partieliste anzeigen\tAlt+Umschalt+G" "Move &History\tAlt+Shift+H" === "Notation anzeigen\tAlt+Umschalt+H" "Open &New Chat Window" === "Chatfenster ffnen" "Edit Ta&gs..." === "&Tags bearbeiten" "Edit Co&mment..." === "&Kommentar bearbeiten" "&Tags" === "&Tags" "&Comments" === "&Kommentar" "Enter &Username..." === "Ben&utzernamen eingeben" "&Pause\tPause" === "&Pause\tPausa" "&Accept\tF3" === "&Annehmen\tF3" "D&ecline\tF4" === "Abl&ehnen\tF4" "Re&match\tF12" === "Rcks&piel\tF12" "Call &Flag\tF5" === "Zeit &reklamieren\tF5" "&Draw\tF6" === "&Remis\tF6" "Ad&journ\tF7" === "Vertagen\tF7" "A&bort\tF8" === "Abbrechen\tF8" "&Resign\tF9" === "Auf&geben\tF9" "Stop &Observing\tF10" === "Zuschauen beenden\tF10" "Stop E&xamining\tF11" === "Analyse beenden\tF11" "&Upload to Examine" === "Z&ur Analyse hochladen" "Adjudicate to &White" === "Abschtzung - Wei gewinnt" "Adjudicate to &Black" === "Abschtzung - Schwarz gewinnt" "Adjudicate &Draw" === "Abschtzung - Remis" "Type In &Move...\tAlt+I" === "&Zug eingeben...\tAlt+I" "&Backward\tAlt+Left" === "Zurck\tAlt+Links" "&Forward\tAlt+Right" === "&Vorwrts\tAlt+Rechts" "Back to &Start\tAlt+Home" === "Zum &Anfang\tAlt+Anfang" "Forward to &End\tAlt+End" === "Zum &Ende\tAlt+Ende" "&Revert\tHome" === "Rckgngig\tAnfang" "&Annotate" === "Kommentieren" "&Truncate Game\tEnd" === "Res&tliche Zge lschen\tEnde" "&Move Now\tCtrl+M" === "Ziehe &jetzt\tCtrl+M" "&Retract Move\tCtrl+X" === "Zurck&nehmen\tCtrl+X" "Flip &View\tF2" === "&Brett drehen\tF2" "&Swap Clocks" === "Uhren taus&chen" "&Mute all Sounds" === "Lautlos" "&General..." === "&Allgemein" "&Board..." === "Brett..." "Ad&judications...\tAlt+Shift+J" === "Abschtzungen...\tAlt+Umschalt+J" "Common &Engine...\tAlt+Shift+U" === "Standardengine...\tAlt+Umschalt+U" "Engine #&1 Settings..." === "Engine #1 konfigurieren..." "Engine #&2 Settings..." === "Engine #2 konfigurieren..." "Install 1st..." === "Installieren in Engineliste 1..." "Install 2nd..." === "Installieren in Engineliste 2..." "&ICS..." === "&ICS..." "Add ICS..." === "Neue ICS..." "&Fonts..." === "&Schriftarten..." "Soun&ds..." === "&Klnge..." "G&ame List..." === "Partieliste..." "&Game List Tags..." === "Partieliste Tags..." "Comm&unications..." === "Porteinstellungen..." "&Load Game...\tAlt+Shift+L" === "Partie &laden...\tAlt+Umschalt+L" "&Save Game...\tAlt+Shift+S" === "Partie &speichern...\tAlt+Umschalt+S" "&Time Control...\tAlt+Shift+T" === "&Zeitkontrolle..." "Save Settings &Now" === "Einstellungen sofort speichern" "Save Settings on E&xit" === "Einstellungen nach Beenden speichern" "Help &Contents\tF1" === "In&halt\tF1" "Help &Index" === "&Index" "How to &Use Help" === "Wie benutzt man die Hilfe" "&Hint..." === "&Tipp..." "&Book..." === "&Erffnungsbuch..." "&About WinBoard" === "ber WinBoard" "White" === "Wei" "Promote" === "Schwarz" "Pawn" === "Bauer" "Knight" === "Springer" "Bishop" === "Lufer" "Rook" === "Turm" "Queen" === "Dame" "King" === "Knig" "Archbishop" === "Erzbischof" "Chancellor" === "Kanzler" "Elephant" === "Elefant" "Cannon" === "Kanone" "Empty Square" === "Leeres Feld" "Black" === "Schwarz" "Demote" === "Degradieren" "Clear Board " === "Brett leeren " "Gold" === "Gold" "Silver" === "Silber" "Lance" === "Lanze" "Drop" === "Einsetzen" "Cop&y and Paste" === "Kopieren &und einfgen" "&Copy" === "&Kopieren" "&Paste" === "&Einfgen" "&Undo" === "&Rckgngig" "Cu&t" === "A&usschneiden" "&Copy" === "&Kopieren" "&Paste" === "&Einfgen" "Select &All" === "&Alles auswhlen" DIALOGS: ABOUTBOX "About WinBoard" === "ber WinBoard" "OK" === "OK" "Chessboard for Windows" === "Schachbrett fr Windows" "Copyright 1991 Digital Equipment Corporation" === "Copyright (c) Digital Equipment Corporation 1991" "Enhancements Copyright 1992-2014 Free Software Foundation" === "Weiter Copyright (c) Free Software Fundation 1992-2014" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "Weiter Copyright (c) \r\nAlessandro Scotti 2005" "WinBoard 0.0.0" === "WinBoard 0.0.0" ABOUTBOX2 "galactic" === "galaktisch" TIME CONTROL DIALOG "Time Control" === "Zeitkontrolle" "Conventional chess clock" === "Normale Schachuhr" "Incremental clock" === "Schachuhr mit Inkrement" "Cancel" === "Abbrechen" "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Benutzen Sie die Pfeiltasten zur Auswahlt des Uhrentyps und verwenden Sie anschlieend die Tabulatortaste, um die Uhr zu stellen." "Fixed time per move" === "Feste Zeit pro Zug" "Number of moves:" === "Anzahl Zge:" "Within number of minutes:" === "in Anzahl Minuten:" "Initial number of minutes:" === "Initiale Anzahl Minuten:" "Plus number of seconds per move:" === "Plus Anzahl Sekunden pro Zug:" "Maximum seconds per move:" === "Maximale Anzahl Sekunden pro Zug" "Time-Odds Factors:" === "Zeitvorgabe:" "Engine #1:" === "Engine #1:" "Engine #2:" === "Engine #2:" LOAD OPTIONS DIALOG "Load Game Options" === "Partieeinstellungen laden" "Load games with automatic stepping" === "Partien mit automatischen Schritten laden" ## Make it wider. It could say "segundos por jugada" "seconds per move" === "Sekunden pro Zug" SAVE OPTIONS DIALOG "Save Game Options" === "Partieeinstellungen speichern" "Save As: " === "Stil speichern" "Save games automatically" === "Partien automatisch speichern" "Prompt for filename" === "Dateinamen eingeben" "To file:" === "Datei:" "PGN" === "PGN" "Old" === "Alt" "Browse..." === "Durchsuchen..." "Save out of book info in PGN" === "Verlassen des Erffnungsbuchs in PGN markieren" 1536 "Open" === "ffnen" "File &Name:" === "Datei&name:" "&Directories:" === "&Verzeichnisse:" "List Files of &Type:" === "Datei&typ:" "Dri&ves:" === "&Partitionen:" "&Help" === "&Hilfe" "&Index number:" === "&Zugnummer:" COMMPORT "Communication Port Settings" === "Porteinstellungen" "Net&work..." === "&Netzwerk" "&Port:" === "&Port:" "Data &Rate:" === "&bertragungsrate:" "Data &Bits:" === "&Bits:" "P&arity:" === "P&aritt:" "&Stop Bits:" === "&Stop Bits:" "F&low:" === "Datenf&luss:" EDIT COMMENT "Edit comment" === "Kommentar bearbeiten" "&Clear" === "&Leeren" "&Edit" === "&Bearbeiten" PROMOTION POPUP "Promotion" === "Umwandlung" "&Queen" === "&Dame" "&Rook" === "&Turm" "&Bishop" === "&Lufer" "K&night" === "&Springer" "&King" === "&Knig" "&Cancel" === "&Abbrechen" ## This text doesn't appear in WB (remove comment and string if deleted from lang450.txt) "Promote pawn to:" === "Bauern umwandeln in:" ## This text appears and it is not in lang450.txt (remove comment if added to lang450.txt) "Promote to:" === "Umwandeln in:" "Chance&llor" === "Kanz&ler" "&Archbishop" === "Er&zbischof" " YES" === " JA" " NO" === " NEIN" "C&entaur" === "Z&entaurus" GAME LIST "Game List" === "Partieliste" "&Load" === "&Laden" "&Prev" === "&Vorschau" "&Next" === "&Weiter" "&Close" === "&Schlieen" "Filter" === "Filter" EDIT TAGS "Edit Tags" === "Tags bearbeiten" ERROR "ICS Interaction" === "ICS Interaktion" "Dialog" === "Dialog" "Error" === "Fehler" "Sorry Charlie" === "Pech gehabt" COLORIZE "I C S Interaction Colors" === "Interaktionsfarben I C S" "Interaction Colors" === "Interaktionsfarben" "Premove" === "Zugeingabe vorab" "Alarm" === "Alarm" "Colors" === "Farben" "&Choose Color..." === "&Farbe auswhlen..." "&Bold" === "&Fett" "&Italic" === "&Kursiv" "&Underline" === "&Unterstrichen" "&Strikeout" === "&Durchgestrichen" QUESTION ## Really appears this? weird "Enter a chess engine command or just type something stupid that will completely screw things up." === "Geben Sie ein Kommand fr die Schachengine ein oder geben Sie etwas Unsinniges ein, das das Programm abstrzen lsst." "Question" === "Frage" "Enter" === "Eingabe" STARTUP DIALOG "WinBoard Startup" === "WinBoard starten" "What would you like to do?" === "Was mchten Sie tun?" "&Play against a chess engine or match two engines" === "Gegen ein &Schachprogramm spielen oder ein Match zwischen zwei Schachprogrammen starten" "&Use an Internet Chess Server" === "Mit einem &Internetschachserver (ICS) verbinden" "Just &view or edit game files" === "Nur &Partien nachspielen oder bearbeiten" "Specify Chess &Engines:" === "&Schachprogramme auswhlen:" "Specify Chess &Server:" === "&Internetschachserver auswhlen:" "&Additional options" === "&Erweiterte Einstellungen" INDEX "Type in a move" === "Geben Sie einen Zug ein" "Inde&x number:" === "Zugnummer" SOUND DIALOG "Sounds" === "Klnge" "&Event:" === "&Ereignis:" "&No sound" === "&Lautlos" ## Make it wider, it could say "Bip por defecto" "&Default beep" === "&Standardton" "&Built-in sound:" === "&Mitgelieferte Klnge" ## Make it wider, it could say "Archivo WAV:" "&WAV file:" === "&WAV-Datei:" "B&rowse..." === "&Durchsuchen..." "&Play" === "&Abspielen" "&Defaults" === "&Standardton" GENERAL OPTIONS DIALOG ## In this dialog, buttons OK/Cancel are not aligned at the right ## Note: finely tuned spaces to align keys at right (add this comment to lang450.txt for commodity) "General Options" === "Allgemeine Einstellungen" "Always on &Top" === "Immer im Vordergrund" "Always &Queen Ctrl+Shift+Q" === "Immer &Dame Ctrl+Umschalt+Q" "Animate &Dragging" === "&Animiertes Ziehen" "&Animate Moving Ctrl+Shift+A" === "Animierte &Zge Ctrl+Umschalt+A" "Auto &Flag Ctrl+Shift+F" === "Autom. &Zeitreklamation Ctrl+Umschalt+F" "Auto Flip &View" === "&Brett automatisch drehen" "Auto &Raise Board" === "&Brett im Vordergrund halten" "&Blindfold" === "Blindspiel" "Highlight Dra&gging" === "&Ziehen hervorheben" "Highlight Last &Move" === "&Letzten Zug hervorhaben" "Periodic &Updates" === "&Regelmig aktualisieren" ## Was wrong in lang450.txt (remove comment if corrected in lang450.txt) "Ponder &Next Move Ctrl+Shift+P" === "Auf &Gegnerzeit rechnen Ctrl+Umschalt+P" "&Popup Exit Message" === "&Rckfrage vor Beenden" "Popup Move &Errors" === "&Inkorrekten Zug anzeigen" "Show Butt&on Bar" === "&Schalterleiste anzeigen" "Show &Coordinates" === "&Koordinaten anzeigen" "&Show Thinking" === "&Computerausgabe anzeigen" "Test &Legality Ctrl+Shift+L" === "&Legalitt berprfen Ctrl+Umschalt+L" "&Hide Thinking Ctrl+Shift+H" === "C&omp. ausgabe ausblenden Ctrl+Ums+H" "&Info in Move History Ctrl+Shift+I" === "&Informationen in Notation Ctrl+Umschalt+I" "&Send Engine Think" === "Computerausgabe &bertragen" "E&xtended PGN Info Ctrl+Shift+X" === "&Erweiterte Inf. in PGN Ctrl+Umschalt+X" "Highlight with Arro&w" === "Mit &Pfeil hervorheben" "Displa&y Logos" === "&Logos anzeigen" "One-Click Move" === "Ein-Klick-Eingabe" ICS OPTIONS "ICS Options" === "ICS Optionen" "&Auto Comment" === "&Autom. Kommentare" "Auto &Observe" === "Automatisches &Zuschauen" "&Get Move List" === "&Zugliste" "&Local Line Editing" === "&Lokale Zeile bearbeiten" "&Quiet Play" === "&Stilles Spiel" "&Premove" === "&Zugeingabe vorab" "&White first move" === "1. Zug &Wei" "&Black first move" === "1. Zug &Schwarz" "&Sound alarm at" === "&Alarm bei" "seconds" === "Sekunden" "Choose..." === "Auswhlen..." "Do ¬ colorize messages" === "Keine &Nachrichtenfarben" "&Auto Kibitz" === "&Autom. Kibitzen" "See&k Graph" === "&Suchgraph" "auto-&Refresh" === "&Autom. aktualisieren" "Bckgnd Obser&ve" === "&Im Hintergrund zuschauen" "&Dual Board" === "&Doppeltes Brett" "One-Click &Move" === "&Ein-Klick-Eingabe" "Background..." === "Hintergrund..." "&Defaults..." === "&Standard..." "Startup &Chat Boxes:" === "ffne Chatfenster:" "General" === "Allgemein" BOARD OPTIONS (NOTE: AllWhite uses the white pieces for both sides FlipBlack plots the blck pieces upside down) "Board Options" === "Brettoptionen" "Defaults" === "Standard" "Light Squares" === "Weie Felder" "Dark Squares" === "Schwarze Felder" "White Pieces" === "Weie Figuren" "Black Pieces" === "Schwarze Figuren" "Square Highlights" === "Felder hervorheben" "Premove Highlights" === "Vorabeingabe hervorheben" "Monochrome" === "Monochrome" "All White" === "Alle Wei" "Flip Black" === "Drehe Schwarz" "Size" === "Gre" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. ## This is a space for imagination (useful note to add to lang450.txt). "&Tiny" === "&Mini" "T&eeny" === "&Sehr winzig" "&Dinky" === "&Winziger" "&Petite" === "W&inzig" "Sl&im" === "Sehr &klein" "&Small" === "K&leiner" "Medi&ocre" === "Kl&ein" "&Middling" === "&Solala" "&Average" === "&Durchschnitt" "Mode&rate" === "&Moderat" "Medi&um" === "&Normal" "Bul&ky" === "M&assiv" "&Large" === "&Gro" "&Big" === "G&rer" "&Huge" === "Sehr gr&o" "&Giant" === "Gigan&tisch" "&Colossal" === "Kol&losal" "Tita&nic" === "Tita&nisch" FONTS "Fonts" === "Schriftarten" "Current Board Size" === "Aktuelle Brettgre" "All Board Sizes" === "Alle Brettgren" "&Revert to Defaults" === "&Standardeinstellung" "Clocks" === "Uhren" "Messages" === "Nachrichten" "Coordinates" === "Koordinaten" "Tags" === "Markierungen" "Comments" === "Kommentare" "I C S Interaction" === "ICS Kommunikation" "&Color..." === "&Farben..." "Move History, Engine Output" === "Notation, Engineausgabe" ADJUDICATIONS DIALOG "Adjudications" === "Abschtzungen" ## Make wider next four controls, text could be more clear "Ponder Next Move" === "Auf Gegnerzeit rechnen" "Enable and Show Thinking (recommended)" === "Engineausgabe anzeigen (empfohlen)" "Hide Thinking when Playing against Human" === "Engineausgabe im Spiel gegen Menschen ausblenden" "Periodic Updates (for Analysis Mode)" === "Regelmig aktualisieren (im Analysemodus)" "Adjudications in non-ICS games" === "Abschtzungen in Nicht-ICS-Partien" ## Make it wider "Adjudicate draw after:" === "Als Remis abschtzen nach:" ## Make it wider "moves" === "Zge" "Win/loss adjudication threshold:" === "Gewinn-/Verlustabschtzung bei:" ## Make it wider "centipawns" === "1/100 Bauerneinheit" "&Verify Engine Claims" === "&berprfe Enginereklamationen" "Detect &Mates" === "&Matterkennung" "Draw if &Insufficient Material" === "&Remis falls kein Mattmaterial" "Adjudicate &Trivial Draws" === "&Klare Remis abschtzen" "Apply" === "bernehmen" ## Make wider next four (currently cutted) "-move rule" === "-Zge-Regel" "-fold repeats" === "-fache Wiederholung" "Engine #1 Score is Absolute" === "Bewertung Engine #1 ist absolut" "Engine #2 Score is Absolute" === "Bewertung Engine #2 ist absolut" COMMON ENGINE DIALOG "Common Engine Settings" === "Allgemeine Einstellungen (Engines)" "Polyglot Directory:" === "Verzeichnis Polyglot:" "Hash Size (MB):" === "Hashgre (MB):" ## Make wider next four "EGTB Path:" === "Verzeichnis EGTB:" "EGTB Size (MB):" === "Gre EGTB (MB):" "Use Book:" === "Buch verwenden:" "Max nr of CPUs:" === "Max. Prozessoren:" "First has Own Book" === "Eigenes Buch (Engine #1)" "Second has Own Book" === "Eigenes Buch (Engine #2)" "Book Depth:" === "Buchtiefe:" "Book Variation:" === "Buchvariation:" "Default Match Games:" === "Anzahl Matchpartien" NEW-VARIANT DIALOG (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "Varianten" "Variant" === "Variante" "Board size:" === "Brettgre" ## Make it wider (currently cutted) "ranks" === "Reihe" "files" === "Linie" "Holdings with room for:" === "Figuren zum Einsetzen:" "pieces" === "Figuren" ## Make it wider (so 'val.' becomes 'valor', and 'sel.' becomes 'seleccionada') "('-1' means defaults for selected variant)" === "('-1' bedeutet Standard fr ausgewhlte Variante)" VARIANT NAMES: "&normal" === "&Normal" "&FRC" === "&FRC" "&wildcastle" === "&Wildcastle" "&nocastle" === "&Nocastle" "&losers" === "&Losers" "&giveaway" === "&Ruberschach" "s&uicide" === "&Selbstmord" "&3Check" === "&Drei Schachs" "&twokings" === "&Zwei Knige" "&atomic" === "&Atomschach" "cra&zyhouse" === "Cra&zyhouse" "&bughouse" === "&Tandem" "&Twilight" === "&Twilight" "&shogi" === "&Shogi" "su&per" === "Su&per" "&knightmate" === "&Springermatt" "&Berolina" === "&Berolina" "c&ylinder" === "&Zylinderschach" "&fairy" === "&Mrchenschach" "&makruk" === "&Makruk" "&gothic" === "&Gothic" "&capablanca" === "&Capablanca" "&Janus" === "&Janus" "&CRC" === "&CRC" "&Falcon" === "&Falcon" "cou&rier" === "&Courier" "&Great" === "&Groschach" "&Shatranj" === "&Shatanj" "&xiangqi" === "&Xiangqi" NEW SHUFFLE GAME "New Shuffle Game" === "Neue Partie FRC" "&Start Position Number:" === "Startposition Nr.:" "Random" === "Zufllig" GAME-LIST OPTIONS DIALOG "Game List Options" === "Einstellungen (Partieliste)" "PGN &Tags:" === "&PGN-Tags:" ## Make wider next five "&Up" === "&Aufwrts" "&Down" === "A&bwrts" "Default" === "Standard" "Factory" === "Fabrik" "Restore to:" === "Wiederherstellen nach:" MOVE HISTORY WINDOW "Move History" === "Notation" EVALUATION GRAPH "Evaluation Graph" === "Bewertungsgraph" ENGINE OUTPUT WINDOW "Engine output" === "Engineausgabe" "Engine #1" === "Engine #1" "NPS" === "Kn./Sec." "Engine #2" === "Engine #2" CHAT BOXES "Chat Window" === "Chatfenster" "Chat partner:" === "Chatpartner:" "Clear" === "Leeren" "Send" === "Senden" winboard.c "&File" === "&Datei" "&Mode" === "&Modus" "&Action" === "&Partie" "&Step" === "&Zug" "&Options" === "&Optionen" "&Help" === "Hilfe" "Font name too long:" === "Schriftname zu lang:" "Font point size missing:" === "Schriftgre fehlt:" "Can't parse color name %s" === "Unbekannte Farbe: %s" "Unrecognized board size value" === "Unbekannte Brettgre" "Unrecognized argument" === "Unbekannter Parameter" "No value provided for argument" === "Fehlender Wert fr Parameter" "Incomplete \\ escape in value for" === "Escapezeichen \\ nicht komplett in Wert fr" "Failed to open indirection file" === "Konnte Umleitungsdatei nicht ffnen" "Unrecognized boolean argument value" === "Ungltiger Wert fr boolschen Parameter" "Unrecognized argument" === "Unbekannter Parameter" "Too many colors" === "Zu viele Farben" "&Minimize\tCtrl+F4" === "&Minimieren\tCtrl+F4" "White: %s" === "Wei: %s" "We only care about the height here" === "Hier ist nur die Hhe wichtig" "Cannot build game list" === "Konnte Partieliste nicht erzeugen" "Load Game from File" === "Partie aus Datei laden" "Load Position from File" === "Stellung aus Datei laden" "Save Game to File" === "Partie in Datei speichern" "Save Position to File" === "Stellung in Datei speichern" "%s does not support analysis" === "%s untersttzt Analysemodus nicht" "Analyze Game from File" === "Analysiere Partie aus Datei" "Unable to activate help" === "Hilfe konnte nicht aktiviert werden" "Send to chess program:" === "An Engine senden:" "Send to second chess program:" === "An Engine #2 senden:" "Direct Command" === "Direkter Befehl" "Error loading sound %s" === "Konnte Klang %s nicht laden" "Error playing sound %s" === "Konnte Klang %s nicht abspielen" "File open failed" === "Konnte Datei nicht ffnen" "Internal error in file dialog box" === "Interner Fehler in Dateidialog" "Option Error" === "Fehler (Option)" "Choose an option, or cancel to exit" === "Option auswhlen oder abbrechen" "Unable to activate help" === "Hilfe konnte nicht aktiviert werden" "Displayed move is not current" === "Angezeigter Zug ist nicht aktuell" "Could not parse move" === "Konnte Zug nicht verarbeiten" "%s:\nError code %d" === "%s:\nFehler %d" "Error" === "Fehler" "Fatal Error" === "Schwerer Fehler" "Exiting" === "Beende..." "%s:\nError code %d" === "%s:\nFehler %d" "Note" === "Beachte" "Error writing to chess program" === "Fehler beim Senden an Engine" "User" === "Benutzer" "Unknown" === "Unbekannt" "White" === "Wei" "Black" === "Schwarz" "Save Game to File" === "Partie in Datei speichern" "Not implemented" === "Nicht implementiert" ## What is this? appears that it can be without translation "Shout Text" === "" "SShout/CShout" === "" "Channel 1 Text" === "Text (Kanal 1)" "Channel Text" === "Text (Kanal)" "Kibitz Text" === "Text (Kibitz)" "Tell Text" === "Text (Chat)" "Challenge Text" === "Text (Fordern)" "Request Text" === "Text (Forderung)" "Seek Text" === "Text (Suche)" "Normal Text" === "Text (Standard)" "None" === "Nichts" "Pawn" === "Bauer" "Knight" === "Springer" "Bishop" === "Lufer" "Rook" === "Turm" "Queen" === "Dame" "Information" === "Information" wclipbrd.c "Unable to convert position to FEN." === "Konnte Stellung nicht nach FEN konvertieren." "Unable to copy FEN to clipboard." === "Konnte FEN nicht in Zwischenablage kopieren" "Cannot create temporary file name." === "Konnte temporre Datei nicht erstellen" "Cannot open temporary file." === "Konnte temporre Datei nicht ffnen" "Cannot write to temporary file." === "Konnte temporre Datei nicht schreiben" "Cannot reopen temporary file." === "Konnte temporre Datei nicht erneut ffnen" "Cannot determine size of file." === "Konnte Dateigre nicht bestimmen" "Cannot allocate clipboard buffer." === "Nicht genug Speicher fr Zwischenablage" "Cannot read from temporary file." === "Konnte temporre Datei nicht lesen" "Error reading from temporary file." === "Fehler beim Lesen temporrer Datei" "Cannot copy text to clipboard" === "Konnte Text nicht in Zwischenablage kopieren" "Unable to allocate memory for clipboard." === "Nicht genug Speicher fr Zwischenablage" "Unable to lock clipboard memory." === "Konnte Speicher fr Zwischenablage nicht blockieren" "Cannot unlock clipboard memory." === "Konnte Speicher fr Zwischenablage nicht freigeben" "Cannot open clipboard." === "Konnte Zwischenablage nicht ffnen" "Cannot empty clipboard." === "" "Cannot copy text to clipboard." === "" "Cannot close clipboard." === "" "Unable to paste FEN from clipboard." === "" "Unable to create temporary file." === "" "Error writing to temporary file." === "" "Unable to open clipboard." === "" "No text in clipboard." === "" "Unable to lock clipboard memory." === "" "Unable to allocate memory for text string." === "" "Unable to unlock clipboard memory." === "" "Unable to close clipboard." === "" woptions.c "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" ## What is this? appears that it can be without translation "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" "Browse for Sound File" === "" "Can't parse com port settings" === "" "Option Error" === "" "Invalid data rate" === "" "Option Error" === "" "Failed to set comm port state;\r\ninvalid options?" === "" "Failed to set comm port state" === "" "Invalid load game step rate" === "" "Invalid save game file name" === "" "Browse for Auto Save File" === "" "Invalid moves per time control" === "" "Invalid minutes per time control" === "" "Invalid increment" === "" "Invalid initial time" === "" "Changing time control during a game is not implemented" === "" "Variant %s not supported by %s" === "" "Warning: second engine (%s) does not support this!" === "" "Invalid ICS Alarm Time" === "" "Invalid max time per move" === "" "Invalid time-odds factor" === "" "Choose Folder" === "" "Choose Book" === "" "Choose Polyglot Directory" === "" "Choose EGTB Directory:" === "" "Polyglot was not found in the specified folder!" === "" wgamelist.c "No game selected" === "" "Can't go forward any further" === "" "Can't back up any further" === "" "No game list" === "" "Game List" === "" "Game list not loaded or empty" === "" "%s - %d/%d games" === "" wedittags.c "Edit Tags" === "" "Tags" === "" "Error replacing tags." === "" wsettings.c "%s Engine Settings (%s)" === "" "OK" === "" "Cancel" === "" backend.c "bad timeControl option %s" === "" "bad searchTime option %s" === "" "first" === "" "second" === "" "protocol version %d not supported" === "" "Variant %s supported only in ICS mode" === "" "Unknown variant name %s" === "" "Starting chess program" === "" "Could not open comm port %s" === "" "Could not connect to host %s, port %s" === "" "Unknown initialMode %s" === "" "Can't have a match with no chess programs" === "" "Bad game file" === "" "Bad position file" === "" "AnalyzeFile mode requires a game file" === "" "Analysis mode requires a chess engine" === "" "Analysis mode does not work with ICS mode" === "" "MachineWhite mode requires a chess engine" === "" "MachineWhite mode does not work with ICS mode" === "" "MachineBlack mode requires a chess engine" === "" "MachineBlack mode does not work with ICS mode" === "" "TwoMachines mode does not work with ICS mode" === "" "TwoMachines mode requires a chess engine" === "" "Training mode requires a game file" === "" "Error writing to ICS" === "" "Error reading from keyboard" === "" "Got end of file from keyboard" === "" "Error writing to ICS" === "" "Error writing to display" === "" "Error gathering move list: two headers" === "" "Error gathering move list: nested" === "" "Connection closed by ICS" === "" "Error reading from ICS" === "" "Failed to parse board string:\n\"%s\"" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Error gathering move list: extra board" === "" "Illegal move \"%s\" from ICS" === "" "Couldn't parse move \"%s\" from ICS" === "" ## 'say' must not be translated (add this comment to lang450.txt) "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "" "You are playing Black" === "" "You are playing White" === "" "It is White's turn" === "" "It is Black's turn" === "" "Displayed position is not current" === "" "Illegal move" === "" "End of game" === "" "Incorrect move" === "" ## Second %s is translated 'first' or 'second'. (add this comment to lang450.txt) "Illegal move \"%s\" from %s machine" === "" "Forfeit due to illegal move" === "" "%s does not support analysis" === "" ## Second %s is translated 'first' or 'second' (add this comment to lang450.txt) "Illegal move \"%s\" (rejected by %s chess program)" === "" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Failed to start %s chess program %s on %s: %s\n" === "" "Hint: %s" === "" "Machine accepts your draw offer" === "" "Machine offers a draw\nSelect Action / Draw to agree" === "" "%s (only move)" === "" "Ambiguous move in ICS output: \"%s\"" === "" "Illegal move in ICS output: \"%s\"" === "" "Gap in move list" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Variant %s not supported by %s" === "" "Startup failure on '%s'" === "" "Waiting for first chess program" === "" "Waiting for second chess program" === "" "Match %s vs. %s: final score %d-%d-%d" === "" "Stalemate" === "" "Illegal move: %d.%s%s" === "" "Ambiguous move: %d.%s%s" === "" "Can't open \"%s\"" === "" "Cannot build game list" === "" "No more games in this message" === "" "No game has been loaded yet" === "" "Can't back up any further" === "" "Game number out of range" === "" "Can't seek on game file" === "" "Game not found in file" === "" "Bad FEN position in file" === "" "No moves in game" === "" "No position has been loaded yet" === "" "Can't back up any further" === "" "Can't open \"%s\"" === "" "Can't seek on position file" === "" "Position not found in file" === "" "Bad FEN position in file" === "" "Black to play" === "" "White to play" === "" "Can't open \"%s\"" === "" "You have edited the game history.\nUse Reload Same Game and make your move again." === "" "You have entered too many moves.\nBack up to the correct position and try again." === "" "Displayed position is not current.\nStep forward to the correct position and try again." === "" "You have not made a move yet" === "" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "" "No unfinished games" === "" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "" "Failed to invoke cmail" === "" "Waiting for reply from opponent\n" === "" "Still need to make move for game\n" === "" "Still need to make moves for both games\n" === "" "Still need to make moves for all %d games\n" === "" "Still need to make a move for game %s\n" === "" "No unfinished games\n" === "" "Ready to send mail\n" === "" "Still need to make moves for games %s\n" === "" "Edit comment" === "" "Edit comment on %d.%s%s" === "" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "" "It is not White's turn" === "" "It is not Black's turn" === "" "Wait until your turn,\nor select Move Now" === "" "Starting second chess program" === "" "Training mode off" === "" "Training mode on" === "" "Already at end of game" === "" "Warning: You are still playing a game" === "" "Warning: You are still observing a game" === "" "Warning: You are still examining a game" === "" "It is Black's turn" === "" "It is White's turn" === "" "That square is occupied" === "" "There is no pending offer on this move" === "" "Your opponent is not out of time" === "" "Black offers a draw" === "" "White offers a draw" === "" "You must make your move before offering a draw" === "" "You are not examining a game" === "" "You can't revert while pausing" === "" "Wait until your turn,\nor select Move Now" === "" "It is your turn" === "" "Wait until your turn" === "" "No hint available" === "" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error writing to %s chess program" === "" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error: %s chess program (%s) exited unexpectedly" === "" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error reading from %s chess program (%s)" === "" "Analysis (%s)" === "" "Comment" === "" "Comment on %d.%s%s" === "" "Both flags fell" === "" "White's flag fell" === "" "Black's flag fell" === "" "Bad FEN position in clipboard" === "" "No response from ICS" === "" "You cannot do this while you are playing or observing" === "" "Click in holdings to choose piece" === "" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [Well, this is currently not possible, they are used for both. And it only appears as a comment in the PGN.] "Game aborted" === "" "White wins on time" === "" "Black wins on time" === "" "Both players ran out of time" === "" "White resigns" === "" "Black resigns" === "" "White mates" === "" "Black mates" === "" "Draw" === "" "Draw agreed" === "" "Xboard adjudication: King destroyed" === "" "Xboard adjudication: Bare king" === "" "Xboard adjudication: 3rd check" === "" "Xboard adjudication: Stalemate" === "" "Xboard adjudication: Checkmate" === "" "Xboard adjudication: Insufficient mating material" === "" "Xboard adjudication: Trivial draw" === "" "XBoard adjudication: repetition draw" === "" "Xboard adjudication: perpetual checking" === "" "Xboard adjudication: perpetual chasing" === "" "%Xboard adjudication: perpetual chasing of" === "" "Xboard adjudication: 50-move rule" === "" "Draw claim: 50-move rule" === "" "Draw claim: 3-fold repetition" === "" "Draw claim: insufficient mating material" === "" "Xboard adjudication: long game" === "" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "" "Xboard adjudication" === "" "User adjudication" === "" "False win claim: '%s'" === "" "False draw claim: '%s'" === "" "xboard exit" === "" ## One forgetted string (remove comment if added to lang450.txt) "Type in your name" === "Geben sie ihre namen ein" xboard-4.7.3/winboard/language/italiano.lng0000644000175000001440000013324112262415351015620 00000000000000## WinBoard 4.5.0 language file ## ## Italian / Italiano ## v1.0 beta 1 ## ## Translation by Giorgio Medeot (09-nov-2010) ## Traduzione di Giorgio Medeot ## WEB ADDRESS OF TRANSLATOR ## ## If you revise this, please insert your date, name and description. ## Se modificate questo file, inserite la data, il vostro nome e la descrizione della modifica ## ## For example: ## Per esempio: ## 24-ago-2010. Juan Prez (j@xyz.p). Corrected translation for xyzzy. ## Notes for translators (can be deleted from the file after translation): ## Just write the translations between the second pair of quotes ## Things like %s, %d and %c must be preserved in the original order ## Empty translated strings will be ignored, so there is no reason ## to delete those for which you don't know a translation, ## and you can start testing everything immediately. ## Simply rename this file to LANGUAGE.lng, and WinBoard should see it, ## and allow you to use the option /language=LANGUAGE. ## You are encouraged to call up the corresponding WinBoard dialog while ## working on the translation, to see in which context the strings are used. ## This is why the strings below are sorted by dialog ## ## Of duplicats, only the first occurrence will be used, even if it was in ## a different dialog! For this reason you will only see an 'OK' in the ## About Box. After you translated it there, this translation will be used ## for all other dialogs as well. ## o Use ## for comments, to make it easy to find them scattered throughout the translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. ## preferably it should be unique in the applicable menu, so it depends on translation of other items! " " === "Traduzione di Giorgio Medeot" winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "&New Game\tCtrl-N" === "&Nuova partita\tCtrl-N" "New Sh&uffle Game..." === "Nuova partita Shu&ffle..." "New &Variant...\tAlt+Shift+V" === "Nuova &variante...\tAlt+Shift+V" "&Load Game...\tCtrl-O" === "&Apri partita da file...\tCtrl-O" "&Save Game...\tCtrl-S" === "&Salva partita...\tCtrl-S" "L&oad Position...\tCtrl+Shift+O" === "Apri &posizione da file...\tCtrl+Shift+O" "S&ave Position...\tCtrl+Shift+S" === "&Salva posizione...\tCtrl+Shift+S" "Save as &Diagram..." === "Salva come &immagine..." "&Quit" === "&Esci" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === "Partita successiva\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "Partita precedente\tAlt+PgUp" "&Reload Same Game" === "Riapri partita corrente" "Load N&ext Position\tAlt+Shift+PgDn" === "Posizione successiva\tAlt+Shift+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Posizione precedente\tAlt+Shift+PgUp" "Reload Sa&me Position" === "Riapri posizione corrente" "&Copy Game To Clipboard\tCtrl+C" === "&Copia partita\tCtrl+C" "C&opy Position To Clipboard\tCtrl+Shift+C" === "&Copia posizione\tCtrl+Shift+C" "Copy Game List to Clipboard" === "Copia &lista partite" "&Paste Game From Clipboard\tCtrl+V" === "&Incolla partita\tCtrl+V" "P&aste Position From Clipboard\tCtrl+Shift+V" === "&Incolla posizione\tCtrl+Shift+V" "&Edit Game\tCtrl+E" === "&Modifica partita\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "&Modifica posizione\tCtrl+Shift+E" "Edit Ta&gs..." === "Mo&difica informazioni partita..." "Edit Co&mment..." === "Mo&difica commento..." "Enter &Username..." === "Inserisci nome &utente..." "&Revert\tHome" === "&Ripristina\tHome" "&Annotate" === "A&nnota" "&Truncate Game\tEnd" === "Tr&onca la partita\tEnd" "&Backward\tAlt+Left" === "&Indietro\tAlt+Left" "&Forward\tAlt+Right" === "&Avanti\tAlt+Right" "Back to &Start\tAlt+Home" === "&Torna all'inizio\tAlt+Home" "For&ward to End\tAlt+End" === "Vai alla &fine\tAlt+End" "Flip &View\tF2" === "&Ruota la scacchiera\tF2" "&Swap Clocks" === "Scambia gli &orologi" "Engine &Output\tAlt+Shift+O" === "&Output del motore di gioco\tAlt+Shift+O" "Move &History\tAlt+Shift+H" === "Lista &mosse\tAlt+Shift+H" "Evaluation &Graph\tAlt+Shift+E" === "&Grafico della valutazione\tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "&Lista partite\tAlt+Shift+G" "Open &New Chat Window" === "Apri nuova Chat" "Type In &Move...\tAlt+I" === "&Digita mossa...\tAlt+I" "&Tags" === "&Informazioni partita" "&Comments" === "&Commenti" "&Game List Tags..." === "Impostazioni &lista partite..." "&Board..." === "&Scacchiera..." "&Fonts..." === "&Fonts..." "Machine &White\tCtrl+W" === "&Bianco al motore di gioco\tCtrl+W" "Machine &Black\tCtrl+B" === "&Nero al motore di gioco\tCtrl+B" "&Two Machines\tCtrl+T" === "Mo&tore di gioco 1 vs 2\tCtrl+T" "Machine Both" === "Osserva motore di gioco" "&Analysis Mode\tCtrl+A" === "&Avvia analisi\tCtrl+A" "Analyze &File\tCtrl+F" === "Analizza &file\tCtrl+F" "&Edit Game\tCtrl+E" === "Mo&difica partita\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "Mo&difica posizione\tCtrl+Shift+E" "Trai&ning" === "Allenamento" "&ICS Client" === "Connetti ad un &ICS" "&Machine Match" === "Matc&h tra i motori di gioco" "&Pause\tPause" === "&Pausa\tPause" "&Accept\tF3" === "&Accetta\tF3" "D&ecline\tF4" === "&Declina\tF4" "Re&match\tF12" === "&Rigioca\tF12" "Call &Flag\tF5" === "Chiama il &Tempo\tF5" "&Draw\tF6" === "&Offri Patta\tF6" "Ad&journ\tF7" === "A&ggiorna\tF7" "A&bort\tF8" === "&Interrompi\tF8" "&Resign\tF9" === "Abband&ona\tF9" "Stop &Observing\tF10" === "Smetti di o&sservare\tF10" "Stop E&xamining\tF11" === "Smetti di &esaminare\tF11" "&Upload to Examine" === "&Carica su ICS per esaminare" "Adjudicate to &White" === "Aggiudica al &Bianco" "Adjudicate to &Black" === "Aggiudica al &Nero" "Adjudicate &Draw" === "Aggiudica come &Patta" "Install 1st..." === "Installa motore 1..." "Install 2nd..." === "Installa motore 2..." "Engine #&1 Settings..." === "Impostazioni motore &1" "Engine #&2 Settings..." === "Impostazioni motore &2" "&Hint..." === "&Suggerimento..." "&Book..." === "&Libro delle aperture..." "&Move Now\tCtrl+M" === "&Muovi subito\tCtrl+M" "&Retract Move\tCtrl+X" === "&Annulla mossa\tCtrl+X" "&Mute all Sounds" === "Modalit silen&ziosa" "&General..." === "&Generali..." "&Time Control...\tAlt+Shift+T" === "Controllo &Tempo...\tAlt+Shift+T" "Common &Engine...\tAlt+Shift+U" === "&Motori di gioco...\tAlt+Shift+U" "Ad&judications...\tAlt+Shift+J" === "&Aggiudicazioni...\tAlt+Shift+J" "&Load Game...\tAlt+Shift+L" === "Apertura &partita...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "Sal&vataggio partita...\tAlt+Shift+S" "G&ame List..." === "&Lista partite..." "Soun&ds..." === "Suo&ni..." "&ICS..." === "&ICS..." "Add ICS..." === "Aggiungi ICS..." "Comm&unications..." === "&Comunicazioni..." "Save Settings &Now" === "&Salva impostazioni" "Save Settings on E&xit" === "Salva impostazioni all'&uscita" "Help &Contents\tF1" === "&Guida in linea\tF1" "Help &Index" === "&Indice della Guida" "How to &Use Help" === "&Utilizzo della Guida" "&About WinBoard" === "Informazioni su &Winboard" "White" === "Bianco" "Promote" === "Promuovi" "Pawn" === "Pedone" "Knight" === "Cavallo" "Bishop" === "Alfiere" "Rook" === "Torre" "Queen" === "Donna" "King" === "Re" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "Arcivescovo" "Chancellor" === "Cancelliere" ## Next 2 are Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === "Elefante" "Cannon" === "Cannone" ## Next 3 are Shogi (Japanese Chess) pieces. Google for 'Shogi' in the target language to get the standard translation. "Lance" === "Lancia" "Silver" === "Generale Argento" "Gold" === "Generale Oro" "Empty Square" === "Casa vuota" "Black" === "Nero" "Demote" === "Degrada" "Clear Board " === "Svuota scacchiera" "Drop" === "Paracadutaggio" "Cop&y and Paste" === "Co&pia e Incolla" "&Copy" === "&Copia" "&Paste" === "&Incolla" "&Undo" === "&Annulla" "Cu&t" === "&Taglia" "&Copy" === "&Copia" "&Paste" === "&Incolla" "Select &All" === "&Seleziona tutto" DIALOGS: ABOUTBOX ## Perhaps copyright notices best left untranslated? "About WinBoard" === "Informazioni su Winboard" "OK" === "OK" "Chessboard for Windows" === "Interfaccia per gli Scacchi e varianti per Windows" "Copyright 1991 Digital Equipment Corporation" === "Copyright (C) 1991 Digital Equipment Corporation" "Enhancements Copyright 1992-2014 Free Software Foundation" === "Modifiche Copyright (C) 1992-2014 Free Software Foundation" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "Modifiche Copyright (C) 2005\r\nAlessandro Scotti" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccin por scar Toledo G.". " " === "Traduzione italiana di Giorgio Medeot" "WinBoard 0.0.0" === "WinBoard 4.5.0" ABOUTBOX2 ## Weird, is it needed? [Normally not. It is a built-in 'Easter Egg' joke.] "galactic" === "galattico TIME CONTROL DIALOG "Time Control" === "Controllo Tempo" "Conventional chess clock" === "Orologio tradizionale" "Incremental clock" === "Orologio con incremento" "Cancel" === "Cancella" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Usa le frecce per specificare quale tipo di orologio utilizzare, poi premi il tasto tabulazione per modificare i valori." "Fixed time per move" === "Tempo per mossa fisso" "Number of moves:" === "Mosse:" "Within number of minutes:" === "In minuti:" "Initial number of minutes:" === "Tempo iniziale in minuti:" "Plus number of seconds per move:" === "Secondi aggiuntivi per mossa:" "Maximum seconds per move:" === "Secondi per mossa:" "Time-Odds Factors:" === "Riduci il tempo di un fattore:" "Engine #1:" === "Motore 1:" "Engine #2:" === "Motore 2:" LOAD OPTIONS DIALOG "Load Game Options" === "Impostazioni apertura partita" "Load games with automatic stepping" === "Apri partite attivando replay automatico" "seconds per move" === "secondi per mossa" SAVE OPTIONS DIALOG "Save Game Options" === "Impostazioni salvataggio partita" ##"Save Style" === "Tipo file: " "Save As: " === "Tipo file: " "Save games automatically" === "Salva automaticamente" "Prompt for filename" === "Chiedi sempre dove salvare" "To file:" === "Salva in:" "PGN" === "" "Old" === "Formato Winboard 3.x" "Browse..." === "Sfoglia..." "Save out of book info in PGN" === "Salva informazioni 'out of book' nel PGN" 1536 ## This dialog is only used in some older Windows versions, so you might not be able to test it. "Open" === "Apri file" "File &Name:" === "&Nome file:" "&Directories:" === "Cerca &in:" "List Files of &Type:" === "&Tipo file:" "Dri&ves:" === "&Unit:" "&Help" === "&Aiuto" "&Index number:" === "I&ndice:" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === "Impostazioni porta di comunicazione" "Net&work..." === "Re&te..." "&Port:" === "&Porta:" "Data &Rate:" === "Data &rate:" "Data &Bits:" === "Data &bits:" "P&arity:" === "P&arit:" "&Stop Bits:" === "&Stop bits" "F&low:" === "F&lusso" EDIT COMMENT "Edit Comment" === "Modifica commento" "&Clear" === "&Cancella" "&Edit" === "&Modifica" PROMOTION POPUP "Promote to:" === "Promuovi a:" ## next used in Shogi as promotion-popup header "Promote?" === "Promuovi?" "Promotion" === "Promozione" "&Queen" === "&Donna" "&Rook" === "&Torre" "&Bishop" === "&Alfiere" "K&night" === "&Cavallo" "&King" === "&Re" "&Cancel" === "&Cancella" "Chance&llor" === "&Cancelliere" "&Archbishop" === "&Arcivescovo" "YES" === "SI" "NO" === "NO" "C&entaur" === "&Centauro" GAME LIST "Game List" === "Lista partite" "&Load" === "&Apri" "&Prev" === "&Prec" "&Next" === "&Succ" "&Close" === "&Chiudi" "Filter" === "Filtro" EDIT TAGS "Edit Tags" === "Modifica informazioni" ERROR "ICS Interaction" === "Console ICS" "Dialog" === "Dialogo" "Error" === "Errore" ## I don't think the next will really appear ever. "Sorry Charlie" === "Spiacente Ciccio" COLORIZE "I C S Interaction Colors" === "Colori Console ICS" "Interaction Colors" === "Colori Console" "Premove" === "Premossa" "Alarm" === "Allarme" "Colors" === "Colori" "&Choose Color..." === "Scegli &colori" "&Bold" === "&Grassetto" "&Italic" === "&Corsivo" "&Underline" === "&Sottolineato" "&Strikeout" === "&Barrato" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === "Digita un comando per il motore di gioco" "Question" === "Comando diretto" "Enter" === "Invia" STARTUP DIALOG "WinBoard Startup" === "Avvio di Winboard" "What would you like to do?" === "Selezionare una delle seguenti azioni:" "&Play against a chess engine or match two engines" === "&Partita contro un motore di gioco o match tra due motori" "&Use an Internet Chess Server" === "&Connetti ad un Internet Chess Server" "Just &view or edit game files" === "&Apri o modifica una partita su file" "Specify Chess &Engines:" === "Specificare &motore di gioco:" "Specify Chess &Server:" === "Specificare indirizzo &ICS:" "&Additional options" === "&Opzioni aggiuntive:" INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === "I&ndice:" MOVE TYPE-IN "Type in a move" === "Digita una mossa" USER-NAME TYPE-IN "Type in your name" === "Inserisci il tuo nome" SOUND DIALOG "Sounds" === "Impostazioni suoni" "&Event:" === "&Evento:" "&No sound" === "&Silenzioso" "&Default beep" === "&Beep" "&Built-in sound:" === "Suoni &predefiniti:" "&WAV file:" === "&File WAV:" "B&rowse..." === "&Apri..." "&Play" === "A&scolta" "&Defaults" === "&Default" GENERAL OPTIONS DIALOG ## please keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === "Impostazioni generali" "Always on &Top" === "Sempre in &primo piano" "Always &Queen Ctrl+Shift+Q" === "Promuovi a &Donna Ctrl+Shift+Q" "Animate &Dragging" === "&Trascinamento animato" "&Animate Moving Ctrl+Shift+A" === "&Mosse animate Ctrl+Shift+A" "Auto &Flag Ctrl+Shift+F" === "Aggiudica sul &tempo Ctrl+Shift+F" "Auto Flip &View" === "Ruota &vista automaticamente" "Auto &Raise Board" === "Porta in p&rimo piano" "&Blindfold" === "Alla &cieca" "Highlight Dra&gging" === "Eviden&zia trascinamento" "Highlight Last &Move" === "&Evidenzia l'ultima mossa" "Periodic &Updates" === "&Aggiornamenti continui" "Ponder &Next Move Ctrl+Shift+P" === "Pe&nsa sul mio tempo Ctrl+Shift+P" "&Popup Exit Message" === "C&hiedi conferma alla chiusura" "Popup Move &Errors" === "Mostra pop&up per mosse errate" "Show Butt&on Bar" === "Mostra &barra dei pulsanti" "Show &Coordinates" === "Mostra c&oordinate" "&Show Thinking" === "Mo&stra output del motore" "Test &Legality Ctrl+Shift+L" === "Verifica mosse i&llegali Ctrl+Shift+L" "&Hide Thinking Ctrl+Shift+H" === "N&ascondi analisi Ctrl+Shift+H" "&Info in Move History Ctrl+Shift+I" === "&Informazioni nella Lista mosse Ctrl+Shift+I" "&Send Engine Think" === "Invia l'output del &motore di gioco" "E&xtended PGN Info Ctrl+Shift+X" === "&Informazioni PGN estese Ctrl+Shift+X" "Highlight with Arro&w" === "Evidenzia con una &freccia" "Displa&y Logos" === "Mostra i &loghi" "One-Click Move" === "Muovi con click &singolo" ICS OPTIONS "ICS Options" === "Impostazioni ICS" "&Auto Comment" === "&Commenti automatici" "Auto &Observe" === "&Osserva automaticamente" "&Get Move List" === "Scarica lista &mosse" "&Local Line Editing" === "Modifiche in &locale" "&Quiet Play" === "Non &disturbare durante il gioco" "&Premove" === "&Premosse" "&White first move" === "1 mossa &Bianco" "&Black first move" === "1 mossa &Nero" "&Sound alarm at" === "Avvi&sa a" "seconds" === "secondi" "Choose..." === "Scegli..." "Do ¬ colorize messages" === "Non colorare i &messaggi" "&Auto Kibitz" === "&Auto Kibitz" "Auto Kibit&z" === "Auto Kibit&z" "See&k Graph" === "Grafico delle &richieste" "auto-&Refresh" === "Auto a&ggiorna" "Bckgnd Obser&ve" === "&Osserva in bckgnd" "&Dual Board" === "Doppia &scacchiera" "One-Click &Move" === "&Mossa con click singolo" "Background..." === "Sfondo..." "&Defaults..." === "&Default..." "Startup &Chat Boxes:" === "Apri &Chat all'avvio:" "General" === "Generali" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === "Impostazioni scacchiera" "Defaults" === "Default" "Light Squares" === "Case bianche" "Dark Squares" === "Case nere" "White Pieces" === "Pezzi bianchi" "Black Pieces" === "Pezzi neri" "Square Highlights" === "Case evidenziate" "Premove Highlights" === "Premosse evidenziate" "Monochrome" === "Monocromatico" "All White" === "Neri a colore pieno" "Flip Black" === "Neri capovolti" "Size" === "Dimensioni" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "&Minima" "T&eeny" === "&Scricciola" "&Dinky" === "&Minuscola" "&Petite" === "&Piccina" "Sl&im" === "&Ridotta" "&Small" === "&Piccola" "Medi&ocre" === "&Contenuta" "&Middling" === "&Modesta" "&Average" === "&Usuale" "Mode&rate" === "&Moderata" "Medi&um" === "&Media" "Bul&ky" === "&Ampia" "&Large" === "&Estesa" "&Big" === "&Grande" "&Huge" === "&Imponente" "&Giant" === "&Gigantesca" "&Colossal" === "&Colossale" "Tita&nic" === "&Titanica" FONTS "Fonts" === "Font" "Current Board Size" === "Dmensione scacchiera corrente" "All Board Sizes" === "Impostazioni globali" "&Revert to Defaults" === "Valori di &default" "Clocks" === "Orologi" "Messages" === "Messaggi" "Coordinates" === "Coordinate" "Tags" === "Tags" "Comments" === "Commenti" "I C S Interaction" === "Console ICS" "&Color..." === "&Colori..." "Move History, Engine Output" === "Lista mosse,\noutput motore" ADJUDICATIONS DIALOG "Adjudications" === "Impostazioni aggiudicazioni" "Ponder Next Move" === "Pensa sul mio tempo" "Enable and Show Thinking (recommended)" === "Abilita e mostra output del motore (raccomandato)" "Hide Thinking when Playing against Human" === "Nascondi l'output del motore se gioca contro un uomo" "Periodic Updates (for Analysis Mode)" === "Aggiornamenti continui (per Modalit di analisi)" "Adjudications in non-ICS games" === "Aggiudicazioni in partite non ICS" "Adjudicate draw after:" === "Aggiudica patta dopo:" "moves" === "mosse" "Win/loss adjudication threshold:" === "Limite per aggiudicare vinta/persa:" "centipawns" === "centipawn" "&Verify Engine Claims" === "&Verifica gli annunci del motore" "Detect &Mates" === "Individua scacco &matto" "Draw if &Insufficient Material" === "Patta per materiale &insufficiente" "Adjudicate &Trivial Draws" === "Aggiudica patte &triviali" "Apply" === "Applica regole" ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === "mosse irreversibili" "-fold repeats" === "ripetizioni di posizione" "Engine #1 Score is Absolute" === "Output motore 1 sempre riferito al Bianco" "Engine #2 Score is Absolute" === "Output motore 2 sempre riferito al Bianco" COMMON ENGINE DIALOG "Common Engine Settings" === "Impostazioni motori di gioco" "Polyglot Directory:" === "Cartella Polyglot:" "Hash Size (MB):" === "Dimensione Hash [MB]:" "EGTB Path:" === "Cartella EGTB:" "EGTB Size (MB):" === "Dimensione EGTB [MB]:" "Use Book:" === "Libro aperture:" "Max nr of CPUs:" === "Num max di CPU:" "First has Own Book" === "Libro proprio per motore 1" "Second has Own Book" === "Libro proprio per motore 2" "Book Depth:" === "Profondit Libro:" "Book Variation:" === "Varianti Libro:" "Default Match Games:" === "Partite per match:" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "Varianti di gioco" "Variant" === "Variante" "Board size:" === "Scacchiera:" "ranks" === "traverse" "files" === "colonne" "Holdings with room for:" === "Num max di pezzi in mano" "pieces" === "pezzi" "('-1' means defaults for selected variant)" === "('-1' per il default della variante selezionata)" VARIANT NAMES: "&normal" === "&Normale" "&FRC" === "&FRC" "&wildcastle" === "&Wildcastle" "&nocastle" === "&Nocastle" "&losers" === "&Losers" "&giveaway" === "&Giveaway" "s&uicide" === "S&uicide" "&3Check" === "&3Check" "&twokings" === "&Twokings" "&atomic" === "&Atomic" "cra&zyhouse" === "Cra&zyhouse" "&bughouse" === "&Bughouse" "&Twilight" === "&Twilight" "&shogi" === "&Shogi" "su&per" === "Su&per" "&knightmate" === "&Knightmate" "&Berolina" === "&Berolina" "c&ylinder" === "&Cilindrici" "&fairy" === "&Fairy" "&makruk" === "&Makruk" "&gothic" === "&Gothic" "&capablanca" === "&Capablanca" "&Janus" === "&Janus" "&CRC" === "&CRC" "&Falcon" === "&Falcon" "cou&rier" === "Cou&rier" "&Great" === "&Great" "&Shatranj" === "&Shatranj" "&xiangqi" === "&Xiangqi" NEW SHUFFLE GAME "New Shuffle Game" === "Partita Shuffle" "&Start Position Number:" === "Disposizione iniziale:" "Random" === "Casuale" GAME-LIST OPTIONS DIALOG "Game List Options" === "Impostazioni lista partite" "PGN &Tags:" === "&Informazioni PGN:" "&Up" === "Muovi &su" "&Down" === "Muovi &giu" "Default" === "Default" "Factory" === "Fabbrica" "Restore to:" === "Reimposta:" MOVE HISTORY WINDOW "Move History" === "Lista mosse" EVALUATION GRAPH "Evaluation Graph" === "Grafico della valutazione" ENGINE OUTPUT WINDOW "Engine output" === "Output del motore di gioco" "Engine #1" === "Motore 1" "NPS" === "" "Engine #2" === "Motore 2" CHAT BOXES "Chat Window" === "Finestra della Chat" "Chat partner:" === "Compagno di chat:" "Clear" === "Cancella" "Send" === "Invia" winboard.c "&File" === "&File" "&Edit" === "&Modifica" "&View" === "&Visualizza" "&Mode" === "&Modalit" "&Action" === "&Azioni" "&Step" === "&Avanzamento" "E&ngine" === "&Motore" "&Options" === "&Impostazioni" "&Help" === "&Aiuto" "You can only start a match from the initial position." === "Un match pu essere avviato solo dalla posizione iniziale." "Font name too long:" === "Nome del font troppo lungo:" "Font point size missing:" === "Dimensione del font mancante:" "Can't parse color name %s" === "Impossibile leggere nome del colore %s" "Unrecognized board size value" === "Dimensione scacchiera non riconosciuta" "Unrecognized argument" === "Argomento non riconosciuto" "No value provided for argument" === "Valore mancante per l'argomento" "Incomplete \\ escape in value for" === "Escape \\ incompleto nel valore per" "Failed to open indirection file" === "Apertura fallita per il file di reindirizzamneto" "Unrecognized boolean argument value" === "Valore non valido per argomento booleano" "Unrecognized argument" === "Argomento non riconosciuto" "Too many colors" === "Troppi colori" "&Minimize\tCtrl+F4" === "&Minimizza\tCtrl+F4" "White: %s" === "Bianco: %s" "We only care about the height here" === "Qui solo l'altezza significativa" "Cannot build game list" === "Impossibile costruire lista delle partite" "Load Game from File" === "Apri partita da file" "Load Position from File" === "Apri posizione da file" "Save Game to File" === "Salva partita" "Save Position to File" === "Salva posizione" "%s does not support analysis" === "%s non supporta l'analisi" "Analyze Game from File" === "Analizza partita da file" "Unable to activate help" === "Impossibile aprire file della guida" "Send to chess program:" === "Invia al motore di gioco:" "Send to second chess program:" === "Invia al secondo motore di gioco" "Direct Command" === "Comando diretto" "Error loading sound %s" === "Errore nell'apertura del suono %s" "Error playing sound %s" === "Errore nella riproduzione del suono %s" "File open failed" === "Apertura file fallita" "Internal error in file dialog box" === "Errore interno nella finestra di dialogo apertura file" "Option Error" === "Errore nelle opzioni" "Choose an option, or cancel to exit" === "Scegli un'opzione o premi Cancella per uscire" "Unable to activate help" === "Impossibile aprire file della guida" "Displayed move is not current" === "La mossa mostrata non quella corrente" "Could not parse move" === "Impossibile leggere mossa" "%s:\nError code %d" === "%s:\nCodice errore %d" "Error" === "Errore" "Fatal Error" === "Errore fatale" "Exiting" === "Chiusura in corso" "%s:\nError code %d" === "%s:\nCodice errore %d" "Note" === "Nota" "Error writing to chess program" === "Errore in scrittura sul motore di gioco" "User" === "Utente" "Unknown" === "Sconosciuto" "White" === "Bianco" "Black" === "Nero" "Save Game to File" === "Salva partita" "Not implemented" === "Non implementato" "Shout Text" === "Testo Shout" "SShout/CShout" === "" "Channel 1 Text" === "Testo Canale 1" "Channel Text" === "Testo Canale" "Kibitz Text" === "Testo Kibitz" "Tell Text" === "Testo Tell" "Challenge Text" === "Testo Challenge" "Request Text" === "Testo Richiesta" "Seek Text" === "Testo Seek" "Normal Text" === "Testo normale" "None" === "Nessuno" "Pawn" === "Pedone" "Knight" === "Cavallo" "Bishop" === "Alfiere" "Rook" === "Torre" "Queen" === "Donna" "Information" === "Informazione" wclipbrd.c "Unable to convert position to FEN." === "Impossibile convertire posizione in FEN." "Unable to copy FEN to clipboard." === "Impossibile copiare FEN negli Appunti." "Cannot create temporary file name." === "Impossibile creare nome file temporaneo." "Cannot open temporary file." === "Impossibile aprire file temporaneo." "Cannot write to temporary file." === "Impossibile scrivere su file temporaneo." "Cannot reopen temporary file." === "Impossibile riaprire file temporaneo." "Cannot determine size of file." === "Impossibile determinare la dimensione del file." "Cannot allocate clipboard buffer." === "Impossibile allocare il buffer per gli Appunti." "Cannot read from temporary file." === "Impossibile leggere da file temporaneo." "Error reading from temporary file." === "Errore in lettura da file temporaneo." "Cannot copy text to clipboard" === "Impossibile copiare il testo negli Appunti" "Unable to allocate memory for clipboard." === "Impossibile allocare la memoria per gli Appunti." "Unable to lock clipboard memory." === "Impossibile riservare la memoria per gli Appunti." "Cannot unlock clipboard memory." === "Impossibile rilasciare la memoria per gli Appunti." "Cannot open clipboard." === "Impossibile aprire gli Appunti." "Cannot empty clipboard." === "Impossibile svuotare gli Appunti" "Cannot copy text to clipboard." === "Impossibile copiare il testo negli Appunti." "Cannot close clipboard." === "Impossibile chiudere gli Appunti." "Unable to paste FEN from clipboard." === "Impossibile incollare FEN dagli Appunti." "Unable to create temporary file." === "Impossibile creare file temporaneo." "Error writing to temporary file." === "Errore in scrittura su file temporaneo." "Unable to open clipboard." === "Impossibile aprire gli Appunti." "No text in clipboard." === "NEssun testo negli Appunti." "Unable to lock clipboard memory." === "Impossibile riservare la memoria per gli Appunti." "Unable to allocate memory for text string." === "Impossibile allocare la memoria per il testo." "Unable to unlock clipboard memory." === "Impossibile rilasciare la memoria per gli Appunti." "Unable to close clipboard." === "Impossibile chiudere gli Appunti." woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === "Sfoglia..." "Can't parse com port settings" === "Impossibile leggere le impostazioni per la porta COM" "Option Error" === "Errore nelle impostazioni" "Invalid data rate" === "Data Rate non valido" "Option Error" === "Errore nelle impostazioni" "Failed to set comm port state;\r\ninvalid options?" === "Settaggio della porta COM fallito;\r\nimpostazioni non valide?" "Failed to set comm port state" === "Settaggio dello stato della porta COM fallito" "Invalid load game step rate" === "Velocit replay partita non valida" "Invalid save game file name" === "Nome file per salvataggio partita non valido" "Browse for Auto Save File" === "Sfoglia nome file Salvataggio Automatico" "Invalid moves per time control" === "Numero mosse per sessione non valido" "Invalid minutes per time control" === "Valore minuti per sessione non valido" "Invalid increment" === "Valore incremento non valido" "Invalid initial time" === "Valore tempo iniziale non valido" "Changing time control during a game is not implemented" === "La possibilit di modificare il controllo di tempo durante la partita non implementata" "Variant %s not supported by %s" === "La variante %s non supportata da %s" "Warning: second engine (%s) does not support this!" === "Attenzione: il secondo motore di gioco (%s) non supporta questa azione!" "Invalid ICS Alarm Time" === "Valore per allarme controllo tempo ICS non valido" "Invalid max time per move" === "Valore tempo massimo per mossa non valido" "Invalid time-odds factor" === "Fattore di riduzione del tempo non valido" "Choose Folder" === "Scegli cartella" "Choose Book" === "Scegli Libro aperture" "Choose Polyglot Directory" === "Scegli cartella Polyglot" "Choose EGTB Directory:" === "Scegli cartella EGTB:" "Polyglot was not found in the specified folder!" === "Polyglot non stato trovato nella cartella specificata!" wgamelist.c "No game selected" === "Nessuna partita selezionata" "Can't go forward any further" === "Impossibile avanzare oltre" "Can't back up any further" === "Impossibile tornare pi indietro" "No game list" === "Nessuna lista partite" "Game List" === "Lista partite" "Game list not loaded or empty" === "Lista partite vuota o non caricata" "%s - %d/%d games" === "%s - %d/%d partite" wedittags.c "Edit Tags" === "Modifica informazioni" "Tags" === "Campi" "Error replacing tags." === "Errore nella sostituzione dei campi" wsettings.c "%s Engine Settings (%s)" === "Impostazioni %s motore di gioco (%s)" "OK" === "OK" "Cancel" === "Cancella" backend.c "bad timeControl option %s" === "Opzione timeControl non corretta: %s" "bad searchTime option %s" === "Opzione searchTime non corretta: %s" ## following to will appear in combinations like "first engine" "first" === "primo" "second" === "secondo" "protocol version %d not supported" === "Versione %d del protocollo non supportata" "Variant %s supported only in ICS mode" === "La variante %s supportata solo in modalit ICS" "Unknown variant name %s" === "Nome di variante sconosciuto: %s" "Starting chess program" === "Avvio del motore di gioco" "Could not open comm port %s" === "Apertura della porta comm %s fallita" "Could not connect to host %s, port %s" === "Connessione all'host %s, porta %s fallita" "Unknown initialMode %s" === "Valore per initialMode non riconosciuto: %s" "Can't have a match with no chess programs" === "Impossibile avviare un match senza specificare alcun motore di gioco" "Bad game file" === "File partita non riconosciuto" "Bad position file" === "File posizione non riconosciuto" "AnalyzeFile mode requires a game file" === "La modalit 'Analizza file' richiede un file partita" "Analysis mode requires a chess engine" === "La modalit Analisi richiede un motore di gioco" "Analysis mode does not work with ICS mode" === "La funzione di Analisi non disponibile in modalit ICS" "MachineWhite mode requires a chess engine" === "La modalit 'Bianco al motore di gioco' richiede almeno un motore" "MachineWhite mode does not work with ICS mode" === "La funzione 'Bianco al motore di gioco' non disponibile in modalit ICS" "MachineBlack mode requires a chess engine" === "La modalit 'Nero al motore di gioco' richiede almeno un motore" "MachineBlack mode does not work with ICS mode" === "La funzione 'Nero al motore di gioco' non disponibile in modalit ICS" "TwoMachines mode does not work with ICS mode" === "La funzione 'Motore di gioco 1 vs 2' non disponibile in modalit ICS" "TwoMachines mode requires a chess engine" === "La modalit 'Motore di gioco 1 vs 2' richiede almeno un motore di gioco" "Training mode requires a game file" === "La modalit Allenamento richiede un file partita" "Error writing to ICS" === "Errore in scrittura sull'ICS" "Error reading from keyboard" === "Errore in lettura da tastiera" "Got end of file from keyboard" === "Ricevuto carattere di Fine file (EOF) dalla tastiera" "Error writing to ICS" === "Errore in scrittura sull'ICS" "Error writing to display" === "Errore in scrittura sul display" "Error gathering move list: two headers" === "Errore nella lettura della lista mosse: sono presenti due intestazioni" "Error gathering move list: nested" === "Errore nella lettura della lista mosse: mosse annidate" "Connection closed by ICS" === "Connessione chiusa dal'ICS" "Error reading from ICS" === "Errore in lettura dall'ICS" "Failed to parse board string:\n\"%s\"" === "Lettura della descrizione posizione fallita:\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "Partita troppo lunga; incrementare il valore di MAX_MOVES e ricompilare" "Error gathering move list: extra board" === "Errore nela lettura della lista mosse: presente una posizione in pi" "Illegal move \"%s\" from ICS" === "Mossa illegale dall'ICS: \"%s\"" "Couldn't parse move \"%s\" from ICS" === "Impossibile interpretare la mossa dall'ICS: \"%s\"" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "say Errore interno; moveType malformato %d (%d,%d-%d,%d)" "You are playing Black" === "Stai giocando con il Nero" "You are playing White" === "Stai giocando con il Bianco" "It is White's turn" === "Il tratto al Bianco" "It is Black's turn" === "Il tratto al Nero" "Displayed position is not current" === "La posizione mostrata non quella corrente" "Illegal move" === "Mossa illegale" "End of game" === "Termine della partita" "Incorrect move" === "Mossa non corretta" ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === "Mossa illegale \"%s\" dal %s motore di gioco" "Illegal move \"%s\" (rejected by %s chess program)" === "Mossa illegale \"%s\" (rifiutata dal %s motore di gioco)" "Failed to start %s chess program %s on %s: %s\n" === "Avvio del %s motore di gioco %s su %s fallito: %s\n" "Error writing to %s chess program" === "Errore in scrittura sul %s motore di gioco" "Error: %s chess program (%s) exited unexpectedly" === "Errore: il %s motore di gioco (%s) terminato in maniera inaspettata" "Error reading from %s chess program (%s)" === "Errore in lettura dal %s motore di gioco (%s)" "Forfeit due to illegal move" === "Forfeit decretato per mossa illegale" "%s does not support analysis" === "%s non supporta la modalit di analisi" "Hint: %s" === "Suggerimento: %s" "Machine accepts your draw offer" === "Il motore di gioco accetta la tua offerta di patta" "Machine offers a draw\nSelect Action / Draw to agree" === "Il motore di gioco offre la patta\nPer accettare seleziona il men Azioni / Offri Patta" "%s (only move)" === "%s (unica mossa)" "Ambiguous move in ICS output: \"%s\"" === "Mossa ambigua nell'output dell'ICS: \"%s\"" "Illegal move in ICS output: \"%s\"" === "Mossa illegale nell'output dell'ICS: \"%s\"" "Gap in move list" === "Mosse mancanti nella lista mosse" "Game too long; increase MAX_MOVES and recompile" === "Partita troppo lunga; incrementare il valore di MAX_MOVES e ricompilare" "Variant %s not supported by %s" === "La variante %s non supportata da %s" "Startup failure on '%s'" === "Avvio di '%s' fallito" "Waiting for first chess program" === "In attesa del primo motore di gioco" "Waiting for second chess program" === "In attesa del secondo motore di gioco" "Match %s vs. %s: final score %d-%d-%d" === "Match %s vs %s: punteggio finale %d-%d-%d" "Stalemate" === "Stallo" "Illegal move: %d.%s%s" === "Mossa illegale: %d.%s%s" "Ambiguous move: %d.%s%s" === "Mossa ambigua: %d.%s%s" "Can't open \"%s\"" === "Impossibile aprire \"%s\"" "Cannot build game list" === "Impossibile costruire la lista partite" "No more games in this message" === "In questo messaggio non sono presenti altre partite" "No game has been loaded yet" === "Non ancora stata caricata nessuna partita" "Can't back up any further" === "Impossibile risalire oltre" "Game number out of range" === "Indice superiore al numero di partite" "Can't seek on game file" === "Impossibile effettuare la ricerca nel file di partita" "Game not found in file" === "Partita non trovata nel file" "Bad FEN position in file" === "Stringa FEN di posizione scorretta nel file" "No moves in game" === "Partita senza mosse" "No position has been loaded yet" === "Non ancora stata caricata nessuna posizione" "Can't back up any further" === "Impossibile risalire oltre" "Can't open \"%s\"" === "Impossibile aprire \"%s\"" "Can't seek on position file" === "Impossibile effettuare la ricerca nel file di posizione" "Position not found in file" === "Posizione non trovata nel file" "Bad FEN position in file" === "Stringa FEN di posizione scorretta nel file" "Black to play" === "Il tratto al Nero" "White to play" === "Il tratto al Bianco" "Can't open \"%s\"" === "Impossibile aprire \"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === "La lista mosse stata modificata.\nUtilizzare 'Riapri partita corrente' e ripetere la mossa" "You have entered too many moves.\nBack up to the correct position and try again." === "Sono state immesse troppe mosse.\nRitornare alla posizione corretta e riprovare." "Displayed position is not current.\nStep forward to the correct position and try again." === "La posizione mostrata non quella corrente.\nAvanzare fino alla posizione corretta e riprovare." "You have not made a move yet" === "Non hai ancora fatto alcuna mossa" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "Il messaggio cmail non stato caricato.\Utilizzare 'Ricarica Messaggio CMail e reimmettere la mossa." "No unfinished games" === "Non presente nessuna partita non terminata" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "E' gi stata postata una mossa.\nAttendere sino a quando non viene inviata una mossa dall'avversario.\nPer reinviare la stessa mossa, digitare\n\"cmail -remail -game %s\"\nsulla riga di comando." "Failed to invoke cmail" === "Impossibile aprire l'applicazione cmail" "Waiting for reply from opponent\n" === "In attesa di risposta dall'avversario\n" "Still need to make move for game\n" === "Occorre ancora eseguire la mossa per la partita\n" "Still need to make moves for both games\n" === "Occorre ancora eseguire mosse per entrambe le partite\n" "Still need to make moves for all %d games\n" === "Occorre ancora eseguire mosse per tutte le %d partite\n" "Still need to make a move for game %s\n" === "Occorre ancora eseguire una mossa per la partita %s\n" "No unfinished games\n" === "Non presente nessuna partita non terminata" "Ready to send mail\n" === "Pronto all'invio della posta\n" "Still need to make moves for games %s\n" === "Occorre ancora eseguire mosse per le partite %s\n" "Edit comment" === "Modifica commento" "Edit comment on %d.%s%s" === "Modifica commento a %d.%s%s" ##"Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "Comenzando modo de anlisis...\nSi este mensaje permanece, su programa de ajedrez no admite anlisis." "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "Avvio della modalit di analisi...\nSe questo messaggio rimane visibile, il motore di gioco non supporta la modalit di analisi." "It is not White's turn" === "Il tratto non al Bianco" "It is not Black's turn" === "Il tratto non al Nero" "Wait until your turn,\nor select Move Now" === "Attendi il tuo turno,\noppure seleziona 'Muovi subito'" "Starting second chess program" === "Avvio del secondo motore di gioco" "Training mode off" === "Modalit Allenamento disattivata" "Training mode on" === "Modalit Allenamento attivata" "Already at end of game" === "Gi alla fine della partita" "Warning: You are still playing a game" === "Avviso: Stai ancora giocando una partita" "Warning: You are still observing a game" === "Avviso: Stai ancora osservando una partita" "Warning: You are still examining a game" === "Avviso: Stai ancora esaminando una partita" "It is Black's turn" === "Il tratto al Nero" "It is White's turn" === "Il tratto al Bianco" "That square is occupied" === "La casa gi occupata" "There is no pending offer on this move" === "Non vi alcuna offerta pendente a questa mossa" "Your opponent is not out of time" === "Il tuo avversario non ha ancora esaurito il proprio tempo" "Black offers a draw" === "Il Nero offre la patta" "White offers a draw" === "Il Bianco ofre la patta" "You must make your move before offering a draw" === "Devi eseguire la tua mossa prima di offrire la patta" "You are not examining a game" === "Non stai esaminando alcuna partita" "You can't revert while pausing" === "Non possibile ripristinare mentre la pausa attiva" "Wait until your turn,\nor select Move Now" === "Attendi il tuo turno,\noppure seleziona 'Muovi subito'" "It is your turn" === "E' il tuo turno" "Wait until your turn" === "Attendi il tuo turno" "No hint available" === "Nessun suggerimento disponibile" "Analysis (%s)" === "Analisi (%s)" "Comment" === "Commento" "Comment on %d.%s%s" === "Commento a %d.%s%s" "Both flags fell" === "Tempo esaurito per entrambi" "White's flag fell" === "Tempo esaurito per il Bianco" "Black's fell" === "Tempo esaurito per il Nero" "Bad FEN position in clipboard" === "Stringa FEN di posizione scorretta negli Appunti" "No response from ICS" === "Nessuna risposta dall'ICS" "You cannot do this while you are playing or observing" === "Questa operazione non pu essere eseguita mentre si sta giocando o osservando una partita" "Click in holdings to choose piece" === "Cliccare sui pezzi 'in mano' per sceglierne uno" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === "Partita abortita" "White wins on time" === "Il Bianco vince sul tempo" "Black wins on time" === "Il Nero vince sul tempo" "Both players ran out of time" === "Tempo esaurito per entrambi i giocatori" "White resigns" === "Il Bianco abbandona" "Black resigns" === "Il Nero abbandona" "White mates" === "Il Bianco matta" "Black mates" === "Il Nero matta" "Draw" === "Patta" "Draw agreed" === "Patta concordata" "Xboard adjudication: King destroyed" === "Aggiudicazione di Xboard: Re distrutto" "Xboard adjudication: Bare king" === "Aggiudicazione di Xboard: Resta solo il re" "Xboard adjudication: 3rd check" === "Aggiudicazione di Xboard: Terzo scacco" "Xboard adjudication: Stalemate" === "Aggiudicazione di Xboard: Stallo" "Xboard adjudication: Checkmate" === "Aggiudicazione di Xboard: Scacco matto" "Xboard adjudication: Insufficient mating material" === "Aggiudicazione di Xboard: Materiale insufficiente" "Xboard adjudication: Trivial draw" === "Aggiudicazione di Xboard: Patta triviale" "XBoard adjudication: repetition draw" === "Aggiudicazione di Xboard: Patta per ripetizione" "Xboard adjudication: perpetual checking" === "Aggiudicazione di Xboard: Scacco perpetuo" "Xboard adjudication: perpetual chasing" === "Aggiudicazione di Xboard: Minaccia perpetua" "%Xboard adjudication: perpetual chasing of" === "Aggiudicazione di Xboard: Minaccia perpetua" "Xboard adjudication: 50-move rule" === "Aggiudicazione di Xboard: Regola delle 50 mosse" "Draw claim: 50-move rule" === "Patta dichiarata: Regola delle 50 mosse" "Draw claim: 3-fold repetition" === "Patta dichiarata: Terza ripetizione" "Draw claim: insufficient mating material" === "Patta dichiarata: Materiale insufficiente" "Xboard adjudication: long game" === "Aggiudicazione di Xboard: Partita lunga" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "Xboard: Forfeit decretato per mossa non valida: %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "Xboard: Forfeit decretato per mossa illegale: %s (%c%c%c%c)%c" "Xboard adjudication" === "Aggiudicazione di Xboard" "User adjudication" === "Aggiudicazione dell'utente" "False win claim: '%s'" === "Falsa dichiarazione di vittoria: '%s'" "False draw claim: '%s'" === "Falsa dichiarazione di patta: '%s'" "xboard exit" === "Chiusura di Xboard" xboard-4.7.3/winboard/language/chinese(simp).lng0000644000175000001440000010033512262415351016446 00000000000000winboard.rc " " === "Translation by Morning Yellow && Liuzy" MENUS "&New Game\tCtrl-N" === "(&N)\tCtrl-N" "New Sh&uffle Game..." === "ϴϷ(&u)..." "New &Variant...\tAlt+Shift+V" === "±(&V)...\tAlt+Shift+V" "&Load Game...\tCtrl-O" === "(&L)...\tCtrl-O" "Load &Next Game\tAlt+PgDn" === "һ(&N)\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "һ(&P)\tAlt+PgUp" "&Reload Same Game" === "ͬһ(&R)" "&Save Game...\tCtrl-S" === "(&S)...\tCtrl-S" "&Copy Game To Clipboard\tCtrl+C" === "ֵ(&C)\tCtrl+C" "&Paste Game From Clipboard\tCtrl+V" === "ճԼ(&P)\tCtrl+V" "Copy Game List to Clipboard" === "Ϸб" "L&oad Position...\tCtrl+Shift+O" === "(&O)...\tCtrl+Shift+O" "Load N&ext Position\tAlt+Shift+PgDn" === "һ(&E)\tAlt+Shift+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "һ(&V)\tAlt+Shift+PgUp" "Reload Sa&me Position" === "ͬһ(&M)" "S&ave Position...\tCtrl+Shift+S" === "(&A)...\tCtrl+Shift+S" "Save as &Diagram..." === "ͼ...(&D)" "C&opy Position To Clipboard\tCtrl+Shift+C" === "ƾ浽(&Y)\tCtrl+Shift+C" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Ӽճ(&T)\tCtrl+Shift+V" "E&xit" === "˳(&X)" "&Quit" === "˳(&Q)" "&Edit Game\tCtrl+E" === "༭(&E)\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "༭(&d)\tCtrl+Shift+E" "&Tags" === "༭ǩ(&T)" "&Comments" === "༭ע(&C)..." "&Game List Tags..." === "Ϸб..." "Machine &White\tCtrl+W" === "ִ(&W)\tCtrl+W" "Machine &Black\tCtrl+B" === "ִ(&B)\tCtrl+B" "&Two Machines\tCtrl+T" === "Զ(&M)\tCtrl+T" "Machine Both" === "ִ׺ͺ" "&Machine Match" === "(&M)" "&Analysis Mode\tCtrl+A" === "ģʽ(&A)\tCtrl+A" "Analyze &File\tCtrl+F" === "ļ(&F)\tCtrl+F" "&ICS Client" === "&ICSͻ" "Edit &Game\tCtrl+E" === "༭(&G)\tCtrl+E" "&Edit Position\tShift+Ctrl+E" === "༭(&E)\tShift+Ctrl+E" "Trai&ning" === "ѵ(&N)" "Engine &Output\tAlt+Shift+O" === "ʾ\tAlt+Shift+O" "Evaluation &Graph\tAlt+Shift+E" === "ʾͼ\tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "ʾб(&L)\tAlt+Shift+G" "Move &History\tAlt+Shift+H" === "ʾŷ\tAlt+Shift+H" "Open &New Chat Window" === "촰" "Edit Ta&gs..." === "༭ǩ(&T)" "Edit Co&mment..." === "༭ע(&C)..." "Enter &Username..." === "û(&U)" "&Pause\tPause" === "ͣ(&P)\tPause" "&Accept\tF3" === "(&A)\tF3" "D&ecline\tF4" === "ܾ(&C)\tF4" "Re&match\tF12" === "(&M)\tF12" "Call &Flag\tF5" === "ʱи(&F)\tF5" "&Draw\tF6" === "(&D)\tF6" "Ad&journ\tF7" === "(&J)\tF7" "A&bort\tF8" === "ֹ(&B)\tF8" "&Resign\tF9" === "(&R)\tF9" "Stop &Observing\tF10" === "ֹͣԹ(&O)\tF10" "Stop E&xamining\tF11" === "ֹͣо(&X)\tF11" "&Upload to Examine" === "ϴ(&U)" "Adjudicate to &White" === "þӮ (&W)" "Adjudicate to &Black" === "þӮ (&B)" "Adjudicate &Draw" === "ٲ(&D)" "Type In &Move...\tAlt+I" === "ŷ(&Y)...\tAlt+I" "&Backward\tAlt+Left" === "һ(&B)\tAlt+Left" "&Forward\tAlt+Right" === "һ(&F)\tAlt+Right" "Back to &Start\tAlt+Home" === "ʼ(&S)\tAlt+Home" "For&ward to End\tAlt+End" === "(&E)\tAlt+End" "&Revert\tHome" === "ָ(&V)" "&Annotate" === "ע(&A)" "&Truncate Game\tEnd" === "ضϺŷ(&T)" "&Move Now\tCtrl+M" === "(&M)\tCtrl+M" "&Retract Move\tCtrl+X" === "(&R)\tCtrl+X" "Flip &View\tF2" === "ת(&V)\tF2" "&Swap Clocks" === "ӱ(&C)" "&Mute all Sounds" === "(&M)" "&General..." === "ѡ(&G)..." "&Board..." === "ѡ(&B)..." "Ad&judications...\tAlt+Shift+J" === "о(&j)...\tAlt+Shift+J" "Common &Engine...\tAlt+Shift+U" === "ͨ(&E)...\tAlt+Shift+U" "Engine #&1 Settings..." === " #1 " "Engine #&2 Settings..." === " #2 " "&ICS..." === "&ICSѡ..." "&Fonts..." === "ѡ(&F)..." "Soun&ds..." === "ѡ(&D)..." "G&ame List..." === "Ϸб..." "Comm&unications..." === "ͨѶ˿(&U)..." "&Load Game...\tAlt+Shift+L" === "ѡ(&L)...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "ѡ(&S)...\tAlt+Shift+S" "&Time Control...\tAlt+Shift+T" === "ʱ(&T)...\tAlt+Shift+T" "Save Settings &Now" === "(&N)" "Save Settings on E&xit" === "˳ʱ(&X)" "Help &Contents\tF1" === "(&C)\tF1" "Help &Index" === "(&I)" "How to &Use Help" === "ʹð(&U)" "&Hint..." === "ʾ(&H)..." "&Book..." === "ֿ(&B)..." "&About WinBoard" === "WinBoard(&A)" "White" === "׷" "Promote" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "King" === "" "Archbishop" === "ʦ" "Chancellor" === "" "Elephant" === "" "Cannon" === "" "Empty Square" === "ո" "Black" === "ڷ" "Demote" === "" "Clear Board " === "" "Drop" === "ȡ" "Cop&y and Paste" === "Ʋճ(&Y)" "&Copy" === "(&C)" "&Paste" === "ճ(&P)" "&Undo" === "(&U)" "Cu&t" === "(&T)" "&Copy" === "(&C)" "&Paste" === "ճ(&P)" "Select &All" === "ȫѡ(&A)" DIALOGS "&Animate Moving Ctrl+Shift+A" === "(&A) Ctrl+Shift+A" "&Auto Comment" === "Զע(&A)" "&Average" === "54" "&Big" === "87" "&Bishop" === "(&B)" "&Black first move" === "ڷ(&B)" "&Blindfold" === "ä(&B)" "&Bold" === "Ӵ(&B)" "&Cancel" === "ȡ(&C)" "&Choose Background Color..." === "ѡ񱳾ɫ(&C)..." "&Choose Color..." === "ѡɫ(&C)..." "&Clear" === "(&C)" "&Close" === "ر(&C)" "&Colossal" === "116" "&Default ICS Colors" === "ĬICSɫ(&D)" "&Dinky" === "29" "&Directories:" === "Ŀ¼(&D)" "&Edit" === "༭(&E)" "&Edit" === "༭(&E)" "&Get Move List" === "ȡŷб(&G)" "&Giant" === "108" "&Help" === "(&H)" "Highlight Dra&gging" === "קĿʾ(&H)" "&Huge" === "95" "&Index number:" === "(&I)" "&Italic" === "б(&I)" "&King" === "(&K)" "&Large" === "80" "&Load" === "(&L)" "&Local Line Editing" === "б༭(&L)" "&Middling" === "49" "&Next" === "һ(&N)" "&Petite" === "33" "&Popup Exit Message" === "˳ʱʾ(&P)" "&Port:" === "˿(&P)" "&Premove" === "Ԥ(&P)" "&Prev" === "һ(&P)" "&Queen" === "(&Q)" "&Quiet Play" === "(&Q)" "&Revert to Defaults" === "ָĬ趨(&R)" "&Rook" === "(&R)" "&Show Thinking" === "ʾ˼ϸ(&S)" "&Small" === "40" "&Sound alarm at" === "(&S)" "&Stop Bits:" === "ֹͣλ(&S)" "&Strikeout" === "ɾ(&S)" "&Tiny" === "21" "&Underline" === "»(&U)" "&White first move" === "׷(&W)" "&Additional options" === "ѡ(&A)" "Always &Queen Ctrl+Shift+Q" === "Ϊ(&Q) Ctrl+Shift+Q" "Always on &Top" === "ǰ(&T)" "Animate &Dragging" === "ק(&D)" "Auto &Flag Ctrl+Shift+F" === "Զʱи(&F) Ctrl+Shift+F" "Auto &Observe" === "ԶԹ(&O)" "Auto &Raise Board" === "Զı̴С(&R)" "Auto Flip &View" === "Զת(&V)" "Black Pieces" === "" "Browse..." === "..." "Built-in sound:" === "ڽ" "Bul&ky" === "72" "Cancel" === "ȡ" "Chessboard for Windows" === "Windowsµĵӹ" "Choose..." === "ѡ..." "Clocks" === "ʱ" "Comments" === "ע" "Conventional chess clock" === "ʱ" "Coordinates" === "" "Copyright 1991 Digital Equipment Corporation" === "Copyright 1991 Digital Equipment Corporation" "Dark Squares" === "ڸ" "Data &Bits:" === "λ(&B)" "Data &Rate:" === "(&R)" "Default beep" === "Ĭ" "Defaults" === "Ĭ" "Do ¬ colorize messages" === "ҪϢɫ(&N)" "Dri&ves:" === "(&V)" "Enter" === "" "Event:" === "¼" "F&low:" === "(&L)" "File &Name:" === "ļ(&N)" "Help" === "" "Highlight Last &Move" === "Ŀʾһŷ(&M)" "ICS Interaction" === "ICS" "Incremental clock" === "ʱ" "Inde&x number:" === "(&X)" "Just &view or edit game files" === "ֻۿ༭(&v)" "K&night" === "(&N)" "Light Squares" === "׸" "List Files of &Type:" === "ļ(&T)" "Load games with automatic stepping" === "Զ" "Medi&ocre" === "45" "Medi&um" === "64" "Messages" === "Ϣ" "Mode&rate" === "58" "Monochrome" === "ڰ" "Net&work..." === "(&W)..." "No sound" === "" "OK" === "ȷ" "Old" === "ɸʽ" "P&arity:" === "У(&A)" "PGN" === "PGNʽ" "Periodic &Updates" === "ڸ(&U)" "Play" === "" "Ponder &Next Move Ctrl+Shift+P" === "ͬ˼(&N) Ctrl+Shift+P" "Popup Move &Errors" === "ʾŷ(&E)" "Premove Highlights" === "Ԥ" "Promote pawn to:" === "Ϊ" "Prompt for filename" === "ʾļ" "Save As: " === "" "Save games automatically" === "Զ" "Show &Coordinates" === "ʾ(&C)" "Show Butt&on Bar" === "ʾť(&O)" "Sl&im" === "37" "Sorry Charlie" === "Բ𣬸" "Square Highlights" === "ӱ" "T&eeny" === "25" "Tags" === "ǩ" "Test &Legality Ctrl+Shift+L" === "ŷ(&L) Cl+Sh+L" "Tita&nic" === "129" "To file:" === "ļ" "Use an Internet Chess Server" === "¼Ϲ" "WAV file:" === "WAVļ" "White Pieces" === "" "WinBoard 0.0.0" === "WinBoard 0.0.0" "galactic" === "galactic" "minutes initially," === "ʼʱ" "minutes" === "" "moves in" === "" "plus" === "" "seconds per move" === "ÿһ" "seconds per move" === "һ" "seconds" === "" "Save As:" === "" "What would you like to do?" === "ʹã" "Interaction Colors" === "ɫ" "Premove" === "Ԥ" "Alarm" === "ʾ" "Colors" === "ɫ" "Size" === "С" "Current Board Size" === "ǰ̴С" "All Board Sizes" === "̴С" "Number of moves:" === "" "Within number of minutes:" === "" "Initial number of minutes:" === "ʼʱ" "Plus number of seconds per move:" === "ÿһ" "Ponder Next Move" === "ͬ˼(&N)" "Enable and Show Thinking (recommended)" === "ʾ˼ϸ" "Periodic Updates (for Analysis Mode)" === "ڸ(ģʽ)" "Game List Options" === "бѡ" "PGN &Tags:" === "PGNǩ(&T)" "Default" === "Ĭ" "Sounds" === "" "&Event:" === "¼(&E)" "&No sound" === "(&N)" "&Default beep" === "Ĭ(&D)" "&Built-in sound:" === "ڽ(&B)" "&WAV file:" === "&WAVļ" "B&rowse..." === "...(&B)" "&Play" === "(&P)" "&Defaults" === "Ĭ(&D)" "I C S Interaction" === "I C S " "About WinBoard" === "WinBoard" "Time Control" === "ʱ" "Load Game Options" === "ѡ" "Save Game Options" === "ѡ" "Open" === "" "Communication Port Settings" === "ͨѶ˿" "Edit Comment" === "༭ע" "Promotion" === "" "Game List" === "б" "Edit Tags" === "༭ǩ" "ICS Interaction" === "ICS" "Dialog" === "Ի" "Error" === "" "ICS Interaction Colors" === "ICSɫ" "Question" === "ʾ" "WinBoard Startup" === "WinBoard" "Type in a move" === "ŷ" "General Options" === "ѡ" "ICS Options" === "ICS" "Board Options" === "ѡ" "Fonts" === "" NEW "&Up" === "" "&Down" === "" "Filter" === "" "All White" === "ȫɫ" "Flip Black" === "תɫ" "Specify Chess &Engines:" === "ָ(&E)" "Specify Chess &Server:" === "ָ(&S)" "New Shuffle Game..." === "ϴϷ..." "New Variant...\tAlt+Shift+V" === "±...\tAlt+Shift+V" "Copy Game List to Clipboard" === "Ϸб" "Save &Diagram..." === "ͼ...(&D)" "Machine Both" === "ִ׺ͺ" "Machine Matc&h" === "(&h)" "Show Engine &Output\tAlt+Shift+O" === "ʾ\tAlt+Shift+O" "Show Evaluation Graph\tAlt+Shift+E" === "ʾͼ\tAlt+Shift+E" "Show Move History\tAlt+Shift+H" === "ʾŷ\tAlt+Shift+H" "Open Chat Window" === "촰" "Enter &Username..." === "û(&U)" "&Upload to Examine" === "ϴ(&U)" "Adjudicate to &White" === "þӮ (&W)" "Adjudicate to &Black" === "þӮ (&B)" "Adjudicate &Draw" === "ٲ(&D)" "&Annotate" === "ע(&A)" "&Truncate Game" === "ض(&T)" "Swap &Clocks" === "ӱ(&C)" "&Mute all Sounds" === "(&M)" "Adjudications...\tAlt+Shift+J" === "о...\tAlt+Shift+J" "Common Engine...\tAlt+Shift+U" === "ͨ...\tAlt+Shift+U" "Engine #1 Settings..." === " #1 " "Engine #2 Settings..." === " #2 " "Game List..." === "Ϸб..." "Promote" === "" "Archbishop" === "ʦ" "Chancellor" === "" "Elephant" === "" "Cannon" === "" "Demote" === "" "Lance" === "㳵" "Silver" === "" "Gold" === "" "Fixed time per move" === "̶ʱ" "Maximum seconds per move:" === "ʱ()" "Time-Odds Factors:" === "ʱ䱶" "Engine #1:" === " #1" "Engine #2:" === " #2" "Save out of book info in PGN" === "PGNбϢ" "&Send Engine Think" === "˼(&S)" "E&xtended PGN Info Ctrl+Shift+X" === "չPGNϢ Ctrl+Shift+X" "&Hide Thinking Ctrl+Shift+H" === "˼ Ctrl+Shift+H" "&Info in Move History Ctrl+Shift+I" === "ŷбʾϢ Cl+Sh+I" "Highlight with Arro&w" === "üͷͻƶ" "Displa&y Logos" === "ʾ־(&y)" "&Auto Kibitz" === "Զ\"kibitz\"(&A)" "See&k Graph" === "ѡͼ(&k)" "auto-&Refresh" === "Զˢͼ(&R)" "Bckgnd Obser&ve" === "̨۲(&v)" "&Dual Board" === "˫(&D)" "One-Click &Move" === "ƶ(&M)" "Background..." === "..." "&Defaults..." === "ȱʡ(&D)" "Startup &Chat Boxes:" === "(&C)" "General" === "" " YES" === "" " NO" === "" "Move History, Engine Output" === "ʷϵĶ,ķ" "New Shuffle Game" === "ϴϷ" "&Start Position Number:" === "λú(&S)" "Random" === "" "Move History" === "ŷ" "Evaluation Graph" === "ͼ" "Engine output" === "" "Engine #1" === " #1" "NPS" === "NPS" "Engine #2" === " #2" "Chat Window" === "촰" "Chat partner:" === "" "Clear" === "" "Send" === "" "Adjudications" === "о" "Hide Thinking when Playing against Human" === "˶ʱ˼ϸ" "Adjudications in non-ICS games" === "оICSϷ" "Adjudicate draw after:" === "źо" "moves" === "ŷ" "Win/loss adjudication threshold:" === "/Ӯоֵ" "centipawns" === "ٷ֮һ" "&Verify Engine Claims" === "֤(&V)" "Detect &Mates" === "⽫ɱ(&M)" "Draw if &Insufficient Material" === "ʱк(&I)" "Adjudicate &Trivial Draws" === "һо(&T)" "Apply" === "Ӧ" "-move rule" === "" "-fold repeats" === "ظ" "Engine #1 Score is Absolute" === " #1 ǾԷ" "Engine #2 Score is Absolute" === " #2 ǾԷ" "Common Engine Settings" === "ͨ" "Polyglot Directory:" === " Polyglot Ŀ¼" "Hash Size (MB):" === "Hash С(MB)" "EGTB Path:" === "EGTB ·" "EGTB Size (MB):" === "EGTB С(MB)" "Use Book:" === "ʹÿ" "Max nr of CPUs:" === "CPU" "First has Own Book" === "1ÿ" "Second has Own Book" === "2ÿ" "Book Depth:" === "ŷ" "Book Variation:" === "" "Default Match Games:" === "ȱʡԾ" "Variants" === "" "Variant" === "" "Board size:" === "̴С" "ranks" === "" "files" === "" "Holdings with room for:" === "ӵеĿ" "('-1' means defaults for selected variant)" === "-1ʾȱʡ" "Type In Your Name" === "Je Naam, Sufferd!" "&Play against a chess engine or match two engines" === "˻ĻԶ(&P)" "&Use an Internet Chess Server" === "¼Ϲ(&U)" winboard.c "&File" === "ļ(&F)" "&Mode" === "ģʽ(&M)" "&Action" === "Ϊ(&A)" "&Step" === "ŷ(&S)" "&Options" === "ѡ(&O)" "&Help" === "(&H)" "&View" === "(&V)" "E&ngine" === "(&N)" "Font name too long:" === "̫" "Font point size missing:" === "ûС" "Can't parse color name %s" === "޷ʶɫ %s" "Unrecognized board size value" === "޷ʶ̴С" "Unrecognized argument" === "޷ʶIJ" "No value provided for argument" === "ûֵṩ" "Incomplete \\ escape in value for" === "жϵֵ" "Failed to open indirection file" === "޷򿪼ļ" "Unrecognized boolean argument value" === "޷ʶ߼ֵ" "Unrecognized argument" === "޷ʶIJ" "Too many colors" === "ɫ̫" "&Minimize\tCtrl+F4" === "С(&M)\tCtrl+F4" "White: %s" === "׷ %s" "We only care about the height here" === "ֻע߶" "Cannot build game list" === "޷б" "Load Game from File" === "ļ" "Load Position from File" === "ļ" "Save Game to File" === "ֵļ" "Save Position to File" === "浽ļ" "%s does not support analysis" === "%s ַ֧" "Analyze Game from File" === "ļ" "Unable to activate help" === "޷򿪰" "Send to chess program:" === "͸һ" "Send to second chess program:" === "͸ڶ" "Direct Command" === "ֱ" "Error loading sound %s" === " %s " "Error playing sound %s" === " %s " "File open failed" === "޷ļ" "Internal error in file dialog box" === "ļԻڲ" "Option Error" === "ѡ" "Choose an option, or cancel to exit" === "ѡһѡ߰ȡť˳" "Unable to activate help" === "޷򿪰" "Displayed move is not current" === "ʾŷǵǰŷ" "Could not parse move" === "޷ŷ" "%s:\nError code %d" === "%s:\n %d" "Error" === "" "Fatal Error" === "ش" "Exiting" === "˳" "%s:\nError code %d" === "%s:\n %d" "ʾϢ" === "ʾϢ" "Note" === "ע" "Error writing to chess program" === "Ϣʱ" "User" === "û" "Unknown" === "δ֪" "White" === "׷" "Black" === "ڷ" "Save Game to File" === "ֵļ" "Not implemented" === "δʵ" "Shout Text" === "" "SShout/CShout" === "" "Channel 1 Text" === "ƵI" "Channel Text" === "Ƶ" "Kibitz Text" === "" "Tell Text" === "˵" "Challenge Text" === "ս" "Request Text" === "" "Seek Text" === "" "Normal Text" === "" "None" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "Information" === "" wclipbrd.c "Unable to convert position to FEN." === "޷ѾתΪFEN" "Unable to copy FEN to clipboard." === "޷FEN" "Cannot create temporary file name." === "޷ʱļ" "Cannot open temporary file." === "޷ʱļ" "Cannot write to temporary file." === "޷дʱļ" "Cannot reopen temporary file." === "޷ٴδʱļ" "Cannot determine size of file." === "޷ȷļС" "Cannot determine size of file." === "޷ȷļС" "Cannot allocate clipboard buffer." === "޷Ļ" "Cannot read from temporary file." === "޷ʱļ" "Error reading from temporary file." === "ʱļʱ" "Cannot copy text to clipboard" === "޷ֵ" "Unable to allocate memory for clipboard." === "޷Ϊ洢ռ" "Unable to lock clipboard memory." === "޷Ĵ洢ռ" "Cannot unlock clipboard memory." === "޷ΪĴ洢ռ" "Cannot open clipboard." === "޷򿪼" "Cannot empty clipboard." === "޷ռ" "Cannot copy text to clipboard." === "޷ֵ" "Cannot close clipboard." === "޷رռ" "Unable to paste FEN from clipboard." === "޷ӼճFEN" "Unable to create temporary file." === "޷ʱļ" "Error writing to temporary file." === "дʱļʱ" "Unable to open clipboard." === "޷򿪼" "No text in clipboard." === "û" "Unable to lock clipboard memory." === "޷Ĵ洢ռ" "Unable to allocate memory for text string." === "޷Ϊַ洢ռ" "Unable to unlock clipboard memory." === "޷ԼĴ洢ռ" "Unable to close clipboard." === "޷رռ" woptions.c "Variant %s not supported by %s" === " %s %s ֧" "Warning: second engine (%s) does not support this!" === ": ڶ(%s) ִ֧!" "Invalid ICS Alarm Time" === "ICSǷ" "Invalid max time per move" === "ʱǷ" "Invalid time-odds factor" === "ʱ䱶Ƿ" "Choose Folder" === "ѡĿ¼" "Choose Book" === "ѡÿ" "Choose Polyglot Directory" === "ѡ Polyglot Ŀ¼" "Choose EGTB Directory:" === "ѡ EGTB Ŀ¼" "Polyglot was not found in the specified folder!" === "ѡĿ¼δ Polyglot " wgamelist.c "No game selected" === "ûѡ" "Can't go forward any further" === "޷ǰ" "Can't back up any further" === "޷ٺ" "No game list" === "ûб" "Game List" === "б" "Game list not loaded or empty" === "" "%s - %d/%d games" === "%s - %d/%d " "Game list not loaded or empty" === "бδػΪ" wedittags.c "Edit Tags" === "༭ǩ" "Tags" === "ǩ" "Error replacing tags." === "滻ǩ" wsettings.c "%s Engine Settings (%s)" === "%s (%s)" "OK" === "ȷ" "Cancel" === "ȡ" backend.c "bad timeControl option %s" === "Ƿ\"timeControl\"(ʱ)ѡ %s" "bad searchTime option %s" === "Ƿ\"searchTime\"(ʱ)ѡ %s" "first" === "һ" "second" === "ڶ" "protocol version %d not supported" === "Э汾 %d ֧" "Variant %s supported only in ICS mode" === " %s ֻICSģʽ֧" "Unknown variant name %s" === "δ֪ı %s" "Starting chess program" === "" "Could not open comm port %s" === "޷ͨѶ˿ %s" "Could not connect to host %s, port %s" === "޷ %s ˿ %s" "Unknown initialMode %s" === "δ֪\"initialMode\"(ʼģʽ)ѡ %s" "Can't have a match with no chess programs" === "ûʱ޷б" "Bad game file" === "ļ" "Bad position file" === "ļ" "AnalyzeFile mode requires a game file" === "\"AnalyzeFile\"(ļ)ģʽָһļ" "Analysis mode requires a chess engine" === "\"Analysis\"()ģʽ" "Analysis mode does not work with ICS mode" === "\"Analysis\"()ģʽ޷ICSģʽ¹" "MachineWhite mode requires a chess engine" === "\"MachineWhite\"(ִ)ģʽ" "MachineWhite mode does not work with ICS mode" === "\"MachineWhite\"(ִ)ģʽ޷ICSģʽ" "MachineBlack mode requires a chess engine" === "\"MachineBlack\"(ִ)ģʽ" "MachineBlack mode does not work with ICS mode" === "\"MachineBlack\"(ִ)ģʽ޷ICSģʽ" "TwoMachines mode does not work with ICS mode" === "\"TwoMachines\"(Զ)ģʽ޷ICSģʽ" "TwoMachines mode requires a chess engine" === "\"TwoMachines\"()ģʽ" "Training mode requires a game file" === "\"Training\"(ѵ)ģʽָһļ" "Error writing to ICS" === "ϢICSʱ" "Error reading from keyboard" === "ȡʱ" "Got end of file from keyboard" === "ȡʱļβ" "Error writing to ICS" === "ϢICSʱ" "Error writing to display" === "Ϣʾʱ" "Error gathering move list: two headers" === "ȡŷʱͷ" "Error gathering move list: nested" === "ȡŷʱǶ״" "Connection closed by ICS" === "ӱICSر" "Error reading from ICS" === "ȡICSϢʱ" "Failed to parse board string:\n\"%s\"" === "޷ַ\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "̫Ҫ\"MAX_MOVES\"±" "Error gathering move list: extra board" === "ȡŷʱ" "Illegal move \"%s\" from ICS" === "ICSŷ\"%s\"" "Couldn't parse move \"%s\" from ICS" === "޷ICSŷ\"%s\"" "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "say ڲ󣬷Ƿ\"moveType\"(ŷ) %d (%d,%d-%d,%d)" "You are playing Black" === "ִ" "You are playing White" === "ִ" "It is White's turn" === "ֵ׷" "It is Black's turn" === "ֵڷ" "Displayed position is not current" === "ʾľ治ǵǰ" "Illegal move" === "ŷ" "End of game" === "ֽ" "Incorrect move" === "ŷ" "Illegal move \"%s\" from %s machine" === "%sŷ\"%s\"" "Forfeit due to illegal move" === "߲ŷ" "%s does not support analysis" === "%s ַ֧" "Illegal move \"%s\" (rejected by %s chess program)" === "ŷ\"%s\" (%sܾܸŷ)" "Failed to start %s chess program %s on %s: %s\n" === "޷%s %s( %s )%s\n" "Hint: %s" === "ʾ %s" "White resigns" === "׷" "Black resigns" === "ڷ" "White mates" === "׷ɱ" "Black mates" === "ڷɱ" "Draw" === "" "Draw agreed" === "Э̺" "Machine accepts your draw offer" === "..." "Machine offers a draw\nSelect Action / Draw to agree" === "\nѡǷ" "%s (only move)" === "%s (Ψһŷ)" "Ambiguous move in ICS output: \"%s\"" === "ICSȷŷ\"%s\"" "Illegal move in ICS output: \"%s\"" === "ICSȷŷ\"%s\"" "Gap in move list" === "ŷϿ" "Game too long; increase MAX_MOVES and recompile" === "̫Ҫ\"MAX_MOVES\"±" "Variant %s not supported by %s" === " %s %s ֧" "Startup failure on '%s'" === "޷'%s'" "Waiting for first chess program" === "ȴһ" "Waiting for second chess program" === "ȴڶ" "Match %s vs. %s: final score %d-%d-%d" === " %s vs. %s: ձȷ %d-%d-%d" "Stalemate" === "ƺ" "Illegal move: %d.%s%s" === "ŷ %d.%s%s" "Ambiguous move: %d.%s%s" === "ȷŷ %d.%s%s" "Can't open \"%s\"" === "޷\"%s\"" "Cannot build game list" === "޷б" "No more games in this message" === "Ϣ" "No game has been loaded yet" === "δ" "Can't back up any further" === "޷ٺ" "Game number out of range" === "Χ" "Can't seek on game file" === "޷ļ" "Game not found in file" === "ļûҵ" "Bad FEN position in file" === "ļеFEN" "No moves in game" === "ûŷ" "No position has been loaded yet" === "δо" "Can't back up any further" === "޷ٺ" "Can't open \"%s\"" === "޷\"%s\"" "Can't seek on position file" === "޷ļ" "Position not found in file" === "ļûŵ" "Bad FEN position in file" === "ļеFEN" "Black to play" === "ֵڷ" "White to play" === "ֵ׷" "Can't open \"%s\"" === "޷\"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === "Ѿ༭\nִ\"ͬһ\"֮" "You have entered too many moves.\nBack up to the correct position and try again." === "˹ŷ\n˻صȷľһ" "Displayed position is not current.\nStep forward to the correct position and try again." === "ʾľ治ǵǰ\nǰǰһ" "You have not made a move yet" === "һҲû߹" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." "No unfinished games" === "No unfinished games" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." "Failed to invoke cmail" === "Failed to invoke cmail" "Waiting for reply from opponent\n" === "Waiting for reply from opponent\n" "Still need to make move for game\n" === "Still need to make move for game\n" "Still need to make moves for both games\n" === "Still need to make moves for both games\n" "Still need to make moves for all %d games\n" === "Still need to make moves for all %d games\n" "Still need to make a move for game %s\n" === "Still need to make a move for game %s\n" "No unfinished games\n" === "No unfinished games\n" "Ready to send mail\n" === "Ready to send mail\n" "Still need to make moves for games %s\n" === "Still need to make moves for games %s\n" "Edit comment" === "༭ע" "Edit comment on %d.%s%s" === "༭ע %d.%s%s" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "ģʽ...\nϢһֱţ˵Ĺַ֧" "It is not White's turn" === "ûֵ׷" "It is not Black's turn" === "ûֵڷ" "Wait until your turn,\nor select Move Now" === "ȴ\nѡ\"\"" "Starting second chess program" === "ڶ" "Training mode off" === "ѵģʽѹر" "Training mode on" === "ѵģʽѴ" "Already at end of game" === "Ѿ" "Warning: You are still playing a game" === "ע⣺ڽ" "Warning: You are still observing a game" === "ע⣺Թ" "Warning: You are still examining a game" === "ע⣺о" "It is Black's turn" === "ֵڷ" "It is White's turn" === "ֵ׷" "That square is occupied" === "ѷ" "Draw agreed" === "Э̺" "There is no pending offer on this move" === "ŷûд" "Both players ran out of time" === "˫ʱ" "Black wins on time" === "׷ʱи" "Your opponent is not out of time" === "ûгʱ" "Both players ran out of time" === "˫ʱ" "White wins on time" === "ڷʱи" "Your opponent is not out of time" === "ûгʱ" "Draw agreed" === "Э̺"1,$g/=== ""/d "Black offers a draw" === "׷" "White offers a draw" === "ڷ" "You must make your move before offering a draw" === "" "Draw agreed" === "Э̺" "Game aborted" === "ж" "You are not examining a game" === "ûз" "You can't revert while pausing" === "ͣʱܸԭ" "Wait until your turn,\nor select Move Now" === "ȴ\nѡ\"\"" "It is your turn" === "ֵ" "Wait until your turn" === "ȴ" "No hint available" === "ûпõʾ" "Error writing to %s chess program" === "Ϣ%sʱ" "Error: %s chess program (%s) exited unexpectedly" === "%s(%s)ͻȻ˳" "Error reading from %s chess program (%s)" === "%s(%s)Ϣʱ" "Analysis (%s)" === "(%s)" "Comment" === "ע" "Comment on %d.%s%s" === "ע %d.%s%s" "Both flags fell" === "˫ʱ" "White's flag fell" === "׷ʱ" "Black wins on time" === "׷ʱи" "Black's flag fell" === "ڷʱ" "White wins on time" === "ڷʱи" "Bad FEN position in clipboard" === "FEN" "No response from ICS" === "ICS δӦ" "You cannot do this while you are playing or observing" === "Թʱܽд˲" "Click in holdings to choose piece" === "ѡֳֵ" END-OF-GAME MESSAGES (should they be translated?) "Xboard adjudication: King destroyed" === "Xboard о" "Xboard adjudication: Bare king" === "Xboard о⽫" "Xboard adjudication: 3rd check" === "Xboard о3ν" "Xboard adjudication: Stalemate" === "Xboard о" "Xboard adjudication: Checkmate" === "Xboard о" "Xboard adjudication: Insufficient mating material" === "Xboard оȡʤ" "Xboard adjudication: Trivial draw" === "Xboard оһ" "XBoard adjudication: repetition draw" === "Xboard оѭ" "Xboard adjudication: perpetual checking" === "Xboard о" "Xboard adjudication: perpetual chasing" === "Xboard о׽" "%Xboard adjudication: perpetual chasing of" === "Xboard о׽" "Xboard adjudication: 50-move rule" === "Xboard о50غк͹" "Draw claim: 50-move rule" === "50غк͹" "Draw claim: 3-fold repetition" === "3ѭ" "Draw claim: insufficient mating material" === "ȡʤ" "Xboard adjudication: long game" === "Xboard оԾֹ" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "Xboardδʶ岽¸ %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "XboardǷ岽¸ %s (%c%c%c%c)%c" "Xboard adjudication" === "Xboard о" "User adjudication" === "ûо" "False win claim: '%s'" === "Ӯʧ" "False draw claim: '%s'" === "ʧ" "xboard exit" === "xboard ˳" xboard-4.7.3/winboard/language/spanish.lng0000644000175000001440000012443512262415351015472 00000000000000## WinBoard 4.5.0 language file ## Spanish/Espaol v1.0 ## Translation by scar Toledo G. ## ## If you revise this, please insert your date, name and description. ## Si usted revisa esto, por favor inserte su fecha, nombre y descripcin. ## ## Aug/24/2010 scar Toledo G. http://nanochess.110mb.com/ ## First beta translation ## Aug/25/2010 scar Toledo G. ## Second beta, enhanced translation. Added notes for translators. ## Nov/29/2010 scar Toledo G. ## Final revision, added new string, adjusted messages for new menu reorganization. ## Notes for translators: (suggested also for lang450.txt) ## o Use ## for comments, find them scattered around this translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. winboard.rc MENUS: "&New Game\tCtrl-N" === "&Nueva partida\tCtrl+N" "New Sh&uffle Game..." === "Nueva partida revuelta..." "New &Variant...\tAlt+Shift+V" === "Nueva variante...\tAlt+Mays+V" "&Load Game...\tCtrl-O" === "&Leer partida...\tCtrl+O" "L&oad Position...\tCtrl+Shift+O" === "Lee&r posicin...\tCtrl+Mays+O" "&Save Game...\tCtrl-S" === "&Guardar partida...\tCtrl+S" "S&ave Position...\tCtrl+Shift+S" === "Guardar po&sicin...\tCtrl+Mays+S" "Save as &Diagram..." === "Guardar &diagrama..." "&Quit" === "&Salir" ## Next six strings not used now. "Load &Next Game\tAlt+PgDn" === "Partida s&iguiente\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "Par&tida previa\tAlt+PgUp" "&Reload Same Game" === "Releer la &misma partida" "Load N&ext Position\tAlt+Shift+PgDn" === "Posicin si&guiente\tAlt+Mays+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Posici&n previa\tAlt+Mays+PgUp" "Reload Sa&me Position" === "Releer la mism&a posicin" "&Copy Game To Clipboard\tCtrl+C" === "&Copiar partida\tCtrl+C" "C&opy Position To Clipboard\tCtrl+Shift+C" === "C&opiar posicin\tAlt+Mays+C" "Copy Game List to Clipboard" === "Copiar lista de &partidas" "&Paste Game From Clipboard\tCtrl+V" === "&Pegar partida\tCtrl+V" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Peg&ar posicin\tAlt+Mays+V" "&Edit Game\tCtrl+E" === "&Editar partida\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "E&ditar posicin\tCtrl+Mays+E" "Edit Ta&gs..." === "Editar c&ircunstancias" "Edit Co&mment..." === "Editar co&mentarios" "Enter &Username..." === "Introducir nombre de &usuario..." "&Revert\tHome" === "&Revertir\tHome" "&Annotate" === "&Anotar" "&Truncate Game\tEnd" === "&Truncar partida\tEnd" "&Backward\tAlt+Left" === "Jugada &anterior\tAlt+Izquierda" "&Forward\tAlt+Right" === "&Siguiente jugada\tAlt+Derecha" "Back to &Start\tAlt+Home" === "&Primera jugada\tAlt+Inicio" "For&ward to End\tAlt+End" === "&Ultima jugada\tAlt+Fin" "Flip &View\tF2" === "&Tablero invertido\tF2" "&Swap Clocks" === "Intercambiar relojes" "Engine &Output\tAlt+Shift+O" === "Mostrar &salida del motor\tAlt+Mays+O" "Evaluation &Graph\tAlt+Shift+E" === "Mostrar &grfica de evaluacin\tAlt+Mays+E" "Game &List\tAlt+Shift+G" === "Mostrar &lista de partidas\tAlt+Mays+G" "Move &History\tAlt+Shift+H" === "Mostrar lista de &jugadas\tAlt+Mays+H" "Open &New Chat Window" === "Abrir ventana de conversacin" "Type In &Move...\tAlt+I" === "T&eclear jugada...\tAlt+I" "&Tags" === "C&ircunstancias" "&Comments" === "&Comentarios" "&Game List Tags..." === "Opciones de lista de &partidas..." "&Board..." === "Opciones del t&ablero..." "&Fonts..." === "Opciones de ti&pografa..." "Machine &White\tCtrl+W" === "El programa juega con &blancas\tCtrl+W" "Machine &Black\tCtrl+B" === "El programa juega con &negras\tCtrl+B" "&Two Machines\tCtrl+T" === "Juegan d&os programas\tCtrl+T" "Machine Both" === "Programa contra si mismo" "&Analysis Mode\tCtrl+A" === "&Anlisis\tCtrl+A" "Analyze &File\tCtrl+F" === "A&nalizar archivo\tCtrl+F" "&Edit Game\tCtrl+E" === "&Editar partida\tCtrl+E" "E&dit Position\tShift+Ctrl+E" === "E&ditar posicin\tCtrl+Mays+E" "Trai&ning" === "Ent&renamiento" "&ICS Client" === "Conectado a un &ICS" "&Machine Match" === "&Torneo de dos programas" "&Pause\tPause" === "&Pausa\tPausa" "&Accept\tF3" === "&Acepto\tF3" "D&ecline\tF4" === "&Rehuso\tF4" "Re&match\tF12" === "Pido &desquite\tF12" "Call &Flag\tF5" === "&Pedir la bandera\tF5" "&Draw\tF6" === "&Tablas\tF6" "Ad&journ\tF7" === "Ap&lazamiento\tF7" "A&bort\tF8" === "A&nulacin\tF8" "&Resign\tF9" === "&Me rindo\tF9" "Stop &Observing\tF10" === "Dejo de obser&var\tF10" "Stop E&xamining\tF11" === "Dejo de e&xaminar\tF11" "&Upload to Examine" === "Enviar para examinar" "Adjudicate to &White" === "Adjudicar a blancas" "Adjudicate to &Black" === "Adjudicar a negras" "Adjudicate &Draw" === "Adjudicar tablas" "Engine #&1 Settings..." === "Configuracin motor #&1..." "Engine #&2 Settings..." === "Configuracin motor #&2..." "Install 1st..." === "Lista de motores #1..." "Install 2nd..." === "Lista de motores #2..." "&Hint..." === "&Dame una pista..." "&Book..." === "Repertorio de &aperturas..." "&Move Now\tCtrl+M" === "&Forzar jugada\tCtrl+M" "&Retract Move\tCtrl+X" === "&Revocar jugada\tCtrl+X" "&Mute all Sounds" === "&Apagar los sonidos" "&General..." === "&Generales..." "&Time Control...\tAlt+Shift+T" === "&Controles de tiempo..." "Common &Engine...\tAlt+Shift+U" === "Para los motores...\tAlt+Mays+U" "Ad&judications...\tAlt+Shift+J" === "Adjudicaciones...\tAlt+Mays+J" "&Load Game...\tAlt+Shift+L" === "Para &leer partida...\tAlt+Mays+L" "&Save Game...\tAlt+Shift+S" === "Para gua&rdar partida...\tAlt+Mays+S" "G&ame List..." === "Lista de &partidas..." "Soun&ds..." === "Soni&do..." "&ICS..." === "&ICS..." "Add ICS..." === "Nueva ICS..." "Comm&unications..." === "Com&unicaciones..." "Save Settings &Now" === "Salvar config. a&hora" "Save Settings on E&xit" === "Salvar config. al &salir del programa" "Help &Contents\tF1" === "&Contenido\tF1" "Help &Index" === "&Indice alfabtico" "How to &Use Help" === "Modo de utilizar la ayuda" "&About WinBoard" === "Acerca de &WinBoard" "White" === "Blancas" "Promote" === "Coronar" "Pawn" === "Pen" "Knight" === "Caballo" "Bishop" === "Alfil" "Rook" === "Torre" "Queen" === "Dama" "King" === "Rey" "Archbishop" === "Arzobispo" "Chancellor" === "Canciller" "Elephant" === "Elefante" "Cannon" === "Can" "Empty Square" === "Vaciar el escaque" "Black" === "Negras" "Demote" === "Degradar" "Clear Board " === "Limpiar el tablero " "Gold" === "Oro" "Silver" === "Plata" "Lance" === "Lanza" "Drop" === "Soltar" "Cop&y and Paste" === "Cop&iar y pegar" "&Copy" === "&Copiar" "&Paste" === "&Pegar" "&Undo" === "&Deshacer" "Cu&t" === "Cor&tar" "&Copy" === "&Copiar" "&Paste" === "&Pegar" "Select &All" === "&Seleccionar todo" DIALOGS: ABOUTBOX "About WinBoard" === "Acerca de WinBoard" "OK" === "Aceptar" "Chessboard for Windows" === "Tablero de ajedrez para Windows" ## Following 3 strings doesn't get translated :( "Copyright 1991 Digital Equipment Corporation" === "(c) Copyright Digital Equipment Corporation 1991" "Enhancements Copyright 1992-2014 Free Software Foundation" === "Mejoras (c) Copyright Free Software Fundation 1992-2010" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "Mejoras (c) Copyright\r\nAlessandro Scotti 2005" ## What happened with H.G.Muller? ## Absolutely needed a link to download the most recent version " " === "Traduccin por scar Toledo G." "WinBoard 0.0.0" === "WinBoard 0.0.0" ABOUTBOX2 "galactic" === "galctico" TIME CONTROL DIALOG "Time Control" === "Control de tiempo" "Conventional chess clock" === "Reloj convencional de ajedrez" "Incremental clock" === "Reloj incremental" "Cancel" === "Cancelar" "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Utilice las flechas del teclado para especificar el tipo de configuracin de reloj, despus oprima Tab para alterar los valores." "Fixed time per move" === "Tiempo fijo por jugada" "Number of moves:" === "Nmero jugadas:" "Within number of minutes:" === "Durante (minutos):" "Initial number of minutes:" === "Nmero inicial de minutos:" "Plus number of seconds per move:" === "Segundos extra por jugada:" "Maximum seconds per move:" === "Mximo de segundos por jugada:" "Time-Odds Factors:" === "Factores de tiempo:" "Engine #1:" === "Motor #1:" "Engine #2:" === "Motor #2:" LOAD OPTIONS DIALOG "Load Game Options" === "Opciones al leer partida" "Load games with automatic stepping" === "Carga partida con avance automtico" "seconds per move" === "segundos por jugada" SAVE OPTIONS DIALOG "Save Game Options" === "Opciones al salvar partida" "Save As: " === "Estilo" "Save games automatically" === "Salvar partidas automtico" "Prompt for filename" === "Pedir nombre" "To file:" === "Archivo:" "PGN" === "PGN" "Old" === "Viejo" "Browse..." === "Ver" "Save out of book info in PGN" === "Incluir en PGN info. al dejar libro de aperturas" 1536 ## Used in old Windows versions (still working?) "Open" === "Abrir" "File &Name:" === "&Nombre:" "&Directories:" === "&Directorios:" "List Files of &Type:" === "Listar de &tipo:" "Dri&ves:" === "&Unidades:" "&Help" === "Ay&uda" "&Index number:" === "N&m. ndice" COMMPORT ## Not tested, I could not access it. "Communication Port Settings" === "Configuracin comunicaciones" "Net&work..." === "&Red..." "&Port:" === "&Puerta:" "Data &Rate:" === "&Velocidad:" "Data &Bits:" === "&Bits:" "P&arity:" === "P&aridad:" "&Stop Bits:" === "Bits pa&rada:" "F&low:" === "F&lujo:" EDIT COMMENT "Edit Comment" === "Editar comentario" "&Clear" === "&Limpiar" "&Edit" === "&Edicin" PROMOTION POPUP "Promotion" === "Coronacin" "&Queen" === "&Dama" "&Rook" === "&Torre" "&Bishop" === "&Alfil" "K&night" === "Ca&ballo" "&King" === "&Rey" "&Cancel" === "&Cancelar" ## This text appears and it is not in lang450.txt (remove comment if added to lang450.txt) "Promote to:" === "Coronar a:" "Promote?" === "Coronar?:" "Chance&llor" === "Canci&ller" "&Archbishop" === "Ar&zobispo" " YES" === " SI" " NO" === " NO" "C&entaur" === "C&entauro" GAME LIST "Game List" === "Lista de juegos" "&Load" === "&Leer" "&Prev" === "&Previo" "&Next" === "&Siguiente" "&Close" === "&Cerrar" "Filter" === "Filtro" EDIT TAGS "Edit Tags" === "Circunstancias" ERROR "ICS Interaction" === "Interaccin ICS" "Dialog" === "Dilogo" "Error" === "Error" "Sorry Charlie" === "Lo siento amigo" COLORIZE "I C S Interaction Colors" === "Colores interaccin I C S" "Interaction Colors" === "Colores interaccin" "Premove" === "Pre-mov." "Alarm" === "Alarma" "Colors" === "Colores" "&Choose Color..." === "&Escoger color..." "&Bold" === "&Negrita" "&Italic" === "&Itlica" "&Underline" === "&Subrayado" "&Strikeout" === "&Tachado" QUESTION ## Next string currently not used "Enter a chess engine command or just type something stupid that will completely screw things up." === "Introduzca una orden para el motor o slo teclee algo tonto que arruinar completamente las cosas." "Question" === "Pregunta" "Enter" === "Entrar" STARTUP DIALOG "WinBoard Startup" === "Inicio de WinBoard" "What would you like to do?" === "Qu le gustara hacer?" "&Play against a chess engine or match two engines" === "&Jugar contra un motor de ajedrez o torneo de dos motores" "&Use an Internet Chess Server" === "&Utilizar un servidor de ajedrez de Internet (ICS)" "Just &view or edit game files" === "Slo &ver o editar archivos de partidas" "Specify Chess &Engines:" === "Especifique &motores de ajedrez:" "Specify Chess &Server:" === "Especifique &servidor de ajedrez:" "&Additional options" === "Opciones extras" INDEX "Type in a move" === "Introduzca una jugada" "Inde&x number:" === "Nm. ndi&ce" SOUND DIALOG "Sounds" === "Sonidos" "&Event:" === "&Evento:" "&No sound" === "&Sin sonido" "&Default beep" === "Bip por &defecto" "&Built-in sound:" === "Sonido &interno" "&WAV file:" === "Archivo &WAV:" "B&rowse..." === "E&xaminar..." "&Play" === "&Reproducir" "&Defaults" === "&Por defecto" GENERAL OPTIONS DIALOG ## Note: finely tuned spaces to align keys at right (add this comment to lang450.txt for commodity) "General Options" === "Opciones generales" "Always on &Top" === "Siempre al &frente" "Always &Queen Ctrl+Shift+Q" === "Siempre &dama Ctrl+Mays+Q" "Animate &Dragging" === "Animar &arrastre" "&Animate Moving Ctrl+Shift+A" === "Animar &movimiento Ctrl+Mays+A" "Auto &Flag Ctrl+Shift+F" === "&Bandera automtica Ctrl+Mays+F" "Auto Flip &View" === "Cambio de &lado automtico" "Auto &Raise Board" === "&Tablero al frente (automtico)" "&Blindfold" === "A &ciegas" "Highlight Dra&gging" === "Iluminar a&rrastre" "Highlight Last &Move" === "Iluminar ltima ju&gada" "Periodic &Updates" === "Act&ualizacin peridica" ## Was wrong in lang450.txt (remove comment if corrected in lang450.txt) "Ponder &Next Move Ctrl+Shift+P" === "Prever &prx.jugada Ctrl+Mays+P" "&Popup Exit Message" === "&Ventana al salir" "Popup Move &Errors" === "Ventana si &error en jugada" "Show Butt&on Bar" === "Mostrar barra de boto&nes" "Show &Coordinates" === "Mostrar coordenada&s" "&Show Thinking" === "Mostrar cog&itaciones" "Test &Legality Ctrl+Shift+L" === "Checar &legalidad Ctrl+Mays+L" "&Hide Thinking Ctrl+Shift+H" === "Ocultar cogitacin Ctrl+Mays+H" "&Info in Move History Ctrl+Shift+I" === "Info. en lista jugadas Ctrl+Mays+I" "&Send Engine Think" === "Enviar cogitaciones del motor" "E&xtended PGN Info Ctrl+Shift+X" === "Info. PGN extendida Ctrl+Mays+X" "Highlight with Arro&w" === "Iluminar con flecha" "Displa&y Logos" === "Mostrar logotipos" "One-Click Move" === "Moviemento de un click" ICS OPTIONS "ICS Options" === "Opciones ICS" "&Auto Comment" === "&Auto-comentario" "Auto &Observe" === "Auto-&Observar" "&Get Move List" === "L&eer lista jugadas" "&Local Line Editing" === "Edicin de lnea &local" "&Quiet Play" === "Jugar en s&ilencio" "&Premove" === "&Moviemento prev." "&White first move" === "1er. mov. &blancas" "&Black first move" === "1er. mov. &negras" "&Sound alarm at" === "&Sonar alarma en" "seconds" === "segundos" "Choose..." === "Escoger..." "Do ¬ colorize messages" === "N&o colorear mensajes" "&Auto Kibitz" === "&Auto Kibitz" "Auto Kibit&z" === "Auto Kibit&z" "See&k Graph" === "&Buscar grfica" "auto-&Refresh" === "auto-&Refresco" "Bckgnd Obser&ve" === "M&irar en el fondo" "&Dual Board" === "Tablero &dual" "One-Click &Move" === "&Moviemento de un click" "Background..." === "Fondo..." "&Defaults..." === "&Por defecto..." "Startup &Chat Boxes:" === "Cajones de pltica:" "General" === "General" BOARD OPTIONS ## (NOTE: AllWhite uses the white pieces for both sides ## FlipBlack plots the black pieces upside down) "Board Options" === "Opciones de tablero" "Defaults" === "Por defecto" "Light Squares" === "Cuadros claros" "Dark Squares" === "Cuadros obscuros" "White Pieces" === "Piezas blancas" "Black Pieces" === "Piezas negras" "Square Highlights" === "Cuadro iluminado" "Premove Highlights" === "Iluminacin pre.mov." "Monochrome" === "Monocromo" "All White" === "Slo blancas" "Flip Black" === "Girar negras" "Size" === "Tamao" BOARD SIZES ## This is a space for imagination (useful note to add to lang450.txt). "&Tiny" === "&Infimo" "T&eeny" === "Dimin&uto" "&Dinky" === "&Pigmeo" "&Petite" === "E&nano" "Sl&im" === "Pequein" "&Small" === "Pe&queo" "Medi&ocre" === "Medio&cre" "&Middling" === "Esca&so" "&Average" === "Ra&zonable" "Mode&rate" === "Mode&rado" "Medi&um" === "&Medio" "Bul&ky" === "Apara&toso" "&Large" === "&Grande" "&Big" === "&Enorme" "&Huge" === "Inmen&so" "&Giant" === "Gigante" "&Colossal" === "Colos&al" "Tita&nic" === "Titnico" FONTS "Fonts" === "Tipografa" "Current Board Size" === "Tamao actual del tablero" "All Board Sizes" === "Todos los tamaos de tablero" "&Revert to Defaults" === "&Volver a por defecto" "Clocks" === "Relojes" "Messages" === "Mensajes" "Coordinates" === "Coordenadas" "Tags" === "Circunstancias" "Comments" === "Comentarios" "I C S Interaction" === "Interaccin ICS" "&Color..." === "&Color..." "Move History, Engine Output" === "Lista jugadas, salida motor" ADJUDICATIONS DIALOG "Adjudications" === "Adjudicaciones" "Ponder Next Move" === "Prever siguente jugada" "Enable and Show Thinking (recommended)" === "Activa y muestra cogitaciones(recomendado)" "Hide Thinking when Playing against Human" === "Ocultar cogitaciones al jugar contra humano" "Periodic Updates (for Analysis Mode)" === "Actualizacin peridica (en anlisis)" "Adjudications in non-ICS games" === "Adjudicaciones en juegos no-ICS" "Adjudicate draw after:" === "Adjudicar mate despus de:" "moves" === "jugadas" "Win/loss adjudication threshold:" === "Lmite para adjudicar juego:" "centipawns" === "centipeones" "&Verify Engine Claims" === "&Verificar avisos del motor" "Detect &Mates" === "Detectar &mates" "Draw if &Insufficient Material" === "Tablas si hay material &insufficiente" "Adjudicate &Trivial Draws" === "Adjudicar tablas &triviales" "Apply" === "Aplicar" "-move rule" === "-jugadas (regla)" "-fold repeats" === "-veces (repeticin)" "Engine #1 Score is Absolute" === "Puntuacin motor #1 es absoluta" "Engine #2 Score is Absolute" === "Puntuacin motor #2 es absoluta" COMMON ENGINE DIALOG "Common Engine Settings" === "Configuracin comn de motor" "Polyglot Directory:" === "Carpeta Polyglot:" "Hash Size (MB):" === "Tamao hash (MB):" "EGTB Path:" === "Carpeta EGTB:" "EGTB Size (MB):" === "Tamao EGTB (MB):" "Use Book:" === "Usar libro:" "Max nr of CPUs:" === "Nmero max. CPUs:" "First has Own Book" === "Primero tiene libro propio" "Second has Own Book" === "Segundo tiene libro propio" "Book Depth:" === "Profundo libro:" "Book Variation:" === "Variacin libro:" "Default Match Games:" === "Partidas torneo p/def" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "Variantes" "Variant" === "Variante" "Board size:" === "Tamao de tablero" "ranks" === "columnas" "files" === "filas" "Holdings with room for:" === "Admitir en mano hasta:" "pieces" === "piezas" "('-1' means defaults for selected variant)" === "('-1' indica valor por defecto para variante seleccionada)" VARIANT NAMES: "&normal" === "&normal" "&FRC" === "" "&wildcastle" === "" "&nocastle" === "" "&losers" === "" "&giveaway" === "" "s&uicide" === "s&uicida" "&3Check" === "" "&twokings" === "" "&atomic" === "&atmico" "cra&zyhouse" === "" "&bughouse" === "" "&Twilight" === "" "&shogi" === "" "su&per" === "" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "c&ilindro" "&fairy" === "" "&makruk" === "" "&gothic" === ">ico" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "&xiangqi" === "" NEW SHUFFLE GAME "New Shuffle Game" === "Nueva partida revuelta" "&Start Position Number:" === "Nm. de pos. inicial:" "Random" === "Aleatorio" GAME-LIST OPTIONS DIALOG "Game List Options" === "Opciones de lista de partidas" "PGN &Tags:" === "&Etiquetas PGN:" "&Up" === "&Arriba" "&Down" === "A&bajo" "Default" === "Por defecto" "Factory" === "De fbrica" "Restore to:" === "Restaurar a" MOVE HISTORY WINDOW "Move History" === "Lista de jugadas" EVALUATION GRAPH "Evaluation Graph" === "Grfica de evaluacin" ENGINE OUTPUT WINDOW "Engine output" === "Salida de motores" "Engine #1" === "Motor #1" "NPS" === "NPS" "Engine #2" === "Motor #2" CHAT BOXES "Chat Window" === "Ventana de pltica" "Chat partner:" === "Quin platica:" "Clear" === "Limpiar" "Send" === "Enviar" winboard.c "&File" === "&Archivo" "&Edit" === "&Editar" "&View" === "&Ver" "&Mode" === "&Modo" "&Action" === "&Partida" "E&ngine" === "Moto&r" "&Step" === "&Jugada" "&Options" === "&Opciones" "&Help" === "Ay&uda" "Font name too long:" === "Nombre tipogrfico muy largo:" "Font point size missing:" === "Falta tamao tipogrfico:" "Can't parse color name %s" === "No se pudo analizar nombre de color %s" "Unrecognized board size value" === "Valor no reconocido de tamao de tablero" "Unrecognized argument" === "Parametro no reconocido" "No value provided for argument" === "No se dio valor para parametro" "Incomplete \\ escape in value for" === "Escape \\ incompleto en valor para" "Failed to open indirection file" === "Falla al abrir archivo de indireccin" "Unrecognized boolean argument value" === "Valor no reconocido para parametro booleano" "Unrecognized argument" === "Parametro no reconocido" "Too many colors" === "Demasiados colores" "&Minimize\tCtrl+F4" === "&Minimizar\tCtrl+F4" "White: %s" === "Blancas: %s" "We only care about the height here" === "Aqu solo importa la altura" "Cannot build game list" === "No se pudo armar lista de partidas" "Load Game from File" === "Leer partida desde archivo" "Load Position from File" === "Leer posicin desde archivo" "Save Game to File" === "Salvar partida a archivo" "Save Position to File" === "Salvar posicin a archivo" "%s does not support analysis" === "%s no admite anlisis" "Analyze Game from File" === "Analizar juego desde archivo" "Unable to activate help" === "No se pudo activar la ayuda" "Send to chess program:" === "Enviar al programa de ajedrez:" "Send to second chess program:" === "Enviar al segundo programa de ajedrez:" "Direct Command" === "Orden directa" "Error loading sound %s" === "Error al cargar sonido %s" "Error playing sound %s" === "Error al ejecutar sonido %s" "File open failed" === "Falla al abrir archivo" "Internal error in file dialog box" === "Error interno en archivo de caja de dilogo" "Option Error" === "Error de opcin" "Choose an option, or cancel to exit" === "Escoja una opcin o cancelar para salir" "Unable to activate help" === "Imposible activar ayuda" "Displayed move is not current" === "La jugada ilustrada no es la actual" "Could not parse move" === "No se pudo analizar la jugada" "%s:\nError code %d" === "%s:\nCdigo de error %d" "Error" === "Error" "Fatal Error" === "Error fatal" "Exiting" === "Saliendo" "%s:\nError code %d" === "%s:\nCdigo de error %d" "Note" === "Nota" "Error writing to chess program" === "Error al escribir al programa de ajedrez" "User" === "Usuario" "Unknown" === "Desconocido" "White" === "Blancas" "Black" === "Negras" "Save Game to File" === "Salvar partida en archivo" "Not implemented" === "No implementado" "Shout Text" === "Texto Shout" "SShout/CShout" === "" "Channel 1 Text" === "Texto canal 1" "Channel Text" === "Texto de canal" "Kibitz Text" === "Texto kibitz" "Tell Text" === "Texto tell" "Challenge Text" === "Texto desafo" "Request Text" === "Texto de pedido" "Seek Text" === "Texto de bsqueda" "Normal Text" === "Texto normal" "None" === "Ninguno" "Pawn" === "Pen" "Knight" === "Caballo" "Bishop" === "Alfil" "Rook" === "Torre" "Queen" === "Dama" "Information" === "Informacin" wclipbrd.c "Unable to convert position to FEN." === "Imposible convertir posicin a FEN." "Unable to copy FEN to clipboard." === "Imposible copiar FEN a portapapeles." "Cannot create temporary file name." === "No se pudo crear nombre de archivo temporal" "Cannot open temporary file." === "No se pudo abrir archivo temporal" "Cannot write to temporary file." === "No se pudo escribir a archivo temporal" "Cannot reopen temporary file." === "No se pudo reabrir archivo temporal" "Cannot determine size of file." === "No se pudo determinar el tamao del archivo" "Cannot allocate clipboard buffer." === "No se pudo asignar buffer para el portapapeles" "Cannot read from temporary file." === "No se pudo leer de archivo temporal" "Error reading from temporary file." === "Error al leer de archivo temporal" "Cannot copy text to clipboard" === "No se pudo copiar texto al portapapeles" "Unable to allocate memory for clipboard." === "Imposible asignar memoria para el portapapeles" "Unable to lock clipboard memory." === "Imposible proteger memoria del portapapeles" "Cannot unlock clipboard memory." === "Imposible desproteger memoria del portapapeles" "Cannot open clipboard." === "No se puede abrir el portapapeles" "Cannot empty clipboard." === "No se puede vaciar el portapapeles" "Cannot copy text to clipboard." === "No se puede copiar texto al portapapeles" "Cannot close clipboard." === "No se puede cerrar el portapapeles" "Unable to paste FEN from clipboard." === "Imposible pegar FEN desde el portapapeles." "Unable to create temporary file." === "Imposible crear archivo temporal." "Error writing to temporary file." === "Error al escribir a archivo temporal." "Unable to open clipboard." === "Imposible abrir el portapapeles" "No text in clipboard." === "No hay texto en el portapapeles." "Unable to lock clipboard memory." === "Imposible proteger memora del portapapeles" "Unable to allocate memory for text string." === "Imposible asignar memoria para cadena de texto" "Unable to unlock clipboard memory." === "Imposible desproteger memoria del portapapeles" "Unable to close clipboard." === "Imposible cerrar portapapeles" woptions.c ## "Move" === "Jugada" ## "Bell" === "Campana" ## "ICS Alarm" === "Alarma ICS" ## "ICS Win" === "Gana ICS" ## "ICS Loss" === "Pierde ICS" ## "ICS Draw" === "Empate ICS" ## "ICS Unfinished" === "Sin terminar ICS" ## "Shout" === "" ## "SShout/CShout" === "" ## "Channel 1" === "Canal 1" ## "Channel" === "Canal" ## "Kibitz" === "Kibitz" ## "Tell" === "Decir" ## "Challenge" === "Desafiar" ## "Request" === "Pedir" ## "Seek" === "Buscar" "Browse for Sound File" === "Buscar archivo de audio" "Can't parse com port settings" === "No se puede leer configuracin de puerta COM" "Option Error" === "Error de opcin" "Invalid data rate" === "Velocidad incorrecta" "Option Error" === "Error de opcin" "Failed to set comm port state;\r\ninvalid options?" === "Falla al poner estado de puerta de comunicaciones;\r\nopciones invlidas?" "Failed to set comm port state" === "Falla al poner estado de puerta de comunicaciones" "Invalid load game step rate" === "Velocidad de paso invlida para leer partida" "Invalid save game file name" === "Nombre de archivo invlido para salvar partida" "Browse for Auto Save File" === "Buscar el archivo de salvado automtico" "Invalid moves per time control" === "Control invlido de jugadas por tiempo" "Invalid minutes per time control" === "Control invlido de minutos por tiempo" "Invalid increment" === "Incremento invlido" "Invalid initial time" === "Tiempo inicial invlido" "Changing time control during a game is not implemented" === "No est implementado cambiar el control de tiempo durante un juego" "Variant %s not supported by %s" === "La variante %s no es admitida por %s" "Warning: second engine (%s) does not support this!" === "Advertencia: el segundo motor (%s) no admite esto!" "Invalid ICS Alarm Time" === "Tiempo de alarma ICS invlido" "Invalid max time per move" === "Tiempo mximo por jugada es invlido" "Invalid time-odds factor" === "Factor de tiempo es invlido" "Choose Folder" === "Escoja carpeta" "Choose Book" === "Escoja libro" "Choose Polyglot Directory" === "Escoja directorio Polyglot" "Choose EGTB Directory:" === "Escoja directorio EGTB" "Polyglot was not found in the specified folder!" === "Polyglot no fue encontrado en la carpeta especificada!" wgamelist.c "No game selected" === "Ninguna partida seleccionada" "Can't go forward any further" === "Ya no se puede ir ms adelante" "Can't back up any further" === "Ya no se puede ir ms atrs" "No game list" === "No hay lista de partidas" "Game List" === "Lista de partidas" "Game list not loaded or empty" === "Lista de partidas no cargada o vaca" "%s - %d/%d games" === "%s - %d/%d partidas" wedittags.c "Edit Tags" === "Editar circunstancias" "Tags" === "Etiquetas" "Error replacing tags." === "Error al reemplazar etiquetas" wsettings.c "%s Engine Settings (%s)" === "Config. motor %s (%s)" "OK" === "Aceptar" "Cancel" === "Cancelar" backend.c "bad timeControl option %s" === "opcin timeControl incorrecta %s" "bad searchTime option %s" === "opcin searchTime incorrecta %s" ## Note that translation cannot be "primero" because it is for a composed string, check ahead "first" === "primer" "second" === "segundo" "protocol version %d not supported" === "versin %d del protocolo no es admitida" "Variant %s supported only in ICS mode" === "La variante %s solo se admite en modo ICS" "Unknown variant name %s" === "Nombre de variante desconocido %s" "Starting chess program" === "Iniciando programa de ajedrez" "Could not open comm port %s" === "No se pudo abrir la puerta de comunicaciones %s" "Could not connect to host %s, port %s" === "No se pudo conectar al servidor %s, puerta %s" "Unknown initialMode %s" === "Modo inicial desconocido %s" "Can't have a match with no chess programs" === "No se puede tener una partida sin programas de ajedrez" "Bad game file" === "archivo de partidas incorrecto" "Bad position file" === "archivo de posicin incorrecto" "AnalyzeFile mode requires a game file" === "El modo anlisis de archivo requiere un archivo de partida" "Analysis mode requires a chess engine" === "El modo de anlisis requiere un motor de ajedrez" "Analysis mode does not work with ICS mode" === "El modo de anlisis no funciona con el modo ICS" "MachineWhite mode requires a chess engine" === "El modo de mquina con blancas requiere un motor de ajedrez" "MachineWhite mode does not work with ICS mode" === "El modo de mquina con blancas no funciona con el modo ICS" "MachineBlack mode requires a chess engine" === "El modo de mquina con negras requiere un motor de ajedrez" "MachineBlack mode does not work with ICS mode" === "El modo de mquina con negras no funciona con el modo ICS" "TwoMachines mode does not work with ICS mode" === "El modo de dos mquinas no funciona con el modo ICS" "TwoMachines mode requires a chess engine" === "El modo de dos mquinas requiere un motor de ajedrez" "Training mode requires a game file" === "El modo de entrenamiento requiere un archivo de partidas" "Error writing to ICS" === "Error al escribir a ICS" "Error reading from keyboard" === "Error al leer el teclado" "Got end of file from keyboard" === "Se obtuvo del teclado un fin de archivo" "Error writing to ICS" === "Error al escribir a ICS" "Error writing to display" === "Error al escribir a la pantalla" "Error gathering move list: two headers" === "Error al recolectar lista de jugadas: dos encabezados" "Error gathering move list: nested" === "Error al recolectar lista de jugadas: anidado" "Connection closed by ICS" === "Conexin cerrada por ICS" "Error reading from ICS" === "Error al leer de ICS" "Failed to parse board string:\n\"%s\"" === "Falla al analizar cadena de tablero:\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "Juego demasiado largo; incremente MAX_MOVES y recompile" "Error gathering move list: extra board" === "Error al recolectar lista de jugadas: tablero extra" "Illegal move \"%s\" from ICS" === "Jugada ilegal \"%s\" de ICS" "Couldn't parse move \"%s\" from ICS" === "No se pudo analizar jugada \"%s\" de ICS" ## 'say' must not be translated (add this comment to lang450.txt) "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "say Error interno; moveType incorrecto %d (%d,%d-%d,%d)" "You are playing Black" === "Usted juega negras" "You are playing White" === "Usted juega blancas" "It is White's turn" === "Turno de las blancas" "It is Black's turn" === "Turno de las negras" "Displayed position is not current" === "La posicin mostrada no es la actual" "Illegal move" === "Jugada ilegal" "End of game" === "Fin del juego" "Incorrect move" === "Jugada incorrecta" ## Second %s is translated 'first' or 'second'. (add this comment to lang450.txt) "Illegal move \"%s\" from %s machine" === "Jugada ilegal \"%s\" del %s motor" "Forfeit due to illegal move" === "Detenido por jugada ilegal" "%s does not support analysis" === "%s no admite anlisis" ## Second %s is translated 'first' or 'second' (add this comment to lang450.txt) "Illegal move \"%s\" (rejected by %s chess program)" === "Jugada ilegal \"%s\" (rechazada por %s programa de ajedrez)" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Failed to start %s chess program %s on %s: %s\n" === "Falla al iniciar %s programa de ajedrez %s en %s: %s\n" "Hint: %s" === "Sugerencia: %s" "Machine accepts your draw offer" === "La mquina acepta su oferta de tablas" "Machine offers a draw\nSelect Action / Draw to agree" === "La mquina ofrece tablas\nSeleccione accin / Tablas para acordar" "%s (only move)" === "%s (jugada nica)" "Ambiguous move in ICS output: \"%s\"" === "Jugada ambigua en salida ICS: \"%s\"" "Illegal move in ICS output: \"%s\"" === "Jugada ilegal en salida ICS: \"%s\"" "Gap in move list" === "Hueco en lista de jugadas" "Game too long; increase MAX_MOVES and recompile" === "Juego demasiado largo; incremente MAX_MOVES y recompile" "Variant %s not supported by %s" === "Variante %s no es admitida por %s" "Startup failure on '%s'" === "Falla al iniciar '%s'" "Waiting for first chess program" === "Esperando al primer programa de ajedrez" "Waiting for second chess program" === "Esperando al segundo programa de ajedrez" "Match %s vs. %s: final score %d-%d-%d" === "Partida %s vs. %s: puntuacin final %d-%d-%d" "Stalemate" === "Mate ahogado" "Illegal move: %d.%s%s" === "Jugada ilegal: %d.%s%s" "Ambiguous move: %d.%s%s" === "Jugada ambigua: %d.%s%s" "Can't open \"%s\"" === "No se puede abrir \"%s\"" "Cannot build game list" === "No se puede armar lista de partidas" "No more games in this message" === "No hay ms partidas en este mensaje" "No game has been loaded yet" === "Ninguna partida se ha cargado an" "Can't back up any further" === "No se puede ir ms atrs" "Game number out of range" === "Nmero de partida fuera de rango" "Can't seek on game file" === "No se puede buscar en archivo de partidas" "Game not found in file" === "Partida no hallada en archivo" "Bad FEN position in file" === "Posicin FEN incorrecta en archivo" "No moves in game" === "Ninguna jugada en la partida" "No position has been loaded yet" === "Ninguna posicin se ha cargado an" "Can't back up any further" === "No se puede ir ms atrs" "Can't open \"%s\"" === "No se puede abrir \"%s\"" "Can't seek on position file" === "No se puede buscar en archivo de partidas" "Position not found in file" === "No se hall la posicin en el archivo" "Bad FEN position in file" === "Posicin FEN incorrecta en archivo" "Black to play" === "Las negras juegan" "White to play" === "Las blancas juegan" "Can't open \"%s\"" === "No se puede abrir \"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === "Usted edit la lista de jugadas.\nUtilice Recargar misma partida y realice su jugada de nuevo." "You have entered too many moves.\nBack up to the correct position and try again." === "Usted entr demasiados jugadas.\nRetroceda a la posicin correcta y vuelva a intentar" "Displayed position is not current.\nStep forward to the correct position and try again." === "La posicin ilustrada no es la actual.\nAdelante a la posicin correcta y vuelva a intentar." "You have not made a move yet" === "Usted todava no hace una jugada" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "El mensaje cmail no est cargado.\nUtilice Reload CMail Message y realice su jugada de nuevo." "No unfinished games" === "No hay partidas sin terminar" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "Usted ya envi una jugada.\nEspere hasta que llegue una jugada de su oponente.\nPara reenviar la misma jugada, teclee\n\"cmail -remail -game %s\"\nen la lnea de comandos." "Failed to invoke cmail" === "Falla al invocar cmail" "Waiting for reply from opponent\n" === "Esperando respuesta del oponente\n" "Still need to make move for game\n" === "Todava necesita hacer una jugada para la partida\n" "Still need to make moves for both games\n" === "Todava necesita hacer jugadas para ambas partidas\n" "Still need to make moves for all %d games\n" === "Todava necesita hacer jugadas para las %d partidas\n" "Still need to make a move for game %s\n" === "Todava necesita hacer una jugada para la partida %s\n" "No unfinished games\n" === "No hay juegos sin terminar\n" "Ready to send mail\n" === "Listo para enviar correo\n" "Still need to make moves for games %s\n" === "Todava necesita hacer jugadas para las partidas %s\n" "Edit comment" === "Editar comentario" "Edit comment on %d.%s%s" === "Editar comentario en %d.%s%s" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "Comenzando modo de anlisis...\nSi este mensaje permanece, su programa de ajedrez no admite anlisis." "It is not White's turn" === "No es turno de las blancas" "It is not Black's turn" === "No es turno de las negras" "Wait until your turn,\nor select Move Now" === "Espere su turno,\no seleccione Forzar Jugada" "Starting second chess program" === "Comenzado el segundo programa de ajedrez" "Training mode off" === "Modo de entrenamiento apagado" "Training mode on" === "Modo de entrenamiento activo" "Already at end of game" === "Ya se encuentra al final de la partida" "Warning: You are still playing a game" === "Advertencia: Usted todava est jugando una partida" "Warning: You are still observing a game" === "Advertencia: Usted todava est observando una partida" "Warning: You are still examining a game" === "Advertencia: Usted todava est examinando una partida" "It is Black's turn" === "Es turno de las negras" "It is White's turn" === "Es turno de las blancas" "That square is occupied" === "Ese cuadro est ocupado" "There is no pending offer on this move" === "No hay oferta pendiente para esta jugada" "Your opponent is not out of time" === "Su oponente no est fuera de tiempo" "Black offers a draw" === "Las negras ofrecen tablas" "White offers a draw" === "Las blancas ofrecen tablas" "You must make your move before offering a draw" === "Debe hacer su jugada antes de ofrecer tablas" "You are not examining a game" === "Usted no est examinando una partida" "You can't revert while pausing" === "No puede revertir si est en pausa" "Wait until your turn,\nor select Move Now" === "Espere su turno,\no seleccione Forzar Jugada" "It is your turn" === "Es su turno" "Wait until your turn" === "Espero su turno" "No hint available" === "No hay sugerencia disponible" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error writing to %s chess program" === "Error al escribir al %s programa de ajedrez" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error: %s chess program (%s) exited unexpectedly" === "Error: el %s programa de ajedrez (%s) termin inesperadamente" ## First %s is translated 'first' or 'second' (add this comment to lang450.txt) "Error reading from %s chess program (%s)" === "Error al leer del %s programa de ajedrez (%s)" "Analysis (%s)" === "Anlisis (%s)" "Comment" === "Comentario" "Comment on %d.%s%s" === "Comentario de %d.%s%s" "Both flags fell" === "Ambas banderas cayeron" "White's flag fell" === "La bandera blanca cay" "Black's flag fell" === "La bandera negra cay" "Bad FEN position in clipboard" === "Posicin FEN incorrecta en portapapeles" "No response from ICS" === "No hay respuesta de ICS" "You cannot do this while you are playing or observing" === "Usted no puede hacer esto mientras juega u observa" "Click in holdings to choose piece" === "Haga click para escoger pieza" END-OF-GAME MESSAGES "Game aborted" === "Partida abortada" "White wins on time" === "Las blancas ganan por tiempo" "Black wins on time" === "Las negras ganan por tiempo" "Both players ran out of time" === "Ambos jugadores se quedaron sin tiempo" "White resigns" === "Las blancas se resignan" "Black resigns" === "Las negras se resignan" "White mates" === "Las blancas dan mate" "Black mates" === "Las negras dan mate" "Draw" === "Tablas" "Draw agreed" === "Tablas acordadas" "Xboard adjudication: King destroyed" === "XBoard adjudica: Rey destruido" "Xboard adjudication: Bare king" === "XBoard adjudica: Rey solitario" "Xboard adjudication: 3rd check" === "XBoard adjudica: 3er. jaque" "Xboard adjudication: Stalemate" === "XBoard adjudica: Mate ahogado" "Xboard adjudication: Checkmate" === "XBoard adjudica: Jaquemate" "Xboard adjudication: Insufficient mating material" === "XBoard adjudica: Material insuficiente para dar mate" "Xboard adjudication: Trivial draw" === "XBoard adjudica: Tablas triviales" "XBoard adjudication: repetition draw" === "XBoard adjudica: Tablas por repeticin" "Xboard adjudication: perpetual checking" === "XBoard adjudica: Jaque perpetuo" "Xboard adjudication: perpetual chasing" === "XBoard adjudica: Persecucin perpetua" "%Xboard adjudication: perpetual chasing of" === "XBoard adjudica: Persecucin perpetua" "Xboard adjudication: 50-move rule" === "XBoard adjudica: regla de las 50 jugadas" "Draw claim: 50-move rule" === "Pide tablas: regla de las 50 jugadas" "Draw claim: 3-fold repetition" === "Pide tablas: 3 repeticiones de posicin" "Draw claim: insufficient mating material" === "Pide tablas: material insuficiente para dar mate" "Xboard adjudication: long game" === "XBoard adjudica: juego largo" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "XBoard: Perdido por jugada invlida: %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "XBoard: Perdido por jugada ilegal: %s (%c%c%c%c)%c" "Xboard adjudication" === "XBoard adjudica" "User adjudication" === "El usuario adjudica" "False win claim: '%s'" === "Falso aviso de ganar: '%s'" "False draw claim: '%s'" === "Falso aviso de tablas: '%s'" "xboard exit" === "XBoard termina" ## One forgetted string (remove comment if added to lang450.txt) "Type in your name" === "Introduzca su nombre" "You can only start a match from the initial position" === "Slo se puede iniciar un torneo desde la posicin inicial" xboard-4.7.3/winboard/language/nederlands.lng0000644000175000001440000015162412262415351016144 00000000000000## WinBoard language file ## ## Dutch / Nederlands ## v1.2 ## ## Translation by H.G.Muller (July 19, 2011) ## Vertaald door H.G.Muller (19 juli 2011) ## http://www.open-aurec.com/wbforum ## 3-oct-2011. H.G.Muller. Added a few missing translations. ## 7-oct-2011. H.G.Muller. Redid Load Options dialog, new Tournament dialog strings ## 10-feb-2012. H.G.Muller. Added some strings in Load Engine, Tournament and Board dialogs ## 1-feb-2010. H.G.Muller. Added new strings for version 4.7.0 ## ## If you revise this, please insert your date, name and description. ## AUB uw naam en datum hierboven bijschrijven als u dit bestand bijwerkt ## winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "&New Game\tCtrl-N" === "&Nieuwe partij\tCtrl-N" "New Sh&uffle Game..." === "Openingsstelling Sch&udden..." "New &Variant...\tAlt+Shift+V" === "Nieuwe Schaak&variant...\tAlt+Shift+V" "&Load Game...\tCtrl-O" === "Partij &Inlezen...\tCtrl-O" "&Save Game...\tCtrl-S" === "Partij &Opslaan...\tCtrl-S" "L&oad Position...\tCtrl+Shift+O" === "Stelling In&lezen...\tCtrl+Shift+O" "S&ave Position...\tCtrl+Shift+S" === "Stelling Op&slaan...\tCtrl+Shift+S" "Save as &Diagram..." === "Opslaan als &Diagram" "&Quit" === "&Afsluiten" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === "" "Load &Previous Game\tAlt+PgUp" === "" "&Reload Same Game" === "" "Load N&ext Position\tAlt+Shift+PgDn" === "Vol&gende stelling\tAlt+Shift+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Vo&rige Stelling\tAlt+Shift+PgUp" "Reload Sa&me Position" === "" "&Copy Game To Clipboard\tCtrl+C" === "Partij &Kopiren\tCtrl+C" "C&opy Position To Clipboard\tCtrl+Shift+C" === "Stelling K&opiren\tCtrl+Shift+C" "Copy Game List to Clipboard" === "Partijenover&zicht Kopiren" "&Paste Game From Clipboard\tCtrl+V" === "Partij &Plakken\tCtrl+V" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Stelling P&lakken\tCtrl+Shift+V" "&Edit Game\tCtrl+E" === "Partij &Bewerken\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "Stelling B&ewerken\tCtrl+Shift+E" "Edit Ta&gs..." === "P G N &Titels Bewerken..." "Edit Co&mment..." === "&Commentaar Bewerken..." "Enter &Username..." === "Gebruikers&naam Invoeren..." "&Revert\tHome" === "&Herstel Vorige Variant" "&Annotate" === "Becommentarier met &Variant" "&Truncate Game\tEnd" === "Partij &Afkappen\tEnd" "&Backward\tAlt+Left" === "Stap Te&rug\tAlt+Left" "&Forward\tAlt+Right" === "Stap &Vooruit\tAlt+Right" "Back to &Start\tAlt+Home" === "Naar Be&gin\tAlt+Home" "For&ward to End\tAlt+End" === "Naar Ein&d\tAlt+End" "Flip &View\tF2" === "Bord &Omdraaien\tF2" "&Swap Clocks" === "&Klokken Verwisselen" "Engine &Output\tAlt+Shift+O" === "O&verwogen Zetten\tAlt+Shift+O" "Move &History\tAlt+Shift+H" === "&Zettenlijst\tAlt+Shift+H" "Evaluation &Graph\tAlt+Shift+E" === "&Scoregrafiek\tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "&Partijenoverzicht\tAlt+Shift+G" "Open &New Chat Window" === "Open &Nieuw Kwebbelvenster" "Type In &Move...\tAlt+I" === "Zet &Intypen...\tAlt+I" "&Tags" === "P G N &Titels" "&Comments" === "&Commentaar" "&Game List Tags..." === "Partijenove&rzicht titels..." "&Board..." === "Schaak&bord..." "&Fonts..." === "&Lettertypen..." "Machine &White\tCtrl+W" === "Computer &Wit\tCtrl+W" "Machine &Black\tCtrl+B" === "Computer &Zwart\tCtrl+B" "&Two Machines\tCtrl+T" === "&Twee Programma's\tCtrl+T" "Machine Both" === "" "&Analysis Mode\tCtrl+A" === "&Analyseren\tCtrl+A" "Analyze &File\tCtrl+F" === "Bestan&d Analyseren\tCtrl+F" "&Edit Game\tCtrl+E" === "Partij &Bewerken\tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "Stelling B&ewerken\tCtrl+Shift+E" "Trai&ning" === "T&raining" "&ICS Client" === "&Internet Verbinding" "&Machine Match" === "&Computer Tweekamp" "&Pause\tPause" === "&Pauze\tPause" "&Accept\tF3" === "&Accepteer Uitdaging\tF3" "D&ecline\tF4" === "&Uitdaging afwijzen\tF4" "Re&match\tF12" === "&Opnieuw Uitdagen\tF12" "Call &Flag\tF5" === "&Vlag Gevallen\tF5" "&Draw\tF6" === "&Remise Aanbieden\tF6" "Ad&journ\tF7" === "A&fbreken\tF7" "A&bort\tF8" === "&Beindigen\tF8" "&Resign\tF9" === "&Geef Op\tF9" "Stop &Observing\tF10" === "&Stop met Toekijken\tF10" "Stop E&xamining\tF11" === "Stop met Anal&yseren\tF11" "&Upload to Examine" === "&Partij Overzenden" "Adjudicate to &White" === "Arbitreer Winst &Wit" "Adjudicate to &Black" === "Arbitreer Winst &Zwart" "Adjudicate &Draw" === "Arbitreer Re&mise" "Install 1st..." === "Installeer &eerste" "Install 2nd..." === "Installeer t&weede" "Engine #&1 Settings..." === "Programma #&1 Instellingen" "Engine #&2 Settings..." === "Programma #&2 Instellingen" "&Hint..." === "&Hint" "&Book..." === "&Boekzetten" "&Move Now\tCtrl+M" === "&Zet Onmiddelijk" "&Retract Move\tCtrl+X" === "Zet &Terugnemen" "&Mute all Sounds" === "Geluid &Uit" "&General..." === "&Algemeen..." "&Time Control...\tAlt+Shift+T" === "Speel&duur...\tAlt+Shift+T" "Common &Engine...\tAlt+Shift+U" === "&Globale Engine...\tAlt+Shift+U" "Ad&judications...\tAlt+Shift+J" === "Ar&bitrage...\tAlt+Shift+J" "&Load Game...\tAlt+Shift+L" === "&Inlees...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "&Opslag...\tAlt+Shift+S" "G&ame List..." === "&Partijenoverzicht..." "Soun&ds..." === "Ge&luiden..." "&ICS..." === "Internet &Schaakdiensten" "Add ICS..." === "Internet Schaakdienst &Toevoegen" "Comm&unications..." === "&Com-poort Instellingen..." "Save Settings &Now" === "Instellingen &Nu Opslaan" "Save Settings on E&xit" === "Inste&llingen Opslaan bij Afsluiten" "Help &Contents\tF1" === "&Help Inhoud\tF1" "Help &Index" === "Help Inde&x" "How to &Use Help" === "Help &Gebruiken" "&About WinBoard" === "WinBoard &Info" "White" === "Wit" "Promote" === "Promoveer" "Pawn" === "Pion" "Knight" === "Paard" "Bishop" === "Loper" "Rook" === "Toren" "Queen" === "Dame" "King" === "Koning" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "Aartsbischop" "Chancellor" === "Kanselier" ## Next 2 Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === "Olifant" "Cannon" === "Kanon" "Empty Square" === "Leeg Veld" "Black" === "Zwart" "Demote" === "Degradeer" "Clear Board " === "Leeg Bord" ## Next 3: Shogi pieces. "Gold" === "Goud" "Silver" === "Zilver" "Lance" === "Lans" "Drop" === "Inzetten" "Cop&y and Paste" === "Kopier en Plak" "&Copy" === "Kopier" "&Paste" === "Plak" "&Undo" === "Ongedaan Maken" "Cu&t" === "Knippen" "&Copy" === "Kopiren" "&Paste" === "Plakken" "Select &All" === "Alles Selecteren" DIALOGS: ABOUTBOX ## Pehaps copyright notices best left untranslated? "About WinBoard" === "Info" "OK" === "OK" "Chessboard for Windows" === "Schaakbord voor Windows" "Copyright 1991 Digital Equipment Corporation" === "" "Enhancements Copyright 1992-2014 Free Software Foundation" === "" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccin por scar Toledo G.". " " === "Nederlandse vertaling: H.G.Muller" "WinBoard 0.0.0" === "" ABOUTBOX2 ## Weird, it is needed? [Normally not. It is a built-in 'Easter Egg' joke.] "galactic" === "" TIME CONTROL DIALOG "Time Control" === "Speelduur Instellen" "Conventional chess clock" === "Klassieke Schaakklok" "Incremental clock" === "Incrementele Klok" "Cancel" === "Annuleren" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Gebruik pijltjestoetsen om kloktype te kiezen, en dan de tabulatortoets om de waarden te veranderen" "Fixed time per move" === "Gongschaak" "Number of moves:" === "Aantal zetten:" "Within number of minutes:" === "In aantal minuten:" "Initial number of minutes:" === "Aanvangstijd (min):" "Plus number of seconds per move:" === "Plus aantal seconden per zet:" "Maximum seconds per move:" === "Maximum seconden per zet" "Time-Odds Factors:" === "Tijdvoorgift Factoren:" "Engine #1:" === "Schaakprog 1:" "Engine #2:" === "Schaakprog 2:" LOAD OPTIONS DIALOG "Load Game Options" === "Opties voor Inlezen Partijen" "Load games with &automatic stepping" === "Stap &automatisch door partij" "&seconds per move" === "&seconden per zet" "when filtering game list on position, use thresholds:" === "Gebruikte drempels bij zoeken stelling:" "Search Mode: " === "Zoekmethode:" "Match exact &position" === "Alleen e&xacte stelling" "Match if position is s&ubset" === "M&ogelijk met extra materiaal" "Match material with e&xact pawn structure" === "Zelfde materiaal, met exacte &pion opstelling" "Match &material" === "Zelfde &materiaal" "Material &range (upper board-half is optional)" === "Materiaal&interval (bovenste bordhelft optioneel)" "Material &difference (optional material balanced)" === "Materiaal&verschil (optioneel deel evenwichtig)" "Also match reversed &colors" === "Accepteer ook verwisselde &kleuren" "Also match &left-right mirror image" === "Accepteer &links-rechts spiegeling" "minimum Elo for &best player" === "minimum Elo &beste speler" "minimum Elo for &weakest players" === "minimum Elo &zwakste speler" "or later &year" === "of een later &jaar" "co&nsecutive positions" === "opee&nvolgende stellingen" SAVE OPTIONS DIALOG "Save Game Options" === "Opties voor Opslaan Partijen" "Save As: " === "Opslaan als:" "Save games automatically" === "Sla partijen automatisch op" "Prompt for filename" === "Vraag telkens om bestandsnaam" "To file:" === "Op bestand:" "PGN" === "P G N" "Old" === "Oud formaat" "Browse..." === "Bladeren..." "Save out of book info in PGN" === "Uit-boek info opslaan in P G N" 1536 ## This dialog is only used in some older Windows versions, so you might not be ableto test it. "Open" === "Open" "File &Name:" === "Bestandsnaam:" "&Directories:" === "Map" "List Files of &Type:" === "List van bestandstypen" "Dri&ves:" === "Schijf" "&Help" === "Help" "&Index number:" === "Index nummer" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === "Communicatiepoort Instellingen" "Net&work..." === "Netwerk" "&Port:" === "Poort" "Data &Rate:" === "Data Snelheid" "Data &Bits:" === "Data Bits" "P&arity:" === "Pariteit" "&Stop Bits:" === "Stop Bits" "F&low:" === "Vloed" EDIT COMMENT "Edit Comment" === "Commentaar Bewerken" "&Clear" === "Wissen" PROMOTION POPUP "Promote to:" === "Promoveer tot:" ## next used in Shogi as promotion-popup header "Promote?" === "Promoveren?" "Promotion" === "Promotie" "&Queen" === "&Dame" "&Rook" === "&Toren" "&Bishop" === "&Loper" "K&night" === "&Paard" "&King" === "&Koning" "&Cancel" === "&Annuleren" "Chance&llor" === "Kan&selier" "&Archbishop" === "Aarts&bischop" "YES" === "&JA" "NO" === "&NEE" "C&entaur" === "&Centaur" GAME LIST "Game List" === "Partijenoverzicht" "&Load" === "&Inlezen" "&Prev" === "Vo&rige" "&Next" === "&Volgende" "&Close" === "&Sluiten" "Filter" === "&Filter" EDIT TAGS "Edit Tags" === "P G N Titels Bewerken" ERROR "ICS Interaction" === "ICS Interactie" "Dialog" === "Dialoog" "Error" === "Fout" ## I don't think the next will really appear ever. "Sorry Charlie" === "" COLORIZE "I C S Interaction Colors" === "I C S Interactie Kleuren" "Interaction Colors" === "Interactie Kleuren" "Premove" === "Voor&zet" "Alarm" === "Tijdnood Alarm" "Colors" === "Kleuren" "&Choose Color..." === "&Kies Kleur..." "&Bold" === "&Vet" "&Italic" === "&Cursief" "&Underline" === "&Onderstreep" "&Strikeout" === "&Doorstreep" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === "" "Question" === "Vraag" "Enter" === "" STARTUP DIALOG "WinBoard Startup" === "Opstarten WinBoard" "What would you like to do?" === "Waarvoor wilt u WinBoard gebruiken?" "&Play against a chess engine or match two engines" === "&Spelen tegen de computer, of twee programma's tegen elkaar" "&Use an Internet Chess Server" === "Een &Internet Schaakdienst gebruiken" "Just &view or edit game files" === "&Alleen partijen uit bestand bekijken of bewerken" "Specify Chess &Engines:" === "Specificeer Schaak&programma's" "Specify Chess &Server:" === "Specificeer Internet Schaak&dienst" "&Additional options" === "&Overige opties" INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === "Inde&x nummer" MOVE TYPE-IN "Type in a move" === "Type een zet" USER-NAME TYPE-IN "Type in your name" === "Typ uw naam" SOUND DIALOG "Sounds" === "Geluid" "&Event:" === "&Gebeurtenis" "&No sound" === "&Stilte" "&Default beep" === "Standaard &piepje" "&Built-in sound:" === "&Ingebouwd geluid" "&WAV file:" === "&WAV bestand:" "B&rowse..." === "&Bladeren..." "&Play" === "&Afspelen" "&Defaults" === "Stan&daard" GENERAL OPTIONS DIALOG ## pleace keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === "Algemene Instellingen" "Always on &Top" === "Altijd &Voorgrond" "Always &Queen Ctrl+Shift+Q" === "Alti&jd Dame Ctrl+Shift+Q" "Animate &Dragging" === "&Sleep Stukken" "&Animate Moving Ctrl+Shift+A" === "Sch&uif Stukken Ctrl+Shift+A" "Auto &Flag Ctrl+Shift+F" === "&Automatisch Vlag Claimen Ctrl+Shift+F" "Auto Flip &View" === "Automatische Bord &Orintatie" "Auto &Raise Board" === "Automatisch naar Voorgrond" "&Blindfold" === "&Blind Schaken" "Highlight Dra&gging" === "Toon &Doelveld(en)" "Highlight Last &Move" === "Acce&ntueer Laatste Zet" "Periodic &Updates" === "Period&iek &Bijwerken" "Ponder &Next Move Ctrl+Shift+P" === "Denk in &Tijd Tegenstander Ctrl+Shift+P" "&Popup Exit Message" === "Toon &Mededeling bij Afsluiten" "Popup Move &Errors" === "Waarschuw bij &Foute Zetten" "Show Butt&on Bar" === "Toon &Knoppenpaneel" "Show &Coordinates" === "Toon Bord&cordinaten" "&Show Thinking" === "Toon Bedenksels" "Test &Legality Ctrl+Shift+L" === "&Weiger Onreglemetaire Zetten Ctrl+Shift+L" "&Hide Thinking Ctrl+Shift+H" === "Verberg &Gedachten Ctrl+Shift+H" "&Info in Move History Ctrl+Shift+I" === "Scores in Zettenlijst Ctrl+Shift+I" "&Send Engine Think" === "Rapporteer Bedenksels" "E&xtended PGN Info Ctrl+Shift+X" === "Vermeld Scores in P G N Ctrl+Shift+X" "Highlight with Arro&w" === "Accentueren met &Pijl" "Displa&y Logos" === "Toon &Logo's" "One-Click Move" === "Tu&rbo-zet" ICS OPTIONS "ICS Options" === "Instellingen Internet Schaakdienst" "&Auto Comment" === "&Commentaar opvangen" "Auto &Observe" === "&Automatisch Toekijken" "&Get Move List" === "Ophalen Zetten&lijst" "&Local Line Editing" === "&Bewerk Regels ter Plaatse" "&Quiet Play" === "&Rustig Spelen" "&Premove" === "&Voorzet" "&White first move" === "&Wit's eerste zet" "&Black first move" === "&Zwart's eerste zet" "&Sound alarm at" === "&Waarschuw bij" "seconds" === "sec" "Choose..." === "Kies..." "Do ¬ colorize messages" === "Boodschappen &niet kleuren" "&Auto Kibitz" === "Auto-Kibitz" "Auto Kibit&z" === "" "See&k Graph" === "Zoek&grafiek" "auto-&Refresh" === "Zel&f-verversend" "Bckgnd Obser&ve" === "Verdekt Toekijken" "&Dual Board" === "&Dubbel Bord" "One-Click &Move" === "&Turbo-zet" "Background..." === "Achtergrond..." "&Defaults..." === "&Standaard..." "Startup &Chat Boxes:" === "&Kwebbelvensters:" "General" === "Algemeen" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === "Schaakbord Instellingen" "Defaults" === "Standaard" "Light Squares" === "Lichte Velden" "Dark Squares" === "Donkere Velden" "White Pieces" === "Witte Stukken" "Black Pieces" === "Zwarte Stukken" "Square Highlights" === "Accentuering" "Premove Highlights" === "Accentuering Voorzet" "Monochrome" === "Zwart-Wit" "All White" === "Beiden Wit" "Flip Black" === "Zwart Omkeren" "Use Board Textures" === "Bord inkleuren" "Use Piece Font" === "Externe stukken" "Suppress Grid" === "Onderdruk belijning" "Size" === "Bordgrootte" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "" "T&eeny" === "" "&Dinky" === "" "&Petite" === "" "Sl&im" === "" "&Small" === "" "Medi&ocre" === "" "&Middling" === "" "&Average" === "" "Mode&rate" === "" "Medi&um" === "" "Bul&ky" === "" "&Large" === "" "&Big" === "" "&Huge" === "" "&Giant" === "" "&Colossal" === "" "Tita&nic" === "" FONTS "Fonts" === "Lettertypen" "Current Board Size" === "Huidige Bordgrootte" "All Board Sizes" === "Alle Bordgroottes" "&Revert to Defaults" === "Gebruik Standaardwaarden" "Clocks" === "Klokken" "Messages" === "Mededelingen" "Coordinates" === "Cordinaten" "Tags" === "P G N Titels" "Comments" === "Commentaar" "I C S Interaction" === "I C S Interactie" "Piece Font" === "Externe stukken" "&Color..." === "Kleur..." "Move History, Engine Output" === "Zettenlijst, Overwogen Zetten" ADJUDICATIONS DIALOG "Adjudications" === "Arbitrage" "Ponder Next Move" === "Denk in Tijd Tegenstander" "Enable and Show Thinking (recommended)" === "Raporteer Bedenksels" "Hide Thinking when Playing against Human" === "Verberg Gedachten voor Gebruiker" "Periodic Updates (for Analysis Mode)" === "Periodiek Bijwerken (bij Analyse)" "Adjudications in non-ICS games" === "Arbitrage in Lokale Partijen" "Adjudicate draw after:" === "Geef Remise na:" "moves" === "zetten" "Win/loss adjudication threshold:" === "Win/verlies drempel" "centipawns" === "centi-pion" "&Verify Engine Claims" === "Controleer Partijresultaat" "Detect &Mates" === "Detecteer Mat en Pat" "Draw if &Insufficient Material" === "Remise als geen Matpotentieel" "Adjudicate &Trivial Draws" === "Arbitreer Simpele Remises" "Apply" === "Toepassen:" ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === "-zettenregel" "-fold repeats" === "-voudige herhaling" "Engine #1 Score is Absolute" === "Programma #1 geeft Score voor Wit" "Engine #2 Score is Absolute" === "Programma #2 geeft Score voor Wit" COMMON ENGINE DIALOG "Common Engine Settings" === "Globale Instellingen" "Polyglot Directory:" === "Polyglot Map:" "Hash Size (MB):" === "Tabelgrootte (MB):" "EGTB Path:" === "EGTB pad:" "EGTB Size (MB):" === "EGTB buffer (MB):" "Use Book:" === "Openingsboek:" "Max nr of CPUs:" === "Max aantal CPUs:" "First has Own Book" === "Prog #1 heeft eigen Boek" "Second has Own Book" === "Prog #2 heeft eigen Boek" "Book Depth:" === "Boekdiepte:" "Book Variation:" === "Boekvariatie:" "Default Match Games:" === "Partijen in Tweekamp" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "Schaakvarianten" "Variant" === "Schaakariant" "Board size:" === "Bordgrootte:" "ranks" === "rijen" "files" === "lijnen" "Holdings with room for:" === "Ruimte voor:" "pieces" === "stukken in de hand" "('-1' means defaults for selected variant)" === "('-1' betekent standaardwaarde voor gekozen variant)" VARIANT NAMES: "&normal" === "Standard" "&FRC" === "Chess960" "&wildcastle" === "" "&nocastle" === "" "&losers" === "" "&giveaway" === "weg&gevertje" "s&uicide" === "" "&3Check" === "" "&twokings" === "" "&atomic" === "" "cra&zyhouse" === "" "&bughouse" === "doorgeefschaak" "&Twilight" === "" "Sp&artan" === "Spartaans" "&shogi" === "Japans (&shogi)" "su&per" === "Superschaak" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "cylinder" "&fairy" === "sprookjes" "&makruk" === "Thais (&makruk)" "&gothic" === "Gotisch" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "&xiangqi" === "Chinees (&xiangqi)" NEW SHUFFLE GAME "New Shuffle Game" === "Willekeurig Opzetten" "&Start Position Number:" === "&Nummer Beginopstelling" "Random" === "&zomaar een" GAME-LIST OPTIONS DIALOG "Game List Options" === "Partijoverzicht Opties" "PGN &Tags:" === "PGN &Titels" "&Up" === "&Op" "&Down" === "&Neer" "Default" === "&Standaard" "Factory" === "&Fabrieks" "Restore to:" === "&Herstel naar:" MOVE HISTORY WINDOW "Move History" === "Zettenlijst" EVALUATION GRAPH "Evaluation Graph" === "Scoregrafiek" ENGINE OUTPUT WINDOW "Engine Output" === "Overwogen zetten" "%s (%d reversible plies)" === "%s (%d omkeerbare zetten)" "Engine #1" === "Programma #1" "NPS" === "" "Engine #2" === "Programma #1" CHAT BOXES "Chat Window" === "Kwebbelvenster" "Chat partner:" === "&Klets met" "Clear" === "&Wis" "Send" === "&Zend" winboard.c "&File" === "&Bestand" "&Edit" === "Be&werk" "&View" === "Beel&d" "&Mode" === "&Modus" "&Action" === "&Actie" "&Step" === "&Stap" "E&ngine" === "&Schaakprog" "&Options" === "&Opties" "&Help" === "&Help" "You can only start a match from the initial position." === "Een tweekamp kan alleen starten vanuit de openingsstelling" "Font name too long:" === "" "Font point size missing:" === "" "Can't parse color name %s" === "" "Unrecognized board size value" === "Ongeldige bordgrootte" "Unrecognized argument" === "Waarde onherkenbaar" "No value provided for argument" === "Waarde van optie ontbreekt" "Incomplete \\ escape in value for" === "Onvolledige \\ in waarde van" "Failed to open indirection file" === "Openen indirectie bestand mislukt" "Unrecognized boolean argument value" === "Onherkenbare waarde" "Unrecognized argument" === "Onherkenbaar argument" "Too many colors" === "Teveel kleuren" "&Minimize\tCtrl+F4" === "&Minimaliseer\tCtrl+F4" "White: %s" === "Wit: %s" "We only care about the height here" === "Alleen de hoogte telt hier" "Cannot build game list" === "Maken van partijenoverzicht mislukt" "Load Game from File" === "Partij van bestand inlezen" "Load Position from File" === "Stelling van bestand inlezen" "Save Game to File" === "Partij opslaan in bestand" "Save Diagram to File" === "Diagram opslaan in bestand" "Save Position to File" === "Stelling opslaan in bestand" "%s does not support analysis" === "%s kan niet analyseren" "Analyze Game from File" === "Analyseer Partij van Bestand" "Unable to activate help" === "Activeren helpprogramma mislukt" "Send to chess program:" === "Zend naar schaakprogramma:" "Send to second chess program:" === "Zend naar tweede schaakprogramma" "Direct Command" === "Rechtstreekse opdracht" "Error loading sound %s" === "Fout bij inlezen geluid %s" "Error playing sound %s" === "Fout bij afspelen geluid %s" "File open failed" === "Openen bestand mislukt" "Internal error in file dialog box" === "Interne fout in bestandsdialoog" "Option Error" === "Optie Fout" "Choose an option, or cancel to exit" === "Kies een optie, of annuleer" "Unable to activate help" === "" "Displayed move is not current" === "Getoonde zet is niet de huidige" "Could not parse move" === "Onbegrijpelijke zet" "%s:\nError code %d" === "%s:\nFout code %d" "Error" === "Fout" "Fatal Error" === "Fatale Fout" "Exiting" === "Afsluiten" "Note" === "Let op" "Error writing to chess program" === "Fout bij zenden naar schaakprogramma" "User" === "Gebruiker" "Unknown" === "Onbekend" "White" === "Wit" "Black" === "Zwart" "Save Game to File" === "Partij Opslaan in Bestand" "Not implemented" === "Niet Gemplementeerd" "Shout Text" === "" "SShout/CShout" === "" "Channel 1 Text" === "" "Channel Text" === "" "Kibitz Text" === "" "Tell Text" === "" "Challenge Text" === "" "Request Text" === "" "Seek Text" === "" "Normal Text" === "" "None" === "" "Pawn" === "Pion" "Knight" === "Paard" "Bishop" === "Loper" "Rook" === "Toren" "Queen" === "Dame" "Information" === "Informatie" wclipbrd.c "Unable to convert position to FEN." === "Kan stelling niet in FEN omzetten" "Unable to copy FEN to clipboard." === "Kan FEN niet naar klembord kopiren" "Cannot create temporary file name." === "Maken van tijdelijk opslagbestand mislukt" "Cannot open temporary file." === "Openen van tijdelijk opslagbestand mislukt" "Cannot write to temporary file." === "Schrijven naar tijdelijk opslagbestand mislukt" "Cannot reopen temporary file." === "Heropenen van tijdelijk opslagbestand mislukt" "Cannot determine size of file." === "Kan grootte van bestand niet bepalen" "Cannot allocate clipboard buffer." === "Reserveren ruimte op klembord mislukt" "Cannot read from temporary file." === "Lezen van tijdelijk opslagbestand mislukt" "Error reading from temporary file." === "Fout bij lezen van tijdelijk opslagbestand" "Cannot copy text to clipboard" === "Kan tekst niet naar klembord kopiren" "Unable to allocate memory for clipboard." === "Reserveren geheugenruimte voor klembord mislukt" "Unable to lock clipboard memory." === "Vergrendelen van klembordgeheugen mislukt" "Cannot unlock clipboard memory." === "Ontgrendelen van klembordgeheugen mislukt" "Cannot open clipboard." === "Openen klembord mislukt" "Cannot empty clipboard." === "Ledigen klembord mislukt" "Cannot copy text to clipboard." === "Kopiren van tekst naar klembord mislukt" "Cannot close clipboard." === "Afsluiten klembord mislukt" "Unable to paste FEN from clipboard." === "Plakken FEN vanaf klembord mislukt" "Unable to create temporary file." === "" "Error writing to temporary file." === "" "Unable to open clipboard." === "" "No text in clipboard." === "" "Unable to lock clipboard memory." === "" "Unable to allocate memory for text string." === "" "Unable to unlock clipboard memory." === "" "Unable to close clipboard." === "" woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === "Bladeren voor Geluidsbestand" "Can't parse com port settings" === "" "Option Error" === "Optie Fout" "Invalid data rate" === "" "Option Error" === "" "Failed to set comm port state;\r\ninvalid options?" === "" "Failed to set comm port state" === "" "Invalid load game step rate" === "" "Invalid save game file name" === "" "Browse for Auto Save File" === "Bladeren voor automatische partijopslag" "Invalid moves per time control" === "Ongeldig aantal zetten per periode" "Invalid minutes per time control" === "Ongeldig aantal minuten per periode" "Invalid increment" === "Ongeldige tijdophoging" "Invalid initial time" === "Ongeldige starttijd" "Changing time control during a game is not implemented" === "De speelduur kan niet veranderd worden als een partij nog bezig is" "Variant %s not supported by %s" === "Schaakvariant %s kan door %s niet gespeeld worden" "Warning: second engine (%s) does not support this!" === "Pas op: het tweede schaakprogramma (%s) kan dit niet!" "Invalid ICS Alarm Time" === "Ongeldige tijdnoodwaarschuwingstijd" "Invalid max time per move" === "Ongeldige maximum tijd per zet" "Invalid time-odds factor" === "Ongeldige tijdsvoorgiftfactor" "Choose Folder" === "Kies Map" "Choose Book" === "Kies Openingsboek" "Choose Polyglot Directory" === "Kies Polyglot Map" "Choose EGTB Directory:" === "Kies EGTB Map:" "Polyglot was not found in the specified folder!" === "Polyglot is niet aanwezig in de gekozen map!" wgamelist.c "No game selected" === "Geen partij geselecteerd" "Can't go forward any further" === "U bent al aan het eind" "Can't back up any further" === "U bent al aan het begin" "No game list" === "Geen partijenoverzicht" "Game List" === "Partijenoverzicht" "Game list not loaded or empty" === "Partijenoverzicht niet gemaakt of leeg" "%s - %d/%d games" === "%s - %d/%d partijen" wedittags.c "Edit Tags" === "P G N Titels Bewerken" "Tags" === "P G N Titels" "Error replacing tags." === "Fout bij vervangen P G N Titels" wsettings.c "%s Engine Settings (%s)" === "Instellingen %s Schaakprogramma" "OK" === "OK" "Cancel" === "Annuleren" wchat.c "Chat Window %s" === "Kwebbelvenster %s" backend.c "bad timeControl option %s" === "Misvormde speeltijd instelling" "bad searchTime option %s" === "misvormde zoektijd instelling" ## following to will appear in combinationslike "first engine" "first" === "eerste" "second" === "tweede" "protocol version %d not supported" === "protocol versie %d niet ondersteund" "Variant %s supported only in ICS mode" === "Schaakvariant %s werkt alleen op Internet Schaakdienst" "Unknown variant name %s" === "Onbekende schaakvariant %s" "Starting chess program" === "Schaakprogramma opstarten" "Could not open comm port %s" === "Kan com poort %s niet openen" "Could not connect to host %s, port %s" === "Verbinding maken met %s (poort %s) mislukt" "Unknown initialMode %s" === "Onbekende startmodus %s" "Can't have a match with no chess programs" === "Tweekamp is niet mogelik zonder schaakprogramma's" "Bad game file" === "Foutief partijenbestand" "Bad position file" === "Foutief stellingenbestand" "AnalyzeFile mode requires a game file" === "Partij analyseren vereist een partijenbestand" "Analysis mode requires a chess engine" === "Analyseren vereist een schaakprogramma" "Analysis mode does not work with ICS mode" === "Analyseren werkt niet met een Internet Schaakdienst" "MachineWhite mode requires a chess engine" === "Computer Wit verseist een schaakprogramma" "MachineWhite mode does not work with ICS mode" === "Computer Wit werkt niet met een Internet Schaakdienst" "MachineBlack mode requires a chess engine" === "Computer Zwart verseist een schaakprogramma" "MachineBlack mode does not work with ICS mode" === "Computer Zwart werkt niet met een Internet Schaakdienst" "TwoMachines mode does not work with ICS mode" === "Twee Programma's werkt niet met een Internet Schaakdienst" "TwoMachines mode requires a chess engine" === "Twee Programma's verseist een schaakprogramma" "Training mode requires a game file" === "Training vereist eenpartijenbestand" "Error writing to ICS" === "Fout bij zenden naar Interenet Schaakdienst" "Error reading from keyboard" === "Fout bij invoer toetsenbord" "Got end of file from keyboard" === "'Einde bestand' ontvangen van toetsenbord" "Error writing to display" === "Fout bij scrijven op beeldscherm" "Error gathering move list: two headers" === "Fout bij ophalen zettenlijst: twee koppen" "Error gathering move list: nested" === "Fout bij ophalen zettenlijst: n binnen ander" "Connection closed by ICS" === "Verbinding verbroken door Internet Schaakdienst" "Error reading from ICS" === "Fout bij ontvangen van Interenet Schaakdienst" "Failed to parse board string:\n\"%s\"" === "Onbegrijpelijk bord:\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === "Partij te lang" "Error gathering move list: extra board" === "Fout bij ophalen zettenlijst: extra bord" "Illegal move \"%s\" from ICS" === "Onreglementaire zet \"%s\" van Internet Schaakdienst" "Couldn't parse move \"%s\" from ICS" === "Onbegrijpelijke zet \"%s\" van Internet Schaakdienst" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "" "You are playing Black" === "U speelt met Zwart" "You are playing White" === "U speelt met Wit" "It is White's turn" === "Wit is aan zet" "It is Black's turn" === "Zwart is aan zet" "Displayed position is not current" === "Getoonde stelling is niet de huidige" "Illegal move" === "Onreglementaire zet" "End of game" === "Einde partij" "Incorrect move" === "Incorrecte zet" ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === "Onreglementaire zet \"%s\" van %s schaakprogramma" "Illegal move \"%s\" (rejected by %s chess program)" === "Onreglementaire zet \"%s\" (geweigerd door %s schaakprogramma)" "Failed to start %s chess program %s on %s: %s\n" === "Opstarten %s schaakprogramma %s op %s mislukt: %s\n" "Error writing to %s chess program" === "Fout bij zenden naar %s schaakprogramma" "Error: %s chess program (%s) exited unexpectedly" === "Fout: %s schaakprogramma onverwacht gestopt" "Error reading from %s chess program (%s)" === "Fout bij ontvangen van %s schaakprogramma (%s)" "Forfeit due to illegal move" === "Verloren wegens onreglementaire zet" "%s does not support analysis" === "%s kan niet analyseren" "Hint: %s" === "" "Machine accepts your draw offer" === "Schaakprogramma neemt remiseaanbod aan" "Machine offers a draw\nSelect Action / Draw to agree" === "Schaakprogramma bied remise aan\nKies Actie" "%s (only move)" === "%s (enige zet)" "Ambiguous move in ICS output: \"%s\"" === "Dubbelzinnige zet in bericht van Internet Schaakdienst: \"%s\"" "Illegal move in ICS output: \"%s\"" === "Onreglementaire zet in bericht van Internet Schaakdienst: \"%s\"" "Gap in move list" === "Lacune in zettenlijst" "Startup failure on '%s'" === "Opstarten '%s' mislukt" "Waiting for first chess program" === "Wacht op eerste schaakprogramma" "Waiting for second chess program" === "Wacht op tweede schaakprogramma" "Match %s vs. %s: final score %d-%d-%d" === "Tweekamp %s tegen %s: eindscore %d-%d-%d" "Stalemate" === "Pat" "Illegal move: %d.%s%s" === "Onreglementaire zet: %d.%s%s" "Ambiguous move: %d.%s%s" === "Dubelzinnige zet: %d.%s%s" "Can't open \"%s\"" === "Openen \"%s\" mislukt" "Cannot build game list" === "Maken partijenoverzicht mislukt" "No more games in this message" === "Geen partijen meer in dit bericht" "No game has been loaded yet" === "Er is nog geen partij ingelezen" "Game number out of range" === "Er is geen partij met dat nummer" "Can't seek on game file" === "Spoelen door partijenbestand mislukt" "Game not found in file" === "Het bestand bevat geen partij" "Bad FEN position in file" === "Ongeldige FEN stelling in bestand" "No moves in game" === "Partij zonder zetten" "No position has been loaded yet" === "Er is nog geen stelling ingelezen" "Can't seek on position file" === "Spoelen door stellingenbestand mislukt" "Position not found in file" === "Bestand bevat geen stelling" "Black to play" === "Zwart aan zet" "White to play" === "Wit aan zet" "You have edited the game history.\nUse Reload Same Game and make your move again." === "U heeft de partij bewerkt.\nGebruik Herlaad Partij en herhaaluw zet" "You have entered too many moves.\nBack up to the correct position and try again." === "U heeftteveel zetten ingevoerd.\nStap terug naarde juiste stelling, and probeer het opnieuw" "Displayed position is not current.\nStep forward to the correct position and try again." === "De getoonde stelling is niet de huidige.\nStap vooruit naar de juiste stelling en probeer het opnieuw" "You have not made a move yet" === "U heeft nog geen zet gedaan" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "Het cmail bericht is niet ingelezen.\nGebruik CMailbericht Herladen, en doe u zet opnieuw" "No unfinished games" === "Geen actieve partijen" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "" "Failed to invoke cmail" === "" "Waiting for reply from opponent\n" === "" "Still need to make move for game\n" === "" "Still need to make moves for both games\n" === "" "Still need to make moves for all %d games\n" === "" "Still need to make a move for game %s\n" === "" "No unfinished games\n" === "" "Ready to send mail\n" === "" "Still need to make moves for games %s\n" === "" "Edit comment" === "Commentaar Bewerken" "Edit comment on %d.%s%s" === "Commentaar op %d.%s%s" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "" "It is not White's turn" === "Wit is niet aan zet" "It is not Black's turn" === "Zwart is niet aan zet" "Wait until your turn,\nor select Move Now" === "Wacht op uw beurt,\nof kies nu een zet" "Starting second chess program" === "Bezig met opstarten tweede schaakprogramma" "Training mode off" === "Trainingmodus uit" "Training mode on" === "Trainingmodus aan" "Already at end of game" === "U bent alaan het eind" "Warning: You are still playing a game" === "Pas op: Uw partij is nog bezig" "Warning: You are still observing a game" === "Pas op: U bent nog toeschouwer bij een partij" "Warning: You are still examining a game" === "Pas op: U bent nog een partij aan het analyseren" "It is Black's turn" === "Zwart is aan zet" "It is White's turn" === "Wit is aan zet" "That square is occupied" === "Dat veld is bezet" "There is no pending offer on this move" === "Er is geen remiseaanbod gedaan op deze zet" "Your opponent is not out of time" === "Uw tegenstander is nog niet door zijn vlag" "Black offers a draw" === "Zwart biedt remise aan" "White offers a draw" === "Wit biedt remise aan" "You must make your move before offering a draw" === "U moet zetten voordat u remise aanbiedt" "You are not examining a game" === "U bent geenpartij aan het analyseren" "You can't revert while pausing" === "Herstellen gedurende een pauze is niet mogelijk" "It is your turn" === "U bent aan zet" "Wait until your turn" === "Wacht op uw beurt" "No hint available" === "Geen hint beschikbaar" "Analysis (%s)" === "Analyse (%s)" "Comment" === "Commentaar" "Comment on %d.%s%s" === "Commentaar op %d.%s%s" "Both flags fell" === "Bijde vlaggen zijn gevallen" "White's flag fell" === "Wit's vlag is gavalen" "Black's flag fell" === "Zwart's vlag is gevallen" "Bad FEN position in clipboard" === "Ongeldige FEN stelling op klembord" "No response from ICS" === "Geen respons van Internet Schaakdienst" "You cannot do this while you are playing or observing" === "Dit kan niet als u aan het spelen of toeschouwen bent" "Click in holdings to choose piece" === "Klik in de voorraad om een stuk te kiezen" "Click clock to clear board" === "Klik op klok voor leeg bord" "Pull pawn backwards to under-promote" === "Trek pion terug voor minor promotie" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === "Partij afgelazen" "White wins on time" === "Wit wint op tijd" "Black wins on time" === "Zwart wint op tijd" "Both players ran out of time" === "Beide spelers overschreden hun tijd" "White resigns" === "Wit geeft op" "Black resigns" === "Zwart geeft op" "White mates" === "Zwart staat mat" "Black mates" === "Wit staat mat" "Draw" === "Remise" "Draw agreed" === "Remise overeengekomen" "Xboard adjudication: King destroyed" === "XBoard arbitrage: Koning opgeblazen" "Xboard adjudication: Bare king" === "XBoard arbitrage: Kale koning" "Xboard adjudication: 3rd check" === "XBoard arbitrage: 3e schaakje" "Xboard adjudication: Stalemate" === "XBoard arbitrage: Pat" "Xboard adjudication: Checkmate" === "XBoard arbitrage: Schaakmat" "Xboard adjudication: Insufficient mating material" === "XBoard arbitrage: Geen matpotentiel" "Xboard adjudication: Trivial draw" === "XBoard arbitrage: Simpele remise" "XBoard adjudication: repetition draw" === "XBoard arbitrage: zettenherhaling" "Xboard adjudication: perpetual checking" === "XBoard arbitrage: eeuwig schaak" "Xboard adjudication: perpetual chasing" === "XBoard arbitrage: eeuwig najagen" "%Xboard adjudication: perpetual chasing of" === "XBoard arbitrage: eeuwig najagen van" "Xboard adjudication: 50-move rule" === "XBoard arbitrage: 50-zettenregel" "Draw claim: 50-move rule" === "Remise opgeist: 50-zettenregel" "Draw claim: 3-fold repetition" === "Remise opgeist: 3x zelfde stelling" "Draw claim: insufficient mating material" === "Remise opgeist: geen matpotentiel" "Xboard adjudication: long game" === "XBoard arbitrage: lange partij" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "XBoard: ongeldige zet: %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "XBoard: onreglementaire zet: %s (%c%c%c%c)%c" "Xboard adjudication" === "XBoard arbitrage" "User adjudication" === "Gebruiker arbitrage" "False win claim: '%s'" === "Onterechte winsteis: '%s'" "False draw claim: '%s'" === "Onterechte remiseis: '%s'" "xboard exit" === "XBoard afgesloten" # NEW STRINGS FOR EXPERIMENTAL TM VERSION: # MENU "Edit Boo&k..." === "Openingsboek Be&werken" "Edit Engine List..." === "&Lijst met Schaakprogs Bewerken..." "Load Engine..." === "&Schaakprogramma Wisselen..." "Tournament..." === "Toernooi..." # LOAD ENGINE DIALOG "First" === "Eerste" "Second" === "Tweede" "Choose File" === "Kies Bestand" "Choose Folder:" === "Kies Map:" "Select engine from list:" === "Kies schaakprog van &lijst:" "or specify one below:" === "of specificeer er een hieronder" "Nickname (optional):" === "Bijnaam (optioneel)" "Use nickname in PGN tag" === "Gebruik bijnaam in P G N titel" "Engine (*.exe):" === "&Schaakprog (*.exe)" "command-line parameters:" === "&Parameters bij opstartbevel" "directory:" === "&map:" "(Directory will be derived from engine path when left empty)" === "(de map wordt afgeleid van het pad wanneer u het leeg laat)" "Add this engine to the list" === "&Voeg schaakprogramma toe aan lijst" "Must not use GUI book" === "Gebruik gezamenlijk openings&boek niet" "UCI" === "&UCI" "WB protocol v1 (skip waiting for features)" === "WB protocol v&1 (wacht niet of 'features')" "UCCI / USI (uses specified /uxiAdapter)" === "UCCI/USI (gebruik ingestelde uxiAdapter)" "Force current variant with this engine" === "Alleen met huidige schaakvariant" "Load mentioned engine as" === "&Gebruik schaakprogramma als" "Load Engine" === "Wisselen Schaakprogramma" "You did not specify the engine executable" === "U heeft geen schaakprogramma (.exe bestand) gespecificeerd" "Select single engine from the group" === "Kies een schaakprogramma uit deze groep" # TOURNAMENT OPTIONS DIALOG "Tournament file:" === "Toernooibestand:" "If you specify an existing file, the rest of this dialog will be ignored." === "Als u een bestaand bestand aangeeft wordt de rest van deze dialoog genegeerd" "Otherwise, the file will be created, with the settings you specify below:" === "Zo niet, dan wordt het bestand aangemaakt met onderstaande gegevens" "Select Engine:" === "Selecteer Schaakprogramma" "Use Swiss pairing engine (cycles = rounds)" === "Zwitsers (cycli = rondes)" "Tourney type (0=RR, 1=gauntlet):" === "Toernooitype (0=competitie)" "Sync after cycle" === "Synchroniseer na cyclus" "Number of tourney cycles:" === "Aantal toernooicycli:" "Sync after round" === "Synchroniseer na ronde" "Games per Match / Pairing:" === "Partijen per paring/tweekamp" "File for saving tourney games:" === "Bestand voor toernooipartijen:" "Game File with Opening Lines:" === "Bestand met Openingszetten:" "Game Number:" === "Partijnummer" "File with Start Positions:" === "Bestand met Beginstellingen:" "Position Number:" === "Stellingnummer" "Step through lines/positions in file" === "Stap door openingen/stellingen in bestand" "Rewind after (0 = never):" === "Terugspoelen na: (0 = nooit)" "Use each line/position twice" === "Gebruik elke opening/stelling 2x" "Pause between Games (ms):" === "Pauze tussen partijen (ms):" "Tournament and Match Options" === "Toernooi en Tweekamp Instellingen" "Tourney participants:" === "Deelnemers:" "Replace Engine" === "Vervang Speler" "Upgrade Engine" === "Invaller" "Time Control..." === "Speelduur..." "Common Engine..." === "Glob. Instellingen..." "Clone Tourney" === "Kloon Toernooi" "Make all use GUI book by default" === "Gebruik openingsboek voor iedereen" "You must supply a tournament file,\nfor storing the tourney progress" === "U moet een toernooibestand specificeren,\nwaarin de voortgang kan worden bijgehouden" "Not enough participants" === "Niet genoeg deelnemers voor een dergelijk toernooi" "Continue Later" === "Straks afmaken" "First you must specify an existing tourney file to clone" === "U moet eerst een bestand om te klonen specificeren" "No engine %s is installed" === "Er is geen schaakprogramma %s genstalleerd" # THEMES DIALOG "Board themes" === "Schaakbord thema's" "Select theme from list:" === "Kies thema uit de lijst:" "or specify new theme below:" === "of specifficeer een nieuw thema hieronder:" "Theme name:" === "Thema naam:" "Use board textures" === "Kleur bord in" "Light-square texture:" === "Patroon lichte velden" "Dark-square texture:" === "Patroon donkere velden" "Dark reorientation mode:" === "donkere orientatiemethode:" "Light reorientation mode:" === "lichte orientatiemethode:" "Draw border around board" === "Bord met rand" "Optional border bitmap:" === "Rand afbeelding" " Beware: a specified piece font will prevail over piece bitmaps" === " Let op: een schaakfiguren lettertype prevaleert over plaatjes" "Directory with piece bitmaps:" === "Map met stukkenplaatjes" "Use piece font" === "Gebruik schaakfiguur lettertype" "Font size (%):" === "Afmeting lettertype(%)" "Font name:" === "Lettertype:" "Font piece to char:" === "Letters voor stukken:" "Delete Theme" === "Verwijder thema" "Select single theme from the group" === "Selecteer een enkel thema uit de groep" # book.c "Could not create book" === "Kon geen openingen bestand maken" "Polyglot book not valid" === "Polyglot openingboek ongeldig" "Hash keys are different" === "" "Book Fault" === "Boek fout" "Book file exists! Try again for overwrite." === "Openingsboek bestaat al. Probeer het nog eens om het te overschrijven." # NEW MENU ITEMS IN 4.7 "Save Games to &Book" === "Sla partijen op als openings&boek" "Colo&rs..." === "Kleu&ren..." "&Board Themes..." === "&Bord stijlen..." "Load &First Engine..." === "1e Schaakprogramma &Wisselen..." "Load &Second Engine..." === "2e &Schaakprogramma Wisselen..." "Auto &Create Logon" === "Bewaar login in&fo" JAWS strings # board coords, files "ay" === "a" "b" === "" "c" === "" "d" === "" "e" === "" "f" === "" "g" === "" "h" === "" "i" === "" "j" === "" "k" === "" "l" === "" # board coords, ranks "naught" === "nul" "zeroth" === "nulde" "first" === "eerste" "second" === "tweede" "third" === "derde" "fourth" === "vierde" "fifth" === "vijfde" "sixth" === "zesde" "seventh" === "zevende" "eighth" === "achtste" "nineth" === "negende" # piece names "White Pawn" === "Witte Pion" "White Knight" === "Wit Paard" "White Bishop" === "Witte Loper" "White Rook" === "Witte Toren" "White Queen" === "Witte Dame" "White Guard" === "Witte Paleiswacht" "White Elephant" === "Witte Olifant" "White Arch Bishop" === "Witte Aartsbischop" "White Chancellor" === "Witte Kanselier" "White General" === "Witte Generaal" "White Man" === "Witte Burger" "White Cannon" === "Wit Kanon" "White Night Rider" === "Witte Nachtruiter" "White Crowned Bishop" === "Witte Gekroonde Loper" "White Crowned Rook" === "Witte Gekroonde Toren" "White Grass Hopper" === "Witte Sprinkhaan" "White Veteran" === "Witte Veteraan" "White Falcon" === "Witte Valk" "White Amazon" === "Witte Amazone" "White Snake" === "Witte Cobra" "White Unicorn" === "Witte Eenhoorn" "White King" === "Witte Koning" "Black Pawn" === "Zwarte Pion" "Black Knight" === "Zwart Paard" "Black Bishop" === "Zwarte Loper" "Black Rook" === "Zwarte Toren" "Black Queen" === "Zwarte Dame" "Black Guard" === "Zwarte Paleiswacht" "Black Elephant" === "Zwarte Olifant" "Black Arch Bishop" === "Zwarte Aartsbischop" "Black Chancellor" === "Zwarte Kanselier" "Black General" === "Zwarte Generaal" "Black Man" === "Zwarte Burger" "Black Cannon" === "Zwart Kanon" "Black Night Rider" === "Zwarte Nachtruiter" "Black Crowned Bishop" === "Zwarte Gekroonde Loper" "Black Crowned Rook" === "Zwarte Gekroonde Toren" "Black Grass Hopper" === "Zwarte Sprinkhaan" "Black Veteran" === "Zwarte Veteraan" "Black Falcon" === "Zwarte Valk" "Black Amazon" === "Zwarte Amazone" "Black Snake" === "Zwarte Cobra" "Black Unicorn" === "Zwarte Eenhoorn" "Black King" === "Zwarte Koning" "Empty" === "Leeg" "Pawn" === "Pion" "Knight" === "Paard" "Bishop" === "Loper" "Rook" === "Toren" "Queen" === "Dame" "Guard" === "Paleiswacht" "Elephant" === "Olifant" "Arch Bishop" === "Aartsbischop" "Chancellor" === "Kanselier" "General" === "Generaal" "Man" === "Burger" "Cannon" === "Kanon" "Night Rider" === "Nachtruiter" "Crowned Bishop" === "Gekroonde Loper" "Crowned Rook" === "Gekroonde Toren" "Grass Hopper" === "Sprinkhaan" "Veteran" === "Veteraan" "Falcon" === "Valk" "Amazon" === "Amazone" "Snake" === "Cobra" "Unicorn" === "Eenhoorn" "King" === "Koning" # JAWS menu "Say Clock &Time\tAlt+T" === "Lees &Klokken\tAlt+T" "Say Last &Move\tAlt+M" === "Zeg Laatste &Zet\tAlt+M" "Say W&ho's Turn\tAlt+X" === "Zeg Wie &aan Zet is\tAlt+X" "Say Complete &Position\tAlt+P" === "Lees hele &Stelling op\tAlt+P" "Say &White Pieces\tAlt+W" === "Noem &Witte Stukken\tAlt+W" "Say &Black Pieces\tAlt+B" === "Noem &Zwarte Stukken\tAlt+B" "Say Board &Rank\tAlt+R" === "Lees &Rij op\tAlt+R" "Say Board &File\tAlt+F" === "Lees &Lijn Op\tAlt+F" "Say &Upper Diagonals\tAlt+U" === "Lees &Bovendiagonalen op\tAlt+U" "Say &Lower Diagonals\tAlt+L" === "Lees &Onderdiagonalen op\tAlt+L" "Say K&night Moves\tAlt+N" === "Noem &Paard Zetten\tAlt+N" "Say Current &Square\tAlt+S" === "Noem &Huidig Veld\tAlt+S" "Say &Attacks\tAlt+A" === "Noem Aan&vallers\tAlt+A" "Say Attacke&d\tAlt+D" === "Noem Aan&gevallenen\tAlt+D" "black holdings" === "zwarte voorraad" "white holdings" === "witte voorraad" "holdings" === "voorraad" "Your" === "Uw" "would have" === "zou hebben" "You must select a piece first" === "U moet eerst een stuk activeren" "possible captures from here are" === "Mogelijke slagzetten van hieruit" "None" === "Geen" "Pieces that can capture you are" === "Stukken die u kunt slaan zijn" "You are defended by" === "U staat gedekt door" "rank" === "rij" "empty" === "leeg" "file empty" === "lijn leeg" "The diagnol squares to your upper right contain" === "De diagonaal rechts boven u bevat" "There is no squares to your upper right" === "Er zijn geen velden rechts boven u" "The diagnol squares to your upper left contain" === "De diagonaal links boven u bevat" "There is no squares to your upper left" === "Er zijn geen velden links boven u" "The diagnol squares to your lower right contain" === "De diagonaal rechts onder u bevat" "There is no squares to your lower right" === "Er zijn geen velden rechts onder u" "The diagnol squares to your lower left contain" === "De diagonaal links onder u bevat" "There is no squares to your lower left" === "Er zijn geen velden links onder u" "The possible squares a Knight could move to are" === "Velden waareen paard heen zou kunnen zijn" "The squares a Knight could possibly attack from are" === "De velden van waaruit een paard u zou kunnen aanvallen zijn" "White pieces" === "Witte stukken" "Black pieces" === "Zwarte stukken" "Pieces" === "Stukken" "are located" === "bevinden zich" "at" === "op" "nowhere" === "nergens" "You strayed into the white holdings" === "U bent de witte voorraad binnengestapt" "You strayed into the black holdings" === "U bent de zwarte voorraad binnengestapt" "Your current position is" === "Uw huidige locatie is" "on a light square" === "op een licht veld" "on a dark square" === "op een donker veld" "white holds" === "wit heeft voorradig" "black holds" === "zwart heeft voorradig" "all" === "alles" "It is your turn" === "U bent aan zet" "It is your opponents turn" === "Uw tegenstander is aan zet" "White is on move here" === "Wit is aan zet" "Black is on move here" === "wart is aan zet" "score %s %d at %d ply" === "Score %d %d bij %d halve zetten" "plus" === "plus" "minus" === "minus" "promotion" === "promotie" "move" === "zet" "queen side castling" === "lange rokade" "king side castling" === "korte rokade" "dropped on" === "neergezet op" "to" === "naar" "Capturing a" === "en slaat een" "Capturing onn passann" === "en slaat en passant" "check" === "schaak" "finishing off" === "en verslaat" "white wins" === "wit wint" "black wins" === "zwart wint" "game ends in a draw" === "partij eindigt in remise" "draw" === "remise" "due to" === "vanwege" "illegal" === "onreglementair" "White clock" === "witte klok" "Black clock" === "zwarte klok" "is now" === "is nu" "on" === "aan" "off" === "uit" "selected" === "geactiveerd" "unselected" === "gedeactiveerd" "ponder" === "peins" "animate moving" === "verschuiven stukken" "auto flag" === "automatisch vlaggen" "always promote to queen" === "altijd to dame promoveren" "legality testing" === "weiger onreglementaire zetten" "hide thinking" === "verberg gedachten" "extended P G N info" === "scores in P G N" "extra info in move history" === "scores in zettenlijst" xboard-4.7.3/winboard/language/russian.lng0000644000175000001440000012675212262415351015515 00000000000000## WinBoard 4.5.1 language file ## Encoding: Win-1251 ## Win-1251 should be set as the default encoding for nonunicode programs (on WinXP) ## ## Russian/ ## v1.0 beta 1 ## ## Translation by Hr. Burunduk (2011.04.14) ## Based on the WinBoard 4.2.6 translation by A.V.Serdiukov (.., 2003) ## ## ## If you revise this, please insert your date, name and description. ## , , , , . ## For example: ## : ## 24-ago-2010. Juan Perez (j@xyz.p). Corrected translation for xyzzy. ## Notes for translators (can be deleted from he file after translation): ## Just write the translations between the second pair of quotes ## Things like %s, %d and %c must be preserved in the original order ## Empty translated strings will be ignored, so there is no reason ## to delete those for which you don't know a translation, ## and you can start testing everything immediately. ## Simply rename this file to LANGUAGE.lng, and WinBoard should see it, ## and allow you to use the option /language=LANGUAGE. ## You are encouraged to call up the corresponding WinBoard dialog while ## working on the translation, to see in which context the strings are used. ## This is why the strings below are sorted by dialog ## ## Of duplicats, only the first occurrence will be used, even if it was in ## a different dialog! For this reason you will only see an 'OK' in the ## About Box. After you translated it there, this translation will be used ## for all other dialogs as well. ## o Use ## for comments, to make iteasy to find them scattered throughout the translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. ## preferably it should be unique in the applicable menu, so it depends on translation of other items! winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "&New Game\tCtrl-N" === "& \tCtrl-N" "New Sh&uffle Game..." === " & ..." "New &Variant...\tAlt+Shift+V" === " &...\tAlt+Shift+V" "&Load Game...\tCtrl-O" === "& ...\tCtrl-O" "&Save Game...\tCtrl-S" === "& ...\tCtrl-S" "L&oad Position...\tCtrl+Shift+O" === "& ...\tCtrl+Shift+O" "S&ave Position...\tCtrl+Shift+S" === "& ...\tCtrl+Shift+S" "Save as &Diagram..." === " &..." "&Quit" === "&" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === " & \tAlt+PgDn"" "Load &Previous Game\tAlt+PgUp" === " & \tAlt+PgUp" "&Reload Same Game" === "& " "Load N&ext Position\tAlt+Shift+PgDn" === "& \tAlt+Shift+PgDn" "Load Pre&vious Position\tAlt+Shift+PgUp" === "& \tAlt+Shift+PgUp" "Reload Sa&me Position" === "& " "&Copy Game To Clipboard\tCtrl+C" === "& \tCtrl+C" "C&opy Position To Clipboard\tCtrl+Shift+C" === "& \tCtrl+Shift+C" "Copy Game List to Clipboard" === " & " "&Paste Game From Clipboard\tCtrl+V" === "& \tCtrl+V" "P&aste Position From Clipboard\tCtrl+Shift+V" === "& \tCtrl+Shift+V" "&Edit Game\tCtrl+E" === "& \tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "& \tCtrl+Shift+E" "Edit Ta&gs..." === "& ..." "Edit Co&mment..." === "& ..." "Enter &Username..." === "& ..." "&Revert\tHome" === "&\tHome" "&Annotate" === "& " "&Truncate Game\tEnd" === "& \tEnd" "&Backward\tAlt+Left" === "&\tAlt+Left" "&Forward\tAlt+Right" === "&\tAlt+Right" "Back to &Start\tAlt+Home" === " &\tAlt+Home" "For&ward to End\tAlt+End" === " &\tAlt+End" "Flip &View\tF2" === "& \tF2" "&Swap Clocks" === " & " "Engine &Output\tAlt+Shift+O" === "& \tAlt+Shift+O" "Move &History\tAlt+Shift+H" === " &\tAlt+Shift+H" "Evaluation &Graph\tAlt+Shift+E" === "& \tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "& \tAlt+Shift+G" "Open &New Chat Window" === " &" "Type In &Move...\tAlt+I" === "& ...\tAlt+I" "&Tags" === "&" "&Comments" === "&" "&Game List Tags..." === "& ..." "&Board..." === "&..." "&Fonts..." === "&..." "Machine &White\tCtrl+W" === " &\tCtrl+W" "Machine &Black\tCtrl+B" === " &\tCtrl+B" "&Two Machines\tCtrl+T" === "& \tCtrl+T" "Machine Both" === " &" "&Analysis Mode\tCtrl+A" === "&\tCtrl+A" "Analyze &File\tCtrl+F" === " &\tCtrl+F" "&Edit Game\tCtrl+E" === "& \tCtrl+E" "E&dit Position\tCtrl+Shift+E" === "& \tCtrl+Shift+E" "Trai&ning" === "&" "&ICS Client" === "& ICS" "&Machine Match" === " & " "&Pause\tPause" === "&" "&Accept\tF3" === "&\tF3" "D&ecline\tF4" === "&\tF4" "Re&match\tF12" === "&\tF12" "Call &Flag\tF5" === "& \tF5" "&Draw\tF6" === "&\tF6" "Ad&journ\tF7" === "&\tF7" "A&bort\tF8" === "&\tF8" "&Resign\tF9" === "&\tF9" "Stop &Observing\tF10" === " & \tF10" "Stop E&xamining\tF11" === " & \tF11" "&Upload to Examine" === "& " "Adjudicate to &White" === " &" "Adjudicate to &Black" === " &" "Adjudicate &Draw" === " &" "Install 1st..." === "1- & ..." "Install 2nd..." === "2- & ..." "Engine #&1 Settings..." === " &1..." "Engine #&2 Settings..." === " &2..." "&Hint..." === "&..." "&Book..." === "&..." "&Move Now\tCtrl+M" === " &!\tCtrl+M" "&Retract Move\tCtrl+X" === " &\tCtrl+X" "&Mute all Sounds" === " &" "&General..." === "&..." "&Time Control...\tAlt+Shift+T" === " &...\tAlt+Shift+T" "Common &Engine...\tAlt+Shift+U" === "& ...\tAlt+Shift+U" "Ad&judications...\tAlt+Shift+J" === "&...\tAlt+Shift+J" "&Load Game...\tAlt+Shift+L" === "&...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "&...\tAlt+Shift+S" "G&ame List..." === "& ..." "Soun&ds..." === "&..." "&ICS..." === "&ICS..." "Add ICS..." === "& ICS..." "Comm&unications..." === "&..." "Save Settings &Now" === "& " "Save Settings on E&xit" === " &" "Help &Contents\tF1" === "&\tF1" "Help &Index" === "&" "How to &Use Help" === " & " "&About WinBoard" === " & WinBoard" "White" === "" "Promote" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "King" === "" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "" "Chancellor" === "" ## Next 2 Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === " (.)" "Cannon" === "" "Empty Square" === " " "Black" === "" "Demote" === "" "Clear Board " === " " ## Next 3: Shogi pieces. "Gold" === "" "Silver" === "" "Lance" === "" "Drop" === "" "Cop&y and Paste" === " " "&Copy" === "" "&Paste" === "" "&Undo" === "" "Cu&t" === "" "&Copy" === "" "&Paste" === "" "Select &All" === " " DIALOGS: ABOUTBOX ## Pehaps copyright notices best left untranslated? "About WinBoard" === " WinBoard" "OK" === "OK" "Chessboard for Windows" === " Windows" "Copyright 1991 Digital Equipment Corporation" === "" "Enhancements Copyright 1992-2014 Free Software Foundation" === "" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccion por Oscar Toledo G.". " " === ": .. (2003), Hr.Burunduk (2011)" "WinBoard 0.0.0" === "" ABOUTBOX2 ## Weird, it is needed? [Normally not. It is a built-in 'Easter Egg' joke.] ## It's a "galactic software ltd." bitmap, no need to translate. "galactic" === "" TIME CONTROL DIALOG "Time Control" === " " "Conventional chess clock" === " " "Incremental clock" === " " "Cancel" === "" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === " , tab ." "Fixed time per move" === " " "Number of moves:" === " :" "Within number of minutes:" === " :" "Initial number of minutes:" === " , :" "Plus number of seconds per move:" === " :" "Maximum seconds per move:" === " :" "Time-Odds Factors:" === " :" "Engine #1:" === " 1-:" "Engine #2:" === " 2-:" LOAD OPTIONS DIALOG "Load Game Options" === " " "Load games with automatic stepping" === " " "seconds per move" === ". " SAVE OPTIONS DIALOG "Save Game Options" === " " "Save As: " === " : " "Save games automatically" === " " "Prompt for filename" === " " "To file:" === " :" "PGN" === "PGN" "Old" === "" "Browse..." === "..." "Save out of book info in PGN" === " PGN" 1536 ## This dialog is only used in some older Windows versions, so you might not be ableto test it. "Open" === "" "File &Name:" === " :" "&Directories:" === ":" "List Files of &Type:" === " :" "Dri&ves:" === ":" "&Help" === "&" "&Index number:" === ":" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === " COM-" "Net&work..." === "..." "&Port:" === ":" "Data &Rate:" === ":" "Data &Bits:" === " :" "P&arity:" === ":" "&Stop Bits:" === "-:" "F&low:" === ":" EDIT COMMENT "Edit Comment" === " " "&Clear" === "&" "&Edit" === "&" PROMOTION POPUP "Promote to:" === "" ## next used in Shogi as promotion-popup header "Promote?" === "?" "Promotion" === "" "&Queen" === "&" "&Rook" === "&" "&Bishop" === "&" "K&night" === "&" "&King" === "&" "&Cancel" === "&" "Chance&llor" === "&" "&Archbishop" === "&" "YES" === "" "NO" === "" "C&entaur" === "&" GAME LIST "Game List" === " " "&Load" === "&" "&Prev" === "" "&Next" === "" "&Close" === "&" "Filter" === "" EDIT TAGS "Edit Tags" === " " ERROR "ICS Interaction" === " ICS" "Dialog" === "" "Error" === "" ## I don't think the next will really appear ever. "Sorry Charlie" === ", !" COLORIZE "I C S Interaction Colors" === " ICS" "Interaction Colors" === " " "Premove" === " " "Alarm" === "" "Colors" === "" "&Choose Color..." === " " "&Bold" === "" "&Italic" === "" "&Underline" === "" "&Strikeout" === "" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === " - , ." "Question" === "" "Enter" === "" STARTUP DIALOG "WinBoard Startup" === " WinBoard" "What would you like to do?" === " " "&Play against a chess engine or match two engines" === "& " "&Use an Internet Chess Server" === "& " "Just &view or edit game files" === "& " "Specify Chess &Engines:" === " " "Specify Chess &Server:" === " " "&Additional options" === "& " INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === ":" MOVE TYPE-IN "Type in a move" === " " USER-NAME TYPE-IN "Type in your name" === " " SOUND DIALOG "Sounds" === "" "&Event:" === "" "&No sound" === " " "&Default beep" === " " "&Built-in sound:" === " :" "&WAV file:" === "WAV-" "B&rowse..." === "..." "&Play" === "" "&Defaults" === "" GENERAL OPTIONS DIALOG ## pleace keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === " " "Always on &Top" === " " "Always &Queen Ctrl+Shift+Q" === " CS+Q" "Animate &Dragging" === " " "&Animate Moving Ctrl+Shift+A" === " CS+A" "Auto &Flag Ctrl+Shift+F" === " CS+F" "Auto Flip &View" === " " "Auto &Raise Board" === " " "&Blindfold" === " " "Highlight Dra&gging" === " " "Highlight Last &Move" === " " "Periodic &Updates" === " " "Ponder &Next Move Ctrl+Shift+P" === " CS+P" "&Popup Exit Message" === " " "Popup Move &Errors" === " " "Show Butt&on Bar" === " " "Show &Coordinates" === " " "&Show Thinking" === " " "Test &Legality Ctrl+Shift+L" === " CS+L" "&Hide Thinking Ctrl+Shift+H" === " CS+H" "&Info in Move History Ctrl+Shift+I" === " CS+I" "&Send Engine Think" === " " "E&xtended PGN Info Ctrl+Shift+X" === " PGN CS+X" "Highlight with Arro&w" === " " "Displa&y Logos" === " " "One-Click Move" === " " ICS OPTIONS "ICS Options" === " ICS" "&Auto Comment" === "" "Auto &Observe" === " " "&Get Move List" === " " "&Local Line Editing" === " " "&Quiet Play" === " " "&Premove" === " " "&White first move" === "1- " "&Black first move" === "1- " "&Sound alarm at" === " " "seconds" === "." "Choose..." === "..." "Do ¬ colorize messages" === " " "&Auto Kibitz" === "" "Auto Kibit&z" === "" "See&k Graph" === " " "auto-&Refresh" === "" "Bckgnd Obser&ve" === " " "&Dual Board" === " " "One-Click &Move" === " " "Background..." === " ..." "&Defaults..." === "" "Startup &Chat Boxes:" === " (/ ;):" "General" === "" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === " " "Defaults" === "" "Light Squares" === " " "Dark Squares" === " " "White Pieces" === " " "Black Pieces" === " " "Square Highlights" === " " "Premove Highlights" === ". " "Monochrome" === "" "All White" === " " "Flip Black" === " " "Size" === "" BOARD SIZES ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "" "T&eeny" === "" "&Dinky" === "" "&Petite" === "" "Sl&im" === "" "&Small" === "" "Medi&ocre" === "" "&Middling" === "" "&Average" === "" "Mode&rate" === "" "Medi&um" === "" "Bul&ky" === "" "&Large" === "" "&Big" === "" "&Huge" === "" "&Giant" === "" "&Colossal" === "" "Tita&nic" === "" FONTS "Fonts" === "" "Current Board Size" === " " "All Board Sizes" === " " "&Revert to Defaults" === " " "Clocks" === "" "Messages" === "" "Coordinates" === "" "Tags" === "" "Comments" === "" "I C S Interaction" === " ICS" "&Color..." === "..." "Move History, Engine Output" === " , " ADJUDICATIONS DIALOG "Adjudications" === "" "Ponder Next Move" === " " "Enable and Show Thinking (recommended)" === " ()" "Hide Thinking when Playing against Human" === " " "Periodic Updates (for Analysis Mode)" === " ( )" "Adjudications in non-ICS games" === " ICS" "Adjudicate draw after:" === " " "moves" === "" "Win/loss adjudication threshold:" === "/ " "centipawns" === " " "&Verify Engine Claims" === " " "Detect &Mates" === " " "Draw if &Insufficient Material" === " " "Adjudicate &Trivial Draws" === " . " "Apply" === " " ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === " " "-fold repeats" === "- " "Engine #1 Score is Absolute" === " 1 - " "Engine #2 Score is Absolute" === " 2 - " COMMON ENGINE DIALOG "Common Engine Settings" === " " "Polyglot Directory:" === "Polyglot :" "Hash Size (MB):" === " ():" "EGTB Path:" === " :" "EGTB Size (MB):" === " ():" "Use Book:" === ":" "Max nr of CPUs:" === "Max CPU:" "First has Own Book" === " 1" "Second has Own Book" === " 2" "Book Depth:" === " :" "Book Variation:" === ":" "Default Match Games:" === " :" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "" "Variant" === "" "Board size:" === " " ## , . "ranks" === "" "files" === "" "Holdings with room for:" === " :" "pieces" === "" "('-1' means defaults for selected variant)" === "'-1' - " VARIANT NAMES: "&normal" === "" "&FRC" === " (960)" "&wildcastle" === "" "&nocastle" === "" "&losers" === " ()" "&giveaway" === "" "s&uicide" === "" "&3Check" === "3 " "&twokings" === "" "&atomic" === "" "cra&zyhouse" === "" "&bughouse" === "" "&Twilight" === "" "Sp&artan" === "" "&shogi" === "" "su&per" === "" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "" "&fairy" === "" "&makruk" === "" "&gothic" === "" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "Seira&wan" === "" "&xiangqi" === "" NEW SHUFFLE GAME "New Shuffle Game" === " " "&Start Position Number:" === " :" "Random" === "" GAME-LIST OPTIONS DIALOG "Game List Options" === " " "PGN &Tags:" === " PGN :" "&Up" === "" "&Down" === "" "Default" === "" "Factory" === "" "Restore to:" === " " MOVE HISTORY WINDOW "Move History" === " " EVALUATION GRAPH "Evaluation Graph" === " " ENGINE OUTPUT WINDOW "Engine output" === " " "Engine #1" === " 1" "NPS" === "NPS (./.)" "Engine #2" === " 2" CHAT BOXES "Chat Window" === " " "Chat partner:" === ":" "Clear" === "" "Send" === "." winboard.c "&File" === "&" "&Edit" === "&" "&View" === "&" "&Mode" === "&" "&Action" === "&" "&Step" === "&" "E&ngine" === "&" "&Options" === "&" "&Help" === "&" ## One-letter menu for small board sizes "&F" === "&" "&E" === "&" "&V" === "&" "&M" === "&" "&A" === "&" "&N" === "&" "&O" === "&" "&H" === "&?" "You can only start a match from the initial position." === " ." "Font name too long:" === " :" "Font point size missing:" === " :" "Can't parse color name %s" === " %s" "Unrecognized board size value" === " " "Unrecognized argument" === " " "No value provided for argument" === " " "Incomplete \\ escape in value for" === " \\ " "Failed to open indirection file" === " INI-" "Unrecognized boolean argument value" === " " "Unrecognized argument" === " " "Too many colors" === " " "&Minimize\tCtrl+F4" === "\tCtrl+F4" "White: %s" === ": %s" "We only care about the height here" === " " "Cannot build game list" === " " "Load Game from File" === " " "Load Position from File" === " " "Save Game to File" === " " "Save Diagram to File" === " " "Save Position to File" === " " "%s does not support analysis" === "%s " "Analyze Game from File" === " " "Unable to activate help" === " " "Send to chess program:" === " :" "Send to second chess program:" === " :" "Direct Command" === " " "Error loading sound %s" === " %s" "Error playing sound %s" === " %s" "File open failed" === " " "Internal error in file dialog box" === " " "Option Error" === " " "Choose an option, or cancel to exit" === " \"\" " "Unable to activate help" === " " "Displayed move is not current" === " " "Could not parse move" === " " "%s:\nError code %d" === "%s:\n %d" "Error" === "" "Fatal Error" === " " "Exiting" === "" "%s:\nError code %d" === "%s:\n %d" "Note" === "" "Error writing to chess program" === " " "User" === "" "Unknown" === "" "White" === "" "Black" === "" "Save Game to File" === " " "Not implemented" === " " "Shout Text" === "Shout" "SShout/CShout" === "" "Channel 1 Text" === "Channel 1" "Channel Text" === "Channel" "Kibitz Text" === "Kibitz" "Tell Text" === "Tell" "Challenge Text" === "Challenge" "Request Text" === "Request" "Seek Text" === "Seek" "Normal Text" === " " "None" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "Information" === "" wclipbrd.c "Unable to convert position to FEN." === " FEN." "Unable to copy FEN to clipboard." === " (FEN) ." "Cannot create temporary file name." === " ." "Cannot open temporary file." === " ." "Cannot write to temporary file." === " ." "Cannot reopen temporary file." === " ." "Cannot determine size of file." === " ." "Cannot allocate clipboard buffer." === " " "Cannot read from temporary file." === " ." "Error reading from temporary file." === " ." "Cannot copy text to clipboard" === " ." "Unable to allocate memory for clipboard." === " ." "Unable to lock clipboard memory." === " ." "Cannot unlock clipboard memory." === " ." "Cannot open clipboard." === " ." "Cannot empty clipboard." === " ." "Cannot copy text to clipboard." === " ." "Cannot close clipboard." === " ." "Unable to paste FEN from clipboard." === " (FEN) ." "Unable to create temporary file." === " ." "Error writing to temporary file." === " ." "Unable to open clipboard." === " ." "No text in clipboard." === " ." "Unable to lock clipboard memory." === " ." "Unable to allocate memory for text string." === " ." "Unable to unlock clipboard memory." === " ." "Unable to close clipboard." === " ." woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === " " "Can't parse com port settings" === " COM-." "Option Error" === " " "Invalid data rate" === " ." "Option Error" === " " "Failed to set comm port state;\r\ninvalid options?" === " COM-;\r\n ?" "Failed to set comm port state" === " COM-." "Invalid load game step rate" === " ." "Invalid save game file name" === " " "Browse for Auto Save File" === " " "Invalid moves per time control" === " " "Invalid minutes per time control" === " " "Invalid increment" === " " "Invalid initial time" === " " "Changing time control during a game is not implemented" === " " "Variant %s not supported by %s" === " %s %s" "Warning: second engine (%s) does not support this!" === ": (%s) !" "Invalid Alarm Time" === " ICS" "Invalid max time per move" === " " "Invalid time-odds factor" === " " "Choose Folder" === " " "Choose Book" === " " "Choose Polyglot Directory" === " Polyglot" "Choose EGTB Directory:" === " :" "Polyglot was not found in the specified folder!" === "Polyglot !" wgamelist.c "No game selected" === " " "Can't go forward any further" === " " "Can't back up any further" === " " "No game list" === " " "Game List" === " " "Game list not loaded or empty" === " " "%s - %d/%d games" === "%s - %d/%d " wedittags.c "Edit Tags" === " " "Tags" === "" "Error replacing tags." === " ." wsettings.c "%s Engine Settings (%s)" === " %s (%s)" "OK" === "OK" "Cancel" === "" wchat.c "Chat Window %s" === " %s" backend.c "bad timeControl option %s" === "timeControl: %s" "bad searchTime option %s" === "searchTime: %s" ## following to will appear in combinationslike "first engine" "first" === "1" "second" === "2" "protocol version %d not supported" === " %d " "Variant %s supported only in ICS mode" === " %s ICS" "Unknown variant name %s" === " %s" "Starting chess program" === " " "Could not open comm port %s" === " COM- %s" "Could not connect to host %s, port %s" === " %s, %s" "Unknown initialMode %s" === "initialMode: %s" "Can't have a match with no chess programs" === " " "Bad game file" === " " "Bad position file" === " " "AnalyzeFile mode requires a game file" === " : " "Analysis mode requires a chess engine" === " " "Analysis mode does not work with ICS mode" === " ICS" "MachineWhite mode requires a chess engine" === " \" \" " "MachineWhite mode does not work with ICS mode" === " \" \" ICS" "MachineBlack mode requires a chess engine" === " \" \" ()" "MachineBlack mode does not work with ICS mode" === " \" \" ICS" "TwoMachines mode does not work with ICS mode" === " \" \" ICS" "TwoMachines mode requires a chess engine" === " \" \" " "Training mode requires a game file" === " " "Error writing to ICS" === " ICS" "Error reading from keyboard" === " " "Got end of file from keyboard" === " " "Error writing to ICS" === " ICS" "Error writing to display" === " " "Error gathering move list: two headers" === " : " "Error gathering move list: nested" === " : " "Connection closed by ICS" === " ICS " "Error reading from ICS" === " ICS" "Failed to parse board string:\n\"%s\"" === " :\n\"%s\"" "Game too long; increase MAX_MOVES and recompile" === " : MAX_MOVES " "Error gathering move list: extra board" === " : " "Illegal move \"%s\" from ICS" === " "%s" ICS" "Couldn't parse move \"%s\" from ICS" === " "%s" ICS" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "" "You are playing Black" === " " "You are playing White" === " " "It is White's turn" === " " "It is Black's turn" === " " "Displayed position is not current" === " " "Illegal move" === " " "End of game" === " " "Incorrect move" === " " ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === " \"%s\" %s" "Illegal move \"%s\" (rejected by %s chess program)" === " \"%s\" ( %s)" "Failed to start %s chess program %s on %s: %s\n" === " %s %s %s: %s\n" "Error writing to %s chess program" === " %s" "Error: %s chess program (%s) exited unexpectedly" === ": %s (%s) " "Error reading from %s chess program (%s)" === " %s (%s)" "Forfeit due to illegal move" === " " "%s does not support analysis" === "%s " "Hint: %s" === ": %s" "Machine accepts your draw offer" === " " "Machine offers a draw\nSelect Action / Draw to agree" === " .\n , /" "%s (only move)" === "%s ( )" "Ambiguous move in ICS output: \"%s\"" === " ICS: \"%s\"" "Illegal move in ICS output: \"%s\"" === " ICS: \"%s\"" "Gap in move list" === " " "Game too long; increase MAX_MOVES and recompile" === " : MAX_MOVES " "Variant %s not supported by %s" === " %s %s" "Startup failure on '%s'" === " '%s'" "Waiting for first chess program" === " " "Waiting for second chess program" === " " "Match %s vs. %s: final score %d-%d-%d" === " %s %s: %d-%d-%d" "Stalemate" === "" "Illegal move: %d.%s%s" === " : %d.%s%s" "Ambiguous move: %d.%s%s" === " : %d.%s%s" "Can't open \"%s\"" === " \"%s\"" "Cannot build game list" === " " "No more games in this message" === " " "No game has been loaded yet" === " " "Can't back up any further" === " " "Game number out of range" === " - " "Can't seek on game file" === " " "Game not found in file" === " " "Bad FEN position in file" === " FEN " "No moves in game" === " " "No position has been loaded yet" === " " "Can't back up any further" === " " "Can't open \"%s\"" === " \"%s\"" "Can't seek on position file" === " " "Position not found in file" === " " "Bad FEN position in file" === " FEN " "Black to play" === " " "White to play" === " " "Can't open \"%s\"" === " \"%s\"" "You have edited the game history.\nUse Reload Same Game and make your move again." === " .\n \" \" ." "You have entered too many moves.\nBack up to the correct position and try again." === " .\n ." "Displayed position is not current.\nStep forward to the correct position and try again." === " .\n ." "You have not made a move yet" === " " "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === " CMail .\n \"Reload CMail Message\" ." "No unfinished games" === " " "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === " .\n .\n :\n\"cmail -remail -game %s\"\n ." "Failed to invoke cmail" === " cmail" "Waiting for reply from opponent\n" === " \n" "Still need to make move for game\n" === " \n" "Still need to make moves for both games\n" === " \n" "Still need to make moves for all %d games\n" === " %d \n" "Still need to make a move for game %s\n" === " %s\n" "No unfinished games\n" === " \n" "Ready to send mail\n" === " \n" "Still need to make moves for games %s\n" === " %s\n" "Edit comment" === " " "Edit comment on %d.%s%s" === " %d.%s%s" "Starting analysis mode...If this message stays up, your chess program does not support analysis." === " ...\n , , " "It is not White's turn" === " " "It is not Black's turn" === " " "Wait until your turn,\nor select Move Now" === " ,\n \" \"" "Starting second chess program" === " " "Training mode off" === " " "Training mode on" === "" "Already at end of game" === " " "Warning: You are still playing a game" === ": " "Warning: You are still observing a game" === ": " "Warning: You are still examining a game" === ": " "It is Black's turn" === " " "It is White's turn" === " " "That square is occupied" === " " "There is no pending offer on this move" === " " "Your opponent is not out of time" === " " "Black offers a draw" === " " "White offers a draw" === " " "You must make your move before offering a draw" === " , " "You are not examining a game" === " " "You can't revert while pausing" === " \"\"" "Wait until your turn,\nor select Move Now" === " ,\n \" \"" "It is your turn" === " " "Wait until your turn" === " " "No hint available" === " " "Analysis (%s)" === " (%s)" "Comment" === "" "Comment on %d.%s%s" === " %d.%s%s" "Both flags fell" === " " "White's flag fell" === " " "Black's flag fell" === " " "Bad FEN position in clipboard" === " FEN" "No response from ICS" === " ICS " "You cannot do this while you are playing or observing" === " " "Click in holdings to choose piece" === " , " END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === " " "White wins on time" === " " "Black wins on time" === " " "Both players ran out of time" === " " "White resigns" === " " "Black resigns" === " " "White mates" === " " "Black mates" === " " "Draw" === "" "Draw agreed" === " " "Xboard adjudication: King destroyed" === " Xboard: " "Xboard adjudication: Bare king" === " Xboard: " "Xboard adjudication: 3rd check" === " Xboard: " "Xboard adjudication: Stalemate" === " Xboard: " "Xboard adjudication: Checkmate" === " Xboard: " "Xboard adjudication: Insufficient mating material" === " Xboard: " "Xboard adjudication: Trivial draw" === " Xboard: " "XBoard adjudication: repetition draw" === " Xboard: - " "Xboard adjudication: perpetual checking" === " Xboard: " "Xboard adjudication: perpetual chasing" === " Xboard: " "%Xboard adjudication: perpetual chasing of" === " Xboard: " "Xboard adjudication: 50-move rule" === " Xboard: 50 " "Draw claim: 50-move rule" === " : 50 " "Draw claim: 3-fold repetition" === " : " "Draw claim: insufficient mating material" === " : " "Xboard adjudication: long game" === " Xboard: " "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "Xboard: - : %s (%c%c%c%c) res=%d" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "Xboard: - : %s (%c%c%c%c)%c" "Xboard adjudication" === " Xboard" "User adjudication" === " " "False win claim: '%s'" === " : '%s'" "False draw claim: '%s'" === " : '%s'" "xboard exit" === " Xboard" xboard-4.7.3/winboard/language/vietnamese.lng0000644000175000001440000007741112262415351016166 00000000000000## WinBoard language file ## ## LANGUAGE NAME IN ENGLISH / TRANSLATED ## v1.0 beta 1 ## ## Translation by Nguyen Pham (27 Jan 2011) ## Ngi dich: Pham Hng Nguyn (27/01/2011) ## xqfan.com ## ## If you revise this, please insert your date, name and description. ## TRANSLATION OF MESSAGE ABOVE ## ## For example: ## TRANSLATION OF FOR EXAMPLE ## 24-ago-2010. Juan Prez (j@xyz.p). Corrected translation for xyzzy. ## Notes for translators (can be deleted from he file after translation): ## Just write the translations between the second pair of quotes ## Things like %s, %d and %c must be preserved in the original order ## Empty translated strings will be ignored, so there is no reason ## to delete those for which you don't know a translation, ## and you can start testing everything immediately. ## Simply rename this file to LANGUAGE.lng, and WinBoard should see it, ## and allow you to use the option /language=LANGUAGE. ## You are encouraged to call up the corresponding WinBoard dialog while ## working on the translation, to see in which context the strings are used. ## This is why the strings below are sorted by dialog ## ## Of duplicats, only the first occurrence will be used, even if it was in ## a different dialog! For this reason you will only see an 'OK' in the ## About Box. After you translated it there, this translation will be used ## for all other dialogs as well. ## o Use ## for comments, to make iteasy to find them scattered throughout the translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. ## preferably it should be unique in the applicable menu, so it depends on translation of other items! winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "New &Game\tCtrl-N" === "Vn Mi\tCtrl-N" "New Sh&uffle Game..." === "Tro Bn..." "New &Variant...\tAlt+Shift+V" === "Bin Mi...\tAlt+Shift+&V" "&Load Game...\tCtrl-O" === "Tai Vn C...\tCtr&l-O" "&Save Game...\tCtrl-S" === "Lu Vn C...\tCtrl-&S" "L&oad Position...\tCtrl+Shift+O" === "Tai Th C...\tCtrl+Shift+&O" "S&ave Position...\tCtrl+Shift+S" === "Lu Th C...\tCtrl+Shift+S" "Save as &Diagram..." === "Lu Thnh Biu ..." "&Quit" === "Thot" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === "Tai V&n Tip\tAlt+PgDn" "Load &Previous Game\tAlt+PgUp" === "Tai Vn Trc" "&Reload Same Game" === "Tai Lai Vn C" "Load N&ext Position\tAlt+Shift+PgDn" === "Tai Th C Tip" "Load Pre&vious Position\tAlt+Shift+PgUp" === "Tai Th C Trc" "Reload Sa&me Position" === "Tai Lai Th C" "&Copy Game To Clipboard\tCtrl+C" === "&Chp Vn C Vo Clipboard\tCtrl+C" "C&opy Position To Clipboard\tCtrl+Shift+C" === "Chp Th C Vo Clipb&oard\tCtrl+Shift+C" "Copy Game List to Clipboard" === "Copy Danh Sch Cc Vn C Vo Clipboard" "&Paste Game From Clipboard\tCtrl+V" === "Dn Vn C T Clipboard\tCtrl+V" "P&aste Position From Clipboard\tCtrl+Shift+V" === "Dn Th C T Clipbo&ard\tCtrl+Shift+V" "&Edit Game\tCtrl+E" === "Soan Vn C\tCtrl+&E" "E&dit Position\tCtrl+Shift+E" === "Soan Th C\tCtrl+Shift+E" "Edit Ta&gs..." === "Soan Cc The..." "Edit &Comment..." === "Soan Binh Ch..." "Enter &Username..." === Nhp Username..." "&Revert\tHome" === "Ngc Lai\tHome" "&Annotate" === "Ch Giai" "&Truncate Game\tEnd" === "C&t Ngn Vn C\tEnd" "&Backward\tAlt+Left" === "Quay Tr Lai\tAlt+Left" "&Forward\tAlt+Right" === "i Tip\tAlt+Right" "Back to &Start\tAlt+Home" === "Quay Lai n u\tAlt+Home" "For&ward to End\tAlt+End" === "i Tip Ti Cui\tAlt+End" "Flip &View\tF2" === "Lt Ngc Bn C\tF2" "&Swap Clocks" === "i ng H" "Engine &Output\tAlt+Shift+O" === "In Ra Cua Cc Chng Trinh C\tAlt+Shift+&O" "Move &History\tAlt+Shift+H" === "Cc Nc i\tAlt+Shift+&H" "Evaluation &Graph\tAlt+Shift+E" === " Thi Lng &Gi\tAlt+Shift+E" "Game &List\tAlt+Shift+G" === "Danh Sch Cc Vn C\tA<+Shift+G" "Open &New Chat Window" === "M Ca S i Thoai Mi" "Type In &Move...\tAlt+I" === "Binh Ch Cho Nc i...\tAlt+I" "&Tags" === "Cc The" "&Comments" === "Binh &Ch" "&Game List Tags..." === "Cc The cua Danh Sch Vn C" "&Board..." === "&Bn C..." "&Fonts..." === "Cc &Fonts..." "Machine &White\tCtrl+W" === "My Chi Bn Trng\tCtrl+&W" "Machine &Black\tCtrl+B" === "My Chi &Bn en\tCtrl+B" "&Two Machines\tCtrl+T" === "My Chi Ca Hai Bn\tCtrl+&T" "Machine Both" === "My Chi Ca Hai Bn" "&Analysis Mode\tCtrl+A" === "Ch Phn Tch\tCtrl+&A" "Analyze &File\tCtrl+F" === "Phn Tch &File\tCtrl+F" "&Edit Game\tCtrl+E" === "Soan Thao Vn C\tCtrl+&E" "E&dit Position\tCtrl+Shift+E" === "Soan Thao Th C\tCtrl+Shift+E" "Trai&ning" === "a&ng Dy My" "&ICS Client" === "Kt Ni Chi Vi My Chu &ICS" "&Machine Match" === "Trn u Vi &My" "&Pause\tPause" === "Tam Dng\t&Pause" "&Accept\tF3" === "Chp Nhn\tF3" "D&ecline\tF4" === "T Chi\tF4" "Re&match\tF12" === "Chi Vn Na\tF12" "Call &Flag\tF5" === "t C\t&F5" "&Draw\tF6" === "Hoa\tF6" "Ad&journ\tF7" === "\tF7" "A&bort\tF8" === "Bo\tF8" "&Resign\tF9" === "Nhn Thua\tF9" "Stop &Observing\tF10" === "Ngng Xem" "Stop E&xamining\tF11" === "Ngng Th" "&Upload to Examine" === "Tai " "Adjudicate to &White" === "Phn X Trng Thng" "Adjudicate to &Black" === "Phn X en Thng" "Adjudicate &Draw" === "Phn X Hoa" "Install 1st..." === "Ci t Ngi Chi Th Nht" "Install 2nd..." === "Ci t Ngi Chi Th Hai" "Engine #&1 Settings..." === "t Tham S Cho Chng Trinh Chi 1..." "Engine #&2 Settings..." === "t Tham S Cho Chng Trinh Chi 2..." "&Hint..." === "Gi Y..." "&Book..." === "Cm Nang Khai Cuc..." "&Move Now\tCtrl+M" === "Phai i Ngay\tCtrl+M" "&Retract Move\tCtrl+X" === "Hoan Nc i Va Ri\tCtrl+X" "&Mute all Sounds" === "Ngng Pht m Thanh" "&General..." === "Chung..." "&Time Control...\tAlt+Shift+T" === "t Thi Gian...\tAlt+Shift+T" "Common &Engine...\tAlt+Shift+U" === "Chng Trinh C Chung...\tAlt+Shift+U" "Ad&judications...\tAlt+Shift+J" === "Phn X Kt Qua...\tAlt+Shift+J" "&Load Game...\tAlt+Shift+L" === "Tai Vn C...\tAlt+Shift+L" "&Save Game...\tAlt+Shift+S" === "Lu Vn C...\tAlt+Shift+S" "G&ame List..." === "Danh Sch Vn C" "Soun&ds..." === "m Thanh" "&ICS..." === "&ICS..." "Add ICS..." === "Thm ICS..." "Comm&unications..." === "Kt Ni...." "Save Settings &Now" === "Lu Cc Tham S &Ngay" "Save Settings on E&xit" === "Lu Cc Tham S Khi Kt Thc" "Help &Contents\tF1" === "Ni Dung Hng Dn" "Help &Index" === "Hng Dn" "How to &Use Help" === "S Dung Hng Dn" "&About WinBoard" === "Thng Tin V WinBoard" "White" === "Trng" "Promote" === "Phong Cp" "Pawn" === "Tt" "Knight" === "Ma" "Bishop" === "Tng" "Rook" === "Xe" "Queen" === "Hong Hu" "King" === "Vua" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "Si" "Chancellor" === "Xe" ## Next 2 Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === "Tng" "Cannon" === "Pho" "Empty Square" === " Trng" "Black" === "en" "Demote" === "" "Clear Board " === "Xa Bn C" ## Next 3: Shogi pieces. "Gold" === "Vng" "Silver" === "Bac" "Lance" === "ng" "Drop" === "t" "Cop&y and Paste" === "Chp v Dn" "&Copy" === "Chp" "&Paste" === "Dn" "&Undo" === "Lai Nh Trc" "Cu&t" === "Ct" "&Copy" === "Chp" "&Paste" === "Dn" "Select &All" === "Chon Tt Ca" DIALOGS: ABOUTBOX ## Pehaps copyright notices best left untranslated? "About WinBoard" === "Thng Tin V WinBoard" "OK" === "c" "Chessboard for Windows" === "Bn C Cho Windows" "Copyright 1991 Digital Equipment Corporation" === "Ban Quyn 1991 Digital Equipment Corporation" "Enhancements Copyright 1992-2014 Free Software Foundation" === "" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccin por scar Toledo G.". " " === "" "WinBoard 0.0.0" === "WinBoard 0.0.0" ABOUTBOX2 ## Weird, it is needed? [Normally not. It is a built-in 'Easter Egg' joke.] "galactic" === "" TIME CONTROL DIALOG "Time Control" === "Thi gian chi" "Conventional chess clock" === "ng h qui chun" "Incremental clock" === "ng h tng tin" "Cancel" === "Bo" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === "Dng cc phm mui tn chon kiu ng h mong mun, ri bm phm tab thay i gi tri." "Fixed time per move" === "Thi gian c inh cho mi nc i" "Number of moves:" === "S nc i" "Within number of minutes:" === "Trong s pht:" "Initial number of minutes:" === "Khi u vi s pht" "Plus number of seconds per move:" === "S giy thm cho mi nc:" "Maximum seconds per move:" === "S giy cc ai cho mi nc" "Time-Odds Factors:" === "H s thi gian le" "Engine #1:" === "Chng trinh c 1:" "Engine #2:" === "Chng trinh c 2:" LOAD OPTIONS DIALOG "Load Game Options" === "Cc La Chon Tai Vn C" "Load games with automatic stepping" === "Tai cc vn c v t ng i qun" "seconds per move" === "s giy mi nc" SAVE OPTIONS DIALOG "Save Game Options" === "Cc La Chon Lu Vn C" "Save Style" === "Kiu Lu" "Save games automatically" === "Lu t ng cc vn c" "Prompt for filename" === "Nhc tn file" "To file:" === "ra file:" "PGN" === "PGN" "Old" === "Cu" "Browse..." === "Xem" "Save out of book info in PGN" === "Lu thng tin khi ht cm nang khai cuc vo PGN" 1536 ## This dialog is only used in some older Windows versions, so you might not be ableto test it. "Open" === "M" "File &Name:" === "T&n File:" "&Directories:" === "Th Muc:" "List Files of &Type:" === "Danh Sch File Vi Kiu:" "Dri&ves:" === " ia:" "&Help" === "&Hng Dn" "&Index number:" === "Chi Muc:" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === "" "Net&work..." === "" "&Port:" === "" "Data &Rate:" === "" "Data &Bits:" === "" "P&arity:" === "" "&Stop Bits:" === "" "F&low:" === "" EDIT COMMENT "Edit Comment" === "Soan Binh Ch" "&Clear" === "Xa" "&Edit" === "Soan" PROMOTION POPUP "Promote to:" === "Phong cp thnh:" ## next used in Shogi as promotion-popup header "Promote?" === "Phong cp?" "Promotion" === "Phong cp" "&Queen" === "Hong Hu" "&Rook" === "Xe" "&Bishop" === "Tng" "K&night" === "Ma" "&King" === "Vua" "&Cancel" === "Bo" "Chance&llor" === "Xe" "&Archbishop" === "Si" "YES" === "ng Y" "NO" === "Khng" "C&entaur" === "" GAME LIST "Game List" === "Danh Sch Vn C" "&Load" === "Tai" "&Prev" === "Trc" "&Next" === "Tip" "&Close" === "ng" "Filter" === "Loc" EDIT TAGS "Edit Tags" === "Soan cc the" ERROR "ICS Interaction" === "" "Dialog" === "" "Error" === "" ## I don't think the next will really appear ever. "Sorry Charlie" === "" COLORIZE "I C S Interaction Colors" === "" "Interaction Colors" === "" "Premove" === "" "Alarm" === "" "Colors" === "" "&Choose Color..." === "" "&Bold" === "" "&Italic" === "" "&Underline" === "" "&Strikeout" === "" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === "" "Question" === "" "Enter" === "" STARTUP DIALOG "WinBoard Startup" === "WinBoard ang Khi ng" "What would you like to do?" === "Ban Mun Lm Gi?" "&Play against a chess engine or match two engines" === "Chi vi mt chng trinh c hoc cho hai chng trinh u vi nhau" "&Use an Internet Chess Server" === "Kt ni v chi vi mt my chu c" "Just &view or edit game files" === "Chi xem hoc soan thao cc file vn c" "Specify Chess &Engines:" === "Chon Cc Chng Trinh C:" "Specify Chess &Server:" === "Chon My Chu Chi C" "&Additional options" === "Cc la chon thm" INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === "S chi muc" MOVE TYPE-IN "Type in a move" === "" USER-NAME TYPE-IN "Type in your name" === "" SOUND DIALOG "Sounds" === "m thanh" "&Event:" === "S kin:" "&No sound" === "Khng m thanh" "&Default beep" === "Ting tt ngm inh" "&Built-in sound:" === "m thanh c sn" "&WAV file:" === "File m thanh WAV" "B&rowse..." === "Xem..." "&Play" === "Chi" "&Defaults" === "Ngm inh" GENERAL OPTIONS DIALOG ## pleace keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === "Cc La Chon Chung" "Always on &Top" === "Lun Ni Ln Trn" "Always &Queen Ctrl+Shift+Q" === "Lun L Hong Hu Ctrl+Shift+&Q" "Animate &Dragging" === "" "&Animate Moving Ctrl+Shift+A" === "" "Auto &Flag Ctrl+Shift+F" === "T ng t C" "Auto Flip &View" === "T ng Xoay Bn C" "Auto &Raise Board" === "T ng Hin Bn C" "&Blindfold" === "M Qung" "Highlight Dra&gging" === "nh Du Khi ang Ko Qun C" "Highlight Last &Move" === "nh Du Nc Cui" "Periodic &Updates" === "Cp Nht Theo Chu Ky" "Ponder &Next Move Ctrl+Shift+P" === "Tip Tuc Tnh Trc" "&Popup Exit Message" === "Bt Ca S Thot Chng trinh" "Popup Move &Errors" === "Bt Ca S Li Nc i" "Show Butt&on Bar" === "Hin Thanh Nt Bm" "Show &Coordinates" === "Hin Toa " "&Show Thinking" === "Hin Tnh Ton" "Test &Legality Ctrl+Shift+L" === "Kim Tra Hp &L" "&Hide Thinking Ctrl+Shift+H" === "n Suy Nghi" "&Info in Move History Ctrl+Shift+I" === "Thng Tin trong Nc i" "&Send Engine Think" === "Lnh Cho Chng Trinh Suy Nghi" "E&xtended PGN Info Ctrl+Shift+X" === "Thng Tin M rng Trong PGN" "Highlight with Arro&w" === "nh Du Vi Mui Tn" "Displa&y Logos" === "Hin Logo" "One-Click Move" === "i Qun Vi Chi Mt Bm" ICS OPTIONS "ICS Options" === "" "&Auto Comment" === "" "Auto &Observe" === "" "&Get Move List" === "" "&Local Line Editing" === "" "&Quiet Play" === "" "&Premove" === "" "&White first move" === "" "&Black first move" === "" "&Sound alarm at" === "" "seconds" === "" "Choose..." === "" "Do ¬ colorize messages" === "" "&Auto Kibitz" === "" "Auto Kibit&z" === "" "See&k Graph" === "" "auto-&Refresh" === "" "Bckgnd Obser&ve" === "" "&Dual Board" === "" "One-Click &Move" === "" "Background..." === "" "&Defaults..." === "" "Startup &Chat Boxes:" === "" "General" === "" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === "" "Defaults" === "" "Light Squares" === "" "Dark Squares" === "" "White Pieces" === "" "Black Pieces" === "" "Square Highlights" === "" "Premove Highlights" === "" "Monochrome" === "" "All White" === "" "Flip Black" === "" "Size" === "" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "" "T&eeny" === "" "&Dinky" === "" "&Petite" === "" "Sl&im" === "" "&Small" === "" "Medi&ocre" === "" "&Middling" === "" "&Average" === "" "Mode&rate" === "" "Medi&um" === "" "Bul&ky" === "" "&Large" === "" "&Big" === "" "&Huge" === "" "&Giant" === "" "&Colossal" === "" "Tita&nic" === "" FONTS "Fonts" === "" "Current Board Size" === "" "All Board Sizes" === "" "&Revert to Defaults" === "" "Clocks" === "" "Messages" === "" "Coordinates" === "" "Tags" === "" "Comments" === "" "I C S Interaction" === "" "&Color..." === "" "Move History, Engine Output" === "" ADJUDICATIONS DIALOG "Adjudications" === "" "Ponder Next Move" === "" "Enable and Show Thinking (recommended)" === "" "Hide Thinking when Playing against Human" === "" "Periodic Updates (for Analysis Mode)" === "" "Adjudications in non-ICS games" === "" "Adjudicate draw after:" === "" "moves" === "" "Win/loss adjudication threshold:" === "" "centipawns" === "" "&Verify Engine Claims" === "" "Detect &Mates" === "" "Draw if &Insufficient Material" === "" "Adjudicate &Trivial Draws" === "" "Apply" === "" ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === "" "-fold repeats" === "" "Engine #1 Score is Absolute" === "" "Engine #2 Score is Absolute" === "" COMMON ENGINE DIALOG "Common Engine Settings" === "" "Polyglot Directory:" === "" "Hash Size (MB):" === "" "EGTB Path:" === "" "EGTB Size (MB):" === "" "Use Book:" === "" "Max nr of CPUs:" === "" "First has Own Book" === "" "Second has Own Book" === "" "Book Depth:" === "" "Book Variation:" === "" "Default Match Games:" === "" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "" "Variant" === "" "Board size:" === "" "ranks" === "" "files" === "" "Holdings with room for:" === "" "pieces" === "" "('-1' means defaults for selected variant)" === "" VARIANT NAMES: "&normal" === "" "&FRC" === "" "&wildcastle" === "" "&nocastle" === "" "&losers" === "" "&giveaway" === "" "s&uicide" === "" "&3Check" === "" "&twokings" === "" "&atomic" === "" "cra&zyhouse" === "" "&bughouse" === "" "&Twilight" === "" "&shogi" === "" "su&per" === "" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "" "&fairy" === "" "&makruk" === "" "&gothic" === "" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "&xiangqi" === "" NEW SHUFFLE GAME "New Shuffle Game" === "" "&Start Position Number:" === "" "Random" === "" GAME-LIST OPTIONS DIALOG "Game List Options" === "" "PGN &Tags:" === "" "&Up" === "" "&Down" === "" "Default" === "" "Factory" === "" "Restore to:" === "" MOVE HISTORY WINDOW "Move History" === "" EVALUATION GRAPH "Evaluation Graph" === "" ENGINE OUTPUT WINDOW "Engine output" === "" "Engine #1" === "" "NPS" === "" "Engine #2" === "" CHAT BOXES "Chat Window" === "" "Chat partner:" === "" "Clear" === "" "Send" === "" winboard.c "&File" === "" "&Edit" === "" "&View" === "" "&Mode" === "" "&Action" === "" "&Step" === "" "E&ngine" === "" "&Options" === "" "&Help" === "" "You can only start a match from the initial position" === "" "Font name too long:" === "" "Font point size missing:" === "" "Can't parse color name %s" === "" "Unrecognized board size value" === "" "Unrecognized argument" === "" "No value provided for argument" === "" "Incomplete \\ escape in value for" === "" "Failed to open indirection file" === "" "Unrecognized boolean argument value" === "" "Unrecognized argument" === "" "Too many colors" === "" "&Minimize\tCtrl+F4" === "" "White: %s" === "" "We only care about the height here" === "" "Cannot build game list" === "" "Load Game from File" === "" "Load Position from File" === "" "Save Game to File" === "" "Save Position to File" === "" "%s does not support analysis" === "" "Analyze Game from File" === "" "Unable to activate help" === "" "Send to chess program:" === "" "Send to second chess program:" === "" "Direct Command" === "" "Error loading sound %s" === "" "Error playing sound %s" === "" "File open failed" === "" "Internal error in file dialog box" === "" "Option Error" === "" "Choose an option, or cancel to exit" === "" "Unable to activate help" === "" "Displayed move is not current" === "" "Could not parse move" === "" "%s:\nError code %d" === "" "Error" === "" "Fatal Error" === "" "Exiting" === "" "%s:\nError code %d" === "" "Note" === "" "Error writing to chess program" === "" "User" === "" "Unknown" === "" "White" === "" "Black" === "" "Save Game to File" === "" "Not implemented" === "" "Shout Text" === "" "SShout/CShout" === "" "Channel 1 Text" === "" "Channel Text" === "" "Kibitz Text" === "" "Tell Text" === "" "Challenge Text" === "" "Request Text" === "" "Seek Text" === "" "Normal Text" === "" "None" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "Information" === "" wclipbrd.c "Unable to convert position to FEN." === "" "Unable to copy FEN to clipboard." === "" "Cannot create temporary file name." === "" "Cannot open temporary file." === "" "Cannot write to temporary file." === "" "Cannot reopen temporary file." === "" "Cannot determine size of file." === "" "Cannot allocate clipboard buffer." === "" "Cannot read from temporary file." === "" "Error reading from temporary file." === "" "Cannot copy text to clipboard" === "" "Unable to allocate memory for clipboard." === "" "Unable to lock clipboard memory." === "" "Cannot unlock clipboard memory." === "" "Cannot open clipboard." === "" "Cannot empty clipboard." === "" "Cannot copy text to clipboard." === "" "Cannot close clipboard." === "" "Unable to paste FEN from clipboard." === "" "Unable to create temporary file." === "" "Error writing to temporary file." === "" "Unable to open clipboard." === "" "No text in clipboard." === "" "Unable to lock clipboard memory." === "" "Unable to allocate memory for text string." === "" "Unable to unlock clipboard memory." === "" "Unable to close clipboard." === "" woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === "" "Can't parse com port settings" === "" "Option Error" === "" "Invalid data rate" === "" "Option Error" === "" "Failed to set comm port state;\r\ninvalid options?" === "" "Failed to set comm port state" === "" "Invalid load game step rate" === "" "Invalid save game file name" === "" "Browse for Auto Save File" === "" "Invalid moves per time control" === "" "Invalid minutes per time control" === "" "Invalid increment" === "" "Invalid initial time" === "" "Changing time control during a game is not implemented" === "" "Variant %s not supported by %s" === "" "Warning: second engine (%s) does not support this!" === "" "Invalid ICS Alarm Time" === "" "Invalid max time per move" === "" "Invalid time-odds factor" === "" "Choose Folder" === "" "Choose Book" === "" "Choose Polyglot Directory" === "" "Choose EGTB Directory:" === "" "Polyglot was not found in the specified folder!" === "" wgamelist.c "No game selected" === "" "Can't go forward any further" === "" "Can't back up any further" === "" "No game list" === "" "Game List" === "" "Game list not loaded or empty" === "" "%s - %d/%d games" === "" wedittags.c "Edit Tags" === "" "Tags" === "" "Error replacing tags." === "" wsettings.c "%s Engine Settings (%s)" === "" "OK" === "" "Cancel" === "" backend.c "bad timeControl option %s" === "" "bad searchTime option %s" === "" ## following to will appear in combinationslike "first engine" "first" === "" "second" === "" "protocol version %d not supported" === "" "Variant %s supported only in ICS mode" === "" "Unknown variant name %s" === "" "Starting chess program" === "" "Could not open comm port %s" === "" "Could not connect to host %s, port %s" === "" "Unknown initialMode %s" === "" "Can't have a match with no chess programs" === "" "Bad game file" === "" "Bad position file" === "" "AnalyzeFile mode requires a game file" === "" "Analysis mode requires a chess engine" === "" "Analysis mode does not work with ICS mode" === "" "MachineWhite mode requires a chess engine" === "" "MachineWhite mode does not work with ICS mode" === "" "MachineBlack mode requires a chess engine" === "" "MachineBlack mode does not work with ICS mode" === "" "TwoMachines mode does not work with ICS mode" === "" "TwoMachines mode requires a chess engine" === "" "Training mode requires a game file" === "" "Error writing to ICS" === "" "Error reading from keyboard" === "" "Got end of file from keyboard" === "" "Error writing to ICS" === "" "Error writing to display" === "" "Error gathering move list: two headers" === "" "Error gathering move list: nested" === "" "Connection closed by ICS" === "" "Error reading from ICS" === "" "Failed to parse board string:\n\"%s\"" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Error gathering move list: extra board" === "" "Illegal move \"%s\" from ICS" === "" "Couldn't parse move \"%s\" from ICS" === "" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "" "You are playing Black" === "" "You are playing White" === "" "It is White's turn" === "" "It is Black's turn" === "" "Displayed position is not current" === "" "Illegal move" === "" "End of game" === "" "Incorrect move" === "" ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === "" "Illegal move \"%s\" (rejected by %s chess program)" === "" "Failed to start %s chess program %s on %s: %s\n" === "" "Error writing to %s chess program" === "" "Error: %s chess program (%s) exited unexpectedly" === "" "Error reading from %s chess program (%s)" === "" "Forfeit due to illegal move" === "" "%s does not support analysis" === "" "Hint: %s" === "" "Machine accepts your draw offer" === "" "Machine offers a draw\nSelect Action / Draw to agree" === "" "%s (only move)" === "" "Ambiguous move in ICS output: \"%s\"" === "" "Illegal move in ICS output: \"%s\"" === "" "Gap in move list" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Variant %s not supported by %s" === "" "Startup failure on '%s'" === "" "Waiting for first chess program" === "" "Waiting for second chess program" === "" "Match %s vs. %s: final score %d-%d-%d" === "" "Stalemate" === "" "Illegal move: %d.%s%s" === "" "Ambiguous move: %d.%s%s" === "" "Can't open \"%s\"" === "" "Cannot build game list" === "" "No more games in this message" === "" "No game has been loaded yet" === "" "Can't back up any further" === "" "Game number out of range" === "" "Can't seek on game file" === "" "Game not found in file" === "" "Bad FEN position in file" === "" "No moves in game" === "" "No position has been loaded yet" === "" "Can't back up any further" === "" "Can't open \"%s\"" === "" "Can't seek on position file" === "" "Position not found in file" === "" "Bad FEN position in file" === "" "Black to play" === "" "White to play" === "" "Can't open \"%s\"" === "" "You have edited the game history.\nUse Reload Same Game and make your move again." === "" "You have entered too many moves.\nBack up to the correct position and try again." === "" "Displayed position is not current.\nStep forward to the correct position and try again." === "" "You have not made a move yet" === "" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "" "No unfinished games" === "" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "" "Failed to invoke cmail" === "" "Waiting for reply from opponent\n" === "" "Still need to make move for game\n" === "" "Still need to make moves for both games\n" === "" "Still need to make moves for all %d games\n" === "" "Still need to make a move for game %s\n" === "" "No unfinished games\n" === "" "Ready to send mail\n" === "" "Still need to make moves for games %s\n" === "" "Edit comment" === "" "Edit comment on %d.%s%s" === "" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "Comenzando modo de anlisis...\nSi este mensaje permanece, su programa de ajedrez no admite anlisis." "It is not White's turn" === "" "It is not Black's turn" === "" "Wait until your turn,\nor select Move Now" === "" "Starting second chess program" === "" "Training mode off" === "" "Training mode on" === "" "Already at end of game" === "" "Warning: You are still playing a game" === "" "Warning: You are still observing a game" === "" "Warning: You are still examining a game" === "" "It is Black's turn" === "" "It is White's turn" === "" "That square is occupied" === "" "There is no pending offer on this move" === "" "Your opponent is not out of time" === "" "Black offers a draw" === "" "White offers a draw" === "" "You must make your move before offering a draw" === "" "You are not examining a game" === "" "You can't revert while pausing" === "" "Wait until your turn,\nor select Move Now" === "" "It is your turn" === "" "Wait until your turn" === "" "No hint available" === "" "Analysis (%s)" === "" "Comment" === "" "Comment on %d.%s%s" === "" "Both flags fell" === "" "White's flag fell" === "" "Black's flag fell" === "" "Bad FEN position in clipboard" === "" "No response from ICS" === "" "You cannot do this while you are playing or observing" === "" "Click in holdings to choose piece" === "" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === "Vn c bi bo d" "White wins on time" === "Trng thng thi gian" "Black wins on time" === "en thng thi gian" "Both players ran out of time" === "Ca hai bn ht thi gian" "White resigns" === "Trng Xin Thua" "Black resigns" === "en Xin Thua" "White mates" === "Trng Chiu Ht" "Black mates" === "en Chiu Ht" "Draw" === "Hoa" "Draw agreed" === "ng y hoa" "Xboard adjudication: King destroyed" === "" "Xboard adjudication: Bare king" === "" "Xboard adjudication: 3rd check" === "" "Xboard adjudication: Stalemate" === "" "Xboard adjudication: Checkmate" === "" "Xboard adjudication: Insufficient mating material" === "" "Xboard adjudication: Trivial draw" === "" "XBoard adjudication: repetition draw" === "" "Xboard adjudication: perpetual checking" === "" "Xboard adjudication: perpetual chasing" === "" "%Xboard adjudication: perpetual chasing of" === "" "Xboard adjudication: 50-move rule" === "" "Draw claim: 50-move rule" === "" "Draw claim: 3-fold repetition" === "" "Draw claim: insufficient mating material" === "" "Xboard adjudication: long game" === "" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "" "Xboard adjudication" === "" "User adjudication" === "" "False win claim: '%s'" === "" "False draw claim: '%s'" === "" "xboard exit" === "" xboard-4.7.3/winboard/res/0000755000175000001440000000000012262415351012400 500000000000000xboard-4.7.3/winboard/res/winboard.exe.manifest0000644000175000001440000000124412262415351016436 00000000000000 Winboard 32-bit application. xboard-4.7.3/winboard/bitmaps/0000755000175000001440000000000012262562252013251 500000000000000xboard-4.7.3/winboard/bitmaps/p33s.bmp0000644000175000001440000000050612262415351014457 00000000000000BMF>(!!} } ??????xboard-4.7.3/winboard/bitmaps/c72w.bmp0000644000175000001440000000163612262415351014456 00000000000000BM>(HH`??????xboard-4.7.3/winboard/bitmaps/f72w.bmp0000644000175000001440000000163612262415351014461 00000000000000BM>(HH`???????xboard-4.7.3/winboard/bitmaps/b58s.bmp0000644000175000001440000000101612262415351014445 00000000000000BM>(::} } ?? ??       ? ? ?xboard-4.7.3/winboard/bitmaps/q72s.bmp0000644000175000001440000000163612262415351014470 00000000000000BM>(HH`} } ????@??@@   ppx?x?x????????xboard-4.7.3/winboard/bitmaps/c58w.bmp0000644000175000001440000000101612262415351014452 00000000000000BM>(::} } ??????xboard-4.7.3/winboard/bitmaps/s72s.bmp0000644000175000001440000000163612262415351014472 00000000000000BM>(HH`??????????????~80|??xboard-4.7.3/winboard/bitmaps/e49w.bmp0000644000175000001440000000070612262415351014461 00000000000000BM>(11 0ǀǀ?>||???xboard-4.7.3/winboard/bitmaps/r80o.bmp0000644000175000001440000000177612262415351014471 00000000000000BM>(PP  ????????????????????????xboard-4.7.3/winboard/bitmaps/n45o.bmp0000644000175000001440000000064612262415351014461 00000000000000BM>(--h} } 888888888x/xxxxx~?]xboard-4.7.3/winboard/bitmaps/r87o.bmp0000644000175000001440000000212212262415351014462 00000000000000BMR>(WW} } ????????xboard-4.7.3/winboard/bitmaps/w72o.bmp0000644000175000001440000000163612262415351014472 00000000000000BM>(HH`??? ρ|??????????????y?p??????xboard-4.7.3/winboard/bitmaps/l45o.bmp0000644000175000001440000000064612262415351014457 00000000000000BM>(--h} } =}}}xboard-4.7.3/winboard/bitmaps/k21w.bmp0000644000175000001440000000022212262415351014446 00000000000000BM>(Txxxx8xboard-4.7.3/winboard/bitmaps/b54s.bmp0000644000175000001440000000075612262415351014453 00000000000000BM>(66} } x0||<| ?00000000xboard-4.7.3/winboard/bitmaps/a58w.bmp0000644000175000001440000000101612262415351014450 00000000000000BM>(::} } ? ????xboard-4.7.3/winboard/bitmaps/wn72s.bmp0000644000175000001440000000163612262415351014654 00000000000000BM>(HH`?? |~??????????~~~~? ?8??????xboard-4.7.3/winboard/bitmaps/r25s.bmp0000644000175000001440000000024212262415351014457 00000000000000BM>(d} } π????????cxboard-4.7.3/winboard/bitmaps/r54o.bmp0000644000175000001440000000075612262415351014467 00000000000000BM>(66} } ????xx>y>>xboard-4.7.3/winboard/bitmaps/m33w.bmp0000644000175000001440000000050612262415351014460 00000000000000BMF>(!!????xboard-4.7.3/winboard/bitmaps/p29s.bmp0000644000175000001440000000026212262415351014463 00000000000000BM>(t} } ????xboard-4.7.3/winboard/bitmaps/n29o.bmp0000644000175000001440000000026212262415351014455 00000000000000BM>(t} } 8888888x{xǽxxx???sxboard-4.7.3/winboard/bitmaps/a37w.bmp0000644000175000001440000000054612262415351014454 00000000000000BMf>(%%(} } xx 8x<???xx888xxboard-4.7.3/winboard/bitmaps/k58o.bmp0000644000175000001440000000101612262415351014452 00000000000000BM>(::} } ??s|??????0?<????xboard-4.7.3/winboard/bitmaps/a64s.bmp0000644000175000001440000000107612262415351014447 00000000000000BM>>(@@  ??g????????xboard-4.7.3/winboard/bitmaps/k80w.bmp0000644000175000001440000000177612262415351014472 00000000000000BM>(PP?????????xboard-4.7.3/winboard/bitmaps/q58s.bmp0000644000175000001440000000101612262415351014464 00000000000000BM>(::} } ???   ppp>x?????@?@?@|@||~?xboard-4.7.3/winboard/bitmaps/b33w.bmp0000644000175000001440000000050612262415351014445 00000000000000BMF>(!!???xboard-4.7.3/winboard/bitmaps/k116o.bmp0000644000175000001440000000357612262415351014542 00000000000000BM~>(tt@} } ????????>???????????~????????0??GG?G??????????>??????????xboard-4.7.3/winboard/bitmaps/a40s.bmp0000644000175000001440000000057612262415351014445 00000000000000BM~>(((@  >?_???xboard-4.7.3/winboard/bitmaps/k87s.bmp0000644000175000001440000000212212262415351014457 00000000000000BMR>(WW} } ??????<xx?<ǀp~<x~88~88~888~88p8~8<|x8~<x|<xp???cハ?ハ?ハハ?8??xboard-4.7.3/winboard/bitmaps/n72o.bmp0000644000175000001440000000163612262415351014461 00000000000000BM>(HH`} } ?????????????s?????σ3q??xboard-4.7.3/winboard/bitmaps/o72o.bmp0000644000175000001440000000163612262415351014462 00000000000000BM>(HH`??>?????????????????????????????????p??xboard-4.7.3/winboard/bitmaps/a54o.bmp0000644000175000001440000000075612262415351014446 00000000000000BM>(66} } 0|<<|0??'c?|||??xboard-4.7.3/winboard/bitmaps/cv37s.bmp0000644000175000001440000000054612262415351014640 00000000000000BMf>(%%(  ??? ''qxboard-4.7.3/winboard/bitmaps/p25o.bmp0000644000175000001440000000024212262415351014451 00000000000000BM>(d} } ߀߀xboard-4.7.3/winboard/bitmaps/f72o.bmp0000644000175000001440000000163612262415351014451 00000000000000BM>(HH`??Gg???(__t?????????<~xboard-4.7.3/winboard/bitmaps/a58o.bmp0000644000175000001440000000101612262415351014440 00000000000000BM>(::} } ? ?G?? ????????xboard-4.7.3/winboard/bitmaps/b29s.bmp0000644000175000001440000000026212262415351014445 00000000000000BM>(t} } 888_xboard-4.7.3/winboard/bitmaps/r25w.bmp0000644000175000001440000000024212262415351014463 00000000000000BM>(d?????????cxboard-4.7.3/winboard/bitmaps/w72w.bmp0000644000175000001440000000163612262415351014502 00000000000000BM>(HH`?????????????xboard-4.7.3/winboard/bitmaps/n58s.bmp0000644000175000001440000000101612262415351014461 00000000000000BM>(::} }  ?`|???<<xxx<???xboard-4.7.3/winboard/bitmaps/l49w.bmp0000644000175000001440000000070612262415351014470 00000000000000BM>(11???????????xboard-4.7.3/winboard/bitmaps/q21o.bmp0000644000175000001440000000022212262415351014444 00000000000000BM>(T  xxxxxxwXڈxboard-4.7.3/winboard/bitmaps/b40s.bmp0000644000175000001440000000057612262415351014446 00000000000000BM~>(((@  >??xboard-4.7.3/winboard/bitmaps/icon_ob.ico0000644000175000001440000000207612262415351015277 00000000000000 0& V( @@  %BPa X (   @@@@0@@0``0`E"*<Q@aA~??( @~??xboard-4.7.3/winboard/bitmaps/h72o.bmp0000644000175000001440000000163612262415351014453 00000000000000BM>(HH`?????????????s??? <>???σ3q??xboard-4.7.3/winboard/bitmaps/q29s.bmp0000644000175000001440000000026212262415351014464 00000000000000BM>(t} }  ?xxxx8888888瘇8}80axxboard-4.7.3/winboard/bitmaps/h49s.bmp0000644000175000001440000000070612262415351014460 00000000000000BM>(1177777777?O/G/Co!oo__߀  ? ߀/s`xboard-4.7.3/winboard/bitmaps/c45o.bmp0000644000175000001440000000064612262415351014446 00000000000000BM>(--h} } xϟx~~ϟxxxboard-4.7.3/winboard/bitmaps/p29o.bmp0000644000175000001440000000026212262415351014457 00000000000000BM>(t} } ϟ?xboard-4.7.3/winboard/bitmaps/r58o.bmp0000644000175000001440000000101612262415351014461 00000000000000BM>(::} } ????????????????????????????????????????????Ϟ|Ϟ|||xboard-4.7.3/winboard/bitmaps/b58o.bmp0000644000175000001440000000101612262415351014441 00000000000000BM>(::} } ? ?G?? ??????????????xboard-4.7.3/winboard/bitmaps/cv33s.bmp0000644000175000001440000000050612262415351014630 00000000000000BMF>(!!} } 88?88????@?@``< 07 @xboard-4.7.3/winboard/bitmaps/c37o.bmp0000644000175000001440000000054612262415351014446 00000000000000BMf>(%%(} } wwww88{{oooo{{88wwwwxboard-4.7.3/winboard/bitmaps/e33s.bmp0000644000175000001440000000050612262415351014444 00000000000000BMF>(!!0XFAÀǀðÀqxboard-4.7.3/winboard/bitmaps/b54w.bmp0000644000175000001440000000075612262415351014457 00000000000000BM>(660|<<|?xboard-4.7.3/winboard/bitmaps/c33w.bmp0000644000175000001440000000050612262415351014446 00000000000000BMF>(!!} } ???π????π???xboard-4.7.3/winboard/bitmaps/r25o.bmp0000644000175000001440000000024212262415351014453 00000000000000BM>(d} } ?ocxboard-4.7.3/winboard/bitmaps/a72s.bmp0000644000175000001440000000163612262415351014450 00000000000000BM>(HH`?~???0???????xboard-4.7.3/winboard/bitmaps/n29s.bmp0000644000175000001440000000026212262415351014461 00000000000000BM>(t} } 8x<xxx `'11{xboard-4.7.3/winboard/bitmaps/r108w.bmp0000644000175000001440000000337612262415351014560 00000000000000BM>(ll??xboard-4.7.3/winboard/bitmaps/unknown_14.ico0000644000175000001440000000044612262415351015671 00000000000000(<<xboard-4.7.3/winboard/bitmaps/a72w.bmp0000644000175000001440000000163612262415351014454 00000000000000BM>(HH`?~?????????xboard-4.7.3/winboard/bitmaps/b80o.bmp0000644000175000001440000000177612262415351014451 00000000000000BM>(PP  0? ~~????????????????xboard-4.7.3/winboard/bitmaps/n64w.bmp0000644000175000001440000000107612262415351014470 00000000000000BM>>(@@???????????@xboard-4.7.3/winboard/bitmaps/w33w.bmp0000644000175000001440000000050612262415351014472 00000000000000BMF>(!!??xboard-4.7.3/winboard/bitmaps/cv64s.bmp0000644000175000001440000000107612262415351014637 00000000000000BM>>(@@} } ??????c@c````0??0p@`8Ãxboard-4.7.3/winboard/bitmaps/analyze2_14.ico0000644000175000001440000000044612262415351015717 00000000000000(wwwwwwwpww?<  <xboard-4.7.3/winboard/bitmaps/board.ico0000644000175000001440000000207612262415351014756 00000000000000 & 0( @{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{( @xboard-4.7.3/winboard/bitmaps/cv54s.bmp0000644000175000001440000000075612262415351014642 00000000000000BM>(66} } ??????????33``p?0?8 pqAaxboard-4.7.3/winboard/bitmaps/p21s.bmp0000644000175000001440000000022212262415351014447 00000000000000BM>(T  xxxxboard-4.7.3/winboard/bitmaps/b129s.bmp0000644000175000001440000000512212262415351014526 00000000000000BMR >( } } ?????????p????xboard-4.7.3/winboard/bitmaps/dk72s.bmp0000644000175000001440000000163612262415351014626 00000000000000BM>(HH`????????ccc??xboard-4.7.3/winboard/bitmaps/k45o.bmp0000644000175000001440000000064612262415351014456 00000000000000BM>(--h} } ߀_p{xxxϟxxboard-4.7.3/winboard/bitmaps/n108o.bmp0000644000175000001440000000337612262415351014544 00000000000000BM>(ll} } ?????????????qpx?????ǟ????????srpxx|>????`xg|#CqGxboard-4.7.3/winboard/bitmaps/n58o.bmp0000644000175000001440000000101612262415351014455 00000000000000BM>(::} } ?????y??????G`p`Dgxboard-4.7.3/winboard/bitmaps/q25w.bmp0000644000175000001440000000024212262415351014462 00000000000000BM>(d"#"#"1c9c8w8ccxboard-4.7.3/winboard/bitmaps/cv33w.bmp0000644000175000001440000000050612262415351014634 00000000000000BMF>(!!} } pppp<x@??xboard-4.7.3/winboard/bitmaps/b116s.bmp0000644000175000001440000000357612262415351014535 00000000000000BM~>(tt@} } @???????@??@?xboard-4.7.3/winboard/bitmaps/h33o.bmp0000644000175000001440000000050612262415351014443 00000000000000BMF>(!!} } }?π߿ππߟߟA?c?gxboard-4.7.3/winboard/bitmaps/cv45s.bmp0000644000175000001440000000064612262415351014640 00000000000000BM>(--h??!~| @ ?? xboard-4.7.3/winboard/bitmaps/dk33s.bmp0000644000175000001440000000050612262415351014616 00000000000000BMF>(!!} } ?????xboard-4.7.3/winboard/bitmaps/r33w.bmp0000644000175000001440000000050612262415351014465 00000000000000BMF>(!!????xboard-4.7.3/winboard/bitmaps/r37s.bmp0000644000175000001440000000054612262415351014471 00000000000000BMf>(%%(} } xboard-4.7.3/winboard/bitmaps/g72w.bmp0000644000175000001440000000163612262415351014462 00000000000000BM>(HH`} } ???????<>>~?~???????????xboard-4.7.3/winboard/bitmaps/k37o.bmp0000644000175000001440000000054612262415351014456 00000000000000BMf>(%%(} } ?C|pwxxwwx|wxboard-4.7.3/winboard/bitmaps/p40w.bmp0000644000175000001440000000057612262415351014470 00000000000000BM~>(((@??xboard-4.7.3/winboard/bitmaps/a72o.bmp0000644000175000001440000000163612262415351014444 00000000000000BM>(HH`?~?~<????p???????xboard-4.7.3/winboard/bitmaps/wl49s.bmp0000644000175000001440000000070612262415351014653 00000000000000BM>(11?@_ 8>p_p ???xboard-4.7.3/winboard/bitmaps/n25o.bmp0000644000175000001440000000024212262415351014447 00000000000000BM>(d} } {Njπw?Wxboard-4.7.3/winboard/bitmaps/r49s.bmp0000644000175000001440000000070612262415351014472 00000000000000BM>(11} } ?????xboard-4.7.3/winboard/bitmaps/as33o.bmp0000644000175000001440000000050612262415351014617 00000000000000BMF>(!!ހݾ]}ww므߀o{{}]׽{{{߀޽{{ۀxboard-4.7.3/winboard/bitmaps/q45w.bmp0000644000175000001440000000064612262415351014474 00000000000000BM>(--h ``00``00`08x8x|xx|x|~x~x8~~~?||~?xboard-4.7.3/winboard/bitmaps/a33s.bmp0000644000175000001440000000050612262415351014440 00000000000000BMF>(!!} } xboard-4.7.3/winboard/bitmaps/cv64o.bmp0000644000175000001440000000107612262415351014633 00000000000000BM>>(@@} } ???????>???>???>?>?>?39?y?????~?|qgO????ý33xboard-4.7.3/winboard/bitmaps/k21o.bmp0000644000175000001440000000022212262415351014436 00000000000000BM>(T  xxxx8w'xboard-4.7.3/winboard/bitmaps/b95w.bmp0000644000175000001440000000226212262415351014456 00000000000000BM>(__t????????xboard-4.7.3/winboard/bitmaps/l49o.bmp0000644000175000001440000000070612262415351014460 00000000000000BM>(11????????~?xboard-4.7.3/winboard/bitmaps/l40s.bmp0000644000175000001440000000057612262415351014460 00000000000000BM~>(((@  )????xboard-4.7.3/winboard/bitmaps/q129w.bmp0000644000175000001440000000512212262415351014551 00000000000000BMR >( ?88<<<<<<?~~??~~?~~??????????????????xboard-4.7.3/winboard/bitmaps/k45w.bmp0000644000175000001440000000064612262415351014466 00000000000000BM>(--hxx88888xx?xboard-4.7.3/winboard/bitmaps/l54s.bmp0000644000175000001440000000075612262415351014465 00000000000000BM>(66  Ix0?0000000000000???xboard-4.7.3/winboard/bitmaps/c33s.bmp0000644000175000001440000000050612262415351014442 00000000000000BMF>(!!} } ?π77 0??   ?? 077π?xboard-4.7.3/winboard/bitmaps/n72w.bmp0000644000175000001440000000163612262415351014471 00000000000000BM>(HH`?????????p?0p??xboard-4.7.3/winboard/bitmaps/q45o.bmp0000644000175000001440000000064612262415351014464 00000000000000BM>(--h} } O-ٝϝϞooooo{{}x{}x}~x~x8X~~~?}}~?xboard-4.7.3/winboard/bitmaps/n45w.bmp0000644000175000001440000000064612262415351014471 00000000000000BM>(--h888888888xxxxxx~?xboard-4.7.3/winboard/bitmaps/as49o.bmp0000644000175000001440000000070612262415351014630 00000000000000BM>(11o{w߀_￀^z{~o?߿~߀w߀?߿_~~߽߿~~~~߿߿￀?xboard-4.7.3/winboard/bitmaps/k29w.bmp0000644000175000001440000000026212262415351014462 00000000000000BM>(tx88x0`xboard-4.7.3/winboard/bitmaps/as72o.bmp0000644000175000001440000000163612262415351014627 00000000000000BM>(HH`?88Ϗ|~|<<<~????G8<|~~>(@@  ?p?????x??????`q`88`ppp? 0?8899s?pa?<p< 0?3333s?xboard-4.7.3/winboard/bitmaps/cv54o.bmp0000644000175000001440000000075612262415351014636 00000000000000BM>(66} } y>y>x>x>?g????7xboard-4.7.3/winboard/bitmaps/k25w.bmp0000644000175000001440000000024212262415351014454 00000000000000BM>(d?Axboard-4.7.3/winboard/bitmaps/c33o.bmp0000644000175000001440000000050612262415351014436 00000000000000BMF>(!!} } π7?π￀_￀π?7πxboard-4.7.3/winboard/bitmaps/b29o.bmp0000644000175000001440000000026212262415351014441 00000000000000BM>(t} } 8}8?/{}ϟxboard-4.7.3/winboard/bitmaps/h49w.bmp0000644000175000001440000000070612262415351014464 00000000000000BM>(11???`xboard-4.7.3/winboard/bitmaps/q58o.bmp0000644000175000001440000000101612262415351014460 00000000000000BM>(::} } ??? ?<@xlax|?p|?bx?fy?'y'qcssO#qO'y>?'???????@?@|@π|Ϟ||~xboard-4.7.3/winboard/bitmaps/n21w.bmp0000644000175000001440000000022212262415351014451 00000000000000BM>(Tр@ 88xxboard-4.7.3/winboard/bitmaps/k64w.bmp0000644000175000001440000000107612262415351014465 00000000000000BM>>(@@?????????????????xboard-4.7.3/winboard/bitmaps/n80s.bmp0000644000175000001440000000177612262415351014471 00000000000000BM>(PP  <<<<<<<<<<<==yyAy`y y0?y{ ?@` 0??<<x88?<???xboard-4.7.3/winboard/bitmaps/a33w.bmp0000644000175000001440000000050612262415351014444 00000000000000BMF>(!!} } xboard-4.7.3/winboard/bitmaps/p45s.bmp0000644000175000001440000000064612262415351014467 00000000000000BM>(--h} } ????xboard-4.7.3/winboard/bitmaps/c40w.bmp0000644000175000001440000000057612262415351014453 00000000000000BM~>(((@  ~xboard-4.7.3/winboard/bitmaps/p108w.bmp0000644000175000001440000000337612262415351014556 00000000000000BM>(ll????xboard-4.7.3/winboard/bitmaps/k54w.bmp0000644000175000001440000000075612262415351014470 00000000000000BM>(66??????||<<<<<<|| |xboard-4.7.3/winboard/bitmaps/k40s.bmp0000644000175000001440000000057612262415351014457 00000000000000BM~>(((@  ? x0_}?/6" k I @"0oϟxboard-4.7.3/winboard/bitmaps/n54w.bmp0000644000175000001440000000075612262415351014473 00000000000000BM>(66|<<<<<<<<<<<|||?|||p? >?xboard-4.7.3/winboard/bitmaps/f72s.bmp0000644000175000001440000000163612262415351014455 00000000000000BM>(HH`9?p?????????xboard-4.7.3/winboard/bitmaps/b116o.bmp0000644000175000001440000000357612262415351014531 00000000000000BM~>(tt@} } ?p??@???A??????????????xboard-4.7.3/winboard/bitmaps/n25w.bmp0000644000175000001440000000024212262415351014457 00000000000000BM>(dx?Gxboard-4.7.3/winboard/bitmaps/c37w.bmp0000644000175000001440000000054612262415351014456 00000000000000BMf>(%%(} } 8888xboard-4.7.3/winboard/bitmaps/r95s.bmp0000644000175000001440000000226212262415351014472 00000000000000BM>(__t} } ???????????xboard-4.7.3/winboard/bitmaps/n116w.bmp0000644000175000001440000000357612262415351014555 00000000000000BM~>(tt@??p0????? ????xboard-4.7.3/winboard/bitmaps/p40s.bmp0000644000175000001440000000057612262415351014464 00000000000000BM~>(((@  ??xboard-4.7.3/winboard/bitmaps/k116s.bmp0000644000175000001440000000357612262415351014546 00000000000000BM~>(tt@} } ??x?????????x??????????? ?????>>xqx8?<?8?x?p???øpøxǀ<<8x||??88>888?8?88??xboard-4.7.3/winboard/bitmaps/l72w.bmp0000644000175000001440000000163612262415351014467 00000000000000BM>(HH`??????xboard-4.7.3/winboard/bitmaps/r129w.bmp0000644000175000001440000000512212262415351014552 00000000000000BMR >( ?????????xboard-4.7.3/winboard/bitmaps/l37s.bmp0000644000175000001440000000054612262415351014463 00000000000000BMf>(%%(} } W# ? ? ?   xboard-4.7.3/winboard/bitmaps/q87w.bmp0000644000175000001440000000212212262415351014471 00000000000000BMR>(WW????0008888><x>||~||~||~>?>???xboard-4.7.3/winboard/bitmaps/b64o.bmp0000644000175000001440000000107612262415351014444 00000000000000BM>>(@@  ???O???xboard-4.7.3/winboard/bitmaps/icon_w.bmp0000644000175000001440000000027612262415351015151 00000000000000BM>(   ???=77 `@0xboard-4.7.3/winboard/bitmaps/n49o.bmp0000644000175000001440000000070612262415351014462 00000000000000BM>(11} } /πππππ߀??.nxboard-4.7.3/winboard/bitmaps/n45s.bmp0000644000175000001440000000064612262415351014465 00000000000000BM>(--h} } xxxxxxxxxxG? ?/_@xboard-4.7.3/winboard/bitmaps/e129o.bmp0000644000175000001440000000512212262415351014525 00000000000000BMR >( ????????yyy<q<?|I>?<<x~y~?ǟǟǏ?>|y9?????><<|||yyyyyyyy998<??0????xboard-4.7.3/winboard/bitmaps/q40s.bmp0000644000175000001440000000057612262415351014465 00000000000000BM~>(((@  ?>>? A`A`xboard-4.7.3/winboard/bitmaps/b45s.bmp0000644000175000001440000000064612262415351014451 00000000000000BM>(--h} } x88x????????xboard-4.7.3/winboard/bitmaps/k49s.bmp0000644000175000001440000000070612262415351014463 00000000000000BM>(11} } 9#C??@O@'@`   P H$b#/߀~4??'xboard-4.7.3/winboard/bitmaps/k129w.bmp0000644000175000001440000000512212262415351014543 00000000000000BMR >( ??????p???????????????????xboard-4.7.3/winboard/bitmaps/b40o.bmp0000644000175000001440000000057612262415351014442 00000000000000BM~>(((@  >?o>xboard-4.7.3/winboard/bitmaps/p49o.bmp0000644000175000001440000000070612262415351014464 00000000000000BM>(11} } xboard-4.7.3/winboard/bitmaps/b129o.bmp0000644000175000001440000000512212262415351014522 00000000000000BMR >( } } ????????????????????????????????????????xboard-4.7.3/winboard/bitmaps/cv37o.bmp0000644000175000001440000000054612262415351014634 00000000000000BMf>(%%(  <www?y???߯_? ?xboard-4.7.3/winboard/bitmaps/w33o.bmp0000644000175000001440000000050612262415351014462 00000000000000BMF>(!!?߀׀?cˀ;߀xboard-4.7.3/winboard/bitmaps/n116s.bmp0000644000175000001440000000357612262415351014551 00000000000000BM~>(tt@} } 0?`000xx?||<?0>>?>?|?|| >|??~>>??????xboard-4.7.3/winboard/bitmaps/wp33o.bmp0000644000175000001440000000050612262415351014642 00000000000000BMF>(!!?߀׀?cˀ;߀xboard-4.7.3/winboard/bitmaps/r29s.bmp0000644000175000001440000000026212262415351014465 00000000000000BM>(t} } xxx8a8axboard-4.7.3/winboard/bitmaps/q40o.bmp0000644000175000001440000000057612262415351014461 00000000000000BM~>(((@  xC|O}>y>y]znݻonݻoݻׯxboard-4.7.3/winboard/bitmaps/q54w.bmp0000644000175000001440000000075612262415351014476 00000000000000BM>(66????????  <>~~| ~? ~? xx p?8 <???>xboard-4.7.3/winboard/bitmaps/n33s.bmp0000644000175000001440000000050612262415351014455 00000000000000BMF>(!!} } |>777'oo@O߀@@?0gxboard-4.7.3/winboard/bitmaps/r108o.bmp0000644000175000001440000000337612262415351014550 00000000000000BM>(ll} } ??????????????xboard-4.7.3/winboard/bitmaps/b108w.bmp0000644000175000001440000000337612262415351014540 00000000000000BM>(ll???????????xboard-4.7.3/winboard/bitmaps/k95w.bmp0000644000175000001440000000226212262415351014467 00000000000000BM>(__t?????????????????>?xboard-4.7.3/winboard/bitmaps/b72s.bmp0000644000175000001440000000163612262415351014451 00000000000000BM>(HH`} } ?<??????<<???xboard-4.7.3/winboard/bitmaps/q37w.bmp0000644000175000001440000000054612262415351014474 00000000000000BMf>(%%(xxÎxǏxǏ?8>߾8xboard-4.7.3/winboard/bitmaps/r45o.bmp0000644000175000001440000000064612262415351014465 00000000000000BM>(--h|}}>xboard-4.7.3/winboard/bitmaps/r72s.bmp0000644000175000001440000000163612262415351014471 00000000000000BM>(HH`} } ????????xboard-4.7.3/winboard/bitmaps/n21o.bmp0000644000175000001440000000022212262415351014441 00000000000000BM>(T  ?џOϯϘ88xCxboard-4.7.3/winboard/bitmaps/o49s.bmp0000644000175000001440000000070612262415351014467 00000000000000BM>(11~?~?~< '''@@??xboard-4.7.3/winboard/bitmaps/c64o.bmp0000644000175000001440000000107612262415351014445 00000000000000BM>>(@@  ?O????|>O??ϟ??g'g?ϟ???????xboard-4.7.3/winboard/bitmaps/icon_o.ico0000644000175000001440000000050612262415351015131 00000000000000 0( @~?gxboard-4.7.3/winboard/bitmaps/dk33o.bmp0000644000175000001440000000050612262415351014612 00000000000000BMF>(!!} } ?߀߀߀xboard-4.7.3/winboard/bitmaps/o33w.bmp0000644000175000001440000000050612262415351014462 00000000000000BMF>(!!?xboard-4.7.3/winboard/bitmaps/q25o.bmp0000644000175000001440000000024212262415351014452 00000000000000BM>(d} } ߀ǀ7ݛꪫꪫ֪k9k8Nw9nck_xboard-4.7.3/winboard/bitmaps/ws49o.bmp0000644000175000001440000000070612262415351014656 00000000000000BM>(11?߀o??c߀_߀߀߀??xboard-4.7.3/winboard/bitmaps/n33o.bmp0000644000175000001440000000050612262415351014451 00000000000000BMF>(!!} } }?πππߟߟ??Ogxboard-4.7.3/winboard/bitmaps/wl49o.bmp0000644000175000001440000000070612262415351014647 00000000000000BM>(11?߀o??s߀_s߀߀߀??xboard-4.7.3/winboard/bitmaps/p72s.bmp0000644000175000001440000000163612262415351014467 00000000000000BM>(HH`} } ???????????xboard-4.7.3/winboard/bitmaps/k72s.bmp0000644000175000001440000000163612262415351014462 00000000000000BM>(HH`} } 8??<<????`?ǃfx8fpf?f?ÀÀ<<fpf88?p?>Ã|?y?ß?~?xboard-4.7.3/winboard/bitmaps/c40s.bmp0000644000175000001440000000057612262415351014447 00000000000000BM~>(((@  ~~A#''#! @~xboard-4.7.3/winboard/bitmaps/as33w.bmp0000644000175000001440000000050612262415351014627 00000000000000BMF>(!!AA??xboard-4.7.3/winboard/bitmaps/p54w.bmp0000644000175000001440000000075612262415351014475 00000000000000BM>(66????xboard-4.7.3/winboard/bitmaps/k45s.bmp0000644000175000001440000000064612262415351014462 00000000000000BM>(--h} } ǀ_Goxx8 @@(xHxL ~PS\__ȟ?xboard-4.7.3/winboard/bitmaps/l72o.bmp0000644000175000001440000000163612262415351014457 00000000000000BM>(HH`"?c????????>>xboard-4.7.3/winboard/bitmaps/p58o.bmp0000644000175000001440000000101612262415351014457 00000000000000BM>(::} } ??????xboard-4.7.3/winboard/bitmaps/h49o.bmp0000644000175000001440000000070612262415351014454 00000000000000BM>(11/πππππ߀??|?x`?.nxboard-4.7.3/winboard/bitmaps/n95o.bmp0000644000175000001440000000226212262415351014462 00000000000000BM>(__t} } ??????????????????ǟ???? ?xx(11???߀߀߀??߿o__o߿??߀߀߀???xboard-4.7.3/winboard/bitmaps/k54s.bmp0000644000175000001440000000075612262415351014464 00000000000000BM>(66} } ??????~?????8qp8||<<<<3<1<x|xx<| |yxboard-4.7.3/winboard/bitmaps/r72o.bmp0000644000175000001440000000163612262415351014465 00000000000000BM>(HH`} } ?????????~?~?~?~?~?xboard-4.7.3/winboard/bitmaps/r45s.bmp0000644000175000001440000000064612262415351014471 00000000000000BM>(--h????>>>xboard-4.7.3/winboard/bitmaps/r54w.bmp0000644000175000001440000000075612262415351014477 00000000000000BM>(66??>>>xboard-4.7.3/winboard/bitmaps/b54o.bmp0000644000175000001440000000075612262415351014447 00000000000000BM>(66} } 0|<<|0??'c???01yy1xboard-4.7.3/winboard/bitmaps/a58s.bmp0000644000175000001440000000101612262415351014444 00000000000000BM>(::} } ? ???  ?      xboard-4.7.3/winboard/bitmaps/u49o.bmp0000644000175000001440000000070612262415351014471 00000000000000BM>(11&π{π}πππ߀??w.wnxboard-4.7.3/winboard/bitmaps/u72w.bmp0000644000175000001440000000163612262415351014500 00000000000000BM>(HH`?A???~????p?@0p???xboard-4.7.3/winboard/bitmaps/g72s.bmp0000644000175000001440000000163612262415351014456 00000000000000BM>(HH`} } ???????????8?8?<<?|?~~xboard-4.7.3/winboard/bitmaps/o49o.bmp0000644000175000001440000000070612262415351014463 00000000000000BM>(11~?>߀߀߀߀߀߀߀߀߀߀߀߀ǀ׀ǀ??π??xboard-4.7.3/winboard/bitmaps/k108s.bmp0000644000175000001440000000337612262415351014545 00000000000000BM>(ll} } ???>?x?>q>q|qqqx8?(PP   y ?|>????????????????xboard-4.7.3/winboard/bitmaps/as49s.bmp0000644000175000001440000000070612262415351014634 00000000000000BM>(11?xp ? _?@@ ?A "p? ?@@? "@A@ ?????????xboard-4.7.3/winboard/bitmaps/b25w.bmp0000644000175000001440000000024212262415351014443 00000000000000BM>(d>{???xboard-4.7.3/winboard/bitmaps/k49w.bmp0000644000175000001440000000070612262415351014467 00000000000000BM>(11?0?xboard-4.7.3/winboard/bitmaps/e33w.bmp0000644000175000001440000000050612262415351014450 00000000000000BMF>(!!@ÀǀÀÀxboard-4.7.3/winboard/bitmaps/c40o.bmp0000644000175000001440000000057612262415351014443 00000000000000BM~>(((@  ~~~}}~~xboard-4.7.3/winboard/bitmaps/n29w.bmp0000644000175000001440000000026212262415351014465 00000000000000BM>(t8888888xxx<xxx?#sxboard-4.7.3/winboard/bitmaps/l37o.bmp0000644000175000001440000000054612262415351014457 00000000000000BMf>(%%(} } W߿߿߿wwwxboard-4.7.3/winboard/bitmaps/b37s.bmp0000644000175000001440000000054612262415351014451 00000000000000BMf>(%%(} } xx 8x<????     ??xboard-4.7.3/winboard/bitmaps/c54s.bmp0000644000175000001440000000075612262415351014454 00000000000000BM>(66} } 1yy1??<?x<8p00`` ? ?  ??``008p<??<1yy1xboard-4.7.3/winboard/bitmaps/k33s.bmp0000644000175000001440000000050612262415351014452 00000000000000BMF>(!!} } ?p??`?????O@'@@   P ,#,/?xboard-4.7.3/winboard/bitmaps/o33o.bmp0000644000175000001440000000050612262415351014452 00000000000000BMF>(!!w?xboard-4.7.3/winboard/bitmaps/wn72o.bmp0000644000175000001440000000163612262415351014650 00000000000000BM>(HH`??? ρ|??????????y?p??????xboard-4.7.3/winboard/bitmaps/cv45w.bmp0000644000175000001440000000064612262415351014644 00000000000000BM>(--h?>|x??xboard-4.7.3/winboard/bitmaps/cross.ico0000644000175000001440000000137612262415351015022 00000000000000 ( @ ϙϙxboard-4.7.3/winboard/bitmaps/q116s.bmp0000644000175000001440000000357612262415351014554 00000000000000BM~>(tt@} } ?@????????  <<~<~<>>~??????????xboard-4.7.3/winboard/bitmaps/s49w.bmp0000644000175000001440000000070612262415351014477 00000000000000BM>(11??π࿀?????xboard-4.7.3/winboard/bitmaps/dk49w.bmp0000644000175000001440000000070612262415351014633 00000000000000BM>(11??????xboard-4.7.3/winboard/bitmaps/e49s.bmp0000644000175000001440000000070612262415351014455 00000000000000BM>(11Y.3]naq1ǀǀ ?>}|        C???xboard-4.7.3/winboard/bitmaps/g33w.bmp0000644000175000001440000000050612262415351014452 00000000000000BMF>(!!} }  !a a ??ߟÇÇxboard-4.7.3/winboard/bitmaps/n21s.bmp0000644000175000001440000000022212262415351014445 00000000000000BM>(T  ɀ!xx xboard-4.7.3/winboard/bitmaps/q49s.bmp0000644000175000001440000000070612262415351014471 00000000000000BM>(11} } ;߀????  8 8 x<<||π|π???????xboard-4.7.3/winboard/bitmaps/b80w.bmp0000644000175000001440000000177612262415351014461 00000000000000BM>(PP??????????xboard-4.7.3/winboard/bitmaps/icon_ow.ico0000644000175000001440000000207612262415351015324 00000000000000 0& V( @?=/'g: ~??( @~??xboard-4.7.3/winboard/bitmaps/white_14.ico0000644000175000001440000000044612262415351015312 00000000000000(<  <xboard-4.7.3/winboard/bitmaps/b87s.bmp0000644000175000001440000000212212262415351014446 00000000000000BMR>(WW} } |??? ??888888888888?????xboard-4.7.3/winboard/bitmaps/r80w.bmp0000644000175000001440000000177612262415351014501 00000000000000BM>(PP?xboard-4.7.3/winboard/bitmaps/clock_14.ico0000644000175000001440000000044612262415351015265 00000000000000(?|<  <|xboard-4.7.3/winboard/bitmaps/v49o.bmp0000644000175000001440000000070612262415351014472 00000000000000BM>(11??[;π?Ǜxboard-4.7.3/winboard/bitmaps/p80w.bmp0000644000175000001440000000177612262415351014477 00000000000000BM>(PP????xboard-4.7.3/winboard/bitmaps/k72w.bmp0000644000175000001440000000163612262415351014466 00000000000000BM>(HH`????????x???xboard-4.7.3/winboard/bitmaps/g49s.bmp0000644000175000001440000000070612262415351014457 00000000000000BM>(11} } ???p?@???xboard-4.7.3/winboard/bitmaps/c58o.bmp0000644000175000001440000000101612262415351014442 00000000000000BM>(::} } >>???ss?s??>?ϟ?g?O?O?O?gϟ?>???sss???>>xboard-4.7.3/winboard/bitmaps/wp33s.bmp0000644000175000001440000000050612262415351014646 00000000000000BMF>(!!?'<|3CÀ 0?xboard-4.7.3/winboard/bitmaps/q87s.bmp0000644000175000001440000000212212262415351014465 00000000000000BMR>(WW} } ?????00088>88>||~||~||~~>?>???xboard-4.7.3/winboard/bitmaps/k108o.bmp0000644000175000001440000000337612262415351014541 00000000000000BM>(ll} } ??0>????`|???????????????????q??xboard-4.7.3/winboard/bitmaps/m33o.bmp0000644000175000001440000000050612262415351014450 00000000000000BMF>(!!?? ߀߀xboard-4.7.3/winboard/bitmaps/cv40s.bmp0000644000175000001440000000057612262415351014635 00000000000000BM~>(((@  ?g8xboard-4.7.3/winboard/bitmaps/b21s.bmp0000644000175000001440000000022212262415351014431 00000000000000BM>(T  p  xboard-4.7.3/winboard/bitmaps/r40o.bmp0000644000175000001440000000057612262415351014462 00000000000000BM~>(((@  ??xboard-4.7.3/winboard/bitmaps/r87w.bmp0000644000175000001440000000212212262415351014472 00000000000000BMR>(WW???????xboard-4.7.3/winboard/bitmaps/l54o.bmp0000644000175000001440000000075612262415351014461 00000000000000BM>(66  ????<ϟϟ???yyy333xboard-4.7.3/winboard/bitmaps/v33o.bmp0000644000175000001440000000050612262415351014461 00000000000000BMF>(!!π~{ x?|xboard-4.7.3/winboard/bitmaps/wp72s.bmp0000644000175000001440000000163612262415351014656 00000000000000BM>(HH`?? |~???????? 8? ????xboard-4.7.3/winboard/bitmaps/v49s.bmp0000644000175000001440000000070612262415351014476 00000000000000BM>(11@@ _ ` ?C @8?8d d?xboard-4.7.3/winboard/bitmaps/q95o.bmp0000644000175000001440000000226212262415351014465 00000000000000BM>(__t} } ???x<???????? `@??` ?8889?>?~??~????ǏǏǏ㏏Ǐ??G???GGG>?????> >?~?~?~?x<xboard-4.7.3/winboard/bitmaps/b25o.bmp0000644000175000001440000000024212262415351014433 00000000000000BM>(d} } >{Ƀ߀߀߀߀߀>xboard-4.7.3/winboard/bitmaps/l45w.bmp0000644000175000001440000000064612262415351014467 00000000000000BM>(--h} } ????xboard-4.7.3/winboard/bitmaps/ws33s.bmp0000644000175000001440000000050612262415351014651 00000000000000BMF>(!!?'<|3C@ÀC 0?xboard-4.7.3/winboard/bitmaps/r64o.bmp0000644000175000001440000000107612262415351014464 00000000000000BM>>(@@  ?????????????ϟ?ϟ???xboard-4.7.3/winboard/bitmaps/b108o.bmp0000644000175000001440000000337612262415351014530 00000000000000BM>(ll} } ???????????????????????xboard-4.7.3/winboard/bitmaps/r21o.bmp0000644000175000001440000000022212262415351014445 00000000000000BM>(T  88xxx!xxxboard-4.7.3/winboard/bitmaps/q33o.bmp0000644000175000001440000000050612262415351014454 00000000000000BMF>(!!} } ?߀???߀?O( o淀ַ׀׀箺瞼Ϟ~_}9}>xboard-4.7.3/winboard/bitmaps/cv64w.bmp0000644000175000001440000000107612262415351014643 00000000000000BM>>(@@} } ?????????????~|p`@???xboard-4.7.3/winboard/bitmaps/v49w.bmp0000644000175000001440000000070612262415351014502 00000000000000BM>(11??C??xboard-4.7.3/winboard/bitmaps/n49s.bmp0000644000175000001440000000070612262415351014466 00000000000000BM>(11} } 77777777?//!ooo?__߀@   /0s0xxboard-4.7.3/winboard/bitmaps/f33s.bmp0000644000175000001440000000050612262415351014445 00000000000000BMF>(!!} } ;?#??xboard-4.7.3/winboard/bitmaps/wn33s.bmp0000644000175000001440000000050612262415351014644 00000000000000BMF>(!!?'<|3CÀ 0?xboard-4.7.3/winboard/bitmaps/p37s.bmp0000644000175000001440000000054612262415351014467 00000000000000BMf>(%%(} } ?xboard-4.7.3/winboard/bitmaps/b95o.bmp0000644000175000001440000000226212262415351014446 00000000000000BM>(__t} } G??????x<??? ???????xboard-4.7.3/winboard/bitmaps/black_14.ico0000644000175000001440000000044612262415351015246 00000000000000(<  <xboard-4.7.3/winboard/bitmaps/k25o.bmp0000644000175000001440000000024212262415351014444 00000000000000BM>(d} } ?ooπ/]xboard-4.7.3/winboard/bitmaps/m49s.bmp0000644000175000001440000000070612262415351014465 00000000000000BM>(11??|~?0??????xboard-4.7.3/winboard/bitmaps/a64w.bmp0000644000175000001440000000107612262415351014453 00000000000000BM>>(@@  ????????xboard-4.7.3/winboard/bitmaps/q21s.bmp0000644000175000001440000000022212262415351014450 00000000000000BM>(T  xxxxx8888ȈȈوxboard-4.7.3/winboard/bitmaps/a49w.bmp0000644000175000001440000000070612262415351014455 00000000000000BM>(11?????xboard-4.7.3/winboard/bitmaps/b64s.bmp0000644000175000001440000000107612262415351014450 00000000000000BM>>(@@  ??@????xboard-4.7.3/winboard/bitmaps/q64s.bmp0000644000175000001440000000107612262415351014467 00000000000000BM>>(@@  ??~~????   `pp???????????????xboard-4.7.3/winboard/bitmaps/b45w.bmp0000644000175000001440000000064612262415351014455 00000000000000BM>(--hx88x???????xboard-4.7.3/winboard/bitmaps/README.bitmaps0000644000175000001440000000164412262415351015511 00000000000000This directory provides bitmaps with the same size and naming conventions as those distributed till xboard-3.** These bitmaps are distributed under the GNU GENERAL PUBLIC LICENSE coming with xboard. The bitmaps contained herein were converted from my MetaFont version of chess font. These are designed very well to deliver good rastered images on low resolution devices. The general shape of these fonts are designed after very old typefaces used in printing chess books. They are not as fancy as the currently used bitmaps of xboard, but I like them in their 'san serif'-ness - may be others too. The MetaFont source of this font may be obtained from me under the GNU GENERAL PUBLIC LICENSE. To convert the pk-Files to bitmaps I used the conversion tool mftobdf to generate X11-bdf - fonts, and then used a small C program, to write the xbm-files. 5.Feb.1994 Elmar Bartel bartel@informatik.tu-muenchen.de xboard-4.7.3/winboard/bitmaps/q49w.bmp0000644000175000001440000000070612262415351014475 00000000000000BM>(11????  8 88x<<||π|π???????xboard-4.7.3/winboard/bitmaps/q64w.bmp0000644000175000001440000000107612262415351014473 00000000000000BM>>(@@?????   ppp???????????????xboard-4.7.3/winboard/bitmaps/q95w.bmp0000644000175000001440000000226212262415351014475 00000000000000BM>(__t??????????????????>?????>????xboard-4.7.3/winboard/bitmaps/wp72o.bmp0000644000175000001440000000163612262415351014652 00000000000000BM>(HH`??? ρ|??????????y?p??????xboard-4.7.3/winboard/bitmaps/c49s.bmp0000644000175000001440000000070612262415351014453 00000000000000BM>(11???߀߀߀?8 @@ 8?߀߀߀???xboard-4.7.3/winboard/bitmaps/b49o.bmp0000644000175000001440000000070612262415351014446 00000000000000BM>(11} } wx??`??xboard-4.7.3/winboard/bitmaps/b72o.bmp0000644000175000001440000000163612262415351014445 00000000000000BM>(HH`} } ?~?~<????p???~<<~~~~<xboard-4.7.3/winboard/bitmaps/w72s.bmp0000644000175000001440000000163612262415351014476 00000000000000BM>(HH`?? |~?????????? 8? ????xboard-4.7.3/winboard/bitmaps/r64s.bmp0000644000175000001440000000107612262415351014470 00000000000000BM>>(@@  ????????????????xboard-4.7.3/winboard/bitmaps/a45s.bmp0000644000175000001440000000064612262415351014450 00000000000000BM>(--h} } x88xx?xx??xboard-4.7.3/winboard/bitmaps/r29o.bmp0000644000175000001440000000026212262415351014461 00000000000000BM>(t} } xxx m8axboard-4.7.3/winboard/bitmaps/s72o.bmp0000644000175000001440000000163612262415351014466 00000000000000BM>(HH`????????????????~81???xboard-4.7.3/winboard/bitmaps/w49s.bmp0000644000175000001440000000070612262415351014477 00000000000000BM>(11?@_ 8>pp_ ???xboard-4.7.3/winboard/bitmaps/q95s.bmp0000644000175000001440000000226212262415351014471 00000000000000BM>(__t} } ???||???????????????>????>????xboard-4.7.3/winboard/bitmaps/p108o.bmp0000644000175000001440000000337612262415351014546 00000000000000BM>(ll} } ????????????xboard-4.7.3/winboard/bitmaps/l64s.bmp0000644000175000001440000000107612262415351014462 00000000000000BM>>(@@  ??????????????xboard-4.7.3/winboard/bitmaps/r95o.bmp0000644000175000001440000000226212262415351014466 00000000000000BM>(__t} } ???xboard-4.7.3/winboard/bitmaps/k58s.bmp0000644000175000001440000000101612262415351014456 00000000000000BM>(::} } ?Cq?83p33sacs333ps8s|?3303<?3?3?xboard-4.7.3/winboard/bitmaps/r37o.bmp0000644000175000001440000000054612262415351014465 00000000000000BMf>(%%(} } p;wwxboard-4.7.3/winboard/bitmaps/dk72o.bmp0000644000175000001440000000163612262415351014622 00000000000000BM>(HH`?????????~?~?~?~?~???~xboard-4.7.3/winboard/bitmaps/b45o.bmp0000644000175000001440000000064612262415351014445 00000000000000BM>(--h} } xx=ϟ??xboard-4.7.3/winboard/bitmaps/p72o.bmp0000644000175000001440000000163612262415351014463 00000000000000BM>(HH`} } ????????????????<(11@DxB| ???@@@@pp`xboard-4.7.3/winboard/bitmaps/l58w.bmp0000644000175000001440000000101612262415351014463 00000000000000BM>(::  ??????xboard-4.7.3/winboard/bitmaps/c54o.bmp0000644000175000001440000000075612262415351014450 00000000000000BM>(66} } 1yy1I??<??x?<????????ϟϟ??x?<??<I1yy1xboard-4.7.3/winboard/bitmaps/trans_14.ico0000644000175000001440000000044612262415351015321 00000000000000(xboard-4.7.3/winboard/bitmaps/r21s.bmp0000644000175000001440000000022212262415351014451 00000000000000BM>(T  88xxxxxxboard-4.7.3/winboard/bitmaps/p64w.bmp0000644000175000001440000000107612262415351014472 00000000000000BM>>(@@?????????xboard-4.7.3/winboard/bitmaps/r54s.bmp0000644000175000001440000000075612262415351014473 00000000000000BM>(66} } ?>>>xboard-4.7.3/winboard/bitmaps/ws33o.bmp0000644000175000001440000000050612262415351014645 00000000000000BMF>(!!?߀׀?c~_ˀ;߀xboard-4.7.3/winboard/bitmaps/v72o.bmp0000644000175000001440000000163612262415351014471 00000000000000BM>(HH`><|xyy9??g?'a ??s?? ?a3???xboard-4.7.3/winboard/bitmaps/p49s.bmp0000644000175000001440000000070612262415351014470 00000000000000BM>(11} } ?xboard-4.7.3/winboard/bitmaps/h33w.bmp0000644000175000001440000000050612262415351014453 00000000000000BMF>(!!} } |>??xboard-4.7.3/winboard/bitmaps/k64o.bmp0000644000175000001440000000107612262415351014455 00000000000000BM>>(@@  ????????????????????????xboard-4.7.3/winboard/bitmaps/w49w.bmp0000644000175000001440000000070612262415351014503 00000000000000BM>(11???xboard-4.7.3/winboard/bitmaps/r116o.bmp0000644000175000001440000000357612262415351014551 00000000000000BM~>(tt@} } ???????????????????????????????????????xboard-4.7.3/winboard/bitmaps/b64w.bmp0000644000175000001440000000107612262415351014454 00000000000000BM>>(@@????xboard-4.7.3/winboard/bitmaps/m72o.bmp0000644000175000001440000000163612262415351014460 00000000000000BM>(HH`8?`??? ??????>>>>??>?xboard-4.7.3/winboard/bitmaps/e72w.bmp0000644000175000001440000000163612262415351014460 00000000000000BM>(HH`?p 80?x?|?~????xboard-4.7.3/winboard/bitmaps/c72s.bmp0000644000175000001440000000163612262415351014452 00000000000000BM>(HH`8|||8??8q|||8qp8 00p````p088p??8>|>|>|8??>>>xboard-4.7.3/winboard/bitmaps/f49o.bmp0000644000175000001440000000070612262415351014452 00000000000000BM>(11??߀π?߀߀߀߀߀??}{o?xboard-4.7.3/winboard/bitmaps/n40o.bmp0000644000175000001440000000057612262415351014456 00000000000000BM~>(((@  _;??7xboard-4.7.3/winboard/bitmaps/ws72o.bmp0000644000175000001440000000163612262415351014655 00000000000000BM>(HH`??? ρ|?????????????y?p??????xboard-4.7.3/winboard/bitmaps/p64s.bmp0000644000175000001440000000107612262415351014466 00000000000000BM>>(@@  ?????????xboard-4.7.3/winboard/bitmaps/w49o.bmp0000644000175000001440000000070612262415351014473 00000000000000BM>(11??߀o??πo߀߀?xboard-4.7.3/winboard/bitmaps/r108s.bmp0000644000175000001440000000337612262415351014554 00000000000000BM>(ll} } ????xboard-4.7.3/winboard/bitmaps/wn49s.bmp0000644000175000001440000000070612262415351014655 00000000000000BM>(11?@_ 8><_< ???xboard-4.7.3/winboard/bitmaps/e33o.bmp0000644000175000001440000000050612262415351014440 00000000000000BMF>(!!=6ZVXۀ׿ۏ{ÿ}}}~xboard-4.7.3/winboard/bitmaps/q29o.bmp0000644000175000001440000000026212262415351014460 00000000000000BM>(t} }  ?x(%%(} } xo?<uuvvxvxۮxׯ^xׯ?8>Xﯾ߾8vwxboard-4.7.3/winboard/bitmaps/n64o.bmp0000644000175000001440000000107612262415351014460 00000000000000BM>>(@@  ?????8?|??????O?ß??y?Nx?Nxboard-4.7.3/winboard/bitmaps/l37w.bmp0000644000175000001440000000054612262415351014467 00000000000000BMf>(%%(} } ???xboard-4.7.3/winboard/bitmaps/n72s.bmp0000644000175000001440000000163612262415351014465 00000000000000BM>(HH`} } ?????????ppx?x0<<x<<yyy?<x|?<?8|xboard-4.7.3/winboard/bitmaps/o72s.bmp0000644000175000001440000000163612262415351014466 00000000000000BM>(HH`???????????xboard-4.7.3/winboard/bitmaps/a37o.bmp0000644000175000001440000000054612262415351014444 00000000000000BMf>(%%(} } xx'x</??xxxsxboard-4.7.3/winboard/bitmaps/b21o.bmp0000644000175000001440000000022212262415351014425 00000000000000BM>(T   ps'xboard-4.7.3/winboard/bitmaps/k49o.bmp0000644000175000001440000000070612262415351014457 00000000000000BM>(11} } =? #?߀߀7?xboard-4.7.3/winboard/bitmaps/l58s.bmp0000644000175000001440000000101612262415351014457 00000000000000BM>(::  ?   ? ?       ???xboard-4.7.3/winboard/bitmaps/r29w.bmp0000644000175000001440000000026212262415351014471 00000000000000BM>(txxx8a8axboard-4.7.3/winboard/bitmaps/n54o.bmp0000644000175000001440000000075612262415351014463 00000000000000BM>(66} } |<<<<<<<<<<<?|||?|3||s????σ@`@O>?xboard-4.7.3/winboard/bitmaps/dk49o.bmp0000644000175000001440000000070612262415351014623 00000000000000BM>(11??>?xboard-4.7.3/winboard/bitmaps/b116w.bmp0000644000175000001440000000357612262415351014541 00000000000000BM~>(tt@??@?????xboard-4.7.3/winboard/bitmaps/b72w.bmp0000644000175000001440000000163612262415351014455 00000000000000BM>(HH`?~?????xboard-4.7.3/winboard/bitmaps/f33o.bmp0000644000175000001440000000050612262415351014441 00000000000000BMF>(!!} } ??ۀ?}?;?xboard-4.7.3/winboard/bitmaps/q21w.bmp0000644000175000001440000000022212262415351014454 00000000000000BM>(Txxxxxx88؈xboard-4.7.3/winboard/bitmaps/cv40w.bmp0000644000175000001440000000057612262415351014641 00000000000000BM~>(((@  ??xboard-4.7.3/winboard/bitmaps/galactic.bmp0000644000175000001440000027361612262415351015454 00000000000000BMw6(Xs  o%?(<0-&^^+SJ`0q3&343f3/+~3@P3463u@5e$7475333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   xboard-4.7.3/winboard/bitmaps/r64w.bmp0000644000175000001440000000107612262415351014474 00000000000000BM>>(@@????????????????xboard-4.7.3/winboard/bitmaps/m33s.bmp0000644000175000001440000000050612262415351014454 00000000000000BMF>(!! ????xboard-4.7.3/winboard/bitmaps/cv72o.bmp0000644000175000001440000000163612262415351014634 00000000000000BM>(HH`} } ??????????????q????? ? c}GO?xboard-4.7.3/winboard/bitmaps/f49s.bmp0000644000175000001440000000070612262415351014456 00000000000000BM>(11?/߀?~??0 ??@??~ ?xboard-4.7.3/winboard/bitmaps/h72w.bmp0000644000175000001440000000163612262415351014463 00000000000000BM>(HH`?????????p?0p??xboard-4.7.3/winboard/bitmaps/p129s.bmp0000644000175000001440000000512212262415351014544 00000000000000BMR >( } } ???????xboard-4.7.3/winboard/bitmaps/r40w.bmp0000644000175000001440000000057612262415351014472 00000000000000BM~>(((@????xboard-4.7.3/winboard/bitmaps/k95s.bmp0000644000175000001440000000226212262415351014463 00000000000000BM>(__t} } ? ?||????????||???????>|p|?p>ppǀ88888888q?xboard-4.7.3/winboard/bitmaps/n33w.bmp0000644000175000001440000000050612262415351014461 00000000000000BMF>(!!|>??xboard-4.7.3/winboard/bitmaps/p129w.bmp0000644000175000001440000000512212262415351014550 00000000000000BMR >( ???????xboard-4.7.3/winboard/bitmaps/cv54w.bmp0000644000175000001440000000075612262415351014646 00000000000000BM>(66} } ?? ?xboard-4.7.3/winboard/bitmaps/m49w.bmp0000644000175000001440000000070612262415351014471 00000000000000BM>(11????????xboard-4.7.3/winboard/bitmaps/q129s.bmp0000644000175000001440000000512212262415351014545 00000000000000BMR >( } } 8???8<<<<?<<?|>??~~??~~??????????????????xboard-4.7.3/winboard/bitmaps/r49o.bmp0000644000175000001440000000070612262415351014466 00000000000000BM>(11} } ??>xboard-4.7.3/winboard/bitmaps/b37o.bmp0000644000175000001440000000054612262415351014445 00000000000000BMf>(%%(} } xx'x</??߿'wwwxboard-4.7.3/winboard/bitmaps/q80o.bmp0000644000175000001440000000177612262415351014470 00000000000000BM>(PP  ???>|???@8O0 cx??Ǚ?99sy3ϟ3ǟ?????????????????????????ϟϟϟ??xboard-4.7.3/winboard/bitmaps/q54o.bmp0000644000175000001440000000075612262415351014466 00000000000000BM>(66????????08s0l1px|9`x|dx<Dy<Ly 13O3~O3~3| ~?~?xyp?8 <?1?y?>1xboard-4.7.3/winboard/bitmaps/k40o.bmp0000644000175000001440000000057612262415351014453 00000000000000BM~>(((@  ?~ÿ?>ϟxboard-4.7.3/winboard/bitmaps/n64s.bmp0000644000175000001440000000107612262415351014464 00000000000000BM>>(@@  ?????????????pp(d} } ?_π **U Uxboard-4.7.3/winboard/bitmaps/p49w.bmp0000644000175000001440000000070612262415351014474 00000000000000BM>(11?xboard-4.7.3/winboard/bitmaps/s72w.bmp0000644000175000001440000000163612262415351014476 00000000000000BM>(HH`??????????????~80??xboard-4.7.3/winboard/bitmaps/w33s.bmp0000644000175000001440000000050612262415351014466 00000000000000BMF>(!!?'<|@3CÀ 0?xboard-4.7.3/winboard/bitmaps/f33w.bmp0000644000175000001440000000050612262415351014451 00000000000000BMF>(!!} } ?xboard-4.7.3/winboard/bitmaps/n37w.bmp0000644000175000001440000000054612262415351014471 00000000000000BMf>(%%(xxxxxxx~x>@???xboard-4.7.3/winboard/bitmaps/k29s.bmp0000644000175000001440000000026212262415351014456 00000000000000BM>(t} } ?x8X X@Xe0x5`xboard-4.7.3/winboard/bitmaps/p33o.bmp0000644000175000001440000000050612262415351014453 00000000000000BMF>(!!} } ??xboard-4.7.3/winboard/bitmaps/r58w.bmp0000644000175000001440000000101612262415351014471 00000000000000BM>(::?????????????????????????||||xboard-4.7.3/winboard/bitmaps/b87w.bmp0000644000175000001440000000212212262415351014452 00000000000000BMR>(WW|~~~?????xboard-4.7.3/winboard/bitmaps/q72o.bmp0000644000175000001440000000163612262415351014464 00000000000000BM>(HH`} } ??x??????A=~? 0?q>|>O|x#q~3s~scώ~qgϞ~y?Ϟ~y?|>|>|88|>|>|<>8<<xboard-4.7.3/winboard/bitmaps/n129s.bmp0000644000175000001440000000512212262415351014542 00000000000000BMR >( } } ??8????>?>????? @??8? ??000??????|?|???`p????xboard-4.7.3/winboard/bitmaps/r116w.bmp0000644000175000001440000000357612262415351014561 00000000000000BM~>(tt@????????xboard-4.7.3/winboard/bitmaps/cv58s.bmp0000644000175000001440000000101612262415351014634 00000000000000BM>(::} } ??????? `p0c|? xboard-4.7.3/winboard/bitmaps/b87o.bmp0000644000175000001440000000212212262415351014442 00000000000000BMR>(WW} } |!??~?~~?|???????????|8||||8xboard-4.7.3/winboard/bitmaps/n80w.bmp0000644000175000001440000000177612262415351014475 00000000000000BM>(PP??@?????xboard-4.7.3/winboard/bitmaps/e72o.bmp0000644000175000001440000000163612262415351014450 00000000000000BM>(HH`?p|~r~8~Ü>>>s'93?ys?|;?~r98C`8ϟϟ?Ϗß??????????g#??xboard-4.7.3/winboard/bitmaps/p87o.bmp0000644000175000001440000000212212262415351014460 00000000000000BMR>(WW} } ???????????~|||?xboard-4.7.3/winboard/bitmaps/p54o.bmp0000644000175000001440000000075612262415351014465 00000000000000BM>(66} } ????x?xxboard-4.7.3/winboard/bitmaps/k29o.bmp0000644000175000001440000000026212262415351014452 00000000000000BM>(t} } ????xx7`xboard-4.7.3/winboard/bitmaps/r116s.bmp0000644000175000001440000000357612262415351014555 00000000000000BM~>(tt@} } ???????????xboard-4.7.3/winboard/bitmaps/n58w.bmp0000644000175000001440000000101612262415351014465 00000000000000BM>(::?x????xboard-4.7.3/winboard/bitmaps/cv33o.bmp0000644000175000001440000000050612262415351014624 00000000000000BMF>(!!} } ppwwo{πG?߀߀?%xboard-4.7.3/winboard/bitmaps/v33s.bmp0000644000175000001440000000050612262415351014465 00000000000000BMF>(!!@ @@@ /߀?a{π?xboard-4.7.3/winboard/bitmaps/icon_w.ico0000644000175000001440000000050612262415351015141 00000000000000 0( @???=77 `@0xboard-4.7.3/winboard/bitmaps/q25s.bmp0000644000175000001440000000024212262415351014456 00000000000000BM>(d} } O߀π#"#"1c9c8c8wc㿀xboard-4.7.3/winboard/bitmaps/u49w.bmp0000644000175000001440000000070612262415351014501 00000000000000BM>(11x|???0p`xboard-4.7.3/winboard/bitmaps/a49s.bmp0000644000175000001440000000070612262415351014451 00000000000000BM>(11??`???xboard-4.7.3/winboard/bitmaps/r45w.bmp0000644000175000001440000000064612262415351014475 00000000000000BM>(--h??>>>xboard-4.7.3/winboard/bitmaps/q40w.bmp0000644000175000001440000000057612262415351014471 00000000000000BM~>(((@??? A``Ǐxboard-4.7.3/winboard/bitmaps/r33o.bmp0000644000175000001440000000050612262415351014455 00000000000000BMF>(!!} } ?߀߀߀xboard-4.7.3/winboard/bitmaps/r87s.bmp0000644000175000001440000000212212262415351014466 00000000000000BMR>(WW} } ???????xboard-4.7.3/winboard/bitmaps/c64w.bmp0000644000175000001440000000107612262415351014455 00000000000000BM>>(@@  ???@?????xboard-4.7.3/winboard/bitmaps/l40w.bmp0000644000175000001440000000057612262415351014464 00000000000000BM~>(((@  ????xboard-4.7.3/winboard/bitmaps/wn49o.bmp0000644000175000001440000000070612262415351014651 00000000000000BM>(11?߀o??߀_߀߀߀??xboard-4.7.3/winboard/bitmaps/b29w.bmp0000644000175000001440000000026212262415351014451 00000000000000BM>(t888xboard-4.7.3/winboard/bitmaps/p40o.bmp0000644000175000001440000000057612262415351014460 00000000000000BM~>(((@>?xboard-4.7.3/winboard/bitmaps/p25w.bmp0000644000175000001440000000024212262415351014461 00000000000000BM>(d?xboard-4.7.3/winboard/bitmaps/q80w.bmp0000644000175000001440000000177612262415351014500 00000000000000BM>(PP????88x???????????????????????????xboard-4.7.3/winboard/bitmaps/s49s.bmp0000644000175000001440000000070612262415351014473 00000000000000BM>(11??π࿀???`? `?xboard-4.7.3/winboard/bitmaps/b33o.bmp0000644000175000001440000000050612262415351014435 00000000000000BMF>(!!} } ~~~}}??xboard-4.7.3/winboard/bitmaps/n49w.bmp0000644000175000001440000000070612262415351014472 00000000000000BM>(11???`xboard-4.7.3/winboard/bitmaps/q33w.bmp0000644000175000001440000000050612262415351014464 00000000000000BMF>(!!???ǀǀ8<Ϟ<>~|9|?>>?xboard-4.7.3/winboard/bitmaps/c72o.bmp0000644000175000001440000000163612262415351014446 00000000000000BM>(HH`8|||8<|~??8q|||8q?>???ϏǟǟϏ???>??8>|>|>|8?>?>>>>xboard-4.7.3/winboard/bitmaps/cv40o.bmp0000644000175000001440000000057612262415351014631 00000000000000BM~>(((@  {{xoxboard-4.7.3/winboard/bitmaps/q45s.bmp0000644000175000001440000000064612262415351014470 00000000000000BM>(--h} }  ``00``00`08x8x||~?xboard-4.7.3/winboard/bitmaps/q29w.bmp0000644000175000001440000000026212262415351014470 00000000000000BM>(txxxx8888888瘇=}=8xxboard-4.7.3/winboard/bitmaps/cv45o.bmp0000644000175000001440000000064612262415351014634 00000000000000BM>(--h߿C}{_?kgk\xboard-4.7.3/winboard/bitmaps/p87s.bmp0000644000175000001440000000212212262415351014464 00000000000000BMR>(WW} } ????????xboard-4.7.3/winboard/bitmaps/r21w.bmp0000644000175000001440000000022212262415351014455 00000000000000BM>(T88xxxxxxboard-4.7.3/winboard/bitmaps/l33w.bmp0000644000175000001440000000050612262415351014457 00000000000000BMF>(!!xboard-4.7.3/winboard/bitmaps/p108s.bmp0000644000175000001440000000337612262415351014552 00000000000000BM>(ll} } ????xboard-4.7.3/winboard/bitmaps/n40s.bmp0000644000175000001440000000057612262415351014462 00000000000000BM~>(((@  7777777?/G/ooxo_ gハ?xboard-4.7.3/winboard/bitmaps/r95w.bmp0000644000175000001440000000226212262415351014476 00000000000000BM>(__t??xboard-4.7.3/winboard/bitmaps/p45o.bmp0000644000175000001440000000064612262415351014463 00000000000000BM>(--h} } ?ϟ??xboard-4.7.3/winboard/bitmaps/k87o.bmp0000644000175000001440000000212212262415351014453 00000000000000BMR>(WW} } ???ǀ?0?????~~~~8~8~|~??????c???|??xboard-4.7.3/winboard/bitmaps/icon_whi.ico0000644000175000001440000000207612262415351015466 00000000000000 0& V( @?=/'g: ~??( @~??xboard-4.7.3/winboard/bitmaps/l54w.bmp0000644000175000001440000000075612262415351014471 00000000000000BM>(66  ????xboard-4.7.3/winboard/bitmaps/q49o.bmp0000644000175000001440000000070612262415351014465 00000000000000BM>(11??};~!?6gs߀߀߀߀߀{o﯀}o}oπ}oπ߻߻?xboard-4.7.3/winboard/bitmaps/as72w.bmp0000644000175000001440000000163612262415351014637 00000000000000BM>(HH`?~<?|<><<<~?~<????<~?xboard-4.7.3/winboard/bitmaps/v72s.bmp0000644000175000001440000000163612262415351014475 00000000000000BM>(HH` O?xq??pG0a`  ``c??xboard-4.7.3/winboard/bitmaps/n108s.bmp0000644000175000001440000000337612262415351014550 00000000000000BM>(ll} } ????@>`|?`|?`x?   >|??>>??? `pxboard-4.7.3/winboard/bitmaps/as49w.bmp0000644000175000001440000000070612262415351014640 00000000000000BM>(11?xp ??? p????????????xboard-4.7.3/winboard/bitmaps/p21w.bmp0000644000175000001440000000022212262415351014453 00000000000000BM>(Txxxxxboard-4.7.3/winboard/bitmaps/p87w.bmp0000644000175000001440000000212212262415351014470 00000000000000BMR>(WW????????xboard-4.7.3/winboard/bitmaps/g33o.bmp0000644000175000001440000000050612262415351014442 00000000000000BMF>(!!} } pOJʦkkmmmm??ߟoo۷۷xboard-4.7.3/winboard/bitmaps/l33o.bmp0000644000175000001440000000050612262415351014447 00000000000000BMF>(!!_ ___xboard-4.7.3/winboard/bitmaps/r72w.bmp0000644000175000001440000000163612262415351014475 00000000000000BM>(HH`????????xboard-4.7.3/winboard/bitmaps/r49w.bmp0000644000175000001440000000070612262415351014476 00000000000000BM>(11?????xboard-4.7.3/winboard/bitmaps/p95w.bmp0000644000175000001440000000226212262415351014474 00000000000000BM>(__t????????????xboard-4.7.3/winboard/bitmaps/l49s.bmp0000644000175000001440000000070612262415351014464 00000000000000BM>(11???????????xboard-4.7.3/winboard/bitmaps/b33s.bmp0000644000175000001440000000050612262415351014441 00000000000000BMF>(!!} } =???xboard-4.7.3/winboard/bitmaps/b37w.bmp0000644000175000001440000000054612262415351014455 00000000000000BMf>(%%(xx 8x<??????xboard-4.7.3/winboard/bitmaps/p58s.bmp0000644000175000001440000000101612262415351014463 00000000000000BM>(::} } ???xboard-4.7.3/winboard/bitmaps/h72s.bmp0000644000175000001440000000163612262415351014457 00000000000000BM>(HH`?????????`<<p<<y yy??<x~<|?h?0p??xboard-4.7.3/winboard/bitmaps/n129w.bmp0000644000175000001440000000512212262415351014546 00000000000000BMR >( ??????????????o?xboard-4.7.3/winboard/bitmaps/p29w.bmp0000644000175000001440000000026212262415351014467 00000000000000BM>(t????xboard-4.7.3/winboard/bitmaps/n80o.bmp0000644000175000001440000000177612262415351014465 00000000000000BM>(PP  ?3?????3?11?O???????c?q?<x>??xboard-4.7.3/winboard/bitmaps/a54w.bmp0000644000175000001440000000075612262415351014456 00000000000000BM>(66} } 0|<<|?|||?xboard-4.7.3/winboard/bitmaps/k95o.bmp0000644000175000001440000000226212262415351014457 00000000000000BM>(__t} } ??????~????????>???????????????????????>?????xboard-4.7.3/winboard/bitmaps/n108w.bmp0000644000175000001440000000337612262415351014554 00000000000000BM>(ll?????????????????@pxboard-4.7.3/winboard/bitmaps/m72w.bmp0000644000175000001440000000163612262415351014470 00000000000000BM>(HH`????????xboard-4.7.3/winboard/bitmaps/k54o.bmp0000644000175000001440000000075612262415351014460 00000000000000BM>(66} } ????????||<<<<3<1<x|x|? |xy1xboard-4.7.3/winboard/bitmaps/r58s.bmp0000644000175000001440000000101612262415351014465 00000000000000BM>(::} } ?????????????????????????????||||xboard-4.7.3/winboard/bitmaps/k58w.bmp0000644000175000001440000000101612262415351014462 00000000000000BM>(::?0<???xboard-4.7.3/winboard/bitmaps/p95s.bmp0000644000175000001440000000226212262415351014470 00000000000000BM>(__t} } ????????????xboard-4.7.3/winboard/bitmaps/a54s.bmp0000644000175000001440000000075612262415351014452 00000000000000BM>(66} } 0|<<|?03?O0000||0|000?xboard-4.7.3/winboard/bitmaps/n95s.bmp0000644000175000001440000000226212262415351014466 00000000000000BM>(__t} } ? ??>>?>?|?||` 000<?><|?>??x??xboard-4.7.3/winboard/bitmaps/as72s.bmp0000644000175000001440000000163612262415351014633 00000000000000BM>(HH`?~<?|<><<<~? @G0 /`~<@` @0?a0# ` 0`0`? ?0?`  0`0?`` <0~0 `?xboard-4.7.3/winboard/bitmaps/b40w.bmp0000644000175000001440000000057612262415351014452 00000000000000BM~>(((@>??xboard-4.7.3/winboard/bitmaps/p116o.bmp0000644000175000001440000000357612262415351014547 00000000000000BM~>(tt@} } ?????????????????????????xboard-4.7.3/winboard/bitmaps/p95o.bmp0000644000175000001440000000226212262415351014464 00000000000000BM>(__t} } ???????????????????????xboard-4.7.3/winboard/bitmaps/k87w.bmp0000644000175000001440000000212212262415351014463 00000000000000BMR>(WW??~~~~~~~` ?????xboard-4.7.3/winboard/bitmaps/p80s.bmp0000644000175000001440000000177612262415351014473 00000000000000BM>(PP  ????xboard-4.7.3/winboard/bitmaps/f49w.bmp0000644000175000001440000000070612262415351014462 00000000000000BM>(11??????xboard-4.7.3/winboard/bitmaps/r37w.bmp0000644000175000001440000000054612262415351014475 00000000000000BMf>(%%(xboard-4.7.3/winboard/bitmaps/convert.exe0000644000175000001440000003474612262415351015367 00000000000000MZ@ !L!This program cannot be run in DOS mode. $PEL H 8  @`w PD.text   `.data0 @.rdata0@@.bssp@.idataDP@U]E1ۉu1=wC=r[$1҉T$ tzt$л؋u]]=twJ=t؋u]]=t[=u$1t$ tjt$=$D$ v# l$ 1D$d t0R$ ?$L$4 %$ D$ 'US$$@U EED$ @$@@D$ ED$@@D$@@td @P@t@@D$P@@0$P@t(@@D$P@@P$g K @!D$@@D$@@$$VD$P@@$P@@U$P@&U$P@&U P@]t&U P@]ᐐU\'WVS }U 0@D$B$0@D$\$$>H1$@~\$\$\$ 0@\$D$D$$1ɉ$@&~$0@D$D$1111ۉf$:ùt&'% IyG$ù% IyG$ù% IyG$ù% IyG ;@9‰U 11Z;tASB@zt"z\uB@zu11;'<.@<u\$1$0@D$\$$40@D$v\$$J0@fHG1K$e0@FD$;ȃÅ])Ӄ)ȉ ÅR$l0@Fq$e0@ÉD$^F$ !1;8H$o0@e[^_]Ã)A&$t0@$$0@] C$0@D$ΐU @8t @BR @uÍ&US@t)t'@Ku$ @:Y[]1=@ @@u뾍'U @@t]f] @@냐U0@Q@0@r]ÐUSX5 PX1ة 1%ft 0@@t 0@@t 0@@t 0@@t 0@@ t 0@@@ t 0@@=v,0@@@t 0@@[]à 0@@M[ 0@@]ÐU]ÐQ=r -) ̋@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@%P@@@rbBM%c%c%c%c%c%ch=%d, w=%d #define %s_width %d #define %s_height %d static char %s_bits[] = { 0x%02x, };usage is: convert %s does not have bitmap format file %s not found @P RPP4RPPQQ"Q4Q>QFQPQ\QfQnQvQ~QQQQQQQPQQ"Q4Q>QFQPQ\QfQnQvQ~QQQQQQQ'__getmainargs<__p__environ>__p__fmodeP__set_app_typey_cexit_iob^_onexit_setmodeatexit*exit1fgetc8fopenBfscanfprintfputcharputssignalExitProcessSetUnhandledExceptionFilterPPPPPPPPPPPPPPPPPmsvcrt.dllPPKERNEL32.dll.filegcrt1.c P 2 B _atexit __onexit .text*.data.bss.filegconvert.c_main .text4'.data.bss.rdata.file"gCRTglob.c.text .data.bss.file*gCRTfmode.c.text .data.bss.file2gtxtmode.c.text .data.bss .file@ggccmain.cU p.0 b  uP ___main .text  .data .bss .fileJgpseudo-reloc.c .text(.data0.bss0.fileTgcpu_features.c  .text  .data0.bss0.file_gCRT_fp10.c_fpreset    .text .data0.bss@.fileg.text .data0.bss@probe done- .text -.data0.bssP.text@ .data0.bssP.text@ .data0.bssP.idata$7.idata$5.idata$4T.idata$6>.text@ .data0.bssP.idata$7.idata$5.idata$4L.idata$6".textH .data0.bssP.idata$7.idata$5.idata$4`.idata$6\.textH .data0.bssP.idata$7.idata$5.idata$4X.idata$6F.textH .data0.bssP.idata$7.idata$5.idata$4P.idata$64.textP .data0.bssP.idata$7.idata$5.idata$4D.idata$6.textX .data0.bssP.idata$7.idata$5.idata$4.idata$6.text` .data0.bssP.idata$7.idata$5.idata$4H.idata$6.texth .data0.bssP.idata$7.idata$5.idata$4\.idata$6P.textp .data0.bssP.idata$7.idata$5.idata$4@.idata$6.textx .data0.bssP.idata$7.idata$5.idata$4x.idata$6.text .data0.bssP.idata$7.idata$5.idata$4|.idata$6.text .data0.bssP.idata$7.idata$5.idata$4h.idata$6n.text .data0.bssP.idata$7 .idata$5.idata$4p.idata$6~.text .data0.bssP.idata$7.idata$5.idata$4d.idata$6f.text .data0.bssP.idata$7.idata$5.idata$4t.idata$6.text .data0.bssP.idata$7.idata$5.idata$4l.idata$6v.filegfakehname@fthunk.text .data0.bssP.idata$2.idata$5.idata$4<.filegfake.text .data0.bssP.idata$4.idata$5.idata$7  .text .data0.bssP.idata$7,.idata$5.idata$4.idata$6.text .data0.bssP.idata$70.idata$5.idata$4.idata$6.file(gfakehnamefthunk.text .data0.bssP.idata$2.idata$5.idata$4.file6gfake.text .data0.bssP.idata$4.idata$5.idata$74 __cexitH  _putcharx   #2`  >  ]`@l  `@`@ `@_puts   !-;^vP  `@`@__dll__@ 6T__argcf  u0p   @ p`@__alloca `@__argv _fopen  __fmode__end__`@_fgetc  _signalX  - ;T`@ft`@0$/h  9G\j_exit  _printf  4`@_fscanf  __gnu_exception_handler@4___mingw_CRTStartup_mainCRTStartup_WinMainCRTStartup_initialized___do_global_dtors___do_global_ctors__pei386_runtime_relocator___cpu_features_init__fpresetpseudo-reloc-list.c___RUNTIME_PSEUDO_RELOC_LIST____imp___setmode__data_start_____DTOR_LIST____imp___onexit___p__fmode_SetUnhandledExceptionFilter@4___tls_start____libmsvcrt_a_iname__size_of_stack_commit____size_of_stack_reserve____major_subsystem_version_____crt_xl_start_____crt_xi_start_____chkstk___crt_xi_end____imp____p__environ__imp___iob__bss_start_____RUNTIME_PSEUDO_RELOC_LIST_END____size_of_heap_commit_____p__environ___crt_xp_start____imp__putchar___crt_xp_end____imp__signal__imp__puts__minor_os_version____imp__atexit__head_libmsvcrt_a__image_base____imp__exit__section_alignment____RUNTIME_PSEUDO_RELOC_LIST____imp____p__fmode_ExitProcess@4__data_end_____getmainargs__CTOR_LIST_____set_app_type__bss_end____CRT_fmode___crt_xc_end_____crt_xc_start_____CTOR_LIST____imp__fgetc__file_alignment____major_os_version____DTOR_LIST____size_of_heap_reserve_____crt_xt_start____subsystem____imp__fopen__imp____getmainargs___tls_end____imp__fscanf__imp__ExitProcess@4___cpu_features__imp__SetUnhandledExceptionFilter@4__major_image_version____loader_flags____CRT_glob__setmode__imp__printf__head_libkernel32_a__imp___cexit__minor_subsystem_version____minor_image_version____imp____set_app_type__RUNTIME_PSEUDO_RELOC_LIST_END____libkernel32_a_iname___crt_xt_end__xboard-4.7.3/winboard/bitmaps/cv49s.bmp0000644000175000001440000000070612262415351014641 00000000000000BM>(11>>>>????<0? ?@3@c ハxboard-4.7.3/winboard/bitmaps/b25s.bmp0000644000175000001440000000024212262415351014437 00000000000000BM>(d} } >{?>?>?xboard-4.7.3/winboard/bitmaps/p33w.bmp0000644000175000001440000000050612262415351014463 00000000000000BMF>(!!??????xboard-4.7.3/winboard/bitmaps/wp49s.bmp0000644000175000001440000000070612262415351014657 00000000000000BM>(11?@_ 8>_ ???xboard-4.7.3/winboard/bitmaps/k37w.bmp0000644000175000001440000000054612262415351014466 00000000000000BMf>(%%(xx88888xxboard-4.7.3/winboard/bitmaps/wl33s.bmp0000644000175000001440000000050612262415351014642 00000000000000BMF>(!!?'<|3CÀ 0?xboard-4.7.3/winboard/bitmaps/q108w.bmp0000644000175000001440000000337612262415351014557 00000000000000BM>(ll???  ``88|||?????????p?p?ppp??????xboard-4.7.3/winboard/bitmaps/wl72o.bmp0000644000175000001440000000163612262415351014646 00000000000000BM>(HH`??? ρ|???????????????y?p??????xboard-4.7.3/winboard/bitmaps/wn33o.bmp0000644000175000001440000000050612262415351014640 00000000000000BMF>(!!?߀׀?c?ˀ?;߀xboard-4.7.3/winboard/bitmaps/q108o.bmp0000644000175000001440000000337612262415351014547 00000000000000BM>(ll} } ??x????????@C??pxcÀ8px?|#?#?c?c88||q|q88?????qq?1??1??1???p?p?ppp?? ????????????????xboard-4.7.3/winboard/bitmaps/dk33w.bmp0000644000175000001440000000050612262415351014622 00000000000000BMF>(!!} } ?????xboard-4.7.3/winboard/bitmaps/o49w.bmp0000644000175000001440000000070612262415351014473 00000000000000BM>(11??xboard-4.7.3/winboard/bitmaps/n116o.bmp0000644000175000001440000000357612262415351014545 00000000000000BM~>(tt@} } ????>?LJ??q1???????O??|8?????>8??0??xboard-4.7.3/winboard/bitmaps/e72s.bmp0000644000175000001440000000163612262415351014454 00000000000000BM>(HH`?pr8s'93?yp?|8?~r<8`0 ??ppp00000000000?8??xboard-4.7.3/winboard/bitmaps/k33o.bmp0000644000175000001440000000050612262415351014446 00000000000000BMF>(!!} } ??_??xboard-4.7.3/winboard/bitmaps/q58w.bmp0000644000175000001440000000101612262415351014470 00000000000000BM>(::???  `ppx>????????@?@|@|||~xboard-4.7.3/winboard/bitmaps/icon_b.ico0000644000175000001440000000207612262415351015120 00000000000000 0& V( @000000 ````@` 0|>???9}( @|>???9}xboard-4.7.3/winboard/bitmaps/l58o.bmp0000644000175000001440000000101612262415351014453 00000000000000BM>(::  ?3???<<??????xboard-4.7.3/winboard/bitmaps/k33w.bmp0000644000175000001440000000050612262415351014456 00000000000000BMF>(!!??????? ?xboard-4.7.3/winboard/bitmaps/q80s.bmp0000644000175000001440000000177612262415351014474 00000000000000BM>(PP  ??@???88xx??????????????????????xboard-4.7.3/winboard/bitmaps/k108w.bmp0000644000175000001440000000337612262415351014551 00000000000000BM>(ll??????p?xboard-4.7.3/winboard/bitmaps/l40o.bmp0000644000175000001440000000057612262415351014454 00000000000000BM~>(((@  E}}}xboard-4.7.3/winboard/bitmaps/cv49w.bmp0000644000175000001440000000070612262415351014645 00000000000000BM>(11||||??>80??xboard-4.7.3/winboard/bitmaps/n129o.bmp0000644000175000001440000000512212262415351014536 00000000000000BMR >( } } ??? ???ÃÃ?Á????????????????????0??op ?xboard-4.7.3/winboard/bitmaps/g49o.bmp0000644000175000001440000000070612262415351014453 00000000000000BM>(11?#3f{>>}޾ݽݽ۽??_wwwxboard-4.7.3/winboard/bitmaps/e49o.bmp0000644000175000001440000000070612262415351014451 00000000000000BM>(11}3=]nmu5ǀZ׀ww7w|?}?_______{_o??xboard-4.7.3/winboard/bitmaps/p54s.bmp0000644000175000001440000000075612262415351014471 00000000000000BM>(66} } ????xboard-4.7.3/winboard/bitmaps/ws49s.bmp0000644000175000001440000000070612262415351014662 00000000000000BM>(11?@_ 8>_pp  ???xboard-4.7.3/winboard/bitmaps/b21w.bmp0000644000175000001440000000022212262415351014435 00000000000000BM>(T xboard-4.7.3/winboard/bitmaps/a49o.bmp0000644000175000001440000000070612262415351014445 00000000000000BM>(11wx??`?߀??xboard-4.7.3/winboard/bitmaps/v72w.bmp0000644000175000001440000000163612262415351014501 00000000000000BM>(HH`??a?xboard-4.7.3/winboard/bitmaps/q33s.bmp0000644000175000001440000000050612262415351014460 00000000000000BMF>(!!} } ??`????ǀǀ8<Ϟ<>>>p|9(!!} } ????xboard-4.7.3/winboard/bitmaps/n40w.bmp0000644000175000001440000000057612262415351014466 00000000000000BM~>(((@8??xboard-4.7.3/winboard/bitmaps/cv58o.bmp0000644000175000001440000000101612262415351014630 00000000000000BM>(::} } ????3g??7?gg;ٿ????>?xboard-4.7.3/winboard/bitmaps/baloon_14.ico0000644000175000001440000000044612262415351015444 00000000000000(|  xboard-4.7.3/winboard/bitmaps/wp49o.bmp0000644000175000001440000000070612262415351014653 00000000000000BM>(11?߀o??߀_߀߀߀??xboard-4.7.3/winboard/bitmaps/c49w.bmp0000644000175000001440000000070612262415351014457 00000000000000BM>(11?????????xboard-4.7.3/winboard/bitmaps/q87o.bmp0000644000175000001440000000212212262415351014461 00000000000000BMR>(WW} } ?????????8?g0B?=x??????1Ǐ?1Ï?1>88>88>><|x><|||x~<|||xG~<|||q|~18181888>?>?8|||??8xboard-4.7.3/winboard/bitmaps/dk72w.bmp0000644000175000001440000000163612262415351014632 00000000000000BM>(HH`?????????xboard-4.7.3/winboard/bitmaps/n54s.bmp0000644000175000001440000000075612262415351014467 00000000000000BM>(66} } ||||||||||||><< ?<<<x`ypyy ??xboard-4.7.3/winboard/bitmaps/p116s.bmp0000644000175000001440000000357612262415351014553 00000000000000BM~>(tt@} } ???????xboard-4.7.3/winboard/bitmaps/l64w.bmp0000644000175000001440000000107612262415351014466 00000000000000BM>>(@@  ??????????????xboard-4.7.3/winboard/bitmaps/p80o.bmp0000644000175000001440000000177612262415351014467 00000000000000BM>(PP  ??????????????xboard-4.7.3/winboard/bitmaps/k80s.bmp0000644000175000001440000000177612262415351014466 00000000000000BM>(PP  x?s??``s`98p0pp 0`88?8?9?9?s?s??pcpq8 08x891s?xboard-4.7.3/winboard/bitmaps/p64o.bmp0000644000175000001440000000107612262415351014462 00000000000000BM>>(@@  ?????????????xboard-4.7.3/winboard/bitmaps/a49c.bmp0000644000175000001440000000272212262415351014431 00000000000000BMv(11\xboard-4.7.3/winboard/bitmaps/b108s.bmp0000644000175000001440000000337612262415351014534 00000000000000BM>(ll} } ????????????xboard-4.7.3/winboard/bitmaps/o33s.bmp0000644000175000001440000000050612262415351014456 00000000000000BMF>(!!G ?xboard-4.7.3/winboard/bitmaps/k129o.bmp0000644000175000001440000000512212262415351014533 00000000000000BMR >( } } ??????p?????????????????p?????????????????????xboard-4.7.3/winboard/bitmaps/h33s.bmp0000644000175000001440000000050612262415351014447 00000000000000BMF>(!!} } |>777'o op@O߀?x gxboard-4.7.3/winboard/bitmaps/k72o.bmp0000644000175000001440000000163612262415351014456 00000000000000BM>(HH`} } p?@|>?????????<<~~?????y??~?<xboard-4.7.3/winboard/bitmaps/b58w.bmp0000644000175000001440000000101612262415351014451 00000000000000BM>(::? ????????xboard-4.7.3/winboard/bitmaps/ws72s.bmp0000644000175000001440000000163612262415351014661 00000000000000BM>(HH`?? |~??????? ?q?? 8??????xboard-4.7.3/winboard/bitmaps/n37o.bmp0000644000175000001440000000054612262415351014461 00000000000000BMf>(%%(} } xxxxxxx~x_?oxboard-4.7.3/winboard/bitmaps/k21s.bmp0000644000175000001440000000022212262415351014442 00000000000000BM>(T  xxxx8H (P((&ĩxxboard-4.7.3/winboard/bitmaps/b95s.bmp0000644000175000001440000000226212262415351014452 00000000000000BM>(__t} } ?||?????xboard-4.7.3/winboard/bitmaps/l64o.bmp0000644000175000001440000000107612262415351014456 00000000000000BM>>(@@  ????????c?????~~?????xboard-4.7.3/winboard/bitmaps/n87o.bmp0000644000175000001440000000212212262415351014456 00000000000000BMR>(WW} } ?????3!  q??????ǃc O<><?xGpA???xboard-4.7.3/winboard/bitmaps/p116w.bmp0000644000175000001440000000357612262415351014557 00000000000000BM~>(tt@???????xboard-4.7.3/winboard/bitmaps/l45s.bmp0000644000175000001440000000064612262415351014463 00000000000000BM>(--h} } ????xboard-4.7.3/winboard/bitmaps/r129o.bmp0000644000175000001440000000512212262415351014542 00000000000000BMR >( } } ???????????xboard-4.7.3/winboard/bitmaps/g72o.bmp0000644000175000001440000000163612262415351014452 00000000000000BM>(HH`} } ~???@?"Do?0 ??=ü?????ϟ㟜ǟǟϟ<>y>y~y?~y?9O9O3q????q?q????q?xboard-4.7.3/winboard/bitmaps/l33s.bmp0000644000175000001440000000050612262415351014453 00000000000000BMF>(!!G@@@AACCxboard-4.7.3/winboard/bitmaps/convert.c0000644000175000001440000000366512262415351015024 00000000000000#include // [HGM] This program converts a WinBoard monochrome .bmp piece-symbol bitmap file // to a .bm C-source file suitable for inclusion in xboard as buit-in bitmap. // You will have to convert the bitmaps one by one, and re-direct the output to the desired file! main(int argc, char **argv) { int i, j, k, d, cnt; char c, *p, data[10000], *name; unsigned char h, w; FILE *f; if(argc<2) { printf("usage is: convert \n"); exit(0); } f = fopen(argv[1], "rb"); if(f == NULL) { printf("file %s not found\n", argv[1]); exit(0); } if(fscanf(f, "BM%c", &i) != 1) { printf("%s does not have bitmap format\n"); exit(0); } for(i=0; i<15; i++) fgetc(f); fscanf(f, "%c%c%c%c%c", &h, &i, &i, &i, &w); for(i=0; i<39; i++) fgetc(f); // printf("h=%d, w=%d\n", h, w); p = data; for(i=0; i>1) | (c&0x80); c <<= 1; } *p++ = d; c = fgetc(f); for(k=0; k<8; k++) { d = (d>>1) | (c&0x80); c <<= 1; } *p++ = d; c = fgetc(f); for(k=0; k<8; k++) { d = (d>>1) | (c&0x80); c <<= 1; } *p++ = d; c = fgetc(f); for(k=0; k<8; k++) { d = (d>>1) | (c&0x80); c <<= 1; } *p++ = d; } } fclose(f); name = argv[1]; for(i=0; argv[1][i]; i++) if(argv[1][i] == '\\') name = argv[1]+i+1; for(i=0; name[i]; i++) if(name[i] == '.') name[i] = 0; printf("#define %s_width %d\n", name, w); printf("#define %s_height %d\n", name, h); printf("static unsigned char %s_bits[] = {\n", name); cnt = 0; for(i=h-1; i>=0; i--) { for(j=0; j>(8+j-w); // for(k=0; k<8; k++) { // printf("%c", c&1 ? 'X' : '.'); // c >>= 1; // } if(cnt!=0) printf(","); printf("0x%02x", c&255); if(++cnt % 15 == 0) { printf("\n"); } } } printf("\n};\n"); } xboard-4.7.3/winboard/bitmaps/p21o.bmp0000644000175000001440000000022212262415351014443 00000000000000BM>(T  xxxxwwwsxboard-4.7.3/winboard/bitmaps/analyze_14.ico0000644000175000001440000000044612262415351015635 00000000000000(pwwpwwwwwwxboard-4.7.3/winboard/bitmaps/b49w.bmp0000644000175000001440000000070612262415351014456 00000000000000BM>(11???????xboard-4.7.3/winboard/bitmaps/cv72w.bmp0000644000175000001440000000163612262415351014644 00000000000000BM>(HH`} } ?????????xboard-4.7.3/winboard/bitmaps/r80s.bmp0000644000175000001440000000177612262415351014475 00000000000000BM>(PP  ?????xboard-4.7.3/winboard/bitmaps/q116w.bmp0000644000175000001440000000357612262415351014560 00000000000000BM~>(tt@????????  >><~<>>~???????xboard-4.7.3/winboard/bitmaps/q72w.bmp0000644000175000001440000000163612262415351014474 00000000000000BM>(HH`????@@   0ppx?x?x???????xboard-4.7.3/winboard/bitmaps/s49o.bmp0000644000175000001440000000070612262415351014467 00000000000000BM>(11π࿀?ߟ??}xboard-4.7.3/winboard/bitmaps/wl33o.bmp0000644000175000001440000000050612262415351014636 00000000000000BMF>(!!?߀׀?cˀﻀ;߀xboard-4.7.3/winboard/bitmaps/as33s.bmp0000644000175000001440000000050612262415351014623 00000000000000BMF>(!!AG / QA A ?D AC#?xboard-4.7.3/winboard/bitmaps/a40o.bmp0000644000175000001440000000057612262415351014441 00000000000000BM~>(((@  >?o??>xboard-4.7.3/winboard/bitmaps/c54w.bmp0000644000175000001440000000075612262415351014460 00000000000000BM>(66} } ??<?<????<??<xboard-4.7.3/winboard/bitmaps/ponder_14.ico0000644000175000001440000000044612262415351015461 00000000000000(?  |xboard-4.7.3/winboard/bitmaps/k129s.bmp0000644000175000001440000000512212262415351014537 00000000000000BMR >( } } ??8??<<???~~?<<<<<<<<??|>?~|>~||>>|>x>|~~?x>|<<??|>?xx???p??xx|>??????????????????xboard-4.7.3/winboard/bitmaps/n87w.bmp0000644000175000001440000000212212262415351014466 00000000000000BMR>(WW?p?????@???xboard-4.7.3/winboard/bitmaps/c45w.bmp0000644000175000001440000000064612262415351014456 00000000000000BM>(--h} } ??x888x?x888x??xboard-4.7.3/winboard/bitmaps/n37s.bmp0000644000175000001440000000054612262415351014465 00000000000000BMf>(%%(} } xxxxxxxxx`  07'O???xboard-4.7.3/winboard/bitmaps/m49o.bmp0000644000175000001440000000070612262415351014461 00000000000000BM>(11??a?߀߀߀?xboard-4.7.3/winboard/bitmaps/tim.bmp0000644000175000001440000001646612262415351014474 00000000000000BM66(PP  '''bbb }}}:::OOO:::'''YYY!!!zzzRRReee:::RRReee:::'''777kkkzzzRRROOOCCC777!!!eee...qqqIII111ܔܓ 9Ѿ-"HH~&UUUZZZ222^^hkMn888888ܓܔDE?$0k-1p,HHU&&&&^2UZ2Z2U2& 8e78888888ѶܔܔF$ɱk-" Hhhl"IHHI&H&22Z22^^ZtT88888888ܓܓE0p,HhH"pS="@""""I~ZZZZZ2&DT888888ܓܔT1"H,hĆ-SVVr="hhZZ222^2^r888888ܓܔܔ-pp,Hl?--SI"&ZZZ22/&&8888887-"H"-_kP0zkkV>>>>CcPPJ r@|,.sn Otc񼵼rplrJܓܓmt,1C666>꣖ʨ @r@ Z Hv%:V""=A#ܓܓܓܘCC666{66)>) {tt,Yv:(aڼ<<l=7^ܓܓܓͳ*CCC6>6{>{>6) y]:CC>>6 )6$>):Pt(:(y-".&ܓܓl&C))CC)):)CC>CCCC C6))(P%((ycy<<"lUlܓI0) ))](0)C:)C)C)<!((({,H2+JU+ij+U&Z h=p.3jLw .z}lhiJJTJ2,0)2ZTq.+i3+·H Hh "3.uX~A.}*&~hhUUUUIr]Kf>P-V5kakac<׳IUU"hYrrph.q㓓XXXx~1z0C>C>{6>]:(](aPV>>6{(]]]Pkaarp" 3瓓#[.ZX"-o*C>C>66))(K]]]](Prt""U.3ujܓ~uZlp100CfC>>>>>Q]](](]((%%(} } www88GGOGG88wwwxboard-4.7.3/winboard/bitmaps/a45w.bmp0000644000175000001440000000064612262415351014454 00000000000000BM>(--h} } x88xxxx??xboard-4.7.3/winboard/bitmaps/a33o.bmp0000644000175000001440000000050612262415351014434 00000000000000BMF>(!!} } ?xboard-4.7.3/winboard/bitmaps/icon_b.bmp0000644000175000001440000000027612262415351015124 00000000000000BM>(   777777|/>oooo_?` 3?9}xboard-4.7.3/winboard/bitmaps/c45s.bmp0000644000175000001440000000064612262415351014452 00000000000000BM>(--h} } ??x0`x@?@0`xx??xboard-4.7.3/winboard/bitmaps/l72s.bmp0000644000175000001440000000163612262415351014463 00000000000000BM>(HH`??????xboard-4.7.3/winboard/bitmaps/p45w.bmp0000644000175000001440000000064612262415351014473 00000000000000BM>(--h????xboard-4.7.3/winboard/bitmaps/p37w.bmp0000644000175000001440000000054612262415351014473 00000000000000BMf>(%%(?xboard-4.7.3/winboard/bitmaps/p58w.bmp0000644000175000001440000000101612262415351014467 00000000000000BM>(::???xboard-4.7.3/winboard/bitmaps/r129s.bmp0000644000175000001440000000512212262415351014546 00000000000000BMR >( } } ???????????xboard-4.7.3/winboard/bitmaps/n87s.bmp0000644000175000001440000000212212262415351014462 00000000000000BMR>(WW} } A0? ?x>>>?|?|?|>||?>??? p??xboard-4.7.3/winboard/bitmaps/u72s.bmp0000644000175000001440000000163612262415351014474 00000000000000BM>(HH`?E? ??~????`p <>?A1Xc0p???xboard-4.7.3/winboard/bitmaps/cv72s.bmp0000644000175000001440000000163612262415351014640 00000000000000BM>(HH`} } ????x?x?||<<<<<<<<?<>1qqaǀǀ ??ppx<|  ?xboard-4.7.3/winboard/bitmaps/p72w.bmp0000644000175000001440000000163612262415351014473 00000000000000BM>(HH`???????????xboard-4.7.3/winboard/bitmaps/a45o.bmp0000644000175000001440000000064612262415351014444 00000000000000BM>(--h} } xx=ϟ?xxx?xboard-4.7.3/winboard/bitmaps/v33w.bmp0000644000175000001440000000050612262415351014471 00000000000000BMF>(!!?{3??xboard-4.7.3/winboard/bitmaps/k116w.bmp0000644000175000001440000000357612262415351014552 00000000000000BM~>(tt@?????????????????????????????? >????xboard-4.7.3/winboard/bitmaps/q64o.bmp0000644000175000001440000000107612262415351014463 00000000000000BM>>(@@  ???|>????`  x<91<(%%(} } <0gxPPxPxTR8 x|wxboard-4.7.3/winboard/bitmaps/cv49o.bmp0000644000175000001440000000070612262415351014635 00000000000000BM>(11|}}}뿀߀߿_~__;?ooxboard-4.7.3/winboard/bitmaps/p25s.bmp0000644000175000001440000000024212262415351014455 00000000000000BM>(d} } ?xboard-4.7.3/winboard/bitmaps/a64o.bmp0000644000175000001440000000107612262415351014443 00000000000000BM>>(@@  ???O????????xboard-4.7.3/winboard/bitmaps/m72s.bmp0000644000175000001440000000163612262415351014464 00000000000000BM>(HH`???????????xboard-4.7.3/winboard/bitmaps/g49w.bmp0000644000175000001440000000070612262415351014463 00000000000000BM>(11????Á?????xboard-4.7.3/winboard/bitmaps/q116o.bmp0000644000175000001440000000357612262415351014550 00000000000000BM~>(tt@} } ???????????x?px8`Ã|<????????????>>?|>?Ǐ<|~?Ǐ<x?>?x?>?q?~?q???>?c>?c>?#<Ǐ<Ǐ?<Ǐ?88811?pGGGGGx ?xboard-4.7.3/winboard/bitmaps/q108s.bmp0000644000175000001440000000337612262415351014553 00000000000000BM>(ll} } ?>?????? ``888|||??????????p?p?ppp??????xboard-4.7.3/winboard/bitmaps/cv37w.bmp0000644000175000001440000000054612262415351014644 00000000000000BMf>(%%(  <<<?????xboard-4.7.3/winboard/bitmaps/p37o.bmp0000644000175000001440000000054612262415351014463 00000000000000BMf>(%%(} } swxboard-4.7.3/winboard/bitmaps/c64s.bmp0000644000175000001440000000107612262415351014451 00000000000000BM>>(@@  ????|>@`p 0 0??? 0 0p`|>???xboard-4.7.3/winboard/bitmaps/u72o.bmp0000644000175000001440000000163612262415351014470 00000000000000BM>(HH`???E? ??~??????s???< F?1σc3q???xboard-4.7.3/winboard/bitmaps/g33s.bmp0000644000175000001440000000050612262415351014446 00000000000000BMF>(!!} }  ??0?0?q?ǟǟπ燀πxboard-4.7.3/winboard/bitmaps/q129o.bmp0000644000175000001440000000512212262415351014541 00000000000000BMR >( } } ????`????~as?????8?8???x??????~~~~~~8??xboard-4.7.3/winboard/bitmaps/a37s.bmp0000644000175000001440000000054612262415351014450 00000000000000BMf>(%%(} } xx 8x<w???  xx 8 88xxboard-4.7.3/winboard/bitmaps/q37s.bmp0000644000175000001440000000054612262415351014470 00000000000000BMf>(%%(} } 0gxxxÎxǏxǏ8>>߾8xboard-4.7.3/winboard/bitmaps/b129w.bmp0000644000175000001440000000512212262415351014532 00000000000000BMR >( ?????????????xboard-4.7.3/winboard/bitmaps/wl72s.bmp0000644000175000001440000000163612262415351014652 00000000000000BM>(HH`?? |~????????8`0`0`0 `088??????xboard-4.7.3/winboard/bitmaps/r40s.bmp0000644000175000001440000000057612262415351014466 00000000000000BM~>(((@  ?????xboard-4.7.3/winboard/bitmaps/cv58w.bmp0000644000175000001440000000101612262415351014640 00000000000000BM>(::} } ??????????xboard-4.7.3/winboard/bitmaps/k40w.bmp0000644000175000001440000000057612262415351014463 00000000000000BM~>(((@??xboard-4.7.3/winboard/bitmaps/p129o.bmp0000644000175000001440000000512212262415351014540 00000000000000BMR >( } } ????????????xboard-4.7.3/winboard/bitmaps/b80s.bmp0000644000175000001440000000177612262415351014455 00000000000000BM>(PP  ??????????xboard-4.7.3/winboard/bitmaps/c58s.bmp0000644000175000001440000000101612262415351014446 00000000000000BM>(::} } ???ss>s880``````088>sss???xboard-4.7.3/winboard/bitmaps/b49s.bmp0000644000175000001440000000070612262415351014452 00000000000000BM>(11} } ?? ?????xboard-4.7.3/winboard/bitmaps/n25s.bmp0000644000175000001440000000024212262415351014453 00000000000000BM>(d} }  x37'oO?Gxboard-4.7.3/winboard/bitmaps/o72w.bmp0000644000175000001440000000163612262415351014472 00000000000000BM>(HH`?????????xboard-4.7.3/winboard/bitmaps/q54s.bmp0000644000175000001440000000075612262415351014472 00000000000000BM>(66} } ??????  <|~|| ~? ~? x?x p8 <???>xboard-4.7.3/winboard/bitmaps/dk49s.bmp0000644000175000001440000000070612262415351014627 00000000000000BM>(11??????xboard-4.7.3/winboard/bitmaps/a40w.bmp0000644000175000001440000000057612262415351014451 00000000000000BM~>(((@  >????xboard-4.7.3/winboard/wlayout.c0000644000175000001440000001502712262415351013404 00000000000000/* * Layout management * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include #include "common.h" #include "frontend.h" #include "winboard.h" VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ) { if( wp->x != CW_USEDEFAULT || wp->y != CW_USEDEFAULT || wp->width != CW_USEDEFAULT || wp->height != CW_USEDEFAULT ) { WINDOWPLACEMENT stWP; ZeroMemory( &stWP, sizeof(stWP) ); EnsureOnScreen( &wp->x, &wp->y, 0, 0); stWP.length = sizeof(stWP); stWP.flags = 0; stWP.showCmd = SW_SHOW; stWP.ptMaxPosition.x = 0; stWP.ptMaxPosition.y = 0; stWP.rcNormalPosition.left = wp->x; stWP.rcNormalPosition.right = wp->x + wp->width; stWP.rcNormalPosition.top = wp->y; stWP.rcNormalPosition.bottom = wp->y + wp->height; SetWindowPlacement(hWnd, &stWP); } } VOID InitWindowPlacement( WindowPlacement * wp ) { wp->visible = TRUE; wp->x = CW_USEDEFAULT; wp->y = CW_USEDEFAULT; wp->width = CW_USEDEFAULT; wp->height = CW_USEDEFAULT; } static BOOL IsAttachDistance( int a, int b ) { BOOL result = FALSE; if( a == b ) { result = TRUE; } return result; } static BOOL IsDefaultPlacement( WindowPlacement * wp ) { BOOL result = FALSE; if( wp->x == CW_USEDEFAULT || wp->y == CW_USEDEFAULT || wp->width == CW_USEDEFAULT || wp->height == CW_USEDEFAULT ) { result = TRUE; } return result; } BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp ) { BOOL result = FALSE; if( hWnd != NULL ) { WINDOWPLACEMENT stWP; ZeroMemory( &stWP, sizeof(stWP) ); stWP.length = sizeof(stWP); GetWindowPlacement( hWnd, &stWP ); wp->x = stWP.rcNormalPosition.left; wp->y = stWP.rcNormalPosition.top; wp->width = stWP.rcNormalPosition.right - stWP.rcNormalPosition.left; wp->height = stWP.rcNormalPosition.bottom - stWP.rcNormalPosition.top; result = TRUE; } return result; } static BOOL IsAttachedByWindowPlacement( LPRECT lprcMain, WindowPlacement * wp ) { BOOL result = FALSE; if( ! IsDefaultPlacement(wp) ) { if( IsAttachDistance( lprcMain->right, wp->x ) || IsAttachDistance( lprcMain->bottom, wp->y ) || IsAttachDistance( lprcMain->left, (wp->x + wp->width) ) || IsAttachDistance( lprcMain->top, (wp->y + wp->height) ) ) { result = TRUE; } } return result; } VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ) { if( ! IsDefaultPlacement( pwpChild ) ) { GetActualPlacement( hWndChild, pwpChild ); if( IsAttachedByWindowPlacement( lprcOldPos, pwpChild ) ) { /* Get position delta */ int delta_x = pwpChild->x - lprcOldPos->left; int delta_y = pwpChild->y - lprcOldPos->top; /* Adjust placement */ pwpChild->x = new_x + delta_x; pwpChild->y = new_y + delta_y; /* Move window */ if( hWndChild != NULL ) { SetWindowPos( hWndChild, HWND_TOP, pwpChild->x, pwpChild->y, 0, 0, SWP_NOZORDER | SWP_NOSIZE ); } } } } extern FILE *debugFP; VOID ReattachAfterSize( LPRECT lprcOldPos, int new_w, int new_h, HWND hWndChild, WindowPlacement * pwpChild ) { if( ! IsDefaultPlacement( pwpChild ) ) { GetActualPlacement( hWndChild, pwpChild ); if( IsAttachedByWindowPlacement( lprcOldPos, pwpChild ) ) { /* Get delta of lower right corner */ int delta_x = new_w - (lprcOldPos->right - lprcOldPos->left); int delta_y = new_h - (lprcOldPos->bottom - lprcOldPos->top); /* Adjust size & placement */ if(pwpChild->x + pwpChild->width >= lprcOldPos->right && (pwpChild->x + pwpChild->width < screenGeometry.right - 5 || delta_x > 0) ) // keep right edge glued to display edge if touching pwpChild->width += delta_x; if(pwpChild->x + pwpChild->width >= screenGeometry.right ) // don't move right edge off screen pwpChild->width = screenGeometry.right - pwpChild->x; if(pwpChild->y + pwpChild->height >= lprcOldPos->bottom && (pwpChild->y + pwpChild->height < screenGeometry.bottom - 35 || delta_y > 0) ) // keep bottom edge glued to display edge if touching pwpChild->height += delta_y; if(pwpChild->y + pwpChild->height >= screenGeometry.bottom - 30 ) // don't move bottom edge off screen pwpChild->height = screenGeometry.bottom - 30 - pwpChild->y; if(pwpChild->x >= lprcOldPos->right) pwpChild->width -= delta_x, pwpChild->x += delta_x; if(pwpChild->y >= lprcOldPos->bottom) pwpChild->height -= delta_y, pwpChild->y += delta_y; if(pwpChild->width < 30) pwpChild->width = 30; // force minimum width if(pwpChild->height < 50) pwpChild->height = 50; // force minimum height /* Move window */ if( hWndChild != NULL ) { SetWindowPos( hWndChild, HWND_TOP, pwpChild->x, pwpChild->y, pwpChild->width, pwpChild->height, SWP_NOZORDER ); } } } } xboard-4.7.3/winboard/winboard.rc0000644000175000001440000035006012262562252013671 00000000000000//Microsoft Developer Studio generated resource script. // #include "resource.h" #include "config.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "dlgs.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 // moved to "res" subdir to make testing easier-- don't want it in the root MANIFEST_RESOURCE_ID 24 MOVEABLE PURE "res\\winboard.exe.manifest" ///////////////////////////////////////////////////////////////////////////// // // Dialog // ABOUTBOX DIALOG DISCARDABLE 22, 17, 180, 108 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About WinBoard" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,126,89,50,14,WS_GROUP ICON "icon_white",IDC_STATIC,3,6,20,20 LTEXT "Chessboard for Windows",400,25,15,121,8 LTEXT "Copyright 1991 Digital Equipment Corporation",201,6,34, 149,8 LTEXT "Enhancements Copyright 1992-2014 Free Software Foundation", OPT_TCtext1,6,45,121,17 CONTROL "",OPT_TCTime,"Static",SS_BLACKRECT,4,28,159,1 LTEXT "WinBoard 0.0.0",ABOUTBOX_Version,25,5,160,8 LTEXT "Enhancements Copyright 2005\r\nAlessandro Scotti", IDC_STATIC,6,65,120,24 LTEXT " ", OPT_MESS,6,85,120,16 END DLG_TimeControl DIALOG DISCARDABLE 6, 18, 263, 212 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Time Control" FONT 8, "MS Sans Serif" BEGIN LTEXT "Use arrow keys to specify which clock setting type, then press tab to alter values.", IDC_Babble,9,9,231,20 CONTROL "Conventional chess clock",OPT_TCUseMoves,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,36,113,10 CONTROL "Incremental clock",OPT_TCUseInc,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,7,73,107,10 CONTROL "Fixed time per move",OPT_TCUseFixed,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,7,124,107,10 LTEXT "Number of moves:",OPT_TCtext1,15,52,58,8,NOT WS_GROUP EDITTEXT OPT_TCMoves,77,52,22,12,ES_AUTOHSCROLL | WS_GROUP LTEXT "Within number of minutes:",OPT_TCtext2,113,54,81,8,NOT WS_GROUP EDITTEXT OPT_TCTime,197,52,32,12,ES_AUTOHSCROLL LTEXT "Initial number of minutes:",OPT_TCitext1,15,89,126,8,NOT WS_GROUP EDITTEXT OPT_TCTime2,147,87,32,12,ES_AUTOHSCROLL | WS_GROUP LTEXT "Plus number of seconds per move:",OPT_TCitext2,15,105,129,8,NOT WS_GROUP EDITTEXT OPT_TCInc,147,103,32,12,ES_AUTOHSCROLL LTEXT "Maximum seconds per move:",OPT_TCftext,15,142,129,8,NOT WS_GROUP EDITTEXT OPT_TCFixed,147,140,32,12,ES_AUTOHSCROLL LTEXT "",OPT_TCitext3,185,148,67,8,NOT WS_GROUP LTEXT "Time-Odds Factors:",GPB_Factors,6,158,150,8,NOT WS_GROUP | WS_TABSTOP LTEXT "Engine #1:",IDC_Factor1,6,173,60,8,NOT WS_GROUP EDITTEXT OPT_TCOdds1,67,171,32,12,ES_AUTOHSCROLL | WS_GROUP LTEXT "Engine #2:",IDC_Factor2,106,173,60,8,NOT WS_GROUP EDITTEXT OPT_TCOdds2,167,171,32,12,ES_AUTOHSCROLL PUSHBUTTON "OK",IDOK,139,190,40,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,195,190,40,14 END DLG_LoadOptions DIALOG DISCARDABLE 10, 18, 170, 261 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Load Game Options" FONT 8, "MS Sans Serif" BEGIN CONTROL "Load games with &automatic stepping",OPT_Autostep,"Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,4,4,160,10 LTEXT "&seconds per move",OPT_AStext1,46,20,90,8,NOT WS_GROUP EDITTEXT OPT_ASTimeDelay,16,16,28,14,ES_AUTOHSCROLL LTEXT "when filtering game list on position, use thresholds:",OPT_thresholds,4,36,160,8,NOT WS_GROUP LTEXT "minimum Elo for &best player",OPT_elo1t,46,54,90,8,NOT WS_GROUP EDITTEXT OPT_elo1,16,50,28,14,ES_AUTOHSCROLL LTEXT "minimum Elo for &weakest players",OPT_elo2t,46,74,90,8,NOT WS_GROUP EDITTEXT OPT_elo2,16,70,28,14,ES_AUTOHSCROLL LTEXT "or later &year",OPT_datet,46,94,94,8,NOT WS_GROUP EDITTEXT OPT_date,16,90,28,14,ES_AUTOHSCROLL LTEXT "co&nsecutive positions",OPT_Stretcht,46,114,94,8,NOT WS_GROUP EDITTEXT OPT_Stretch,16,110,28,14,ES_AUTOHSCROLL CONTROL "Match exact &position",OPT_Exact,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,6,136,159,10 CONTROL "Match if position is s&ubset",OPT_Subset,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,6,149,159,10 CONTROL "Match material with e&xact pawn structure",OPT_Struct,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,6,162,159,10 CONTROL "Match &material",OPT_Material,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,6,175,159,10 CONTROL "Material &range (upper board-half is optional)",OPT_Range,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,6,188,159,10 CONTROL "Material &difference (optional material balanced)",OPT_Difference,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,6,201,159,10 GROUPBOX "Search Mode: ",OPT_SearchMode,3,126,164,87,WS_GROUP CONTROL "Also match reversed &colors",OPT_Reversed,"Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,4,214,160,10 CONTROL "Also match &left-right mirror image",OPT_Mirror,"Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,4,227,160,10 PUSHBUTTON "OK",IDOK,56,242,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,112,242,50,14 END DLG_SaveOptions DIALOG DISCARDABLE 6, 17, 218, 119 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Save Game Options" FONT 8, "MS Sans Serif" BEGIN CONTROL "Save games automatically",OPT_Autosave,"Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,4,4,157,10 CONTROL "Prompt for filename",OPT_AVPrompt,"Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,18,150,10 CONTROL "To file:",OPT_AVToFile,"Button",BS_AUTORADIOBUTTON,16, 32,56,10 EDITTEXT OPT_AVFilename,74,30,117,14,ES_AUTOHSCROLL PUSHBUTTON "...",OPT_AVBrowse,196,30,18,14 GROUPBOX "Save As: ",801,4,48,210,28,WS_GROUP CONTROL "PGN",OPT_PGN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,8, 60,59,10 CONTROL "Old",OPT_Old,"Button",BS_AUTORADIOBUTTON,74,60,114,10 CONTROL "Save out of book info in PGN",OPT_OutOfBookInfo,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,82,169,10 PUSHBUTTON "OK",IDOK,108,100,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,164,100,50,14 END 1536 DIALOG DISCARDABLE 36, 24, 264, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Open" FONT 8, "Helv" BEGIN LTEXT "File &Name:",1090,6,6,76,9 EDITTEXT 1152,6,16,90,12,ES_AUTOHSCROLL | ES_OEMCONVERT LISTBOX 1120,6,32,90,68,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP LTEXT "&Directories:",IDC_Directories,110,6,92,9 LTEXT "",1088,110,18,92,9,SS_NOPREFIX | NOT WS_GROUP LISTBOX 1121,110,32,92,68,LBS_SORT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP LTEXT "List Files of &Type:",1089,6,104,90,9 COMBOBOX 1136,6,114,90,36,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "Dri&ves:",1091,110,104,92,9 COMBOBOX 1137,110,114,92,68,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "OK",IDOK,208,6,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,208,24,50,14,WS_GROUP PUSHBUTTON "&Help",1038,208,46,50,14,NOT WS_VISIBLE | WS_GROUP LTEXT "&Index number:",IDC_IndexNr,208,74,48,8 EDITTEXT OPT_IndexNumberOld,208,84,50,12,ES_AUTOHSCROLL PUSHBUTTON "Net&work...",1037,208,113,50,14,WS_GROUP END DLG_CommPort DIALOG DISCARDABLE 25, 30, 220, 79 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Communication Port Settings" FONT 8, "Helv" BEGIN PUSHBUTTON "OK",IDOK,106,60,50,14 PUSHBUTTON "Cancel",IDCANCEL,164,60,50,14 RTEXT "&Port:",IDC_Port,4,6,40,10 COMBOBOX OPT_Port,49,4,55,60,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP RTEXT "Data &Rate:",IDC_Rate,114,6,40,10,NOT WS_GROUP COMBOBOX OPT_DataRate,159,4,55,100,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP RTEXT "Data &Bits:",IDC_Bits,4,25,40,10,NOT WS_GROUP COMBOBOX OPT_Bits,49,22,55,60,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "P&arity:",IDC_Parity,114,24,40,10,NOT WS_GROUP COMBOBOX OPT_Parity,159,22,55,60,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "&Stop Bits:",IDC_Stop,4,42,40,10,NOT WS_GROUP COMBOBOX OPT_StopBits,49,40,55,60,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP RTEXT "F&low:",IDC_Flow,114,42,40,10,NOT WS_GROUP COMBOBOX OPT_Flow,159,40,55,60,CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Help",OPT_SerialHelp,4,60,50,14,NOT WS_VISIBLE END DLG_EditComment DIALOG DISCARDABLE 6, 18, 302, 102 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Edit Comment" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "OK",IDOK,194,84,50,14 PUSHBUTTON "Cancel",OPT_CancelComment,250,84,50,14 CONTROL "",OPT_CommentText,"RICHEDIT",ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,2,2,298,78 PUSHBUTTON "&Clear",OPT_ClearComment,2,84,50,14 PUSHBUTTON "&Edit",OPT_EditComment,58,84,50,14 END DLG_PromotionKing DIALOG DISCARDABLE 98, 90, 183, 41 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Promote to:" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Chance&llor",PB_Chancellor,49,4,40,14,NOT WS_TABSTOP PUSHBUTTON "&Archbishop",PB_Archbishop,94,4,40,14,NOT WS_TABSTOP PUSHBUTTON "&Queen",PB_Queen,4,23,40,14,WS_GROUP PUSHBUTTON "&Rook",PB_Rook,49,23,40,14,NOT WS_TABSTOP PUSHBUTTON "&Bishop",PB_Bishop,94,23,40,14,NOT WS_TABSTOP PUSHBUTTON "K&night",PB_Knight,139,23,40,14,NOT WS_TABSTOP PUSHBUTTON "&King",PB_King,4,4,40,14,NOT WS_TABSTOP PUSHBUTTON "&Cancel",IDCANCEL,139,4,40,14,WS_GROUP LTEXT "C&entaur",IDC_Centaur,12,6,25,10 END ABOUTBOX2 DIALOG DISCARDABLE 22, 17, 281, 223 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About WinBoard" FONT 8, "MS Sans Serif" BEGIN RTEXT "Chessboard for Windows",IDC_ChessBoard,196,154,80,8 LTEXT "Copyright 1991 Digital Equipment Corporation",201,4,168, 151,8 LTEXT "Enhancements Copyright 1992-2014 Free Software Foundation", OPT_TCtext1,4,179,126,17 CONTROL "",OPT_TCTime,"Static",SS_BLACKRECT,4,164,272,1 LTEXT "WinBoard 0.0.0",ABOUTBOX_Version,4,154,64,8 CONTROL "galactic",IDC_STATIC,"Static",SS_BITMAP,4,4,15,13 DEFPUSHBUTTON "OK",IDOK,226,204,50,14 LTEXT "Enhancements Copyright 2005\r\nAlessandro Scotti", IDC_STATIC,4,199,183,20 LTEXT "(unofficial version ""X"")",IDC_STATIC,68,154,71,8 END DLG_GameList DIALOG DISCARDABLE 6, 18, 282, 153 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Game List" FONT 8, "MS Sans Serif" BEGIN LISTBOX OPT_GameListText,2,2,277,130,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP PUSHBUTTON "&Thresholds",OPT_GameListLoad,2,136,40,15 PUSHBUTTON "&Find Position",OPT_GameListFind,45,136,48,15 PUSHBUTTON "&Narrow",OPT_GameListNarrow,96,136,30,15 PUSHBUTTON "&Close",OPT_GameListClose,129,136,20,15 PUSHBUTTON ">",OPT_GameListNext,152,136,17,15 PUSHBUTTON "&Filter",IDC_GameListDoFilter,172,136,25,14 EDITTEXT IDC_GameListFilter,201,136,78,14,ES_AUTOHSCROLL END DLG_EditTags DIALOG DISCARDABLE 6, 18, 167, 140 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Edit Tags" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "OK",IDOK,58,122,50,14 PUSHBUTTON "Cancel",OPT_TagsCancel,114,122,50,14 CONTROL "",OPT_TagsText,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,2,2,162,115 PUSHBUTTON "&Edit",OPT_EditTags,2,122,50,14 END WBCONSOLE DIALOG DISCARDABLE 0, 0, 335, 133 STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "I C S" CLASS "WBConsole" FONT 8, "Courier New" BEGIN CONTROL "",OPT_ConsoleText,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL | ES_READONLY | ES_NUMBER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,0,0,335,119 CONTROL "",OPT_ConsoleInput,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL | ES_NUMBER | WS_BORDER | WS_TABSTOP,0,120,335,13, WS_EX_TRANSPARENT END DLG_Analysis DIALOG DISCARDABLE 0, 0, 294, 62 STYLE WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "Dialog" FONT 8, "MS Sans Serif" BEGIN CONTROL "",OPT_AnalysisText,"RICHEDIT",ES_MULTILINE | ES_READONLY | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,4,4,286,54 END DLG_Error DIALOG DISCARDABLE 0, 0, 220, 66 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Error" FONT 8, "MS Sans Serif" BEGIN ICON 32515,IDC_STATIC,4,4,21,20 LTEXT "Sorry Charlie",OPT_ErrorText,28,4,188,36 DEFPUSHBUTTON "OK",IDOK,84,48,50,14 END DLG_Colorize DIALOGEX 0, 0, 174, 61 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "I C S Interaction Colors" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,64,42,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,120,42,50,14 PUSHBUTTON "&Color...",OPT_ChooseColor,119,4,51,14,WS_GROUP CONTROL "&Bold",OPT_Bold,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,4,24,30,10 CONTROL "&Italic",OPT_Italic,"Button",BS_AUTOCHECKBOX,40,24,30, 10 CONTROL "&Underline",OPT_Underline,"Button",BS_AUTOCHECKBOX,76, 24,45,10 CONTROL "&Strikeout",OPT_Strikeout,"Button",BS_AUTOCHECKBOX,128, 24,42,10 CONTROL "",OPT_Sample,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_GROUP,4,4,106,15,WS_EX_CLIENTEDGE END DLG_Question DIALOG DISCARDABLE 0, 0, 187, 77 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Question" FONT 8, "MS Sans Serif" BEGIN EDITTEXT OPT_QuestionInput,4,36,179,14,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,78,58,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,134,58,50,14 LTEXT "Enter a chess engine command or just type something stupid that will completely screw things up.", OPT_QuestionText,30,2,153,28 ICON 32514,IDC_STATIC,4,4,20,20 END DLG_Startup DIALOG DISCARDABLE 0, 0, 326, 159 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "WinBoard Startup" FONT 8, "MS Sans Serif" BEGIN GROUPBOX "What would you like to do?",IDC_Welcome,4,4,318,56 CONTROL "&Play against a chess engine or match two engines", OPT_ChessEngine,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,8,17,310,10 CONTROL "&Use an Internet Chess Server",OPT_ChessServer,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,8,30,310,10 CONTROL "Just &view or edit game files",OPT_View,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,8,43,310,10 LTEXT "Specify Chess &Engines:",IDC_SPECIFY_ENG_STATIC,11,63, 200,10 COMBOBOX OPT_ChessEngineName,17,74,244,129,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP COMBOBOX OPT_SecondChessEngineName,17,92,244,129,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP LTEXT "Specify Chess &Server:",IDC_SPECIFY_SERVER_STATIC,11, 108,200,10 COMBOBOX OPT_ChessServerName,17,122,244,129,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "&Additional options",OPT_AnyAdditional,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,11,142,91,10 EDITTEXT OPT_AdditionalOptions,105,142,215,13,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,272,73,50,14 PUSHBUTTON "Cancel",IDCANCEL,272,91,50,14 PUSHBUTTON "&Help",IDM_HELPCONTENTS,272,109,50,14 END DLG_IndexNumber DIALOG DISCARDABLE 0, 0, 236, 18 STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS FONT 8, "MS Sans Serif" BEGIN LTEXT "Inde&x number:",IDC_Index,5,2,46,8 EDITTEXT OPT_IndexNumber,54,0,155,13,ES_AUTOHSCROLL END DLG_TypeInMove DIALOG DISCARDABLE 0, 0, 206, 23 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Type in a move" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,96,4,50,14 PUSHBUTTON "Cancel",IDCANCEL,152,4,50,14 EDITTEXT OPT_Move,4,4,86,13,ES_AUTOHSCROLL END DLG_TypeInName DIALOG DISCARDABLE 0, 0, 206, 23 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Type in your name" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,96,4,50,14 PUSHBUTTON "Cancel",IDCANCEL,152,4,50,14 EDITTEXT OPT_Name,4,4,86,13,ES_AUTOHSCROLL END DLG_Sound DIALOG DISCARDABLE 0, 0, 262, 105 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Sounds" FONT 8, "MS Sans Serif" BEGIN LTEXT "&Event:",IDC_Event,4,7,46,9 COMBOBOX CBO_Sounds,50,4,208,110,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP // GROUPBOX "sound type",IDC_STATIC,8,18,66,62 CONTROL "&No sound",OPT_NoSound,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,12,22,47,10 CONTROL "&Default beep",OPT_DefaultBeep,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,12,36,83,10 CONTROL "&Built-in sound:",OPT_BuiltInSound,"Button", BS_AUTORADIOBUTTON | WS_TABSTOP,12,51,83,10 CONTROL "&WAV file:",OPT_WavFile,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,12,66,83,10 COMBOBOX OPT_BuiltInSoundName,96,48,103,109,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_GROUP EDITTEXT OPT_WavFileName,96,65,103,12,ES_AUTOHSCROLL PUSHBUTTON "B&rowse...",OPT_BrowseSound,208,64,50,14 PUSHBUTTON "&Play",OPT_PlaySound,208,47,50,14 PUSHBUTTON "Defaults",OPT_DefaultSounds,6,86,50,14 DEFPUSHBUTTON "OK",IDOK,152,86,50,14 PUSHBUTTON "Cancel",IDCANCEL,208,86,50,14 END DLG_GeneralOptions DIALOG DISCARDABLE 0, 0, 300, 197 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "General Options" FONT 8, "MS Sans Serif" BEGIN CONTROL "Always on &Top",OPT_AlwaysOnTop,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,6,151,10 CONTROL "Highlight Last &Move",OPT_HighlightLastMove,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,6,151,10 CONTROL "Always &Queen Ctrl+Shift+Q",OPT_AlwaysQueen,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,20,151,10 CONTROL "Periodic &Updates",OPT_PeriodicUpdates,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,20,151,10 CONTROL "Animate &Dragging",OPT_AnimateDragging,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,34,151,10 CONTROL "Ponder &Next Move Ctrl+Shift+P",OPT_PonderNextMove,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,34,151,10 CONTROL "&Animate Moving Ctrl+Shift+A",OPT_AnimateMoving,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,48,151,10 CONTROL "&Popup Exit Message",OPT_PopupExitMessage,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,48,151,10 CONTROL "Auto &Flag Ctrl+Shift+F",OPT_AutoFlag,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,62,151,10 CONTROL "Popup Move &Errors",OPT_PopupMoveErrors,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,62,151,10 CONTROL "Auto Flip &View",OPT_AutoFlipView,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,76,151,10 CONTROL "Show Butt&on Bar",OPT_ShowButtonBar,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,76,151,10 CONTROL "Auto &Raise Board",OPT_AutoRaiseBoard,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,90,151,10 CONTROL "Show &Coordinates",OPT_ShowCoordinates,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,90,151,10 CONTROL "&Blindfold",OPT_Blindfold,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,104,151,10 CONTROL "&Send Engine Think",OPT_ShowThinking,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,104,151,10 CONTROL "Highlight Dra&gging",OPT_HighlightDragging,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,118,151,10 CONTROL "Test &Legality Ctrl+Shift+L",OPT_TestLegality,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,118,151,10 CONTROL "E&xtended PGN Info Ctrl+Shift+X",OPT_SaveExtPGN,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,4,132,151,10 CONTROL "&Hide Thinking Ctrl+Shift+H",OPT_HideThinkFromHuman,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,156,132,151,10 CONTROL "&Info in Move History Ctrl+Shift+I",OPT_ExtraInfoInMoveHistory, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,146,151,10 CONTROL "Highlight with Arro&w",OPT_HighlightMoveArrow, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,146,151,10 CONTROL "Displa&y Logos",OPT_AutoLogo, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,160,151,10 CONTROL "One-Click Move",OPT_SmartMove, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,156,160,151,10 DEFPUSHBUTTON "OK",IDOK,180,178,50,14 PUSHBUTTON "Cancel",IDCANCEL,236,178,50,14 END DLG_IcsOptions DIALOGEX 0, 0, 302, 268 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "ICS Options" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,194,250,50,15 PUSHBUTTON "Cancel",IDCANCEL,248,250,50,15 CONTROL "&Auto Comment",OPT_AutoComment,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,12,73,8 CONTROL "&Auto Kibitz",OPT_AutoKibitz,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,12,73,8 CONTROL "Auto &Observe",OPT_AutoObserve,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,25,73,8 CONTROL "Auto &Create Logon",OPT_AutoCreate,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,25,73,8 CONTROL "&Get Move List",OPT_GetMoveList,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,10,38,150,8 CONTROL "&Local Line Editing",OPT_LocalLineEditing,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,10,51,150,8 CONTROL "&Quiet Play",OPT_QuietPlay,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,64,150,8 CONTROL "See&k Graph",OPT_SeekGraph,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,77,73,8 CONTROL "auto-&Refresh",OPT_AutoRefresh,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,77,73,8 CONTROL "Bckgnd Obser&ve",OPT_BgObserve,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,90,73,8 CONTROL "&Dual Board",OPT_DualBoard,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,94,90,73,8 CONTROL "&Premove",OPT_Premove,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,12,117,10 CONTROL "&White first move",OPT_PremoveWhite,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,180,26,67,10 EDITTEXT OPT_PremoveWhiteText,256,22,25,14,ES_AUTOHSCROLL CONTROL "&Black first move",OPT_PremoveBlack,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,180,40,66,10 EDITTEXT OPT_PremoveBlackText,256,38,25,14,ES_AUTOHSCROLL CONTROL "One-Click &Move",OPT_SmartMove,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,54,117,10 CONTROL "&Sound alarm at",OPT_IcsAlarm,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,85,63,10 EDITTEXT OPT_IcsAlarmTime,244,81,18,14,ES_AUTOHSCROLL LTEXT "seconds",IDC_Sec,264,85,33,8 PUSHBUTTON "Choose...",OPT_ChooseShoutColor,97,114,45,15 PUSHBUTTON "Choose...",OPT_ChooseSShoutColor,97,134,45,15 PUSHBUTTON "Choose...",OPT_ChooseChannel1Color,97,154,45,15 PUSHBUTTON "Choose...",OPT_ChooseChannelColor,97,174,45,15 PUSHBUTTON "Choose...",OPT_ChooseKibitzColor,97,194,45,15 PUSHBUTTON "Choose...",OPT_ChooseTellColor,246,114,45,15 PUSHBUTTON "Choose...",OPT_ChooseChallengeColor,246,134,45,15 PUSHBUTTON "Choose...",OPT_ChooseRequestColor,246,154,45,15 PUSHBUTTON "Choose...",OPT_ChooseSeekColor,246,174,45,15 PUSHBUTTON "Choose...",OPT_ChooseNormalColor,246,194,45,15 PUSHBUTTON "Background...",OPT_ChooseBackgroundColor,10,221,50,16 PUSHBUTTON "&Defaults...",OPT_DefaultColors,68,221,50,16 CONTROL "Do ¬ colorize messages",OPT_DontColorize,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,192,225,97,10 CONTROL "",OPT_SampleShout,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,10,114,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleSShout,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,10,134,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleChannel1,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,10, 154,75,15,WS_EX_CLIENTEDGE CONTROL "",OPT_SampleChannel,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,10,174,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleKibitz,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_GROUP,10,194,75,15,WS_EX_CLIENTEDGE CONTROL "",OPT_SampleTell,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,159,114,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleChallenge,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,159, 134,75,15,WS_EX_CLIENTEDGE CONTROL "",OPT_SampleRequest,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,159,154,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleSeek,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,159,174,75,15, WS_EX_CLIENTEDGE CONTROL "",OPT_SampleNormal,"RICHEDIT",ES_CENTER | ES_MULTILINE | ES_READONLY | WS_DISABLED | WS_GROUP,159,194,75,15, WS_EX_CLIENTEDGE LTEXT "Startup &Chat Boxes:",IDC_Boxes,4,251,65,8 EDITTEXT OPT_StartupChatBoxes,72,249,90,14,ES_AUTOHSCROLL GROUPBOX "Interaction Colors",GPB_Colors,4,103,294,140 GROUPBOX "Premove",GPB_Premove,174,0,124,69 GROUPBOX "General",GPB_General,4,0,166,101 GROUPBOX "Alarm",GPB_Alarm,174,71,124,30 END DLG_BoardOptions DIALOG DISCARDABLE 0, 0, 224, 262 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Board Options" FONT 8, "MS Sans Serif" BEGIN CONTROL "&Tiny",OPT_SizeTiny,"Button",BS_AUTORADIOBUTTON | WS_GROUP,9,14,50,10 CONTROL "T&eeny",OPT_SizeTeeny,"Button",BS_AUTORADIOBUTTON,9,24, 60,10 CONTROL "&Dinky",OPT_SizeDinky,"Button",BS_AUTORADIOBUTTON,9,34, 60,10 CONTROL "&Petite",OPT_SizePetite,"Button",BS_AUTORADIOBUTTON,9, 44,60,10 CONTROL "Sl&im",OPT_SizeSlim,"Button",BS_AUTORADIOBUTTON,9,54,60, 10 CONTROL "&Small",OPT_SizeSmall,"Button",BS_AUTORADIOBUTTON,9,64, 60,10 CONTROL "Medi&ocre",OPT_SizeMediocre,"Button",BS_AUTORADIOBUTTON, 80,14,60,10 CONTROL "&Middling",OPT_SizeMiddling,"Button",BS_AUTORADIOBUTTON, 80,24,60,10 CONTROL "&Average",OPT_SizeAverage,"Button",BS_AUTORADIOBUTTON, 80,34,60,10 CONTROL "Mode&rate",OPT_SizeModerate,"Button",BS_AUTORADIOBUTTON, 80,44,60,10 CONTROL "Medi&um",OPT_SizeMedium,"Button",BS_AUTORADIOBUTTON,80, 54,60,10 CONTROL "Bul&ky",OPT_SizeBulky,"Button",BS_AUTORADIOBUTTON,80,64, 60,10 CONTROL "&Large",OPT_SizeLarge,"Button",BS_AUTORADIOBUTTON,154, 14,60,10 CONTROL "&Big",OPT_SizeBig,"Button",BS_AUTORADIOBUTTON,154,24,60, 10 CONTROL "&Huge",OPT_SizeHuge,"Button",BS_AUTORADIOBUTTON,154,34, 60,10 CONTROL "&Giant",OPT_SizeGiant,"Button",BS_AUTORADIOBUTTON,154, 44,60,10 CONTROL "&Colossal",OPT_SizeColossal,"Button",BS_AUTORADIOBUTTON, 154,54,60,10 CONTROL "Tita&nic",OPT_SizeTitanic,"Button",BS_AUTORADIOBUTTON, 154,64,60,10 PUSHBUTTON "...",OPT_ChooseLightSquareColor,110,94,20,15 PUSHBUTTON "...",OPT_ChooseDarkSquareColor,110,112,20,15 PUSHBUTTON "...",OPT_ChooseWhitePieceColor,110,130,20,15 PUSHBUTTON "...",OPT_ChooseBlackPieceColor,110,148,20,15 PUSHBUTTON "...",OPT_ChooseHighlightSquareColor,110,166,20,15 PUSHBUTTON "...",OPT_ChoosePremoveHighlightColor,110,184,20,15 CONTROL "Monochrome",OPT_Monochrome,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,210,64,10 CONTROL "All White",OPT_AllWhite,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,179,73,10 CONTROL "Flip Black",OPT_UpsideDown,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,191,73,10 CONTROL "Use Board Textures",OPT_Bitmaps,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,203,73,10 CONTROL "Use Piece Font",OPT_PieceFont,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,215,73,10 CONTROL "Suppress Grid",OPT_Grid,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,227,73,10 PUSHBUTTON "Defaults",OPT_DefaultBoardColors,80,206,50,15 EDITTEXT OPT_DarkSquareColor,80,112,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT OPT_LightSquareColor,80,94,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT OPT_WhitePieceColor,80,130,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT OPT_BlackPieceColor,80,148,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT OPT_HighlightSquareColor,80,166,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP GROUPBOX "Colors",GPB_Colors,4,84,215,154 EDITTEXT OPT_PremoveHighlightColor,80,184,25,15,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "Light Squares",IDC_Light,10,98,60,10 LTEXT "Dark Squares",IDC_Dark,10,116,60,10 LTEXT "White Pieces",IDC_White,10,134,60,10 LTEXT "Black Pieces",IDC_Black,10,152,60,10 LTEXT "Square Highlights",IDC_High,10,170,60,10 LTEXT "Premove Highlights",IDC_PreHigh,10,188,70,10 GROUPBOX "Size",GPB_Size,4,4,215,75 EDITTEXT OPT_SampleLightSquare,144,96,39,36,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT OPT_SampleDarkSquare,144,138,39,36,ES_READONLY | WS_DISABLED | NOT WS_BORDER | NOT WS_TABSTOP DEFPUSHBUTTON "OK",IDOK,84,244,50,14 PUSHBUTTON "Cancel",IDCANCEL,140,244,50,14 END DLG_NewVariant DIALOG DISCARDABLE 0, 0, 224, 250 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Variants" FONT 8, "MS Sans Serif" BEGIN CONTROL "&normal",OPT_VariantNormal,"Button",BS_AUTORADIOBUTTON | WS_GROUP,9,14,70,10 CONTROL "&FRC",OPT_VariantFRC,"Button",BS_AUTORADIOBUTTON,9, 24,70,10 CONTROL "&wildcastle",OPT_VariantWildcastle,"Button",BS_AUTORADIOBUTTON,9,34, 50,10 CONTROL "&nocastle",OPT_VariantNocastle,"Button",BS_AUTORADIOBUTTON,9, 44,70,10 CONTROL "&losers",OPT_VariantLosers,"Button",BS_AUTORADIOBUTTON, 9,54,70,10 CONTROL "&giveaway",OPT_VariantGiveaway,"Button",BS_AUTORADIOBUTTON, 9,64,70,10 CONTROL "s&uicide",OPT_VariantSuicide,"Button",BS_AUTORADIOBUTTON, 9,74,70,10 CONTROL "&3Check",OPT_Variant3Check,"Button",BS_AUTORADIOBUTTON,9,84, 70,10 CONTROL "&twokings",OPT_VariantTwoKings,"Button",BS_AUTORADIOBUTTON,9,94, 70,10 CONTROL "&atomic",OPT_VariantAtomic,"Button",BS_AUTORADIOBUTTON, 9,104,70,10 CONTROL "cra&zyhouse",OPT_VariantCrazyhouse,"Button",BS_AUTORADIOBUTTON,80,14, 70,10 CONTROL "&bughouse",OPT_VariantBughouse,"Button",BS_AUTORADIOBUTTON,80,24,70, 10 CONTROL "Sp&artan",OPT_VariantSpartan,"Button",BS_AUTORADIOBUTTON,80,34,70, 10 CONTROL "&shogi",OPT_VariantShogi,"Button",BS_AUTORADIOBUTTON,80, 44,70,10 CONTROL "su&per",OPT_VariantSuper,"Button",BS_AUTORADIOBUTTON,80, 54,70,10 CONTROL "&knightmate",OPT_VariantKnightmate,"Button",BS_AUTORADIOBUTTON, 80,64,70,10 CONTROL "&Berolina",OPT_VariantBerolina,"Button",BS_AUTORADIOBUTTON,80,74, 70,10 CONTROL "c&ylinder",OPT_VariantCylinder,"Button",BS_AUTORADIOBUTTON,80, 84,70,10 CONTROL "&fairy",OPT_VariantFairy,"Button",BS_AUTORADIOBUTTON,80, 94,70,10 CONTROL "&makruk",OPT_VariantMakruk,"Button",BS_AUTORADIOBUTTON,80, 104,70,10 CONTROL "&gothic",OPT_VariantGothic,"Button",BS_AUTORADIOBUTTON,154,14, 70,10 CONTROL "&capablanca",OPT_VariantCapablanca,"Button",BS_AUTORADIOBUTTON,154, 24,70,10 CONTROL "&Janus",OPT_VariantJanus,"Button",BS_AUTORADIOBUTTON,154,34, 70,10 CONTROL "&CRC",OPT_VariantCRC,"Button",BS_AUTORADIOBUTTON,154,44, 70,10 CONTROL "&Falcon",OPT_VariantFalcon,"Button",BS_AUTORADIOBUTTON,154, 54,70,10 CONTROL "cou&rier",OPT_VariantCourier,"Button",BS_AUTORADIOBUTTON,154,64, 70,10 CONTROL "&Great",OPT_VariantGreat,"Button",BS_AUTORADIOBUTTON,154,74, 70,10 CONTROL "&Shatranj",OPT_VariantShatranj,"Button",BS_AUTORADIOBUTTON,154, 84,70,10 CONTROL "Seira&wan",OPT_VariantSChess,"Button",BS_AUTORADIOBUTTON,154,94,70, 10 CONTROL "&Grand",OPT_VariantGrand,"Button",BS_AUTORADIOBUTTON,154,104,70, 10 CONTROL "&xiangqi",OPT_VariantXiangqi,"Button",BS_AUTORADIOBUTTON,154,114,70, 10 GROUPBOX "Variant",GPB_Variant,4,4,215,125 LTEXT "Board size:",GPB_Board,10,165,40,8,WS_TABSTOP LTEXT "ranks",IDC_Height,77,165,38,8 EDITTEXT IDC_Ranks,60,161,14,14,ES_AUTOHSCROLL LTEXT "files",IDC_Width,133,165,80,8 EDITTEXT IDC_Files,116,161,14,14,ES_AUTOHSCROLL LTEXT "Holdings with room for:",IDC_Hand,10,183,90,8 EDITTEXT IDC_Holdings,93,179,14,14,ES_AUTOHSCROLL LTEXT "pieces",IDC_Pieces,110,183,100,8 LTEXT "('-1' means defaults for selected variant)",IDC_Def,10,201,210,8 DEFPUSHBUTTON "OK",IDOK,114,232,50,14 PUSHBUTTON "Cancel",IDCANCEL,170,232,50,14 END DLG_Fonts DIALOG DISCARDABLE 0, 0, 266, 274 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Fonts" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,156,256,50,14 PUSHBUTTON "Cancel",IDCANCEL,212,256,50,14 PUSHBUTTON "Choose...",OPT_ChooseClockFont,212,15,45,15 PUSHBUTTON "Choose...",OPT_ChooseMessageFont,212,39,45,15 PUSHBUTTON "Choose...",OPT_ChooseCoordFont,212,63,45,15 PUSHBUTTON "Choose...",OPT_ChooseTagFont,212,101,45,15 PUSHBUTTON "Choose...",OPT_ChooseCommentsFont,212,125,45,15 PUSHBUTTON "Choose...",OPT_ChooseConsoleFont,212,149,45,15 PUSHBUTTON "Choose...",OPT_ChooseMoveHistoryFont,212,174,45,15 PUSHBUTTON "Choose...",OPT_ChooseGameListFont,212,198,45,15 PUSHBUTTON "Choose...",OPT_ChoosePieceFont,212,222,45,15 PUSHBUTTON "&Defaults",OPT_DefaultFonts,3,256,50,15 CONTROL "",OPT_SampleCoordFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,59,130,20 CONTROL "",OPT_SampleTagFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,97,130,20 CONTROL "",OPT_SampleCommentsFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,121,130,20 CONTROL "",OPT_SampleConsoleFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,145,130,20 LTEXT "Clocks",OPT_ClockFont,13,16,63,10,NOT WS_GROUP LTEXT "Messages",OPT_MessageFont,13,40,63,10,NOT WS_GROUP LTEXT "Coordinates",OPT_CoordFont,13,64,63,10,NOT WS_GROUP LTEXT "Tags",OPT_EditTagsFont,13,102,63,10,NOT WS_GROUP LTEXT "Comments",OPT_CommentsFont,13,126,63,10,NOT WS_GROUP LTEXT "I C S Interaction",OPT_MessageFont5,13,150,63,10,NOT WS_GROUP CONTROL "",OPT_SampleClockFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,11,130,20 CONTROL "",OPT_SampleMessageFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,35,130,20 GROUPBOX "Current Board Size",GPB_Current,3,1,259,83 GROUPBOX "All Board Sizes",GPB_All,3,87,259,157 CONTROL "",OPT_SampleMoveHistoryFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,170,130,20 LTEXT "Move History, Engine Output",OPT_MessageFont6,13,171,63,20,NOT WS_GROUP CONTROL "",OPT_SampleGameListFont,"RICHEDIT",ES_READONLY | WS_DISABLED | WS_BORDER,77,194,130,20 LTEXT "Game List",OPT_MessageFont7,13,199,63,20,NOT WS_GROUP CONTROL "",OPT_SamplePieceFont,"RICHEDIT", ES_AUTOHSCROLL | WS_BORDER,77,218,130,20 LTEXT "Piece Font",OPT_MessageFont8,13,223,63,20,NOT WS_GROUP END DLG_NewGameFRC DIALOG DISCARDABLE 0, 0, 176, 47 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "New Shuffle Game" FONT 8, "MS Sans Serif" BEGIN LTEXT "&Start Position Number:",IDC_NFG_Label,4,7,71,8 EDITTEXT IDC_NFG_Edit,76,4,42,14,ES_AUTOHSCROLL PUSHBUTTON "Random",IDC_NFG_Random,122,4,50,14 DEFPUSHBUTTON "OK",IDOK,64,28,50,14 PUSHBUTTON "Cancel",IDCANCEL,122,28,50,14 END DLG_GameListOptions DIALOG DISCARDABLE 0, 0, 218, 150 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Game List Options" FONT 8, "MS Sans Serif" BEGIN LTEXT "PGN &Tags:",IDC_GLT,2,2,158,8 LISTBOX IDC_GameListTags,2,12,153,112,LBS_USETABSTOPS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Up",IDC_GLT_Up,164,12,50,14 PUSHBUTTON "&Down",IDC_GLT_Down,164,30,50,14 PUSHBUTTON "Default",IDC_GLT_Restore,164,92,50,14 PUSHBUTTON "Factory",IDC_GLT_Default,164,110,50,14 DEFPUSHBUTTON "OK",IDOK,108,132,50,14 PUSHBUTTON "Cancel",IDCANCEL,164,132,50,14 LTEXT "Restore to:",IDC_GLT_RestoreTo,159,80,58,8 END DLG_MoveHistory DIALOGEX 0, 0, 225, 130 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_TOOLWINDOW CAPTION "Move History" FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN CONTROL "",IDC_MoveHistory,"RICHEDIT",ES_MULTILINE | ES_READONLY | WS_BORDER | WS_VSCROLL | WS_TABSTOP,2,2,222,128 END DLG_EvalGraph DIALOGEX 0, 0, 216, 75 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_TOOLWINDOW CAPTION "Evaluation Graph" FONT 8, "MS Sans Serif" BEGIN END DLG_EngineOutput DIALOGEX 0, 0, 266, 167 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_TOOLWINDOW CAPTION "Engine output" FONT 8, "MS Sans Serif" BEGIN RTEXT "NPS",IDC_Engine1_NPS,206,2,57,8 LTEXT "Engine #1",IDC_EngineLabel1,14,2,84,8 CONTROL "",IDC_EngineMemo1,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,0,10,262,72 LTEXT "Engine #2",IDC_EngineLabel2,15,84,103,8 CONTROL "",IDC_EngineMemo2,"RICHEDIT",ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,2,92,262,74 RTEXT "NPS",IDC_Engine2_NPS,210,84,55,8 ICON IDI_UNKNOWN_14,IDC_Color1,2,4,20,20,SS_REALSIZEIMAGE ICON IDI_UNKNOWN_14,IDC_Color2,4,84,20,20 LTEXT "Static",IDC_StateData1,120,2,83,8 ICON IDI_TRANS_14,IDC_StateIcon1,98,0,21,20 LTEXT "Static",IDC_StateData2,186,84,19,8 ICON IDI_TRANS_14,IDC_StateIcon2,164,84,20,20 END DLG_Chat DIALOGEX 0, 0, 290, 106 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_TOOLWINDOW CAPTION "Chat Window" FONT 8, "MS Sans Serif" BEGIN LTEXT "Chat partner:",IDC_Partner,5,5,45,10 EDITTEXT IDC_ChatPartner,50,3,45,13,ES_AUTOHSCROLL PUSHBUTTON "",IDC_Focus1,100,3,30,13 PUSHBUTTON "",IDC_Focus2,133,3,30,13 PUSHBUTTON "",IDC_Focus3,166,3,30,13 PUSHBUTTON "",IDC_Focus4,199,3,30,13 PUSHBUTTON "Clear",IDC_Clear,232,3,25,13 DEFPUSHBUTTON "Send",IDC_Send,262,3,25,13 CONTROL "",IDC_ChatMemo,"RICHEDIT",ES_MULTILINE | ES_READONLY | ES_AUTOVSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,3,17,284,70 CONTROL "",OPT_ChatInput,"RICHEDIT",ES_AUTOHSCROLL | ES_NOHIDESEL | WS_BORDER | WS_TABSTOP,3,90,284,13 END DLG_EnginePlayOptions DIALOG DISCARDABLE 0, 0, 248, 202 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Adjudications" FONT 8, "MS Sans Serif" BEGIN CONTROL "Ponder Next Move",IDC_EpPonder,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,4,240,10 CONTROL "Enable and Show Thinking (recommended)", IDC_EpShowThinking,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 4,16,240,10 CONTROL "Hide Thinking when Playing against Human", IDC_EpHideThinkingHuman,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,28,240,10 CONTROL "Periodic Updates (for Analysis Mode)", IDC_EpPeriodicUpdates,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,40,240,10 GROUPBOX "Adjudications in non-ICS games",GPB_Adjudications,4,56,240,98 LTEXT "Adjudicate draw after:",IDC_Draw,10,72,124,8 EDITTEXT IDC_EpDrawMoveCount,136,68,40,14,ES_AUTOHSCROLL LTEXT "moves",IDC_Moves,178,72,22,8 LTEXT "Win/loss adjudication threshold:",IDC_Threshold,10,90,124, 8 EDITTEXT IDC_EpAdjudicationThreshold,136,86,40,14,ES_AUTOHSCROLL LTEXT "centipawns",IDC_Centi,178,90,65,8 CONTROL "&Verify Engine Claims",IDC_TestClaims,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,108,119,10 CONTROL "Detect &Mates", IDC_DetectMates,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, 10,118,119,10 CONTROL "Draw if &Insufficient Material", IDC_MaterialDraws,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,128,119,10 CONTROL "Adjudicate &Trivial Draws", IDC_TrivialDraws,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,138,119,10 GROUPBOX "Apply",GPB_Apply,130,102,106,47 EDITTEXT IDC_RuleMoves,135,113,20,14,ES_AUTOHSCROLL LTEXT "-move rule",IDC_Rule,157,117,75,8 EDITTEXT IDC_DrawRepeats,135,130,20,14,ES_AUTOHSCROLL LTEXT "-fold repeats",IDC_Repeats,157,134,75,8 CONTROL "Engine #1 Score is Absolute", IDC_ScoreAbs1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,156,140,10 CONTROL "Engine #2 Score is Absolute", IDC_ScoreAbs2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,168,140,10 DEFPUSHBUTTON "OK",IDOK,138,185,50,14 PUSHBUTTON "Cancel",IDCANCEL,194,185,50,14 END DLG_OptionsUCI DIALOG DISCARDABLE 0, 0, 248, 160 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Common Engine Settings" FONT 8, "MS Sans Serif" BEGIN LTEXT "Polyglot Directory:",IDC_PolyDir,2,8,78,8 EDITTEXT IDC_PolyglotDir,82,4,140,14,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_BrowseForPolyglotDir,226,4,17,14 LTEXT "Hash Size (MB):",IDC_Hash,2,26,78,8 EDITTEXT IDC_HashSize,82,22,40,14,ES_AUTOHSCROLL LTEXT "Max nr of CPUs:",IDC_CPU,126,26,60,8 EDITTEXT IDC_Cores,187,22,35,14,ES_AUTOHSCROLL LTEXT "EGTB Path:",IDC_Path,2,44,78,8 EDITTEXT IDC_PathToEGTB,82,40,140,14,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_BrowseForEGTB,226,40,17,14 LTEXT "EGTB Size (MB):",IDC_Cache,2,62,78,8 EDITTEXT IDC_SizeOfEGTB,82,58,40,14,ES_AUTOHSCROLL CONTROL "Use Book:",IDC_UseBook,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,2,80,78,10 EDITTEXT IDC_BookFile,82,76,140,14,ES_AUTOHSCROLL PUSHBUTTON "...",IDC_BrowseForBook,226,76,17,14 CONTROL "First has Own Book",IDC_OwnBook1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,2,94,100,10 CONTROL "Second has Own Book",IDC_OwnBook2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,2,107,100,10 LTEXT "Book Depth:",IDC_Depth,126,98,60,8 EDITTEXT IDC_BookDep,187,94,35,14,ES_AUTOHSCROLL LTEXT "Book Variation:",IDC_Variation,126,116,60,8 EDITTEXT IDC_BookStr,187,112,35,14,ES_AUTOHSCROLL LTEXT "Default Match Games:",IDC_DefGames,2,135,72,8 EDITTEXT IDC_Games,82,131,28,14,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,128,142,50,14 PUSHBUTTON "Cancel",IDCANCEL,194,142,50,14 END DLG_Null DIALOG DISCARDABLE 0, 0, 186, 50 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Null" FONT 8, "MS Sans Serif" BEGIN END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN DLG_GameList, DIALOG BEGIN RIGHTMARGIN, 258 END DLG_Colorize, DIALOG BEGIN BOTTOMMARGIN, 32 END DLG_GeneralOptions, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 213 TOPMARGIN, 7 BOTTOMMARGIN, 176 END DLG_IcsOptions, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 295 TOPMARGIN, 7 BOTTOMMARGIN, 248 END DLG_BoardOptions, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 187 TOPMARGIN, 7 BOTTOMMARGIN, 243 END DLG_Fonts, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 259 TOPMARGIN, 7 BOTTOMMARGIN, 219 END DLG_NewGameFRC, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 169 TOPMARGIN, 7 BOTTOMMARGIN, 40 END DLG_GameListOptions, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 199 TOPMARGIN, 7 BOTTOMMARGIN, 133 END DLG_MoveHistory, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 218 TOPMARGIN, 7 BOTTOMMARGIN, 123 END DLG_EvalGraph, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 209 TOPMARGIN, 7 BOTTOMMARGIN, 68 END DLG_EngineOutput, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 259 TOPMARGIN, 7 BOTTOMMARGIN, 160 END DLG_EnginePlayOptions, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 201 TOPMARGIN, 7 BOTTOMMARGIN, 122 END DLG_OptionsUCI, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 221 TOPMARGIN, 7 BOTTOMMARGIN, 117 END DLG_Null, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 179 TOPMARGIN, 7 BOTTOMMARGIN, 43 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_WHITE_14 ICON DISCARDABLE "bitmaps/white_14.ico" ICON_BLACK ICON DISCARDABLE "bitmaps/icon_ob.ico" ICON_BOARD ICON DISCARDABLE "bitmaps/board.ico" ICON_WHITE ICON DISCARDABLE "bitmaps/icon_whi.ico" ICON_XTOURNEY ICON DISCARDABLE "bitmaps/cross.ico" IDI_BLACK_14 ICON DISCARDABLE "bitmaps/black_14.ico" IDI_PONDER_14 ICON DISCARDABLE "bitmaps/ponder_14.ico" IDI_TRANS_14 ICON DISCARDABLE "bitmaps/trans_14.ico" IDI_CLOCK_14 ICON DISCARDABLE "bitmaps/clock_14.ico" IDI_UNKNOWN_14 ICON DISCARDABLE "bitmaps/unknown_14.ico" IDI_BALOON_14 ICON DISCARDABLE "bitmaps/baloon_14.ico" IDI_ANALYZE_14 ICON DISCARDABLE "bitmaps/analyze_14.ico" IDI_ANALYZE2_14 ICON DISCARDABLE "bitmaps/analyze2_14.ico" ///////////////////////////////////////////////////////////////////////////// // // Menu // WINBOARD MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New Game\tCtrl-N", IDM_NewGame MENUITEM "New Sh&uffle Game...", IDM_NewGameFRC MENUITEM "New &Variant...\tAlt+Shift+V",IDM_NewVariant MENUITEM SEPARATOR MENUITEM "&Load Game...\tCtrl-O", IDM_LoadGame MENUITEM "L&oad Position...\tCtrl+Shift+O", IDM_LoadPosition // MENUITEM "Load &Next Game\tAlt+PgDn", IDM_LoadNextGame // MENUITEM "Load &Previous Game\tAlt+PgUp", IDM_LoadPrevGame // MENUITEM "&Reload Same Game", IDM_ReloadGame MENUITEM "Load N&ext Position\tAlt+Shift+PgDn", IDM_LoadNextPosition MENUITEM "Load Pre&vious Position\tAlt+Shift+PgUp", IDM_LoadPrevPosition // MENUITEM "Reload Sa&me Position", IDM_ReloadPosition MENUITEM SEPARATOR MENUITEM "&Save Game...\tCtrl-S", IDM_SaveGame MENUITEM "S&ave Position...\tCtrl+Shift+S",IDM_SavePosition MENUITEM SEPARATOR MENUITEM "Save as &Diagram...", IDM_SaveDiagram MENUITEM "Save Games to &Book", IDM_CreateBook MENUITEM SEPARATOR MENUITEM "&Quit", IDM_Exit END POPUP "&Edit" BEGIN MENUITEM "&Copy Game To Clipboard\tCtrl+C", IDM_CopyGame MENUITEM "C&opy Position To Clipboard\tCtrl+Shift+C", IDM_CopyPosition MENUITEM "Copy Game List to Clipboard", IDM_CopyGameListToClipboard MENUITEM SEPARATOR MENUITEM "&Paste Game From Clipboard\tCtrl+V", IDM_PasteGame MENUITEM "P&aste Position From Clipboard\tCtrl+Shift+V", IDM_PasteAny MENUITEM SEPARATOR MENUITEM "&Edit Game\tCtrl+E", IDM_EditGame2 MENUITEM "E&dit Position\tCtrl+Shift+E",IDM_EditPosition2 MENUITEM SEPARATOR MENUITEM "Edit Ta&gs...", IDM_EditTags MENUITEM "Edit Co&mment...", IDM_EditComment MENUITEM "Edit Boo&k...", IDM_EditBook MENUITEM "Enter &Username...", IDM_TypeInName MENUITEM SEPARATOR MENUITEM "&Revert\tHome", IDM_Revert MENUITEM "&Annotate", IDM_Annotate MENUITEM "&Truncate Game\tEnd", IDM_TruncateGame MENUITEM SEPARATOR MENUITEM "&Backward\tAlt+Left", IDM_Backward MENUITEM "&Forward\tAlt+Right", IDM_Forward MENUITEM "Back to &Start\tAlt+Home", IDM_ToStart MENUITEM "For&ward to End\tAlt+End", IDM_ToEnd END POPUP "&View" BEGIN MENUITEM "Flip &View\tF2", IDM_FlipView MENUITEM "&Swap Clocks", IDM_FlipClock MENUITEM SEPARATOR MENUITEM "Engine &Output\tAlt+Shift+O", IDM_ShowEngineOutput MENUITEM "Move &History\tAlt+Shift+H", IDM_ShowMoveHistory MENUITEM "Evaluation &Graph\tAlt+Shift+E",IDM_ShowEvalGraph MENUITEM "Game &List\tAlt+Shift+G", IDM_ShowGameList MENUITEM "Open &New Chat Window", IDM_NewChat MENUITEM "Type In &Move...\tAlt+I", IDM_TypeInMove MENUITEM SEPARATOR MENUITEM "&Tags", IDM_Tags MENUITEM "&Comments", IDM_Comment MENUITEM SEPARATOR MENUITEM "&Game List Tags...", IDM_GameListOptions MENUITEM "Colo&rs...", IDM_BoardOptions MENUITEM "&Board Themes...", IDM_ThemeOptions MENUITEM "&Fonts...", IDM_Fonts END POPUP "&Mode" BEGIN MENUITEM "Machine &White\tCtrl+W", IDM_MachineWhite MENUITEM "Machine &Black\tCtrl+B", IDM_MachineBlack MENUITEM "&Two Machines\tCtrl+T", IDM_TwoMachines // MENUITEM "Machine Both", IDM_MachineBoth MENUITEM "&Analysis Mode\tCtrl+A", IDM_AnalysisMode MENUITEM "Analyze &Game\tCtrl+G", IDM_AnalyzeFile MENUITEM "&Edit Game\tCtrl+E", IDM_EditGame MENUITEM "E&dit Position\tCtrl+Shift+E",IDM_EditPosition MENUITEM "Trai&ning", IDM_Training, GRAYED MENUITEM "&ICS Client", IDM_IcsClient MENUITEM SEPARATOR MENUITEM "&Machine Match", IDM_Match MENUITEM "&Pause\tPause", IDM_Pause END POPUP "&Action" BEGIN MENUITEM "&Accept\tF3", IDM_Accept MENUITEM "D&ecline\tF4", IDM_Decline MENUITEM "Re&match\tF12", IDM_Rematch MENUITEM SEPARATOR MENUITEM "Call &Flag\tF5", IDM_CallFlag MENUITEM "&Draw\tF6", IDM_Draw MENUITEM "Ad&journ\tF7", IDM_Adjourn MENUITEM "A&bort\tF8", IDM_Abort MENUITEM "&Resign\tF9", IDM_Resign MENUITEM SEPARATOR MENUITEM "Stop &Observing\tF10", IDM_StopObserving MENUITEM "Stop E&xamining\tF11", IDM_StopExamining MENUITEM "&Upload to Examine", IDM_Upload MENUITEM SEPARATOR MENUITEM "Adjudicate to &White", IDM_UserAdjudication_White MENUITEM "Adjudicate to &Black", IDM_UserAdjudication_Black MENUITEM "Adjudicate &Draw", IDM_UserAdjudication_Draw END POPUP "E&ngine" BEGIN MENUITEM "Edit Engine List...", IDM_EditProgs1 MENUITEM "Load &First Engine...", IDM_LoadProg1 MENUITEM "Load &Second Engine...", IDM_LoadProg2 MENUITEM SEPARATOR MENUITEM "Engine #&1 Settings...", IDM_Engine1Options MENUITEM "Engine #&2 Settings...", IDM_Engine2Options MENUITEM SEPARATOR MENUITEM "&Hint...", IDM_Hint MENUITEM "&Book...", IDM_Book MENUITEM SEPARATOR MENUITEM "&Move Now\tCtrl+M", IDM_MoveNow MENUITEM "&Retract Move\tCtrl+X", IDM_RetractMove END POPUP "&Options" BEGIN MENUITEM "&Mute all Sounds", IDM_MuteSounds MENUITEM SEPARATOR MENUITEM "&General...", IDM_GeneralOptions MENUITEM "&Time Control...\tAlt+Shift+T",IDM_TimeControl MENUITEM "Common &Engine...\tAlt+Shift+U",IDM_OptionsUCI MENUITEM "Ad&judications...\tAlt+Shift+J",IDM_EnginePlayOptions MENUITEM "Tournament...", IDM_Tourney MENUITEM SEPARATOR MENUITEM "&Load Game...\tAlt+Shift+L", IDM_LoadOptions MENUITEM "&Save Game...\tAlt+Shift+S", IDM_SaveOptions MENUITEM "G&ame List...", IDM_GameListOptions MENUITEM SEPARATOR MENUITEM "Soun&ds...", IDM_Sounds MENUITEM "&ICS...", IDM_IcsOptions, GRAYED MENUITEM "Add ICS...", IDM_EditServers MENUITEM "Comm&unications...", IDM_CommPort MENUITEM SEPARATOR MENUITEM "Save Settings &Now", IDM_SaveSettings MENUITEM "Save Settings on E&xit", IDM_SaveSettingsOnExit END POPUP "&Help" BEGIN MENUITEM "Help &Contents\tF1", IDM_HELPCONTENTS MENUITEM "Help &Index", IDM_HELPSEARCH MENUITEM "How to &Use Help", IDM_HELPHELP MENUITEM SEPARATOR MENUITEM "&About WinBoard", IDM_ABOUT END END PIECEMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "White", EP_White MENUITEM SEPARATOR MENUITEM "Promote", EP_Promote MENUITEM SEPARATOR MENUITEM "Pawn", EP_WhitePawn MENUITEM "Knight", EP_WhiteKnight MENUITEM "Bishop", EP_WhiteBishop MENUITEM "Rook", EP_WhiteRook MENUITEM "Queen", EP_WhiteQueen MENUITEM "King", EP_WhiteKing MENUITEM SEPARATOR MENUITEM "Archbishop", EP_WhiteCardinal MENUITEM "Chancellor", EP_WhiteMarshall MENUITEM "Elephant", EP_WhiteAlfil MENUITEM "Cannon", EP_WhiteCannon MENUITEM SEPARATOR MENUITEM "Empty Square", EP_EmptySquare MENUITEM "Black", EP_Black, MENUBARBREAK MENUITEM SEPARATOR MENUITEM "Demote", EP_Demote MENUITEM SEPARATOR MENUITEM "Pawn", EP_BlackPawn MENUITEM "Knight", EP_BlackKnight MENUITEM "Bishop", EP_BlackBishop MENUITEM "Rook", EP_BlackRook MENUITEM "Queen", EP_BlackQueen MENUITEM "King", EP_BlackKing MENUITEM SEPARATOR MENUITEM "Archbishop", EP_BlackCardinal MENUITEM "Chancellor", EP_BlackMarshall MENUITEM "Elephant", EP_BlackAlfil MENUITEM "Cannon", EP_BlackCannon MENUITEM SEPARATOR MENUITEM "Clear Board ", EP_ClearBoard END END SHOGIPIECEMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "White", EP_White MENUITEM SEPARATOR MENUITEM "Pawn", EP_WhitePawn MENUITEM "Knight", EP_WhiteKnight MENUITEM "Bishop", EP_WhiteBishop MENUITEM "Rook", EP_WhiteRook MENUITEM "Lance", EP_WhiteQueen MENUITEM "Silver", EP_WhiteFerz MENUITEM "Gold", EP_WhiteWazir MENUITEM "King", EP_WhiteKing MENUITEM SEPARATOR MENUITEM "Promote", EP_Promote MENUITEM SEPARATOR MENUITEM "Empty Square", EP_EmptySquare MENUITEM "Black", EP_Black, MENUBARBREAK MENUITEM SEPARATOR MENUITEM "Pawn", EP_BlackPawn MENUITEM "Knight", EP_BlackKnight MENUITEM "Bishop", EP_BlackBishop MENUITEM "Rook", EP_BlackRook MENUITEM "Lance", EP_BlackQueen MENUITEM "Silver", EP_BlackFerz MENUITEM "Gold", EP_BlackWazir MENUITEM "King", EP_BlackKing MENUITEM SEPARATOR MENUITEM "Demote", EP_Demote MENUITEM SEPARATOR MENUITEM "Clear Board ", EP_ClearBoard END END WHITEPIECEMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "White", EP_White MENUITEM SEPARATOR MENUITEM "Pawn", EP_WhitePawn MENUITEM "Knight", EP_WhiteKnight MENUITEM "Bishop", EP_WhiteBishop MENUITEM "Rook", EP_WhiteRook MENUITEM "Queen", EP_WhiteQueen MENUITEM "King", EP_WhiteKing MENUITEM SEPARATOR MENUITEM "Empty Square", EP_EmptySquare MENUITEM "Clear Board", EP_ClearBoard END END BLACKPIECEMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "Black", EP_Black MENUITEM SEPARATOR MENUITEM "Pawn", EP_BlackPawn MENUITEM "Knight", EP_BlackKnight MENUITEM "Bishop", EP_BlackBishop MENUITEM "Rook", EP_BlackRook MENUITEM "Queen", EP_BlackQueen MENUITEM "King", EP_BlackKing MENUITEM SEPARATOR MENUITEM "Empty Square", EP_EmptySquare MENUITEM "Clear Board", EP_ClearBoard END END DROPPIECEMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "Drop", 0, INACTIVE MENUITEM SEPARATOR MENUITEM "Pawn", DP_Pawn MENUITEM "Knight", DP_Knight MENUITEM "Bishop", DP_Bishop MENUITEM "Rook", DP_Rook MENUITEM "Queen", DP_Queen END END TEXTMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "Cop&y and Paste", IDM_QuickPaste MENUITEM "&Copy", IDM_Copy MENUITEM "&Paste", IDM_Paste END END INPUTMENU MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "&Undo", IDM_Undo MENUITEM SEPARATOR MENUITEM "Cu&t", IDM_Cut MENUITEM "&Copy", IDM_Copy MENUITEM "&Paste", IDM_Paste MENUITEM SEPARATOR MENUITEM "Select &All", IDM_SelectAll END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // WINBOARD ACCELERATORS MOVEABLE PURE BEGIN "1", IDM_DirectCommand1, VIRTKEY, ALT, NOINVERT "2", IDM_DirectCommand2, VIRTKEY, ALT, NOINVERT "I", IDM_TypeInMove, VIRTKEY, ALT, NOINVERT "N", IDM_NewGame, VIRTKEY, CONTROL, NOINVERT "O", IDM_LoadGame, VIRTKEY, CONTROL, NOINVERT "S", IDM_SaveGame, VIRTKEY, CONTROL, NOINVERT "O", IDM_LoadPosition, VIRTKEY, SHIFT, CONTROL, NOINVERT "S", IDM_SavePosition, VIRTKEY, SHIFT, CONTROL, NOINVERT "C", IDM_CopyPosition, VIRTKEY, SHIFT, CONTROL, NOINVERT "V", IDM_PasteAny, VIRTKEY, SHIFT, CONTROL, NOINVERT "O", IDM_ShowEngineOutput, VIRTKEY, ALT, SHIFT, NOINVERT "H", IDM_ShowMoveHistory, VIRTKEY, ALT, SHIFT, NOINVERT "E", IDM_ShowEvalGraph, VIRTKEY, ALT, SHIFT, NOINVERT "G", IDM_ShowGameList, VIRTKEY, ALT, SHIFT, NOINVERT "B", IDM_BoardOptions, VIRTKEY, ALT, SHIFT, NOINVERT "T", IDM_TimeControl, VIRTKEY, ALT, SHIFT, NOINVERT "L", IDM_LoadOptions, VIRTKEY, ALT, SHIFT, NOINVERT "S", IDM_SaveOptions, VIRTKEY, ALT, SHIFT, NOINVERT "J", IDM_EnginePlayOptions, VIRTKEY, ALT, SHIFT, NOINVERT "U", IDM_OptionsUCI, VIRTKEY, ALT, SHIFT, NOINVERT "V", IDM_NewVariant, VIRTKEY, ALT, SHIFT, NOINVERT "P", OPT_PonderNextMove, VIRTKEY, SHIFT, CONTROL, NOINVERT "X", OPT_SaveExtPGN, VIRTKEY, SHIFT, CONTROL, NOINVERT "L", OPT_TestLegality, VIRTKEY, SHIFT, CONTROL, NOINVERT "A", OPT_AnimateMoving, VIRTKEY, SHIFT, CONTROL, NOINVERT "Q", OPT_AlwaysQueen, VIRTKEY, SHIFT, CONTROL, NOINVERT "F", OPT_AutoFlag, VIRTKEY, SHIFT, CONTROL, NOINVERT "H", OPT_HideThinkFromHuman, VIRTKEY, SHIFT, CONTROL, NOINVERT "I", OPT_ExtraInfoInMoveHistory, VIRTKEY, SHIFT, CONTROL, NOINVERT "W", IDM_MachineWhite, VIRTKEY, CONTROL, NOINVERT "B", IDM_MachineBlack, VIRTKEY, CONTROL, NOINVERT "T", IDM_TwoMachines, VIRTKEY, CONTROL, NOINVERT "E", IDM_EditGame, VIRTKEY, CONTROL, NOINVERT "E", IDM_EditPosition, VIRTKEY, SHIFT, CONTROL, NOINVERT "D", IDM_Debug, VIRTKEY, CONTROL, NOINVERT "G", IDM_AnalyzeFile, VIRTKEY, CONTROL, NOINVERT "M", IDM_MoveNow, VIRTKEY, CONTROL, NOINVERT "X", IDM_RetractMove, VIRTKEY, CONTROL, NOINVERT VK_DOWN, IDM_ToEnd, VIRTKEY, ALT, NOINVERT VK_END, IDM_ToEnd, VIRTKEY, ALT, NOINVERT VK_F1, IDM_HELPCONTENTS, VIRTKEY, NOINVERT VK_F10, IDM_StopObserving, VIRTKEY, NOINVERT VK_F11, IDM_StopExamining, VIRTKEY, NOINVERT VK_F12, IDM_Rematch, VIRTKEY, NOINVERT VK_F12, IDM_Debug, VIRTKEY, CONTROL, ALT, NOINVERT VK_F2, IDM_FlipView, VIRTKEY, NOINVERT VK_F3, IDM_Accept, VIRTKEY, NOINVERT VK_F4, IDM_Decline, VIRTKEY, NOINVERT VK_F4, IDM_Minimize, VIRTKEY, CONTROL, NOINVERT VK_F5, IDM_CallFlag, VIRTKEY, NOINVERT VK_F6, IDM_Draw, VIRTKEY, NOINVERT VK_F7, IDM_Adjourn, VIRTKEY, NOINVERT VK_F8, IDM_Abort, VIRTKEY, NOINVERT VK_F9, IDM_Resign, VIRTKEY, NOINVERT VK_HOME, IDM_ToStart, VIRTKEY, ALT, NOINVERT VK_INSERT, IDM_MoveNow, VIRTKEY, ALT, NOINVERT VK_NEXT, IDM_LoadNextGame, VIRTKEY, ALT, NOINVERT VK_NEXT, IDM_LoadNextPosition, VIRTKEY, SHIFT, ALT, NOINVERT VK_PAUSE, IDM_Pause, VIRTKEY, NOINVERT VK_PAUSE, IDM_Pause, VIRTKEY, ALT, NOINVERT VK_PRIOR, IDM_LoadPrevGame, VIRTKEY, ALT, NOINVERT VK_PRIOR, IDM_LoadPrevPosition, VIRTKEY, SHIFT, ALT, NOINVERT VK_LEFT, IDM_Backward, VIRTKEY, ALT, NOINVERT VK_RIGHT, IDM_Forward, VIRTKEY, ALT, NOINVERT END NO_ALT ACCELERATORS MOVEABLE PURE BEGIN VK_DELETE, IDM_RetractMove, VIRTKEY, NOINVERT VK_INSERT, IDM_MoveNow, VIRTKEY, NOINVERT #ifndef JAWS VK_END, IDM_TruncateGame, VIRTKEY, NOINVERT VK_HOME, IDM_Revert, VIRTKEY, NOINVERT VK_NEXT, IDM_LoadNextGame, VIRTKEY, NOINVERT VK_NEXT, IDM_LoadNextPosition, VIRTKEY, SHIFT, NOINVERT VK_PRIOR, IDM_LoadPrevGame, VIRTKEY, NOINVERT VK_PRIOR, IDM_LoadPrevPosition, VIRTKEY, SHIFT, NOINVERT VK_LEFT, IDM_Backward, VIRTKEY, NOINVERT VK_RIGHT, IDM_Forward, VIRTKEY, NOINVERT VK_DOWN, IDM_ToEnd, VIRTKEY, NOINVERT VK_UP, IDM_ToStart, VIRTKEY, NOINVERT VK_DOWN, OPT_GameListNext, VIRTKEY, CONTROL, NOINVERT VK_UP, OPT_GameListPrev, VIRTKEY, CONTROL, NOINVERT #endif END NO_ICS ACCELERATORS DISCARDABLE BEGIN "A", IDM_AnalysisMode, VIRTKEY, CONTROL, NOINVERT "V", IDM_PasteAny, VIRTKEY, CONTROL, NOINVERT END ///////////////////////////////////////////////////////////////////////////// // // Bitmap // P21O BITMAP MOVEABLE PURE "bitmaps/p21o.bmp" N21O BITMAP MOVEABLE PURE "bitmaps/n21o.bmp" B21O BITMAP MOVEABLE PURE "bitmaps/b21o.bmp" R21O BITMAP MOVEABLE PURE "bitmaps/r21o.bmp" K21O BITMAP MOVEABLE PURE "bitmaps/k21o.bmp" Q21O BITMAP MOVEABLE PURE "bitmaps/q21o.bmp" P21S BITMAP MOVEABLE PURE "bitmaps/p21s.bmp" N21S BITMAP MOVEABLE PURE "bitmaps/n21s.bmp" B21S BITMAP MOVEABLE PURE "bitmaps/b21s.bmp" R21S BITMAP MOVEABLE PURE "bitmaps/r21s.bmp" Q21S BITMAP MOVEABLE PURE "bitmaps/q21s.bmp" K21S BITMAP MOVEABLE PURE "bitmaps/k21s.bmp" P21W BITMAP MOVEABLE PURE "bitmaps/p21w.bmp" N21W BITMAP MOVEABLE PURE "bitmaps/n21w.bmp" B21W BITMAP MOVEABLE PURE "bitmaps/b21w.bmp" R21W BITMAP MOVEABLE PURE "bitmaps/r21w.bmp" Q21W BITMAP MOVEABLE PURE "bitmaps/q21w.bmp" K21W BITMAP MOVEABLE PURE "bitmaps/k21w.bmp" P25O BITMAP MOVEABLE PURE "bitmaps/p25o.bmp" N25O BITMAP MOVEABLE PURE "bitmaps/n25o.bmp" B25O BITMAP MOVEABLE PURE "bitmaps/b25o.bmp" R25O BITMAP MOVEABLE PURE "bitmaps/r25o.bmp" Q25O BITMAP MOVEABLE PURE "bitmaps/q25o.bmp" K25O BITMAP MOVEABLE PURE "bitmaps/k25o.bmp" P25S BITMAP MOVEABLE PURE "bitmaps/p25s.bmp" N25S BITMAP MOVEABLE PURE "bitmaps/n25s.bmp" B25S BITMAP MOVEABLE PURE "bitmaps/b25s.bmp" R25S BITMAP MOVEABLE PURE "bitmaps/r25s.bmp" Q25S BITMAP MOVEABLE PURE "bitmaps/q25s.bmp" K25S BITMAP MOVEABLE PURE "bitmaps/k25s.bmp" P25W BITMAP MOVEABLE PURE "bitmaps/p25w.bmp" N25W BITMAP MOVEABLE PURE "bitmaps/n25w.bmp" B25W BITMAP MOVEABLE PURE "bitmaps/b25w.bmp" R25W BITMAP MOVEABLE PURE "bitmaps/r25w.bmp" Q25W BITMAP MOVEABLE PURE "bitmaps/q25w.bmp" K25W BITMAP MOVEABLE PURE "bitmaps/k25w.bmp" P29O BITMAP MOVEABLE PURE "bitmaps/p29o.bmp" N29O BITMAP MOVEABLE PURE "bitmaps/n29o.bmp" B29O BITMAP MOVEABLE PURE "bitmaps/b29o.bmp" R29O BITMAP MOVEABLE PURE "bitmaps/r29o.bmp" Q29O BITMAP MOVEABLE PURE "bitmaps/q29o.bmp" K29O BITMAP MOVEABLE PURE "bitmaps/k29o.bmp" P29S BITMAP MOVEABLE PURE "bitmaps/p29s.bmp" N29S BITMAP MOVEABLE PURE "bitmaps/n29s.bmp" B29S BITMAP MOVEABLE PURE "bitmaps/b29s.bmp" R29S BITMAP MOVEABLE PURE "bitmaps/r29s.bmp" Q29S BITMAP MOVEABLE PURE "bitmaps/q29s.bmp" K29S BITMAP MOVEABLE PURE "bitmaps/k29s.bmp" P29W BITMAP MOVEABLE PURE "bitmaps/p29w.bmp" N29W BITMAP MOVEABLE PURE "bitmaps/n29w.bmp" B29W BITMAP MOVEABLE PURE "bitmaps/b29w.bmp" R29W BITMAP MOVEABLE PURE "bitmaps/r29w.bmp" Q29W BITMAP MOVEABLE PURE "bitmaps/q29w.bmp" K29W BITMAP MOVEABLE PURE "bitmaps/k29w.bmp" P33O BITMAP MOVEABLE PURE "bitmaps/p33o.bmp" N33O BITMAP MOVEABLE PURE "bitmaps/n33o.bmp" B33O BITMAP MOVEABLE PURE "bitmaps/b33o.bmp" R33O BITMAP MOVEABLE PURE "bitmaps/r33o.bmp" Q33O BITMAP MOVEABLE PURE "bitmaps/q33o.bmp" K33O BITMAP MOVEABLE PURE "bitmaps/k33o.bmp" P33S BITMAP MOVEABLE PURE "bitmaps/p33s.bmp" N33S BITMAP MOVEABLE PURE "bitmaps/n33s.bmp" B33S BITMAP MOVEABLE PURE "bitmaps/b33s.bmp" R33S BITMAP MOVEABLE PURE "bitmaps/r33s.bmp" Q33S BITMAP MOVEABLE PURE "bitmaps/q33s.bmp" K33S BITMAP MOVEABLE PURE "bitmaps/k33s.bmp" P33W BITMAP MOVEABLE PURE "bitmaps/p33w.bmp" N33W BITMAP MOVEABLE PURE "bitmaps/n33w.bmp" B33W BITMAP MOVEABLE PURE "bitmaps/b33w.bmp" R33W BITMAP MOVEABLE PURE "bitmaps/r33w.bmp" Q33W BITMAP MOVEABLE PURE "bitmaps/q33w.bmp" K33W BITMAP MOVEABLE PURE "bitmaps/k33w.bmp" P37O BITMAP MOVEABLE PURE "bitmaps/p37o.bmp" N37O BITMAP MOVEABLE PURE "bitmaps/n37o.bmp" B37O BITMAP MOVEABLE PURE "bitmaps/b37o.bmp" R37O BITMAP MOVEABLE PURE "bitmaps/r37o.bmp" Q37O BITMAP MOVEABLE PURE "bitmaps/q37o.bmp" K37O BITMAP MOVEABLE PURE "bitmaps/k37o.bmp" P37S BITMAP MOVEABLE PURE "bitmaps/p37s.bmp" N37S BITMAP MOVEABLE PURE "bitmaps/n37s.bmp" B37S BITMAP MOVEABLE PURE "bitmaps/b37s.bmp" R37S BITMAP MOVEABLE PURE "bitmaps/r37s.bmp" Q37S BITMAP MOVEABLE PURE "bitmaps/q37s.bmp" K37S BITMAP MOVEABLE PURE "bitmaps/k37s.bmp" P37W BITMAP MOVEABLE PURE "bitmaps/p37w.bmp" N37W BITMAP MOVEABLE PURE "bitmaps/n37w.bmp" B37W BITMAP MOVEABLE PURE "bitmaps/b37w.bmp" R37W BITMAP MOVEABLE PURE "bitmaps/r37w.bmp" Q37W BITMAP MOVEABLE PURE "bitmaps/q37w.bmp" K37W BITMAP MOVEABLE PURE "bitmaps/k37w.bmp" P40O BITMAP MOVEABLE PURE "bitmaps/p40o.bmp" N40O BITMAP MOVEABLE PURE "bitmaps/n40o.bmp" B40O BITMAP MOVEABLE PURE "bitmaps/b40o.bmp" R40O BITMAP MOVEABLE PURE "bitmaps/r40o.bmp" Q40O BITMAP MOVEABLE PURE "bitmaps/q40o.bmp" K40O BITMAP MOVEABLE PURE "bitmaps/k40o.bmp" P40S BITMAP MOVEABLE PURE "bitmaps/p40s.bmp" N40S BITMAP MOVEABLE PURE "bitmaps/n40s.bmp" B40S BITMAP MOVEABLE PURE "bitmaps/b40s.bmp" R40S BITMAP MOVEABLE PURE "bitmaps/r40s.bmp" Q40S BITMAP MOVEABLE PURE "bitmaps/q40s.bmp" K40S BITMAP MOVEABLE PURE "bitmaps/k40s.bmp" P40W BITMAP MOVEABLE PURE "bitmaps/p40w.bmp" N40W BITMAP MOVEABLE PURE "bitmaps/n40w.bmp" B40W BITMAP MOVEABLE PURE "bitmaps/b40w.bmp" R40W BITMAP MOVEABLE PURE "bitmaps/r40w.bmp" Q40W BITMAP MOVEABLE PURE "bitmaps/q40w.bmp" K40W BITMAP MOVEABLE PURE "bitmaps/k40w.bmp" P45O BITMAP MOVEABLE PURE "bitmaps/p45o.bmp" N45O BITMAP MOVEABLE PURE "bitmaps/n45o.bmp" B45O BITMAP MOVEABLE PURE "bitmaps/b45o.bmp" R45O BITMAP MOVEABLE PURE "bitmaps/r45o.bmp" Q45O BITMAP MOVEABLE PURE "bitmaps/q45o.bmp" K45O BITMAP MOVEABLE PURE "bitmaps/k45o.bmp" P45S BITMAP MOVEABLE PURE "bitmaps/p45s.bmp" N45S BITMAP MOVEABLE PURE "bitmaps/n45s.bmp" B45S BITMAP MOVEABLE PURE "bitmaps/b45s.bmp" R45S BITMAP MOVEABLE PURE "bitmaps/r45s.bmp" Q45S BITMAP MOVEABLE PURE "bitmaps/q45s.bmp" K45S BITMAP MOVEABLE PURE "bitmaps/k45s.bmp" P45W BITMAP MOVEABLE PURE "bitmaps/p45w.bmp" N45W BITMAP MOVEABLE PURE "bitmaps/n45w.bmp" B45W BITMAP MOVEABLE PURE "bitmaps/b45w.bmp" R45W BITMAP MOVEABLE PURE "bitmaps/r45w.bmp" Q45W BITMAP MOVEABLE PURE "bitmaps/q45w.bmp" K45W BITMAP MOVEABLE PURE "bitmaps/k45w.bmp" P49O BITMAP MOVEABLE PURE "bitmaps/p49o.bmp" N49O BITMAP MOVEABLE PURE "bitmaps/n49o.bmp" B49O BITMAP MOVEABLE PURE "bitmaps/b49o.bmp" R49O BITMAP MOVEABLE PURE "bitmaps/r49o.bmp" Q49O BITMAP MOVEABLE PURE "bitmaps/q49o.bmp" K49O BITMAP MOVEABLE PURE "bitmaps/k49o.bmp" P49S BITMAP MOVEABLE PURE "bitmaps/p49s.bmp" N49S BITMAP MOVEABLE PURE "bitmaps/n49s.bmp" B49S BITMAP MOVEABLE PURE "bitmaps/b49s.bmp" R49S BITMAP MOVEABLE PURE "bitmaps/r49s.bmp" Q49S BITMAP MOVEABLE PURE "bitmaps/q49s.bmp" K49S BITMAP MOVEABLE PURE "bitmaps/k49s.bmp" P49W BITMAP MOVEABLE PURE "bitmaps/p49w.bmp" N49W BITMAP MOVEABLE PURE "bitmaps/n49w.bmp" B49W BITMAP MOVEABLE PURE "bitmaps/b49w.bmp" R49W BITMAP MOVEABLE PURE "bitmaps/r49w.bmp" Q49W BITMAP MOVEABLE PURE "bitmaps/q49w.bmp" K49W BITMAP MOVEABLE PURE "bitmaps/k49w.bmp" P54O BITMAP MOVEABLE PURE "bitmaps/p54o.bmp" N54O BITMAP MOVEABLE PURE "bitmaps/n54o.bmp" B54O BITMAP MOVEABLE PURE "bitmaps/b54o.bmp" R54O BITMAP MOVEABLE PURE "bitmaps/r54o.bmp" Q54O BITMAP MOVEABLE PURE "bitmaps/q54o.bmp" K54O BITMAP MOVEABLE PURE "bitmaps/k54o.bmp" P54S BITMAP MOVEABLE PURE "bitmaps/p54s.bmp" N54S BITMAP MOVEABLE PURE "bitmaps/n54s.bmp" B54S BITMAP MOVEABLE PURE "bitmaps/b54s.bmp" R54S BITMAP MOVEABLE PURE "bitmaps/r54s.bmp" Q54S BITMAP MOVEABLE PURE "bitmaps/q54s.bmp" K54S BITMAP MOVEABLE PURE "bitmaps/k54s.bmp" P54W BITMAP MOVEABLE PURE "bitmaps/p54w.bmp" N54W BITMAP MOVEABLE PURE "bitmaps/n54w.bmp" B54W BITMAP MOVEABLE PURE "bitmaps/b54w.bmp" R54W BITMAP MOVEABLE PURE "bitmaps/r54w.bmp" Q54W BITMAP MOVEABLE PURE "bitmaps/q54w.bmp" K54W BITMAP MOVEABLE PURE "bitmaps/k54w.bmp" P58O BITMAP MOVEABLE PURE "bitmaps/p58o.bmp" N58O BITMAP MOVEABLE PURE "bitmaps/n58o.bmp" B58O BITMAP MOVEABLE PURE "bitmaps/b58o.bmp" R58O BITMAP MOVEABLE PURE "bitmaps/r58o.bmp" Q58O BITMAP MOVEABLE PURE "bitmaps/q58o.bmp" K58O BITMAP MOVEABLE PURE "bitmaps/k58o.bmp" P58S BITMAP MOVEABLE PURE "bitmaps/p58s.bmp" N58S BITMAP MOVEABLE PURE "bitmaps/n58s.bmp" B58S BITMAP MOVEABLE PURE "bitmaps/b58s.bmp" R58S BITMAP MOVEABLE PURE "bitmaps/r58s.bmp" Q58S BITMAP MOVEABLE PURE "bitmaps/q58s.bmp" K58S BITMAP MOVEABLE PURE "bitmaps/k58s.bmp" P58W BITMAP MOVEABLE PURE "bitmaps/p58w.bmp" N58W BITMAP MOVEABLE PURE "bitmaps/n58w.bmp" B58W BITMAP MOVEABLE PURE "bitmaps/b58w.bmp" R58W BITMAP MOVEABLE PURE "bitmaps/r58w.bmp" Q58W BITMAP MOVEABLE PURE "bitmaps/q58w.bmp" K58W BITMAP MOVEABLE PURE "bitmaps/k58w.bmp" P64O BITMAP MOVEABLE PURE "bitmaps/p64o.bmp" N64O BITMAP MOVEABLE PURE "bitmaps/n64o.bmp" B64O BITMAP MOVEABLE PURE "bitmaps/b64o.bmp" R64O BITMAP MOVEABLE PURE "bitmaps/r64o.bmp" Q64O BITMAP MOVEABLE PURE "bitmaps/q64o.bmp" K64O BITMAP MOVEABLE PURE "bitmaps/k64o.bmp" P64S BITMAP MOVEABLE PURE "bitmaps/p64s.bmp" N64S BITMAP MOVEABLE PURE "bitmaps/n64s.bmp" B64S BITMAP MOVEABLE PURE "bitmaps/b64s.bmp" R64S BITMAP MOVEABLE PURE "bitmaps/r64s.bmp" Q64S BITMAP MOVEABLE PURE "bitmaps/q64s.bmp" K64S BITMAP MOVEABLE PURE "bitmaps/k64s.bmp" P64W BITMAP MOVEABLE PURE "bitmaps/p64w.bmp" N64W BITMAP MOVEABLE PURE "bitmaps/n64w.bmp" B64W BITMAP MOVEABLE PURE "bitmaps/b64w.bmp" R64W BITMAP MOVEABLE PURE "bitmaps/r64w.bmp" Q64W BITMAP MOVEABLE PURE "bitmaps/q64w.bmp" K64W BITMAP MOVEABLE PURE "bitmaps/k64w.bmp" P72O BITMAP MOVEABLE PURE "bitmaps/p72o.bmp" N72O BITMAP MOVEABLE PURE "bitmaps/n72o.bmp" B72O BITMAP MOVEABLE PURE "bitmaps/b72o.bmp" R72O BITMAP MOVEABLE PURE "bitmaps/r72o.bmp" Q72O BITMAP MOVEABLE PURE "bitmaps/q72o.bmp" K72O BITMAP MOVEABLE PURE "bitmaps/k72o.bmp" P72S BITMAP MOVEABLE PURE "bitmaps/p72s.bmp" N72S BITMAP MOVEABLE PURE "bitmaps/n72s.bmp" B72S BITMAP MOVEABLE PURE "bitmaps/b72s.bmp" R72S BITMAP MOVEABLE PURE "bitmaps/r72s.bmp" Q72S BITMAP MOVEABLE PURE "bitmaps/q72s.bmp" K72S BITMAP MOVEABLE PURE "bitmaps/k72s.bmp" P72W BITMAP MOVEABLE PURE "bitmaps/p72w.bmp" N72W BITMAP MOVEABLE PURE "bitmaps/n72w.bmp" B72W BITMAP MOVEABLE PURE "bitmaps/b72w.bmp" R72W BITMAP MOVEABLE PURE "bitmaps/r72w.bmp" Q72W BITMAP MOVEABLE PURE "bitmaps/q72w.bmp" K72W BITMAP MOVEABLE PURE "bitmaps/k72w.bmp" P80O BITMAP MOVEABLE PURE "bitmaps/p80o.bmp" N80O BITMAP MOVEABLE PURE "bitmaps/n80o.bmp" B80O BITMAP MOVEABLE PURE "bitmaps/b80o.bmp" R80O BITMAP MOVEABLE PURE "bitmaps/r80o.bmp" Q80O BITMAP MOVEABLE PURE "bitmaps/q80o.bmp" K80O BITMAP MOVEABLE PURE "bitmaps/k80o.bmp" P80S BITMAP MOVEABLE PURE "bitmaps/p80s.bmp" N80S BITMAP MOVEABLE PURE "bitmaps/n80s.bmp" B80S BITMAP MOVEABLE PURE "bitmaps/b80s.bmp" R80S BITMAP MOVEABLE PURE "bitmaps/r80s.bmp" Q80S BITMAP MOVEABLE PURE "bitmaps/q80s.bmp" K80S BITMAP MOVEABLE PURE "bitmaps/k80s.bmp" P80W BITMAP MOVEABLE PURE "bitmaps/p80w.bmp" N80W BITMAP MOVEABLE PURE "bitmaps/n80w.bmp" B80W BITMAP MOVEABLE PURE "bitmaps/b80w.bmp" R80W BITMAP MOVEABLE PURE "bitmaps/r80w.bmp" Q80W BITMAP MOVEABLE PURE "bitmaps/q80w.bmp" K80W BITMAP MOVEABLE PURE "bitmaps/k80w.bmp" P87O BITMAP MOVEABLE PURE "bitmaps/p87o.bmp" N87O BITMAP MOVEABLE PURE "bitmaps/n87o.bmp" B87O BITMAP MOVEABLE PURE "bitmaps/b87o.bmp" R87O BITMAP MOVEABLE PURE "bitmaps/r87o.bmp" Q87O BITMAP MOVEABLE PURE "bitmaps/q87o.bmp" K87O BITMAP MOVEABLE PURE "bitmaps/k87o.bmp" P87S BITMAP MOVEABLE PURE "bitmaps/p87s.bmp" N87S BITMAP MOVEABLE PURE "bitmaps/n87s.bmp" B87S BITMAP MOVEABLE PURE "bitmaps/b87s.bmp" R87S BITMAP MOVEABLE PURE "bitmaps/r87s.bmp" Q87S BITMAP MOVEABLE PURE "bitmaps/q87s.bmp" K87S BITMAP MOVEABLE PURE "bitmaps/k87s.bmp" P87W BITMAP MOVEABLE PURE "bitmaps/p87w.bmp" N87W BITMAP MOVEABLE PURE "bitmaps/n87w.bmp" B87W BITMAP MOVEABLE PURE "bitmaps/b87w.bmp" R87W BITMAP MOVEABLE PURE "bitmaps/r87w.bmp" Q87W BITMAP MOVEABLE PURE "bitmaps/q87w.bmp" K87W BITMAP MOVEABLE PURE "bitmaps/k87w.bmp" P95O BITMAP MOVEABLE PURE "bitmaps/p95o.bmp" N95O BITMAP MOVEABLE PURE "bitmaps/n95o.bmp" B95O BITMAP MOVEABLE PURE "bitmaps/b95o.bmp" R95O BITMAP MOVEABLE PURE "bitmaps/r95o.bmp" Q95O BITMAP MOVEABLE PURE "bitmaps/q95o.bmp" K95O BITMAP MOVEABLE PURE "bitmaps/k95o.bmp" P95S BITMAP MOVEABLE PURE "bitmaps/p95s.bmp" N95S BITMAP MOVEABLE PURE "bitmaps/n95s.bmp" B95S BITMAP MOVEABLE PURE "bitmaps/b95s.bmp" R95S BITMAP MOVEABLE PURE "bitmaps/r95s.bmp" Q95S BITMAP MOVEABLE PURE "bitmaps/q95s.bmp" K95S BITMAP MOVEABLE PURE "bitmaps/k95s.bmp" P95W BITMAP MOVEABLE PURE "bitmaps/p95w.bmp" N95W BITMAP MOVEABLE PURE "bitmaps/n95w.bmp" B95W BITMAP MOVEABLE PURE "bitmaps/b95w.bmp" R95W BITMAP MOVEABLE PURE "bitmaps/r95w.bmp" Q95W BITMAP MOVEABLE PURE "bitmaps/q95w.bmp" K95W BITMAP MOVEABLE PURE "bitmaps/k95w.bmp" P108O BITMAP MOVEABLE PURE "bitmaps/p108o.bmp" N108O BITMAP MOVEABLE PURE "bitmaps/n108o.bmp" B108O BITMAP MOVEABLE PURE "bitmaps/b108o.bmp" R108O BITMAP MOVEABLE PURE "bitmaps/r108o.bmp" Q108O BITMAP MOVEABLE PURE "bitmaps/q108o.bmp" K108O BITMAP MOVEABLE PURE "bitmaps/k108o.bmp" P108S BITMAP MOVEABLE PURE "bitmaps/p108s.bmp" N108S BITMAP MOVEABLE PURE "bitmaps/n108s.bmp" B108S BITMAP MOVEABLE PURE "bitmaps/b108s.bmp" R108S BITMAP MOVEABLE PURE "bitmaps/r108s.bmp" Q108S BITMAP MOVEABLE PURE "bitmaps/q108s.bmp" K108S BITMAP MOVEABLE PURE "bitmaps/k108s.bmp" P108W BITMAP MOVEABLE PURE "bitmaps/p108w.bmp" N108W BITMAP MOVEABLE PURE "bitmaps/n108w.bmp" B108W BITMAP MOVEABLE PURE "bitmaps/b108w.bmp" R108W BITMAP MOVEABLE PURE "bitmaps/r108w.bmp" Q108W BITMAP MOVEABLE PURE "bitmaps/q108w.bmp" K108W BITMAP MOVEABLE PURE "bitmaps/k108w.bmp" P116O BITMAP MOVEABLE PURE "bitmaps/p116o.bmp" N116O BITMAP MOVEABLE PURE "bitmaps/n116o.bmp" B116O BITMAP MOVEABLE PURE "bitmaps/b116o.bmp" R116O BITMAP MOVEABLE PURE "bitmaps/r116o.bmp" Q116O BITMAP MOVEABLE PURE "bitmaps/q116o.bmp" K116O BITMAP MOVEABLE PURE "bitmaps/k116o.bmp" P116S BITMAP MOVEABLE PURE "bitmaps/p116s.bmp" N116S BITMAP MOVEABLE PURE "bitmaps/n116s.bmp" B116S BITMAP MOVEABLE PURE "bitmaps/b116s.bmp" R116S BITMAP MOVEABLE PURE "bitmaps/r116s.bmp" Q116S BITMAP MOVEABLE PURE "bitmaps/q116s.bmp" K116S BITMAP MOVEABLE PURE "bitmaps/k116s.bmp" P116W BITMAP MOVEABLE PURE "bitmaps/p116w.bmp" N116W BITMAP MOVEABLE PURE "bitmaps/n116w.bmp" B116W BITMAP MOVEABLE PURE "bitmaps/b116w.bmp" R116W BITMAP MOVEABLE PURE "bitmaps/r116w.bmp" Q116W BITMAP MOVEABLE PURE "bitmaps/q116w.bmp" K116W BITMAP MOVEABLE PURE "bitmaps/k116w.bmp" P129O BITMAP MOVEABLE PURE "bitmaps/p129o.bmp" N129O BITMAP MOVEABLE PURE "bitmaps/n129o.bmp" B129O BITMAP MOVEABLE PURE "bitmaps/b129o.bmp" R129O BITMAP MOVEABLE PURE "bitmaps/r129o.bmp" Q129O BITMAP MOVEABLE PURE "bitmaps/q129o.bmp" K129O BITMAP MOVEABLE PURE "bitmaps/k129o.bmp" P129S BITMAP MOVEABLE PURE "bitmaps/p129s.bmp" N129S BITMAP MOVEABLE PURE "bitmaps/n129s.bmp" B129S BITMAP MOVEABLE PURE "bitmaps/b129s.bmp" R129S BITMAP MOVEABLE PURE "bitmaps/r129s.bmp" Q129S BITMAP MOVEABLE PURE "bitmaps/q129s.bmp" K129S BITMAP MOVEABLE PURE "bitmaps/k129s.bmp" P129W BITMAP MOVEABLE PURE "bitmaps/p129w.bmp" N129W BITMAP MOVEABLE PURE "bitmaps/n129w.bmp" B129W BITMAP MOVEABLE PURE "bitmaps/b129w.bmp" R129W BITMAP MOVEABLE PURE "bitmaps/r129w.bmp" Q129W BITMAP MOVEABLE PURE "bitmaps/q129w.bmp" K129W BITMAP MOVEABLE PURE "bitmaps/k129w.bmp" GALACTIC BITMAP MOVEABLE PURE "bitmaps/galactic.bmp" TIM BITMAP MOVEABLE PURE "bitmaps/tim.bmp" // [HGM] Some fairy symbols: E72O BITMAP MOVEABLE PURE "bitmaps/e72o.bmp" A72O BITMAP MOVEABLE PURE "bitmaps/a72o.bmp" AA72O BITMAP MOVEABLE PURE "bitmaps/as72o.bmp" C72O BITMAP MOVEABLE PURE "bitmaps/c72o.bmp" CV72O BITMAP MOVEABLE PURE "bitmaps/cv72o.bmp" F72O BITMAP MOVEABLE PURE "bitmaps/f72o.bmp" M72O BITMAP MOVEABLE PURE "bitmaps/m72o.bmp" W72O BITMAP MOVEABLE PURE "bitmaps/w72o.bmp" O72O BITMAP MOVEABLE PURE "bitmaps/o72o.bmp" U72O BITMAP MOVEABLE PURE "bitmaps/u72o.bmp" H72O BITMAP MOVEABLE PURE "bitmaps/h72o.bmp" G72O BITMAP MOVEABLE PURE "bitmaps/g72o.bmp" V72O BITMAP MOVEABLE PURE "bitmaps/v72o.bmp" S72O BITMAP MOVEABLE PURE "bitmaps/s72o.bmp" L72O BITMAP MOVEABLE PURE "bitmaps/l72o.bmp" DK72O BITMAP MOVEABLE PURE "bitmaps/dk72o.bmp" WP72O BITMAP MOVEABLE PURE "bitmaps/wp72o.bmp" WN72O BITMAP MOVEABLE PURE "bitmaps/wn72o.bmp" WL72O BITMAP MOVEABLE PURE "bitmaps/wl72o.bmp" WS72O BITMAP MOVEABLE PURE "bitmaps/ws72o.bmp" E72S BITMAP MOVEABLE PURE "bitmaps/e72s.bmp" A72S BITMAP MOVEABLE PURE "bitmaps/a72s.bmp" AA72S BITMAP MOVEABLE PURE "bitmaps/as72s.bmp" C72S BITMAP MOVEABLE PURE "bitmaps/c72s.bmp" CV72S BITMAP MOVEABLE PURE "bitmaps/cv72s.bmp" F72S BITMAP MOVEABLE PURE "bitmaps/f72s.bmp" M72S BITMAP MOVEABLE PURE "bitmaps/m72s.bmp" W72S BITMAP MOVEABLE PURE "bitmaps/w72s.bmp" O72S BITMAP MOVEABLE PURE "bitmaps/o72s.bmp" U72S BITMAP MOVEABLE PURE "bitmaps/u72s.bmp" H72S BITMAP MOVEABLE PURE "bitmaps/h72s.bmp" G72S BITMAP MOVEABLE PURE "bitmaps/g72s.bmp" V72S BITMAP MOVEABLE PURE "bitmaps/v72s.bmp" S72S BITMAP MOVEABLE PURE "bitmaps/s72s.bmp" L72S BITMAP MOVEABLE PURE "bitmaps/l72s.bmp" DK72S BITMAP MOVEABLE PURE "bitmaps/dk72s.bmp" WP72S BITMAP MOVEABLE PURE "bitmaps/wp72s.bmp" WN72S BITMAP MOVEABLE PURE "bitmaps/wn72s.bmp" WL72S BITMAP MOVEABLE PURE "bitmaps/wl72s.bmp" WS72S BITMAP MOVEABLE PURE "bitmaps/ws72s.bmp" E72W BITMAP MOVEABLE PURE "bitmaps/e72w.bmp" A72W BITMAP MOVEABLE PURE "bitmaps/a72w.bmp" AA72W BITMAP MOVEABLE PURE "bitmaps/as72w.bmp" C72W BITMAP MOVEABLE PURE "bitmaps/c72w.bmp" CV72W BITMAP MOVEABLE PURE "bitmaps/cv72w.bmp" F72W BITMAP MOVEABLE PURE "bitmaps/f72w.bmp" M72W BITMAP MOVEABLE PURE "bitmaps/m72w.bmp" W72W BITMAP MOVEABLE PURE "bitmaps/w72w.bmp" O72W BITMAP MOVEABLE PURE "bitmaps/o72w.bmp" U72W BITMAP MOVEABLE PURE "bitmaps/u72w.bmp" H72W BITMAP MOVEABLE PURE "bitmaps/h72w.bmp" G72W BITMAP MOVEABLE PURE "bitmaps/g72w.bmp" V72W BITMAP MOVEABLE PURE "bitmaps/v72w.bmp" S72W BITMAP MOVEABLE PURE "bitmaps/s72w.bmp" L72W BITMAP MOVEABLE PURE "bitmaps/l72w.bmp" DK72W BITMAP MOVEABLE PURE "bitmaps/dk72w.bmp" E49O BITMAP MOVEABLE PURE "bitmaps/e49o.bmp" A49O BITMAP MOVEABLE PURE "bitmaps/a49o.bmp" AA49O BITMAP MOVEABLE PURE "bitmaps/as49o.bmp" C49O BITMAP MOVEABLE PURE "bitmaps/c49o.bmp" CV49O BITMAP MOVEABLE PURE "bitmaps/cv49o.bmp" F49O BITMAP MOVEABLE PURE "bitmaps/f49o.bmp" M49O BITMAP MOVEABLE PURE "bitmaps/m49o.bmp" W49O BITMAP MOVEABLE PURE "bitmaps/w49o.bmp" O49O BITMAP MOVEABLE PURE "bitmaps/o49o.bmp" U49O BITMAP MOVEABLE PURE "bitmaps/u49o.bmp" H49O BITMAP MOVEABLE PURE "bitmaps/h49o.bmp" G49O BITMAP MOVEABLE PURE "bitmaps/g49o.bmp" V49O BITMAP MOVEABLE PURE "bitmaps/v49o.bmp" S49O BITMAP MOVEABLE PURE "bitmaps/s49o.bmp" L49O BITMAP MOVEABLE PURE "bitmaps/l49o.bmp" DK49O BITMAP MOVEABLE PURE "bitmaps/dk49o.bmp" WP49O BITMAP MOVEABLE PURE "bitmaps/wp49o.bmp" WN49O BITMAP MOVEABLE PURE "bitmaps/wn49o.bmp" WL49O BITMAP MOVEABLE PURE "bitmaps/wl49o.bmp" WS49O BITMAP MOVEABLE PURE "bitmaps/ws49o.bmp" E49S BITMAP MOVEABLE PURE "bitmaps/e49s.bmp" A49S BITMAP MOVEABLE PURE "bitmaps/a49s.bmp" AA49S BITMAP MOVEABLE PURE "bitmaps/as49s.bmp" C49S BITMAP MOVEABLE PURE "bitmaps/c49s.bmp" CV49S BITMAP MOVEABLE PURE "bitmaps/cv49s.bmp" F49S BITMAP MOVEABLE PURE "bitmaps/f49s.bmp" M49S BITMAP MOVEABLE PURE "bitmaps/m49s.bmp" W49S BITMAP MOVEABLE PURE "bitmaps/w49s.bmp" O49S BITMAP MOVEABLE PURE "bitmaps/o49s.bmp" U49S BITMAP MOVEABLE PURE "bitmaps/u49s.bmp" H49S BITMAP MOVEABLE PURE "bitmaps/h49s.bmp" G49S BITMAP MOVEABLE PURE "bitmaps/g49s.bmp" V49S BITMAP MOVEABLE PURE "bitmaps/v49s.bmp" S49S BITMAP MOVEABLE PURE "bitmaps/s49s.bmp" L49S BITMAP MOVEABLE PURE "bitmaps/l49s.bmp" DK49S BITMAP MOVEABLE PURE "bitmaps/dk49s.bmp" WP49S BITMAP MOVEABLE PURE "bitmaps/wp49s.bmp" WN49S BITMAP MOVEABLE PURE "bitmaps/wn49s.bmp" WL49S BITMAP MOVEABLE PURE "bitmaps/wl49s.bmp" WS49S BITMAP MOVEABLE PURE "bitmaps/ws49s.bmp" E49W BITMAP MOVEABLE PURE "bitmaps/e49w.bmp" A49W BITMAP MOVEABLE PURE "bitmaps/a49w.bmp" AA49W BITMAP MOVEABLE PURE "bitmaps/as49w.bmp" C49W BITMAP MOVEABLE PURE "bitmaps/c49w.bmp" CV49W BITMAP MOVEABLE PURE "bitmaps/cv49w.bmp" F49W BITMAP MOVEABLE PURE "bitmaps/f49w.bmp" M49W BITMAP MOVEABLE PURE "bitmaps/m49w.bmp" W49W BITMAP MOVEABLE PURE "bitmaps/w49w.bmp" O49W BITMAP MOVEABLE PURE "bitmaps/o49w.bmp" U49W BITMAP MOVEABLE PURE "bitmaps/u49w.bmp" H49W BITMAP MOVEABLE PURE "bitmaps/h49w.bmp" G49W BITMAP MOVEABLE PURE "bitmaps/g49w.bmp" V49W BITMAP MOVEABLE PURE "bitmaps/v49w.bmp" S49W BITMAP MOVEABLE PURE "bitmaps/s49w.bmp" L49W BITMAP MOVEABLE PURE "bitmaps/l49w.bmp" DK49W BITMAP MOVEABLE PURE "bitmaps/dk49w.bmp" A33O BITMAP MOVEABLE PURE "bitmaps/a33o.bmp" AA33O BITMAP MOVEABLE PURE "bitmaps/as33o.bmp" C33O BITMAP MOVEABLE PURE "bitmaps/c33o.bmp" CV33O BITMAP MOVEABLE PURE "bitmaps/cv33o.bmp" V33O BITMAP MOVEABLE PURE "bitmaps/v33o.bmp" E33O BITMAP MOVEABLE PURE "bitmaps/e33o.bmp" F33O BITMAP MOVEABLE PURE "bitmaps/f33o.bmp" H33O BITMAP MOVEABLE PURE "bitmaps/h33o.bmp" G33O BITMAP MOVEABLE PURE "bitmaps/g33o.bmp" L33O BITMAP MOVEABLE PURE "bitmaps/l33o.bmp" W33O BITMAP MOVEABLE PURE "bitmaps/w33o.bmp" M33O BITMAP MOVEABLE PURE "bitmaps/m33o.bmp" O33O BITMAP MOVEABLE PURE "bitmaps/o33o.bmp" DK33O BITMAP MOVEABLE PURE "bitmaps/dk33o.bmp" WP33O BITMAP MOVEABLE PURE "bitmaps/wp33o.bmp" WN33O BITMAP MOVEABLE PURE "bitmaps/wn33o.bmp" WL33O BITMAP MOVEABLE PURE "bitmaps/wl33o.bmp" WS33O BITMAP MOVEABLE PURE "bitmaps/ws33o.bmp" A33W BITMAP MOVEABLE PURE "bitmaps/a33w.bmp" AA33W BITMAP MOVEABLE PURE "bitmaps/as33w.bmp" C33W BITMAP MOVEABLE PURE "bitmaps/c33w.bmp" CV33W BITMAP MOVEABLE PURE "bitmaps/cv33w.bmp" V33W BITMAP MOVEABLE PURE "bitmaps/v33w.bmp" E33W BITMAP MOVEABLE PURE "bitmaps/e33w.bmp" F33W BITMAP MOVEABLE PURE "bitmaps/f33w.bmp" H33W BITMAP MOVEABLE PURE "bitmaps/h33w.bmp" G33W BITMAP MOVEABLE PURE "bitmaps/g33w.bmp" L33W BITMAP MOVEABLE PURE "bitmaps/l33w.bmp" W33W BITMAP MOVEABLE PURE "bitmaps/w33w.bmp" M33W BITMAP MOVEABLE PURE "bitmaps/m33w.bmp" O33W BITMAP MOVEABLE PURE "bitmaps/o33w.bmp" DK33W BITMAP MOVEABLE PURE "bitmaps/dk33w.bmp" A33S BITMAP MOVEABLE PURE "bitmaps/a33s.bmp" AA33S BITMAP MOVEABLE PURE "bitmaps/as33s.bmp" C33S BITMAP MOVEABLE PURE "bitmaps/c33s.bmp" CV33S BITMAP MOVEABLE PURE "bitmaps/cv33s.bmp" V33S BITMAP MOVEABLE PURE "bitmaps/v33s.bmp" E33S BITMAP MOVEABLE PURE "bitmaps/e33s.bmp" F33S BITMAP MOVEABLE PURE "bitmaps/f33s.bmp" H33S BITMAP MOVEABLE PURE "bitmaps/h33s.bmp" G33S BITMAP MOVEABLE PURE "bitmaps/g33s.bmp" L33S BITMAP MOVEABLE PURE "bitmaps/l33s.bmp" W33S BITMAP MOVEABLE PURE "bitmaps/w33s.bmp" M33S BITMAP MOVEABLE PURE "bitmaps/m33s.bmp" O33S BITMAP MOVEABLE PURE "bitmaps/o33s.bmp" DK33S BITMAP MOVEABLE PURE "bitmaps/dk33s.bmp" WP33S BITMAP MOVEABLE PURE "bitmaps/wp33s.bmp" WN33S BITMAP MOVEABLE PURE "bitmaps/wn33s.bmp" WL33S BITMAP MOVEABLE PURE "bitmaps/wl33s.bmp" WS33S BITMAP MOVEABLE PURE "bitmaps/ws33s.bmp" A37O BITMAP MOVEABLE PURE "bitmaps/a37o.bmp" L37O BITMAP MOVEABLE PURE "bitmaps/l37o.bmp" C37O BITMAP MOVEABLE PURE "bitmaps/c37o.bmp" CV37O BITMAP MOVEABLE PURE "bitmaps/cv37o.bmp" A40O BITMAP MOVEABLE PURE "bitmaps/a40o.bmp" L40O BITMAP MOVEABLE PURE "bitmaps/l40o.bmp" C40O BITMAP MOVEABLE PURE "bitmaps/c40o.bmp" CV40O BITMAP MOVEABLE PURE "bitmaps/cv40o.bmp" A45O BITMAP MOVEABLE PURE "bitmaps/a45o.bmp" L45O BITMAP MOVEABLE PURE "bitmaps/l45o.bmp" C45O BITMAP MOVEABLE PURE "bitmaps/c45o.bmp" CV45O BITMAP MOVEABLE PURE "bitmaps/cv45o.bmp" A54O BITMAP MOVEABLE PURE "bitmaps/a54o.bmp" L54O BITMAP MOVEABLE PURE "bitmaps/l54o.bmp" C54O BITMAP MOVEABLE PURE "bitmaps/c54o.bmp" CV54O BITMAP MOVEABLE PURE "bitmaps/cv54o.bmp" A58O BITMAP MOVEABLE PURE "bitmaps/a58o.bmp" L58O BITMAP MOVEABLE PURE "bitmaps/l58o.bmp" C58O BITMAP MOVEABLE PURE "bitmaps/c58o.bmp" CV58O BITMAP MOVEABLE PURE "bitmaps/cv58o.bmp" A64O BITMAP MOVEABLE PURE "bitmaps/a64o.bmp" L64O BITMAP MOVEABLE PURE "bitmaps/l64o.bmp" C64O BITMAP MOVEABLE PURE "bitmaps/c64o.bmp" CV64O BITMAP MOVEABLE PURE "bitmaps/cv64o.bmp" A37W BITMAP MOVEABLE PURE "bitmaps/a37w.bmp" L37W BITMAP MOVEABLE PURE "bitmaps/l37w.bmp" C37W BITMAP MOVEABLE PURE "bitmaps/c37w.bmp" CV37W BITMAP MOVEABLE PURE "bitmaps/cv37w.bmp" A40W BITMAP MOVEABLE PURE "bitmaps/a40w.bmp" L40W BITMAP MOVEABLE PURE "bitmaps/l40w.bmp" C40W BITMAP MOVEABLE PURE "bitmaps/c40w.bmp" CV40W BITMAP MOVEABLE PURE "bitmaps/cv40w.bmp" A45W BITMAP MOVEABLE PURE "bitmaps/a45w.bmp" L45W BITMAP MOVEABLE PURE "bitmaps/l45w.bmp" C45W BITMAP MOVEABLE PURE "bitmaps/c45w.bmp" CV45W BITMAP MOVEABLE PURE "bitmaps/cv45w.bmp" A54W BITMAP MOVEABLE PURE "bitmaps/a54w.bmp" L54W BITMAP MOVEABLE PURE "bitmaps/l54w.bmp" C54W BITMAP MOVEABLE PURE "bitmaps/c54w.bmp" CV54W BITMAP MOVEABLE PURE "bitmaps/cv54w.bmp" A58W BITMAP MOVEABLE PURE "bitmaps/a58w.bmp" L58W BITMAP MOVEABLE PURE "bitmaps/l58w.bmp" C58W BITMAP MOVEABLE PURE "bitmaps/c58w.bmp" CV58W BITMAP MOVEABLE PURE "bitmaps/cv58w.bmp" A64W BITMAP MOVEABLE PURE "bitmaps/a64w.bmp" L64W BITMAP MOVEABLE PURE "bitmaps/l64w.bmp" C64W BITMAP MOVEABLE PURE "bitmaps/c64w.bmp" CV64W BITMAP MOVEABLE PURE "bitmaps/cv64w.bmp" A37S BITMAP MOVEABLE PURE "bitmaps/a37s.bmp" L37S BITMAP MOVEABLE PURE "bitmaps/l37s.bmp" C37S BITMAP MOVEABLE PURE "bitmaps/c37s.bmp" CV37S BITMAP MOVEABLE PURE "bitmaps/cv37s.bmp" A40S BITMAP MOVEABLE PURE "bitmaps/a40s.bmp" L40S BITMAP MOVEABLE PURE "bitmaps/l40s.bmp" C40S BITMAP MOVEABLE PURE "bitmaps/c40s.bmp" CV40S BITMAP MOVEABLE PURE "bitmaps/cv40s.bmp" A45S BITMAP MOVEABLE PURE "bitmaps/a45s.bmp" L45S BITMAP MOVEABLE PURE "bitmaps/l45s.bmp" C45S BITMAP MOVEABLE PURE "bitmaps/c45s.bmp" CV45S BITMAP MOVEABLE PURE "bitmaps/cv45s.bmp" A54S BITMAP MOVEABLE PURE "bitmaps/a54s.bmp" L54S BITMAP MOVEABLE PURE "bitmaps/l54s.bmp" C54S BITMAP MOVEABLE PURE "bitmaps/c54s.bmp" CV54S BITMAP MOVEABLE PURE "bitmaps/cv54s.bmp" A58S BITMAP MOVEABLE PURE "bitmaps/a58s.bmp" L58S BITMAP MOVEABLE PURE "bitmaps/l58s.bmp" C58S BITMAP MOVEABLE PURE "bitmaps/c58s.bmp" CV58S BITMAP MOVEABLE PURE "bitmaps/cv58s.bmp" A64S BITMAP MOVEABLE PURE "bitmaps/a64s.bmp" L64S BITMAP MOVEABLE PURE "bitmaps/l64s.bmp" C64S BITMAP MOVEABLE PURE "bitmaps/c64s.bmp" CV64S BITMAP MOVEABLE PURE "bitmaps/cv64s.bmp" SP58O BITMAP MOVEABLE PURE "shogibitmaps/sp58o.bmp" SN58O BITMAP MOVEABLE PURE "shogibitmaps/sn58o.bmp" SB58O BITMAP MOVEABLE PURE "shogibitmaps/sb58o.bmp" SR58O BITMAP MOVEABLE PURE "shogibitmaps/sr58o.bmp" SL58O BITMAP MOVEABLE PURE "shogibitmaps/sl58o.bmp" SK58O BITMAP MOVEABLE PURE "shogibitmaps/sk58o.bmp" SF58O BITMAP MOVEABLE PURE "shogibitmaps/sf58o.bmp" SW58O BITMAP MOVEABLE PURE "shogibitmaps/sw58o.bmp" SU58O BITMAP MOVEABLE PURE "shogibitmaps/su58o.bmp" SH58O BITMAP MOVEABLE PURE "shogibitmaps/sh58o.bmp" SA58O BITMAP MOVEABLE PURE "shogibitmaps/sa58o.bmp" SC58O BITMAP MOVEABLE PURE "shogibitmaps/sc58o.bmp" SG58O BITMAP MOVEABLE PURE "shogibitmaps/sg58o.bmp" SS58O BITMAP MOVEABLE PURE "shogibitmaps/ss58o.bmp" SP58W BITMAP MOVEABLE PURE "shogibitmaps/sp58w.bmp" SN58W BITMAP MOVEABLE PURE "shogibitmaps/sn58w.bmp" SR58W BITMAP MOVEABLE PURE "shogibitmaps/sr58w.bmp" SL58W BITMAP MOVEABLE PURE "shogibitmaps/sl58w.bmp" SK58W BITMAP MOVEABLE PURE "shogibitmaps/sk58w.bmp" SW58W BITMAP MOVEABLE PURE "shogibitmaps/sw58w.bmp" #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""dlgs.h""\r\n" "\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // WAVE // DING WAVE DISCARDABLE "sounds/ding1.wav" CHING WAVE DISCARDABLE "sounds/ching.wav" CLICK WAVE DISCARDABLE "sounds/click.wav" CYMBAL WAVE DISCARDABLE "sounds/cymbal.wav" DRIP WAVE DISCARDABLE "sounds/drip.wav" GONG WAVE DISCARDABLE "sounds/gong.wav" BEEPBEEP WAVE DISCARDABLE "sounds/honkhonk.wav" LASER WAVE DISCARDABLE "sounds/laser.wav" PENALTY WAVE DISCARDABLE "sounds/penalty.wav" PHONE WAVE DISCARDABLE "sounds/phone.wav" POP WAVE DISCARDABLE "sounds/pop.wav" POP2 WAVE DISCARDABLE "sounds/pop2.wav" SLAP WAVE DISCARDABLE "sounds/slap.wav" SQUEAK WAVE DISCARDABLE "sounds/squeak.wav" SWISH WAVE DISCARDABLE "sounds/swish.wav" THUD WAVE DISCARDABLE "sounds/thud.wav" WHIPCRACK WAVE DISCARDABLE "sounds/whipcrak.wav" MOVE WAVE DISCARDABLE "sounds/move.wav" ALARM WAVE DISCARDABLE "sounds/alarm.wav" CHALLENGE WAVE DISCARDABLE "sounds/challenge.wav" CHANNEL WAVE DISCARDABLE "sounds/channel.wav" CHANNEL1 WAVE DISCARDABLE "sounds/channel1.wav" DRAW WAVE DISCARDABLE "sounds/draw.wav" KIBITZ WAVE DISCARDABLE "sounds/kibitz.wav" LOSE WAVE DISCARDABLE "sounds/lose.wav" REQUEST WAVE DISCARDABLE "sounds/request.wav" SEEK WAVE DISCARDABLE "sounds/seek.wav" SHOUT WAVE DISCARDABLE "sounds/shout.wav" SSHOUT WAVE DISCARDABLE "sounds/sshout.wav" TELL WAVE DISCARDABLE "sounds/tell.wav" UNFINISHED WAVE DISCARDABLE "sounds/unfinished.wav" WIN WAVE DISCARDABLE "sounds/win.wav" ///////////////////////////////////////////////////////////////////////////// // // Version // 1 VERSIONINFO FILEVERSION PACKAGE_FILEVERSION PRODUCTVERSION PACKAGE_FILEVERSION FILETYPE VFT_APP { BLOCK "StringFileInfo" { BLOCK "040904b0" { #ifdef JAWS VALUE "Comments", "Includes support for JAWS screen reader" #endif VALUE "CompanyName", "GNU Project" VALUE "FileVersion", PACKAGE_VERSION VALUE "FileDescription", "Winboard 32-bit GUI for chess" VALUE "InternalName", "Winboard" VALUE "LegalCopyright", "GPLv3 Copyright 2009" VALUE "OriginalFilename", "winboard.exe" VALUE "ProductName", "Winboard" VALUE "ProductVersion", PACKAGE_VERSION #ifdef JAWS VALUE "SpecialBuild", "JAWS (Job Access With Speech) accessiblity build\0" #endif } } BLOCK "VarFileInfo" { VALUE "Translation", 0x0409, 1252 } } #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED xboard-4.7.3/winboard/wsnap.h0000644000175000001440000000316712262415351013037 00000000000000/* * Smart "snapping" for window moving and sizing * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef WSNAP_H_ #define WSNAP_H_ #include #define MAX_SNAP_POINTS 12 #define SNAP_DISTANCE 4 typedef struct { int x_grid[ MAX_SNAP_POINTS ]; int x_grid_len; int y_grid[ MAX_SNAP_POINTS ]; int y_grid_len; } SnapData; LRESULT OnEnterSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ); #endif // WSNAP_H_ xboard-4.7.3/winboard/wengineoutput.c0000644000175000001440000003654612262415351014626 00000000000000/* * wengineoutput.c - split-off front-end of Engine output (PV) by HGM * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "wsnap.h" #include "engineoutput.h" /* Module variables */ int windowMode = 1; static BOOLEAN engineOutputDialogUp = FALSE; HICON icons[8]; // [HGM] this front-end array translates back-end icon indicator to handle HWND outputField[2][7]; // [HGM] front-end array to translate output field to window handle // front end static HICON LoadIconEx( int id ) { return LoadImage( hInst, MAKEINTRESOURCE(id), IMAGE_ICON, ICON_SIZE, ICON_SIZE, 0 ); } // [HGM] the platform-dependent way of indicating where output should go is now all // concentrated here, where a table of platform-dependent handles are initialized. // This cleanses most other routines of front-end stuff, so they can go into the back end. static void InitializeEngineOutput() { // [HGM] made this into a table, rather than separate global variables icons[nColorBlack] = LoadIconEx( IDI_BLACK_14 ); icons[nColorWhite] = LoadIconEx( IDI_WHITE_14 ); icons[nColorUnknown] = LoadIconEx( IDI_UNKNOWN_14 ); icons[nClear] = LoadIconEx( IDI_TRANS_14 ); icons[nPondering] = LoadIconEx( IDI_PONDER_14 ); icons[nThinking] = LoadIconEx( IDI_CLOCK_14 ); icons[nAnalyzing] = LoadIconEx( IDI_ANALYZE2_14 ); // [HGM] also make a table of handles to output controls // Note that engineOutputDialog must be defined first! outputField[0][nColorIcon] = GetDlgItem( engineOutputDialog, IDC_Color1 ); outputField[0][nLabel] = GetDlgItem( engineOutputDialog, IDC_EngineLabel1 ); outputField[0][nStateIcon] = GetDlgItem( engineOutputDialog, IDC_StateIcon1 ); outputField[0][nStateData] = GetDlgItem( engineOutputDialog, IDC_StateData1 ); outputField[0][nLabelNPS] = GetDlgItem( engineOutputDialog, IDC_Engine1_NPS ); outputField[0][nMemo] = GetDlgItem( engineOutputDialog, IDC_EngineMemo1 ); outputField[1][nColorIcon] = GetDlgItem( engineOutputDialog, IDC_Color2 ); outputField[1][nLabel] = GetDlgItem( engineOutputDialog, IDC_EngineLabel2 ); outputField[1][nStateIcon] = GetDlgItem( engineOutputDialog, IDC_StateIcon2 ); outputField[1][nStateData] = GetDlgItem( engineOutputDialog, IDC_StateData2 ); outputField[1][nLabelNPS] = GetDlgItem( engineOutputDialog, IDC_Engine2_NPS ); outputField[1][nMemo] = GetDlgItem( engineOutputDialog, IDC_EngineMemo2 ); } // front end static void SetControlPos( HWND hDlg, int id, int x, int y, int width, int height ) { HWND hControl = GetDlgItem( hDlg, id ); SetWindowPos( hControl, HWND_TOP, x, y, width, height, SWP_NOZORDER ); } #define HIDDEN_X 20000 #define HIDDEN_Y 20000 // front end static void HideControl( HWND hDlg, int id ) { HWND hControl = GetDlgItem( hDlg, id ); RECT rc; GetWindowRect( hControl, &rc ); /* Avoid hiding an already hidden control, because that causes many unnecessary WM_ERASEBKGND messages! */ if( rc.left != HIDDEN_X || rc.top != HIDDEN_Y ) { SetControlPos( hDlg, id, 20000, 20000, 100, 100 ); } } // front end, although we might make GetWindowRect front end instead static int GetControlWidth( HWND hDlg, int id ) { RECT rc; GetWindowRect( GetDlgItem( hDlg, id ), &rc ); return rc.right - rc.left; } // front end? static int GetControlHeight( HWND hDlg, int id ) { RECT rc; GetWindowRect( GetDlgItem( hDlg, id ), &rc ); return rc.bottom - rc.top; } static int GetHeaderHeight() { int result = GetControlHeight( engineOutputDialog, IDC_EngineLabel1 ); if( result < ICON_SIZE ) result = ICON_SIZE; return result; } // The size calculations should be backend? If setControlPos is a platform-dependent way of doing things, // a platform-independent wrapper for it should be supplied. static void PositionControlSet( HWND hDlg, int x, int y, int clientWidth, int memoHeight, int idColor, int idEngineLabel, int idNPS, int idMemo, int idStateIcon, int idStateData ) { int label_x = x + ICON_SIZE + H_MARGIN; int label_h = GetControlHeight( hDlg, IDC_EngineLabel1 ); int label_y = y + ICON_SIZE - label_h; int nps_w = GetControlWidth( hDlg, IDC_Engine1_NPS ); int nps_x = clientWidth - H_MARGIN - nps_w; int state_data_w = GetControlWidth( hDlg, IDC_StateData1 ); int state_data_x = nps_x - H_MARGIN - state_data_w; int state_icon_x = state_data_x - ICON_SIZE - 2; int max_w = clientWidth - 2*H_MARGIN; int memo_y = y + ICON_SIZE + LABEL_V_DISTANCE; SetControlPos( hDlg, idColor, x, y, ICON_SIZE, ICON_SIZE ); SetControlPos( hDlg, idEngineLabel, label_x, label_y, state_icon_x - label_x, label_h ); SetControlPos( hDlg, idStateIcon, state_icon_x, y, ICON_SIZE, ICON_SIZE ); SetControlPos( hDlg, idStateData, state_data_x, label_y, state_data_w, label_h ); SetControlPos( hDlg, idNPS, nps_x, label_y, nps_w, label_h ); SetControlPos( hDlg, idMemo, x, memo_y, max_w, memoHeight ); } // Also here some of the size calculations should go to the back end, and their actual application to a front-end routine void ResizeWindowControls( int mode ) { HWND hDlg = engineOutputDialog; // [HGM] used to be parameter, but routine is called from back-end RECT rc; int headerHeight = GetHeaderHeight(); // int labelHeight = GetControlHeight( hDlg, IDC_EngineLabel1 ); // int labelOffset = H_MARGIN + ICON_SIZE + H_MARGIN; // int labelDeltaY = ICON_SIZE - labelHeight; int clientWidth; int clientHeight; int maxControlWidth; int npsWidth; /* Initialize variables */ GetClientRect( hDlg, &rc ); clientWidth = rc.right - rc.left; clientHeight = rc.bottom - rc.top; maxControlWidth = clientWidth - 2*H_MARGIN; npsWidth = GetControlWidth( hDlg, IDC_Engine1_NPS ); /* Resize controls */ if( mode == 0 ) { /* One engine */ PositionControlSet( hDlg, H_MARGIN, V_MARGIN, clientWidth, clientHeight - V_MARGIN - LABEL_V_DISTANCE - headerHeight- V_MARGIN, IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); /* Hide controls for the second engine */ HideControl( hDlg, IDC_Color2 ); HideControl( hDlg, IDC_EngineLabel2 ); HideControl( hDlg, IDC_StateIcon2 ); HideControl( hDlg, IDC_StateData2 ); HideControl( hDlg, IDC_Engine2_NPS ); HideControl( hDlg, IDC_EngineMemo2 ); SendDlgItemMessage( hDlg, IDC_EngineMemo2, WM_SETTEXT, 0, (LPARAM) "" ); /* TODO: we should also hide/disable them!!! what about tab stops?!?! */ } else { /* Two engines */ int memo_h = (clientHeight - headerHeight*2 - V_MARGIN*2 - LABEL_V_DISTANCE*2 - SPLITTER_SIZE) / 2; int header1_y = V_MARGIN; int header2_y = V_MARGIN + headerHeight + LABEL_V_DISTANCE + memo_h + SPLITTER_SIZE; PositionControlSet( hDlg, H_MARGIN, header1_y, clientWidth, memo_h, IDC_Color1, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineMemo1, IDC_StateIcon1, IDC_StateData1 ); PositionControlSet( hDlg, H_MARGIN, header2_y, clientWidth, memo_h, IDC_Color2, IDC_EngineLabel2, IDC_Engine2_NPS, IDC_EngineMemo2, IDC_StateIcon2, IDC_StateData2 ); } InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo1), NULL, FALSE ); InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE ); } static int currentPV, highTextStart[2], highTextEnd[2]; extern RECT boardRect; VOID GetMemoLine(HWND hDlg, int x, int y) { // [HGM] pv: translate click to PV line, and load it for display char buf[10000]; int index, start, end, memo; POINT pt; pt.x = x; pt.y = y; memo = currentPV ? IDC_EngineMemo2 : IDC_EngineMemo1; index = SendDlgItemMessage( hDlg, memo, EM_CHARFROMPOS, 0, (LPARAM) &pt ); GetDlgItemText(hDlg, memo, buf, sizeof(buf)); if(LoadMultiPV(x, y, buf, index, &start, &end, currentPV)) { SetCapture(hDlg); SendMessage( outputField[currentPV][nMemo], EM_SETSEL, (WPARAM)start, (LPARAM)end ); highTextStart[currentPV] = start; highTextEnd[currentPV] = end; SetFocus(outputField[currentPV][nMemo]); } } // front end. Actual printing of PV lines into the output field void InsertIntoMemo( int which, char * text, int where ) { SendMessage( outputField[which][nMemo], EM_SETSEL, where, where ); // [HGM] multivar: choose insertion point SendMessage( outputField[which][nMemo], EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); if(where < highTextStart[which]) { // [HGM] multiPVdisplay: move highlighting int len = strlen(text); highTextStart[which] += len; highTextEnd[which] += len; SendMessage( outputField[which][nMemo], EM_SETSEL, highTextStart[which], highTextEnd[which] ); } } // front end. Associates an icon with an output field ("control" in Windows jargon). // [HGM] let it find out the output field from the 'which' number by itself void SetIcon( int which, int field, int nIcon ) { if( nIcon != 0 ) { SendMessage( outputField[which][field], STM_SETICON, (WPARAM) icons[nIcon], 0 ); } } // front end wrapper for SetWindowText, taking control number in stead of handle void DoSetWindowText(int which, int field, char *s_label) { SetWindowText( outputField[which][field], s_label ); } void SetEngineOutputTitle(char *title) { SetWindowText( engineOutputDialog, title ); } // This seems pure front end LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { static SnapData sd; switch (message) { case WM_INITDIALOG: if( engineOutputDialog == NULL ) { engineOutputDialog = hDlg; Translate(hDlg, DLG_EngineOutput); RestoreWindowPlacement( hDlg, &wpEngineOutput ); /* Restore window placement */ ResizeWindowControls( windowMode ); SendDlgItemMessage( hDlg, IDC_EngineMemo1, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); SendDlgItemMessage( hDlg, IDC_EngineMemo2, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); /* Set font */ SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo1, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo2, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); } return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; case WM_MOUSEMOVE: MovePV(LOWORD(lParam) - boardRect.left, HIWORD(lParam) - boardRect.top, boardRect.bottom - boardRect.top); break; case WM_RBUTTONUP: ReleaseCapture(); SendMessage( outputField[currentPV][nMemo], EM_SETSEL, 0, 0 ); highTextStart[currentPV] = highTextEnd[currentPV] = 0; UnLoadPV(); break; case WM_NOTIFY: if( wParam == IDC_EngineMemo1 || wParam == IDC_EngineMemo2 ) { MSGFILTER * lpMF = (MSGFILTER *) lParam; if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL)) == 0 ) { shiftKey = (lpMF->wParam & MK_SHIFT) != 0; // [HGM] remember last shift status currentPV = (wParam == IDC_EngineMemo2); GetMemoLine(hDlg, LOWORD(lpMF->lParam), HIWORD(lpMF->lParam)); } } break; case WM_GETMINMAXINFO: { MINMAXINFO * mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 160; } break; case WM_CLOSE: EngineOutputPopDown(); break; case WM_SIZE: ResizeWindowControls( windowMode ); break; case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } return FALSE; } // front end void EngineOutputPopUp() { FARPROC lpProc; static int needInit = TRUE; CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_CHECKED); if( engineOutputDialog ) { SendMessage( engineOutputDialog, WM_INITDIALOG, 0, 0 ); if( ! engineOutputDialogUp ) { ShowWindow(engineOutputDialog, SW_SHOW); } } else { lpProc = MakeProcInstance( (FARPROC) EngineOutputProc, hInst ); /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ CreateDialog( hInst, MAKEINTRESOURCE(DLG_EngineOutput), hwndMain, (DLGPROC)lpProc ); FreeProcInstance(lpProc); } // [HGM] displaced to after creation of dialog, to allow initialization of output fields if( needInit ) { InitializeEngineOutput(); needInit = FALSE; } engineOutputDialogUp = TRUE; } // front end void EngineOutputPopDown() { CheckMenuItem(GetMenu(hwndMain), IDM_ShowEngineOutput, MF_UNCHECKED); if( engineOutputDialog ) { ShowWindow(engineOutputDialog, SW_HIDE); } engineOutputDialogUp = FALSE; } // front end. [HGM] Takes handle of output control from table, so only number is passed void DoClearMemo(int which) { SendMessage( outputField[which][nMemo], WM_SETTEXT, 0, (LPARAM) "" ); } // front end (because only other front-end wants to know) int EngineOutputIsUp() { return engineOutputDialogUp; } // front end, to give back-end access to engineOutputDialog int EngineOutputDialogExists() { return engineOutputDialog != NULL; } xboard-4.7.3/winboard/winboard.rtf0000644000175000001440000173076212262415351014071 00000000000000{\rtf1\ansi\ansicpg1252\uc1 \deff5\deflang1033\deflangfe1043{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} {\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times;} {\f5\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica{\*\falt Arial};}{\f6\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier{\*\falt Courier New};}{\f7\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Geneva;} {\f8\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Tms Rmn;}{\f9\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helv;}{\f10\froman\fcharset0\fprq2{\*\panose 00000000000000000000}MS Serif;} {\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f12\froman\fcharset0\fprq2{\*\panose 00000000000000000000}New York{\*\falt Times New Roman};}{\f13\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}System;} {\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f15\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f16\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun;} {\f17\froman\fcharset0\fprq0{\*\panose 00000000000000000000}??;}{\f18\fswiss\fcharset0\fprq0{\*\panose 00000000000000000000}BookAntiqua-Bold;}{\f19\fswiss\fcharset0\fprq0{\*\panose 00000000000000000000}BookAntiqua;} {\f20\froman\fcharset0\fprq0{\*\panose 00000000000000000000}Minion-Regular;}{\f21\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Calibri;}{\f22\froman\fcharset0\fprq0{\*\panose 00000000000000000000}TimesNewRoman;} {\f23\froman\fcharset0\fprq0{\*\panose 00000000000000000000}TimesNewRoman,Italic;}{\f24\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Cambria Math;}{\f25\fnil\fcharset129\fprq1{\*\panose 00000000000000000000}Terminal;} {\f26\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Fixedsys;}{\f27\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Small Fonts;}{\f28\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Czec;} {\f29\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Engl;}{\f30\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Fren;}{\f31\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Germ;} {\f32\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Ital;}{\f33\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Span;}{\f34\fdecor\fcharset2\fprq1{\*\panose 00000000000000000000}WST_Swed;} {\f35\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Marlett;}{\f36\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f37\fswiss\fcharset0\fprq2{\*\panose 020b0602030504020204}Lucida Sans Unicode;} {\f38\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}{\f39\fswiss\fcharset0\fprq2{\*\panose 020b0a04020102020204}Arial Black;}{\f40\fscript\fcharset0\fprq2{\*\panose 030f0702030302020204}Comic Sans MS;} {\f41\fswiss\fcharset0\fprq2{\*\panose 020b0806030902050204}Impact;}{\f42\froman\fcharset0\fprq2{\*\panose 02040502050405020303}Georgia;}{\f43\fswiss\fcharset0\fprq2{\*\panose 020b0603020102020204}Franklin Gothic Medium;} {\f44\froman\fcharset0\fprq2{\*\panose 02040502050505030304}Palatino Linotype;}{\f45\fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;}{\f46\froman\fcharset2\fprq2{\*\panose 05030102010509060703}Webdings;} {\f47\fscript\fcharset0\fprq2 Estrangelo Edessa;}{\f48\fnil\fcharset0\fprq2 Gautami;}{\f49\fnil\fcharset0\fprq2 Latha;}{\f50\fnil\fcharset0\fprq2 Mangal;}{\f51\fnil\fcharset0\fprq2 MV Boli;}{\f52\fnil\fcharset0\fprq2 Raavi;} {\f53\fnil\fcharset0\fprq2 Shruti;}{\f54\fnil\fcharset0\fprq2 Tunga;}{\f55\froman\fcharset0\fprq2{\*\panose 010a0502050306030303}Sylfaen;}{\f56\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;} {\f57\fswiss\fcharset0\fprq2{\*\panose 020b0506020202030204}Arial Narrow;}{\f58\froman\fcharset0\fprq2{\*\panose 02060603020205020403}Rockwell;}{\f59\froman\fcharset0\fprq2{\*\panose 02060903040505020403}Rockwell Extra Bold;} {\f60\fscript\fcharset0\fprq2{\*\panose 03090702030407020403}Mistral;}{\f61\fdecor\fcharset0\fprq2{\*\panose 04020505051007020d02}Blackadder ITC;}{\f62\fscript\fcharset0\fprq2{\*\panose 03070402050302030203}Bradley Hand ITC;} {\f63\fswiss\fcharset0\fprq2{\*\panose 020e0705020206020404}Copperplate Gothic Bold;}{\f64\fswiss\fcharset0\fprq2{\*\panose 020e0507020206020404}Copperplate Gothic Light;}{\f65\fdecor\fcharset0\fprq2{\*\panose 04040404050702020202}Curlz MT;} {\f66\fscript\fcharset0\fprq2{\*\panose 030303020407070d0804}Edwardian Script ITC;}{\f67\froman\fcharset0\fprq2{\*\panose 02090707080505020304}Engravers MT;}{\f68\fswiss\fcharset0\fprq2{\*\panose 020b0805030504020804}Eras Demi ITC;} {\f69\fswiss\fcharset0\fprq2{\*\panose 020b0402030504020804}Eras Light ITC;}{\f70\fswiss\fcharset0\fprq2{\*\panose 020b0504020202050204}Eurostile;}{\f71\fdecor\fcharset0\fprq2{\*\panose 04060505060202020a04}Felix Titling;} {\f72\fswiss\fcharset0\fprq2{\*\panose 020b0503020102020204}Franklin Gothic Book;}{\f73\fswiss\fcharset0\fprq2{\*\panose 020b0703020102020204}Franklin Gothic Demi;}{\f74\fswiss\fcharset0\fprq2{\*\panose 020b0606030402020204}Franklin Gothic Medium Cond;} {\f75\fswiss\fcharset0\fprq2{\*\panose 020b0903020102020204}Franklin Gothic Heavy;}{\f76\fswiss\fcharset0\fprq2{\*\panose 020b0706030402020204}Franklin Gothic Demi Cond;}{\f77\fscript\fcharset0\fprq2{\*\panose 03020402040607040605}French Script MT;} {\f78\fswiss\fcharset0\fprq2{\*\panose 020b0502020202020204}Century Gothic;}{\f79\fscript\fcharset0\fprq2{\*\panose 03050502040202030202}Kristen ITC;}{\f80\fswiss\fcharset0\fprq2{\*\panose 020b0602030504020204}Lucida Sans;} {\f81\fswiss\fcharset0\fprq2{\*\panose 020e0502030308020204}Maiandra GD;}{\f82\fdecor\fcharset0\fprq2{\*\panose 04040403030d02020704}Matisse ITC;}{\f83\fscript\fcharset0\fprq2{\*\panose 03070502060502030205}Papyrus;} {\f84\froman\fcharset0\fprq2{\*\panose 02020502060401020303}Perpetua;}{\f85\fdecor\fcharset0\fprq2{\*\panose 04020404030d07020202}Tempus Sans ITC;}{\f86\fscript\fcharset0\fprq2{\*\panose 03020602050506090804}Vivaldi;} {\f87\froman\fcharset2\fprq2{\*\panose 05020102010507070707}Wingdings 2;}{\f88\froman\fcharset2\fprq2{\*\panose 05040102010807070707}Wingdings 3;}{\f89\fdecor\fcharset0\fprq2{\*\panose 04090605060d06020702}Jokerman;} {\f90\fdecor\fcharset0\fprq2{\*\panose 04040403040a02020202}Juice ITC;}{\f91\fmodern\fcharset0\fprq2{\*\panose 02010509020102010303}OCR A Extended;}{\f92\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}MS Reference 1;} {\f93\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}MS Reference 2;}{\f94\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}MS Reference Sans Serif;}{\f95\fnil\fcharset2\fprq2{\*\panose 05000500000000000000}MS Reference Specialty;} {\f96\froman\fcharset2\fprq2{\*\panose 05050102010205020202}MT Extra;}{\f97\fswiss\fcharset0\fprq2{\*\panose 020b0706040902060204}Haettenschweiler;}{\f98\froman\fcharset0\fprq2{\*\panose 02050604050505020204}Bookman Old Style;} {\f99\fnil\fcharset2\fprq2{\*\panose 01010601010101010101}Monotype Sorts;}{\f100\froman\fcharset0\fprq2{\*\panose 02020404030301010803}Garamond;}{\f101\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}MS Outlook;} {\f102\froman\fcharset0\fprq2{\*\panose 02020503030404060203}Kartika;}{\f103\fnil\fcharset0\fprq2{\*\panose 01010600010101010101}Vrinda;}{\f104\fswiss\fcharset2\fprq2{\*\panose 020b0603050302020204}WinboardF;} {\f105\fswiss\fcharset2\fprq2{\*\panose 020b0603050302020204}Chess Mark;}{\f106\fnil\fcharset0\fprq2{\*\panose 02000500000000000000}Superchess;}{\f107\fswiss\fcharset0\fprq2{\*\panose 020b0603050302020204}Tasc Chess Figurine;} {\f108\fnil\fcharset0\fprq1{\*\panose 02010603010101010101}XIANGQI;}{\f109\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho;}{\f110\fmodern\fcharset128\fprq1{\*\panose 02020609040205080304}@MS Mincho;} {\f111\froman\fcharset128\fprq2{\*\panose 02020600040205080304}MS PMincho;}{\f112\froman\fcharset128\fprq2{\*\panose 02020600040205080304}@MS PMincho;}{\f113\fmodern\fcharset128\fprq1{\*\panose 020b0609070205080204}MS Gothic;} {\f114\fmodern\fcharset128\fprq1{\*\panose 020b0609070205080204}@MS Gothic;}{\f115\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}MS PGothic;}{\f116\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}@MS PGothic;} {\f117\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}MS UI Gothic;}{\f118\fswiss\fcharset128\fprq2{\*\panose 020b0600070205080204}@MS UI Gothic;}{\f119\fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}Gulim;} {\f120\fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}@Gulim;}{\f121\fmodern\fcharset129\fprq1{\*\panose 020b0609000101010101}GulimChe;}{\f122\fmodern\fcharset129\fprq1{\*\panose 020b0609000101010101}@GulimChe;} {\f123\fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}Dotum;}{\f124\fswiss\fcharset129\fprq2{\*\panose 020b0600000101010101}@Dotum;}{\f125\fmodern\fcharset129\fprq1{\*\panose 020b0609000101010101}DotumChe;} {\f126\fmodern\fcharset129\fprq1{\*\panose 020b0609000101010101}@DotumChe;}{\f127\froman\fcharset129\fprq2{\*\panose 02030600000101010101}Batang;}{\f128\froman\fcharset129\fprq2{\*\panose 02030600000101010101}@Batang;} {\f129\fmodern\fcharset129\fprq1{\*\panose 02030609000101010101}BatangChe;}{\f130\fmodern\fcharset129\fprq1{\*\panose 02030609000101010101}@BatangChe;}{\f131\froman\fcharset129\fprq2{\*\panose 02030600000101010101}Gungsuh;} {\f132\froman\fcharset129\fprq2{\*\panose 02030600000101010101}@Gungsuh;}{\f133\fmodern\fcharset129\fprq1{\*\panose 02030609000101010101}GungsuhChe;}{\f134\fmodern\fcharset129\fprq1{\*\panose 02030609000101010101}@GungsuhChe;} {\f135\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimSun;}{\f136\fmodern\fcharset134\fprq1{\*\panose 02010609030101010101}NSimSun;}{\f137\fmodern\fcharset134\fprq1{\*\panose 02010609030101010101}@NSimSun;} {\f138\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimHei;}{\f139\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@SimHei;}{\f140\fmodern\fcharset136\fprq1{\*\panose 02020309000000000000}MingLiU;} {\f141\fmodern\fcharset136\fprq1{\*\panose 02020309000000000000}@MingLiU;}{\f142\froman\fcharset136\fprq2{\*\panose 02020300000000000000}PMingLiU;}{\f143\froman\fcharset136\fprq2{\*\panose 02020300000000000000}@PMingLiU;} {\f144\froman\fcharset128\fprq1{\*\panose 00000000000000000000}Mincho{\*\falt ??};}{\f145\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Century;}{\f146\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Angsana New;} {\f147\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Cordia New;}{\f148\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Sendnya;}{\f149\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Estrangella Edessa;} {\f150\fswiss\fcharset128\fprq2{\*\panose 00000000000000000000}Arial Unicode MS;}{\f151\fswiss\fcharset0\fprq0{\*\panose 00000000000000000000}Univers (WN);}{\f152\froman\fcharset0\fprq0{\*\panose 00000000000000000000}CG Times (WN);} {\f153\fswiss\fcharset128\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS;}{\f154\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Book Antiqua;}{\f155\fscript\fcharset0\fprq2{\*\panose 00000000000000000000}Monotype Corsiva;} {\f156\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}CA Chess;}{\f157\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}ISDiagram;}{\f158\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}CADiagram;} {\f159\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Alfonso-X;}{\f160\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Adventurer;}{\f161\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Cases;} {\f162\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Marroquin;}{\f163\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Condal;}{\f164\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Harlequin;} {\f165\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Kingdom;}{\f166\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Leipzig;}{\f167\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Line;} {\f168\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Lucena;}{\f169\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Magnetic;}{\f170\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Maya;} {\f171\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Merida Fatx;}{\f172\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Merida;}{\f173\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Millennia-D;} {\f174\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Miscel;}{\f175\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Motif;}{\f176\fswiss\fcharset2\fprq2{\*\panose 00000000000000000000}Chess Mediaeval;} {\f177\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Smart;}{\f178\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Traveller Standard;}{\f179\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess;} {\f180\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Usual;}{\f181\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chess Utrecht;}{\f182\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica1;} {\f183\froman\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica1Mono;}{\f184\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica2;}{\f185\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica2Mono;} {\f186\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica3;}{\f187\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica3Mono;}{\f188\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica4;} {\f189\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica4Mono;}{\f190\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica5;}{\f191\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica5Mono;} {\f192\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica6;}{\f193\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica6Mono;}{\f194\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica7;} {\f195\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mathematica7Mono;}{\f196\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Bookup;}{\f197\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Chessmaster9000;} {\f198\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}FigurineCB AriesSP;}{\f199\fnil\fcharset0\fprq1{\*\panose 00000000000000000000}FigurineCB LetterSP;}{\f200\froman\fcharset0\fprq2{\*\panose 00000000000000000000}FigurineCB TimeSP;} {\f201\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}DiagramTTFritz;}{\f202\fmodern\fcharset2\fprq1{\*\panose 00000000000000000000}FigurineCrrCB;}{\f203\froman\fcharset2\fprq2{\*\panose 00000000000000000000}FigurineTmsCB;} {\f204\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}HE_TERMINAL;}{\f205\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Digiface;}{\f206\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Sydnie;} {\f207\froman\fcharset177\fprq2{\*\panose 00000000000000000000}Times New Roman (Hebrew);}{\f208\froman\fcharset178\fprq2{\*\panose 00000000000000000000}Times New Roman (Arabic);} {\f209\froman\fcharset163\fprq2{\*\panose 00000000000000000000}Times New Roman (Vietnamese);}{\f210\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Arial (Hebrew);}{\f211\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}Arial (Arabic);} {\f212\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Arial (Vietnamese);}{\f213\fmodern\fcharset177\fprq1{\*\panose 00000000000000000000}Courier New (Hebrew);}{\f214\fmodern\fcharset178\fprq1{\*\panose 00000000000000000000}Courier New (Arabic);} {\f215\fmodern\fcharset163\fprq1{\*\panose 00000000000000000000}Courier New (Vietnamese);}{\f216\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Helvetica (Hebrew){\*\falt Arial};} {\f217\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}Helvetica (Arabic){\*\falt Arial};}{\f218\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Helvetica (Vietnamese){\*\falt Arial};} {\f219\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Arial Unicode MS (Hebrew);}{\f220\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}Arial Unicode MS (Arabic);} {\f221\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Arial Unicode MS (Vietnamese);}{\f222\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}Arial Unicode MS (Thai);} {\f223\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Tahoma (Hebrew);}{\f224\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}Tahoma (Arabic);}{\f225\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Tahoma (Vietnamese);} {\f226\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}Tahoma (Thai);}{\f227\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Lucida Sans Unicode (Hebrew);} {\f228\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Verdana (Vietnamese);}{\f229\froman\fcharset163\fprq2{\*\panose 00000000000000000000}Palatino Linotype (Vietnamese);} {\f230\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}Microsoft Sans Serif (Hebrew);}{\f231\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}Microsoft Sans Serif (Arabic);} {\f232\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}Microsoft Sans Serif (Vietnames;}{\f233\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}Microsoft Sans Serif (Thai);} {\f234\fswiss\fcharset177\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS (Hebrew);}{\f235\fswiss\fcharset178\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS (Arabic);} {\f236\fswiss\fcharset163\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS (Vietnamese);}{\f237\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS (Thai);} {\f238\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Haettenschweiler CE;}{\f239\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Haettenschweiler Cyr;} {\f240\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Haettenschweiler Greek;}{\f241\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Haettenschweiler Tur;} {\f242\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Haettenschweiler Baltic;}{\f243\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}CA Chess Cyr;}{\f244\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}CA Chess Tur;} {\f245\fmodern\fcharset238\fprq1{\*\panose 00000000000000000000}HE_TERMINAL CE;}{\f246\fmodern\fcharset204\fprq1{\*\panose 00000000000000000000}HE_TERMINAL Cyr;}{\f247\fmodern\fcharset161\fprq1{\*\panose 00000000000000000000}HE_TERMINAL Greek;} {\f248\fmodern\fcharset162\fprq1{\*\panose 00000000000000000000}HE_TERMINAL Tur;}{\f249\fmodern\fcharset186\fprq1{\*\panose 00000000000000000000}HE_TERMINAL Baltic;}{\f250\fnil\fcharset161\fprq2{\*\panose 00000000000000000000}Sydnie Greek;} {\f251\fmodern\fcharset128\fprq1{\*\panose 00000000000000000000}Gothic{\*\falt ?????};}{\f252\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}News Gothic MT;}{\f253\fscript\fcharset0\fprq2{\*\panose 00000000000000000000}Lucida Handwriting;} {\f254\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Calisto MT;}{\f255\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Abadi MT Condensed Light;}{\f256\fdecor\fcharset0\fprq2{\*\panose 00000000000000000000}Westminster;} {\f257\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}OCR-A II;}{\f258\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}OCR B MT;}{\f259\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}QuickType II;} {\f260\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}QuickType II Condensed;}{\f261\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}QuickType II Mono;}{\f262\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}QuickType II Pi;} {\f263\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Franklin Gothic Medium Cond Gre;}{\f264\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Franklin Gothic Medium Cond Bal;} {\f265\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Franklin Gothic Demi Cond Balti;}{\f266\froman\fcharset238\fprq0{\*\panose 00000000000000000000}?? CE;}{\f267\froman\fcharset162\fprq0{\*\panose 00000000000000000000}?? Tur;} {\f268\fswiss\fcharset0\fprq2{\*\panose 020b0600000000000000}Shogi;}{\f269\fnil\fcharset134\fprq2{\*\panose 00000000000000000000}SimSun-PUA;}{\f270\fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@SimSun-PUA;} {\f271\froman\fcharset222\fprq2{\*\panose 00000000000000000000}AngsanaUPC;}{\f272\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}BrowalliaUPC;}{\f273\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Browallia New;} {\f274\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}CordiaUPC;}{\f275\froman\fcharset222\fprq2{\*\panose 00000000000000000000}DilleniaUPC;}{\f276\froman\fcharset222\fprq2{\*\panose 00000000000000000000}EucrosiaUPC;} {\f277\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}FreesiaUPC;}{\f278\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}IrisUPC;}{\f279\froman\fcharset222\fprq2{\*\panose 00000000000000000000}JasmineUPC;} {\f280\froman\fcharset222\fprq2{\*\panose 00000000000000000000}KodchiangUPC;}{\f281\fswiss\fcharset222\fprq2{\*\panose 00000000000000000000}LilyUPC;}{\f282\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Aharoni;} {\f283\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}David;}{\f284\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}David Transparent;}{\f285\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}FrankRuehl;} {\f286\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Levenim MT;}{\f287\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Miriam;}{\f288\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Miriam Transparent;} {\f289\fmodern\fcharset177\fprq1{\*\panose 00000000000000000000}Miriam Fixed;}{\f290\fmodern\fcharset177\fprq1{\*\panose 00000000000000000000}Fixed Miriam Transparent;}{\f291\fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Narkisim;} {\f292\fmodern\fcharset177\fprq1{\*\panose 00000000000000000000}Rod;}{\f293\fmodern\fcharset177\fprq1{\*\panose 00000000000000000000}Rod Transparent;}{\f294\fnil\fcharset178\fprq2{\*\panose 00000000000000000000}Traditional Arabic;} {\f295\fnil\fcharset178\fprq2{\*\panose 00000000000000000000}Arabic Transparent;}{\f296\fnil\fcharset178\fprq2{\*\panose 00000000000000000000}Andalus;}{\f297\fnil\fcharset178\fprq2{\*\panose 00000000000000000000}Simplified Arabic;} {\f298\fmodern\fcharset178\fprq1{\*\panose 00000000000000000000}Simplified Arabic Fixed;}{\f299\fscript\fcharset0\fprq2{\*\panose 00000000000000000000}Freestyle Script;}{\f300\fscript\fcharset0\fprq2{\*\panose 00000000000000000000}Pristina;} {\f301\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Cambria;}{\f302\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Candara;}{\f303\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Consolas;} {\f304\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Constantia;}{\f305\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Corbel;}{\f306\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Segoe UI;} {\f307\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Calibri CE;}{\f308\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Calibri Cyr;}{\f309\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Calibri Greek;} {\f310\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Calibri Tur;}{\f311\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Calibri Baltic;}{\f312\froman\fcharset238\fprq2{\*\panose 00000000000000000000}Cambria Math CE;} {\f313\froman\fcharset204\fprq2{\*\panose 00000000000000000000}Cambria Math Cyr;}{\f314\froman\fcharset161\fprq2{\*\panose 00000000000000000000}Cambria Math Greek;}{\f315\froman\fcharset162\fprq2{\*\panose 00000000000000000000}Cambria Math Tur;} {\f316\froman\fcharset186\fprq2{\*\panose 00000000000000000000}Cambria Math Baltic;}{\f317\froman\fcharset238\fprq2{\*\panose 00000000000000000000}Century CE;}{\f318\froman\fcharset204\fprq2{\*\panose 00000000000000000000}Century Cyr;} {\f319\froman\fcharset161\fprq2{\*\panose 00000000000000000000}Century Greek;}{\f320\froman\fcharset162\fprq2{\*\panose 00000000000000000000}Century Tur;}{\f321\froman\fcharset186\fprq2{\*\panose 00000000000000000000}Century Baltic;} {\f322\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Arial Unicode MS CE;}{\f323\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Arial Unicode MS Cyr;} {\f324\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Arial Unicode MS Greek;}{\f325\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Arial Unicode MS Tur;} {\f326\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Arial Unicode MS Baltic;}{\f327\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS CE;} {\f328\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS Cyr;}{\f329\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS Greek;} {\f330\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS Tur;}{\f331\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}@Arial Unicode MS Baltic;}{\f332\froman\fcharset238\fprq2{\*\panose 00000000000000000000}Book Antiqua CE;} {\f333\froman\fcharset204\fprq2{\*\panose 00000000000000000000}Book Antiqua Cyr;}{\f334\froman\fcharset161\fprq2{\*\panose 00000000000000000000}Book Antiqua Greek;}{\f335\froman\fcharset162\fprq2{\*\panose 00000000000000000000}Book Antiqua Tur;} {\f336\froman\fcharset186\fprq2{\*\panose 00000000000000000000}Book Antiqua Baltic;}{\f337\fscript\fcharset238\fprq2{\*\panose 00000000000000000000}Monotype Corsiva CE;}{\f338\fscript\fcharset204\fprq2{\*\panose 00000000000000000000}Monotype Corsiva Cyr;} {\f339\fscript\fcharset161\fprq2{\*\panose 00000000000000000000}Monotype Corsiva Greek;}{\f340\fscript\fcharset162\fprq2{\*\panose 00000000000000000000}Monotype Corsiva Tur;} {\f341\fscript\fcharset186\fprq2{\*\panose 00000000000000000000}Monotype Corsiva Baltic;}{\f342\froman\fcharset238\fprq2{\*\panose 00000000000000000000}Cambria CE;}{\f343\froman\fcharset204\fprq2{\*\panose 00000000000000000000}Cambria Cyr;} {\f344\froman\fcharset161\fprq2{\*\panose 00000000000000000000}Cambria Greek;}{\f345\froman\fcharset162\fprq2{\*\panose 00000000000000000000}Cambria Tur;}{\f346\froman\fcharset186\fprq2{\*\panose 00000000000000000000}Cambria Baltic;} {\f347\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Candara CE;}{\f348\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Candara Cyr;}{\f349\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Candara Greek;} {\f350\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Candara Tur;}{\f351\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Candara Baltic;}{\f352\fmodern\fcharset238\fprq1{\*\panose 00000000000000000000}Consolas CE;} {\f353\fmodern\fcharset204\fprq1{\*\panose 00000000000000000000}Consolas Cyr;}{\f354\fmodern\fcharset161\fprq1{\*\panose 00000000000000000000}Consolas Greek;}{\f355\fmodern\fcharset162\fprq1{\*\panose 00000000000000000000}Consolas Tur;} {\f356\fmodern\fcharset186\fprq1{\*\panose 00000000000000000000}Consolas Baltic;}{\f357\froman\fcharset238\fprq2{\*\panose 00000000000000000000}Constantia CE;}{\f358\froman\fcharset204\fprq2{\*\panose 00000000000000000000}Constantia Cyr;} {\f359\froman\fcharset161\fprq2{\*\panose 00000000000000000000}Constantia Greek;}{\f360\froman\fcharset162\fprq2{\*\panose 00000000000000000000}Constantia Tur;}{\f361\froman\fcharset186\fprq2{\*\panose 00000000000000000000}Constantia Baltic;} {\f362\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Corbel CE;}{\f363\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Corbel Cyr;}{\f364\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Corbel Greek;} {\f365\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Corbel Tur;}{\f366\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Corbel Baltic;}{\f367\fswiss\fcharset238\fprq2{\*\panose 00000000000000000000}Segoe UI CE;} {\f368\fswiss\fcharset204\fprq2{\*\panose 00000000000000000000}Segoe UI Cyr;}{\f369\fswiss\fcharset161\fprq2{\*\panose 00000000000000000000}Segoe UI Greek;}{\f370\fswiss\fcharset162\fprq2{\*\panose 00000000000000000000}Segoe UI Tur;} {\f371\fswiss\fcharset186\fprq2{\*\panose 00000000000000000000}Segoe UI Baltic;}{\f372\fnil\fcharset0\fprq2{\*\panose 00000504000000000004}Ultima;}{\f373\froman\fcharset238\fprq2 Times New Roman CE;}{\f374\froman\fcharset204\fprq2 Times New Roman Cyr;} {\f376\froman\fcharset161\fprq2 Times New Roman Greek;}{\f377\froman\fcharset162\fprq2 Times New Roman Tur;}{\f378\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f379\fswiss\fcharset238\fprq2 Arial CE;}{\f380\fswiss\fcharset204\fprq2 Arial Cyr;} {\f382\fswiss\fcharset161\fprq2 Arial Greek;}{\f383\fswiss\fcharset162\fprq2 Arial Tur;}{\f384\fswiss\fcharset186\fprq2 Arial Baltic;}{\f385\fmodern\fcharset238\fprq1 Courier New CE;}{\f386\fmodern\fcharset204\fprq1 Courier New Cyr;} {\f388\fmodern\fcharset161\fprq1 Courier New Greek;}{\f389\fmodern\fcharset162\fprq1 Courier New Tur;}{\f390\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f397\froman\fcharset238\fprq2 Times CE;}{\f398\froman\fcharset204\fprq2 Times Cyr;} {\f400\froman\fcharset161\fprq2 Times Greek;}{\f401\froman\fcharset162\fprq2 Times Tur;}{\f402\froman\fcharset186\fprq2 Times Baltic;}{\f403\fswiss\fcharset238\fprq2 Helvetica CE{\*\falt Arial};} {\f404\fswiss\fcharset204\fprq2 Helvetica Cyr{\*\falt Arial};}{\f406\fswiss\fcharset161\fprq2 Helvetica Greek{\*\falt Arial};}{\f407\fswiss\fcharset162\fprq2 Helvetica Tur{\*\falt Arial};}{\f408\fswiss\fcharset186\fprq2 Helvetica Baltic{\*\falt Arial};} {\f463\fswiss\fcharset238\fprq2 Tahoma CE;}{\f464\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f466\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f467\fswiss\fcharset162\fprq2 Tahoma Tur;}{\f468\fswiss\fcharset186\fprq2 Tahoma Baltic;} {\f471\fnil\fcharset0\fprq2 SimSun;}{\f589\fmodern\fcharset238\fprq1 Lucida Console CE;}{\f590\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f592\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f593\fmodern\fcharset162\fprq1 Lucida Console Tur;} {\f595\fswiss\fcharset238\fprq2 Lucida Sans Unicode CE;}{\f596\fswiss\fcharset204\fprq2 Lucida Sans Unicode Cyr;}{\f598\fswiss\fcharset161\fprq2 Lucida Sans Unicode Greek;}{\f599\fswiss\fcharset162\fprq2 Lucida Sans Unicode Tur;} {\f601\fswiss\fcharset238\fprq2 Verdana CE;}{\f602\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f604\fswiss\fcharset161\fprq2 Verdana Greek;}{\f605\fswiss\fcharset162\fprq2 Verdana Tur;}{\f606\fswiss\fcharset186\fprq2 Verdana Baltic;} {\f607\fswiss\fcharset238\fprq2 Arial Black CE;}{\f608\fswiss\fcharset204\fprq2 Arial Black Cyr;}{\f610\fswiss\fcharset161\fprq2 Arial Black Greek;}{\f611\fswiss\fcharset162\fprq2 Arial Black Tur;}{\f612\fswiss\fcharset186\fprq2 Arial Black Baltic;} {\f613\fscript\fcharset238\fprq2 Comic Sans MS CE;}{\f614\fscript\fcharset204\fprq2 Comic Sans MS Cyr;}{\f616\fscript\fcharset161\fprq2 Comic Sans MS Greek;}{\f617\fscript\fcharset162\fprq2 Comic Sans MS Tur;} {\f618\fscript\fcharset186\fprq2 Comic Sans MS Baltic;}{\f619\fswiss\fcharset238\fprq2 Impact CE;}{\f620\fswiss\fcharset204\fprq2 Impact Cyr;}{\f622\fswiss\fcharset161\fprq2 Impact Greek;}{\f623\fswiss\fcharset162\fprq2 Impact Tur;} {\f624\fswiss\fcharset186\fprq2 Impact Baltic;}{\f625\froman\fcharset238\fprq2 Georgia CE;}{\f626\froman\fcharset204\fprq2 Georgia Cyr;}{\f628\froman\fcharset161\fprq2 Georgia Greek;}{\f629\froman\fcharset162\fprq2 Georgia Tur;} {\f630\froman\fcharset186\fprq2 Georgia Baltic;}{\f631\fswiss\fcharset238\fprq2 Franklin Gothic Medium CE;}{\f632\fswiss\fcharset204\fprq2 Franklin Gothic Medium Cyr;}{\f634\fswiss\fcharset161\fprq2 Franklin Gothic Medium Greek;} {\f635\fswiss\fcharset162\fprq2 Franklin Gothic Medium Tur;}{\f636\fswiss\fcharset186\fprq2 Franklin Gothic Medium Baltic;}{\f637\froman\fcharset238\fprq2 Palatino Linotype CE;}{\f638\froman\fcharset204\fprq2 Palatino Linotype Cyr;} {\f640\froman\fcharset161\fprq2 Palatino Linotype Greek;}{\f641\froman\fcharset162\fprq2 Palatino Linotype Tur;}{\f642\froman\fcharset186\fprq2 Palatino Linotype Baltic;}{\f643\fswiss\fcharset238\fprq2 Trebuchet MS CE;} {\f644\fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f646\fswiss\fcharset161\fprq2 Trebuchet MS Greek;}{\f647\fswiss\fcharset162\fprq2 Trebuchet MS Tur;}{\f648\fswiss\fcharset186\fprq2 Trebuchet MS Baltic;}{\f703\froman\fcharset238\fprq2 Sylfaen CE;} {\f704\froman\fcharset204\fprq2 Sylfaen Cyr;}{\f706\froman\fcharset161\fprq2 Sylfaen Greek;}{\f707\froman\fcharset162\fprq2 Sylfaen Tur;}{\f708\froman\fcharset186\fprq2 Sylfaen Baltic;}{\f709\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;} {\f710\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f712\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f713\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;}{\f714\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} {\f715\fswiss\fcharset238\fprq2 Arial Narrow CE;}{\f716\fswiss\fcharset204\fprq2 Arial Narrow Cyr;}{\f718\fswiss\fcharset161\fprq2 Arial Narrow Greek;}{\f719\fswiss\fcharset162\fprq2 Arial Narrow Tur;}{\f720\fswiss\fcharset186\fprq2 Arial Narrow Baltic;} {\f733\fscript\fcharset238\fprq2 Mistral CE;}{\f734\fscript\fcharset204\fprq2 Mistral Cyr;}{\f736\fscript\fcharset161\fprq2 Mistral Greek;}{\f737\fscript\fcharset162\fprq2 Mistral Tur;}{\f738\fscript\fcharset186\fprq2 Mistral Baltic;} {\f805\fswiss\fcharset238\fprq2 Franklin Gothic Book CE;}{\f806\fswiss\fcharset204\fprq2 Franklin Gothic Book Cyr;}{\f808\fswiss\fcharset161\fprq2 Franklin Gothic Book Greek;}{\f809\fswiss\fcharset162\fprq2 Franklin Gothic Book Tur;} {\f810\fswiss\fcharset186\fprq2 Franklin Gothic Book Baltic;}{\f811\fswiss\fcharset238\fprq2 Franklin Gothic Demi CE;}{\f812\fswiss\fcharset204\fprq2 Franklin Gothic Demi Cyr;}{\f814\fswiss\fcharset161\fprq2 Franklin Gothic Demi Greek;} {\f815\fswiss\fcharset162\fprq2 Franklin Gothic Demi Tur;}{\f816\fswiss\fcharset186\fprq2 Franklin Gothic Demi Baltic;}{\f817\fswiss\fcharset238\fprq2 Franklin Gothic Medium Cond CE;}{\f818\fswiss\fcharset204\fprq2 Franklin Gothic Medium Cond Cyr;} {\f820\fswiss\fcharset161\fprq2 Franklin Gothic Medium Cond Greek;}{\f821\fswiss\fcharset162\fprq2 Franklin Gothic Medium Cond Tur;}{\f822\fswiss\fcharset186\fprq2 Franklin Gothic Medium Cond Baltic;} {\f823\fswiss\fcharset238\fprq2 Franklin Gothic Heavy CE;}{\f824\fswiss\fcharset204\fprq2 Franklin Gothic Heavy Cyr;}{\f826\fswiss\fcharset161\fprq2 Franklin Gothic Heavy Greek;}{\f827\fswiss\fcharset162\fprq2 Franklin Gothic Heavy Tur;} {\f828\fswiss\fcharset186\fprq2 Franklin Gothic Heavy Baltic;}{\f829\fswiss\fcharset238\fprq2 Franklin Gothic Demi Cond CE;}{\f830\fswiss\fcharset204\fprq2 Franklin Gothic Demi Cond Cyr;}{\f832\fswiss\fcharset161\fprq2 Franklin Gothic Demi Cond Greek;} {\f833\fswiss\fcharset162\fprq2 Franklin Gothic Demi Cond Tur;}{\f834\fswiss\fcharset186\fprq2 Franklin Gothic Demi Cond Baltic;}{\f841\fswiss\fcharset238\fprq2 Century Gothic CE;}{\f842\fswiss\fcharset204\fprq2 Century Gothic Cyr;} {\f844\fswiss\fcharset161\fprq2 Century Gothic Greek;}{\f845\fswiss\fcharset162\fprq2 Century Gothic Tur;}{\f846\fswiss\fcharset186\fprq2 Century Gothic Baltic;}{\f937\fswiss\fcharset238\fprq2 MS Reference Sans Serif CE;} {\f938\fswiss\fcharset204\fprq2 MS Reference Sans Serif Cyr;}{\f940\fswiss\fcharset161\fprq2 MS Reference Sans Serif Greek;}{\f941\fswiss\fcharset162\fprq2 MS Reference Sans Serif Tur;}{\f942\fswiss\fcharset186\fprq2 MS Reference Sans Serif Baltic;} {\f961\froman\fcharset238\fprq2 Bookman Old Style CE;}{\f962\froman\fcharset204\fprq2 Bookman Old Style Cyr;}{\f964\froman\fcharset161\fprq2 Bookman Old Style Greek;}{\f965\froman\fcharset162\fprq2 Bookman Old Style Tur;} {\f966\froman\fcharset186\fprq2 Bookman Old Style Baltic;}{\f973\froman\fcharset238\fprq2 Garamond CE;}{\f974\froman\fcharset204\fprq2 Garamond Cyr;}{\f976\froman\fcharset161\fprq2 Garamond Greek;}{\f977\froman\fcharset162\fprq2 Garamond Tur;} {\f978\froman\fcharset186\fprq2 Garamond Baltic;}{\f1013\fnil\fcharset162\fprq2 Superchess Tur;}{\f1029\fmodern\fcharset0\fprq1 MS Mincho;}{\f1027\fmodern\fcharset238\fprq1 MS Mincho CE;}{\f1028\fmodern\fcharset204\fprq1 MS Mincho Cyr;} {\f1030\fmodern\fcharset161\fprq1 MS Mincho Greek;}{\f1031\fmodern\fcharset162\fprq1 MS Mincho Tur;}{\f1032\fmodern\fcharset186\fprq1 MS Mincho Baltic;}{\f1035\fmodern\fcharset0\fprq1 @MS Mincho;}{\f1033\fmodern\fcharset238\fprq1 @MS Mincho CE;} {\f1034\fmodern\fcharset204\fprq1 @MS Mincho Cyr;}{\f1036\fmodern\fcharset161\fprq1 @MS Mincho Greek;}{\f1037\fmodern\fcharset162\fprq1 @MS Mincho Tur;}{\f1038\fmodern\fcharset186\fprq1 @MS Mincho Baltic;}{\f1041\froman\fcharset0\fprq2 MS PMincho;} {\f1039\froman\fcharset238\fprq2 MS PMincho CE;}{\f1040\froman\fcharset204\fprq2 MS PMincho Cyr;}{\f1042\froman\fcharset161\fprq2 MS PMincho Greek;}{\f1043\froman\fcharset162\fprq2 MS PMincho Tur;}{\f1044\froman\fcharset186\fprq2 MS PMincho Baltic;} {\f1047\froman\fcharset0\fprq2 @MS PMincho;}{\f1045\froman\fcharset238\fprq2 @MS PMincho CE;}{\f1046\froman\fcharset204\fprq2 @MS PMincho Cyr;}{\f1048\froman\fcharset161\fprq2 @MS PMincho Greek;}{\f1049\froman\fcharset162\fprq2 @MS PMincho Tur;} {\f1050\froman\fcharset186\fprq2 @MS PMincho Baltic;}{\f1053\fmodern\fcharset0\fprq1 MS Gothic;}{\f1051\fmodern\fcharset238\fprq1 MS Gothic CE;}{\f1052\fmodern\fcharset204\fprq1 MS Gothic Cyr;}{\f1054\fmodern\fcharset161\fprq1 MS Gothic Greek;} {\f1055\fmodern\fcharset162\fprq1 MS Gothic Tur;}{\f1056\fmodern\fcharset186\fprq1 MS Gothic Baltic;}{\f1059\fmodern\fcharset0\fprq1 @MS Gothic;}{\f1057\fmodern\fcharset238\fprq1 @MS Gothic CE;}{\f1058\fmodern\fcharset204\fprq1 @MS Gothic Cyr;} {\f1060\fmodern\fcharset161\fprq1 @MS Gothic Greek;}{\f1061\fmodern\fcharset162\fprq1 @MS Gothic Tur;}{\f1062\fmodern\fcharset186\fprq1 @MS Gothic Baltic;}{\f1065\fswiss\fcharset0\fprq2 MS PGothic;}{\f1063\fswiss\fcharset238\fprq2 MS PGothic CE;} {\f1064\fswiss\fcharset204\fprq2 MS PGothic Cyr;}{\f1066\fswiss\fcharset161\fprq2 MS PGothic Greek;}{\f1067\fswiss\fcharset162\fprq2 MS PGothic Tur;}{\f1068\fswiss\fcharset186\fprq2 MS PGothic Baltic;}{\f1071\fswiss\fcharset0\fprq2 @MS PGothic;} {\f1069\fswiss\fcharset238\fprq2 @MS PGothic CE;}{\f1070\fswiss\fcharset204\fprq2 @MS PGothic Cyr;}{\f1072\fswiss\fcharset161\fprq2 @MS PGothic Greek;}{\f1073\fswiss\fcharset162\fprq2 @MS PGothic Tur;}{\f1074\fswiss\fcharset186\fprq2 @MS PGothic Baltic;} {\f1077\fswiss\fcharset0\fprq2 MS UI Gothic;}{\f1075\fswiss\fcharset238\fprq2 MS UI Gothic CE;}{\f1076\fswiss\fcharset204\fprq2 MS UI Gothic Cyr;}{\f1078\fswiss\fcharset161\fprq2 MS UI Gothic Greek;}{\f1079\fswiss\fcharset162\fprq2 MS UI Gothic Tur;} {\f1080\fswiss\fcharset186\fprq2 MS UI Gothic Baltic;}{\f1083\fswiss\fcharset0\fprq2 @MS UI Gothic;}{\f1081\fswiss\fcharset238\fprq2 @MS UI Gothic CE;}{\f1082\fswiss\fcharset204\fprq2 @MS UI Gothic Cyr;} {\f1084\fswiss\fcharset161\fprq2 @MS UI Gothic Greek;}{\f1085\fswiss\fcharset162\fprq2 @MS UI Gothic Tur;}{\f1086\fswiss\fcharset186\fprq2 @MS UI Gothic Baltic;}{\f1089\fswiss\fcharset0\fprq2 Gulim;}{\f1087\fswiss\fcharset238\fprq2 Gulim CE;} {\f1088\fswiss\fcharset204\fprq2 Gulim Cyr;}{\f1090\fswiss\fcharset161\fprq2 Gulim Greek;}{\f1091\fswiss\fcharset162\fprq2 Gulim Tur;}{\f1092\fswiss\fcharset186\fprq2 Gulim Baltic;}{\f1095\fswiss\fcharset0\fprq2 @Gulim;} {\f1093\fswiss\fcharset238\fprq2 @Gulim CE;}{\f1094\fswiss\fcharset204\fprq2 @Gulim Cyr;}{\f1096\fswiss\fcharset161\fprq2 @Gulim Greek;}{\f1097\fswiss\fcharset162\fprq2 @Gulim Tur;}{\f1098\fswiss\fcharset186\fprq2 @Gulim Baltic;} {\f1101\fmodern\fcharset0\fprq1 GulimChe;}{\f1099\fmodern\fcharset238\fprq1 GulimChe CE;}{\f1100\fmodern\fcharset204\fprq1 GulimChe Cyr;}{\f1102\fmodern\fcharset161\fprq1 GulimChe Greek;}{\f1103\fmodern\fcharset162\fprq1 GulimChe Tur;} {\f1104\fmodern\fcharset186\fprq1 GulimChe Baltic;}{\f1107\fmodern\fcharset0\fprq1 @GulimChe;}{\f1105\fmodern\fcharset238\fprq1 @GulimChe CE;}{\f1106\fmodern\fcharset204\fprq1 @GulimChe Cyr;}{\f1108\fmodern\fcharset161\fprq1 @GulimChe Greek;} {\f1109\fmodern\fcharset162\fprq1 @GulimChe Tur;}{\f1110\fmodern\fcharset186\fprq1 @GulimChe Baltic;}{\f1113\fswiss\fcharset0\fprq2 Dotum;}{\f1111\fswiss\fcharset238\fprq2 Dotum CE;}{\f1112\fswiss\fcharset204\fprq2 Dotum Cyr;} {\f1114\fswiss\fcharset161\fprq2 Dotum Greek;}{\f1115\fswiss\fcharset162\fprq2 Dotum Tur;}{\f1116\fswiss\fcharset186\fprq2 Dotum Baltic;}{\f1119\fswiss\fcharset0\fprq2 @Dotum;}{\f1117\fswiss\fcharset238\fprq2 @Dotum CE;} {\f1118\fswiss\fcharset204\fprq2 @Dotum Cyr;}{\f1120\fswiss\fcharset161\fprq2 @Dotum Greek;}{\f1121\fswiss\fcharset162\fprq2 @Dotum Tur;}{\f1122\fswiss\fcharset186\fprq2 @Dotum Baltic;}{\f1125\fmodern\fcharset0\fprq1 DotumChe;} {\f1123\fmodern\fcharset238\fprq1 DotumChe CE;}{\f1124\fmodern\fcharset204\fprq1 DotumChe Cyr;}{\f1126\fmodern\fcharset161\fprq1 DotumChe Greek;}{\f1127\fmodern\fcharset162\fprq1 DotumChe Tur;}{\f1128\fmodern\fcharset186\fprq1 DotumChe Baltic;} {\f1131\fmodern\fcharset0\fprq1 @DotumChe;}{\f1129\fmodern\fcharset238\fprq1 @DotumChe CE;}{\f1130\fmodern\fcharset204\fprq1 @DotumChe Cyr;}{\f1132\fmodern\fcharset161\fprq1 @DotumChe Greek;}{\f1133\fmodern\fcharset162\fprq1 @DotumChe Tur;} {\f1134\fmodern\fcharset186\fprq1 @DotumChe Baltic;}{\f1137\froman\fcharset0\fprq2 Batang;}{\f1135\froman\fcharset238\fprq2 Batang CE;}{\f1136\froman\fcharset204\fprq2 Batang Cyr;}{\f1138\froman\fcharset161\fprq2 Batang Greek;} {\f1139\froman\fcharset162\fprq2 Batang Tur;}{\f1140\froman\fcharset186\fprq2 Batang Baltic;}{\f1143\froman\fcharset0\fprq2 @Batang;}{\f1141\froman\fcharset238\fprq2 @Batang CE;}{\f1142\froman\fcharset204\fprq2 @Batang Cyr;} {\f1144\froman\fcharset161\fprq2 @Batang Greek;}{\f1145\froman\fcharset162\fprq2 @Batang Tur;}{\f1146\froman\fcharset186\fprq2 @Batang Baltic;}{\f1149\fmodern\fcharset0\fprq1 BatangChe;}{\f1147\fmodern\fcharset238\fprq1 BatangChe CE;} {\f1148\fmodern\fcharset204\fprq1 BatangChe Cyr;}{\f1150\fmodern\fcharset161\fprq1 BatangChe Greek;}{\f1151\fmodern\fcharset162\fprq1 BatangChe Tur;}{\f1152\fmodern\fcharset186\fprq1 BatangChe Baltic;}{\f1155\fmodern\fcharset0\fprq1 @BatangChe;} {\f1153\fmodern\fcharset238\fprq1 @BatangChe CE;}{\f1154\fmodern\fcharset204\fprq1 @BatangChe Cyr;}{\f1156\fmodern\fcharset161\fprq1 @BatangChe Greek;}{\f1157\fmodern\fcharset162\fprq1 @BatangChe Tur;}{\f1158\fmodern\fcharset186\fprq1 @BatangChe Baltic;} {\f1161\froman\fcharset0\fprq2 Gungsuh;}{\f1159\froman\fcharset238\fprq2 Gungsuh CE;}{\f1160\froman\fcharset204\fprq2 Gungsuh Cyr;}{\f1162\froman\fcharset161\fprq2 Gungsuh Greek;}{\f1163\froman\fcharset162\fprq2 Gungsuh Tur;} {\f1164\froman\fcharset186\fprq2 Gungsuh Baltic;}{\f1167\froman\fcharset0\fprq2 @Gungsuh;}{\f1165\froman\fcharset238\fprq2 @Gungsuh CE;}{\f1166\froman\fcharset204\fprq2 @Gungsuh Cyr;}{\f1168\froman\fcharset161\fprq2 @Gungsuh Greek;} {\f1169\froman\fcharset162\fprq2 @Gungsuh Tur;}{\f1170\froman\fcharset186\fprq2 @Gungsuh Baltic;}{\f1173\fmodern\fcharset0\fprq1 GungsuhChe;}{\f1171\fmodern\fcharset238\fprq1 GungsuhChe CE;}{\f1172\fmodern\fcharset204\fprq1 GungsuhChe Cyr;} {\f1174\fmodern\fcharset161\fprq1 GungsuhChe Greek;}{\f1175\fmodern\fcharset162\fprq1 GungsuhChe Tur;}{\f1176\fmodern\fcharset186\fprq1 GungsuhChe Baltic;}{\f1179\fmodern\fcharset0\fprq1 @GungsuhChe;}{\f1177\fmodern\fcharset238\fprq1 @GungsuhChe CE;} {\f1178\fmodern\fcharset204\fprq1 @GungsuhChe Cyr;}{\f1180\fmodern\fcharset161\fprq1 @GungsuhChe Greek;}{\f1181\fmodern\fcharset162\fprq1 @GungsuhChe Tur;}{\f1182\fmodern\fcharset186\fprq1 @GungsuhChe Baltic;}{\f1185\fnil\fcharset0\fprq2 @SimSun;} {\f1191\fmodern\fcharset0\fprq1 NSimSun;}{\f1197\fmodern\fcharset0\fprq1 @NSimSun;}{\f1215\fmodern\fcharset0\fprq1 MingLiU;}{\f1221\fmodern\fcharset0\fprq1 @MingLiU;}{\f1227\froman\fcharset0\fprq2 PMingLiU;}{\f1233\froman\fcharset0\fprq2 @PMingLiU;} {\f1275\fswiss\fcharset0\fprq2 Arial Unicode MS;}{\f1293\fswiss\fcharset0\fprq2 @Arial Unicode MS;}{\f1981\fswiss\fcharset238\fprq2 Shogi CE;}{\f1982\fswiss\fcharset204\fprq2 Shogi Cyr;}{\f1984\fswiss\fcharset161\fprq2 Shogi Greek;} {\f1985\fswiss\fcharset162\fprq2 Shogi Tur;}{\f1986\fswiss\fcharset186\fprq2 Shogi Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; \red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid \snext0 Normal;}{\s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\adjustright \b\f5\cgrid \sbasedon0 \snext26 heading 1;}{\s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\adjustright \b\f5\fs20\cgrid \sbasedon0 \snext0 heading 2;}{\s3\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \sbasedon0 \snext0 heading 3;}{\s4\fi-245\li360\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \f11\fs20\cgrid \sbasedon2 \snext4 heading 4;}{\s5\li120\sb80\sl-240\slmult0\keepn\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid \sbasedon0 \snext0 heading 5;}{\*\cs10 \additive Default Paragraph Font;}{\*\cs15 \additive \f5\fs18\up6\lang1033 \sbasedon10 footnote reference;}{ \s16\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \sbasedon0 \snext0 footnote text;}{\s17\li360\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \sbasedon0 \snext0 Normal Indent;}{\s18\fi-240\li600\sb60\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid \snext18 Jli;}{\s19\li120\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid \snext19 Ex;}{\s20\li120\sb160\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \snext29 Sa1;}{\s21\fi-240\li360\sl-240\slmult0\nowidctlpar\tx360\adjustright \f5\fs20\cgrid \snext22 Lb1;}{\s22\fi-240\li360\sb60\sl-240\slmult0\nowidctlpar\tx360\adjustright \f5\fs20\cgrid \snext22 Lb2;}{\s23\li360\sb60\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid \snext22 Lp1;}{\s24\fi-1800\li1920\sb120\sa40\sl-240\slmult0\nowidctlpar\brdrb\brdrs\brdrw15\brsp20 \brdrbtw\brdrs\brdrw15\brsp20 \tx1920\adjustright \b\f5\fs20\cgrid \snext25 Th;}{ \s25\fi-1800\li1920\sb60\sl-240\slmult0\nowidctlpar\tx1920\adjustright \f5\fs20\cgrid \snext25 Tp;}{\s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \snext0 Normal 2;}{\s27\li120\sb120\sa120\nowidctlpar\adjustright \f5\fs20\cgrid \snext0 bitmap;}{\s28\li120\sb120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \snext29 Sa2;}{\s29\fi-240\li360\sb60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \snext29 Jl;}{\s30\li120\sa60\nowidctlpar\adjustright \f151\fs20\cgrid \snext30 *body;}{\s31\li120\sa60\nowidctlpar\adjustright \b\f151\fs20\cgrid \snext31 *heading;}{\s32\li120\sa60\sl-240\slmult0\nowidctlpar\adjustright \f151\fs20\cgrid \sbasedon30 \snext32 para;}{\s33\fi-280\li400\sa60\nowidctlpar\adjustright \f151\fs20\cgrid \sbasedon30 \snext33 jump;}{\s34\fi-280\li400\sa60\nowidctlpar\tx400\adjustright \f151\fs20\cgrid \sbasedon30 \snext34 list bullet;}{\s35\fi-280\li600\sa60\nowidctlpar\adjustright \f151\fs20\cgrid \sbasedon30 \snext35 jump indent;}{ \s36\li120\sa60\sl-40\slmult0\nowidctlpar\brdrb\brdrs\brdrw15\brsp20 \brdrbtw\brdrs\brdrw15\brsp20 \adjustright \f151\fs20\cgrid \sbasedon30 \snext36 table rule;}{\s37\fi-280\li400\sa60\nowidctlpar\tqr\tx280\tx400\adjustright \f151\fs20\cgrid \sbasedon30 \snext37 list number;}{\s38\li120\sb100\sa60\nowidctlpar\adjustright \b\f151\fs20\cgrid \sbasedon31 \snext33 see also;}{\s39\li400\sa60\nowidctlpar\adjustright \f151\fs20\cgrid \sbasedon30 \snext39 para indent;}{\s40\fi-1800\li1920\nowidctlpar \tx1920\adjustright \b\f151\fs20\cgrid \sbasedon31 \snext36 table head;}{\s41\fi-1800\li1920\sa60\nowidctlpar\tx1920\adjustright \f151\fs20\cgrid \sbasedon30 \snext41 table text;}{\s42\li120\sb120\sa60\nowidctlpar\adjustright \f151\fs20\cgrid \sbasedon30 \snext35 see also 2;}{\s43\li120\sa60\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs20\cgrid \sbasedon30 \snext43 code;}{\s44\sl-120\slmult0\nowidctlpar\adjustright \f152\fs20\cgrid \snext32 *spacing;}{\s45\sl-120\slmult0 \nowidctlpar\adjustright \f152\fs20\cgrid \sbasedon44 \snext45 s6;}{\s46\qj\li360\nowidctlpar\adjustright \f5\cgrid \sbasedon0 \snext46 Help Text;}{\s47\li115\sb120\sa40\sl-240\slmult0\nowidctlpar\brdrb\brdrs\brdrw15\brsp20 \brdrbtw\brdrs\brdrw15\brsp20 \adjustright \f11\fs20\cgrid \sbasedon24 \snext25 Th2;}{\s48\li115\sb120\sa40\sl-240\slmult0\nowidctlpar\brdrb\brdrs\brdrw15\brsp20 \brdrbtw\brdrs\brdrw15\brsp20 \adjustright \b\f11\fs16\cgrid \sbasedon24 \snext25 Th3;}{\s49\li115\sb200\sl-240\slmult0 \nowidctlpar\adjustright \f11\fs20\cgrid \sbasedon0 \snext0 Normal 3;}{\s50\fi-1800\li1915\sb120\sa40\sl-240\slmult0\nowidctlpar\brdrb\brdrs\brdrw15\brsp20 \brdrbtw\brdrs\brdrw15\brsp20 \tx1915\adjustright \b\f11\fs20\cgrid \sbasedon0 \snext51 Thh;}{ \s51\fi-1800\li1915\sb60\sl-240\slmult0\nowidctlpar\tx1915\adjustright \f11\fs20\cgrid \sbasedon0 \snext51 Tph;}{\s52\li288\ri-432\sb80\sl-240\slmult0\nowidctlpar\tx288\tx864\tx1440\adjustright \f5\cgrid \sbasedon0 \snext52 unixman1;}{ \s53\li1440\ri-432\sb80\sa240\sl-240\slmult0\nowidctlpar\tx288\tx864\tx1440\adjustright \f5\cgrid \sbasedon0 \snext53 unixman2;}{\s54\li115\ri-432\sb80\sl-240\slmult0\nowidctlpar\tx288\tx864\tx1440\adjustright \f5\cgrid \sbasedon52 \snext54 unixman0;}{ \s55\li288\ri-432\sb80\sa240\sl-240\slmult0\nowidctlpar\tx288\tx864\tx1440\adjustright \f5\cgrid \sbasedon52 \snext55 unixman1a;}{\s56\li115\sa60\sl-240\slmult0\nowidctlpar\adjustright \b\f5\fs20\cgrid \sbasedon2 \snext56 heading 2a;}{ \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \sbasedon0 \snext57 endnote text;}{\*\cs58 \additive \super \sbasedon10 endnote reference;}{\*\cs59 \additive \ul\cf2 \sbasedon10 Hyperlink;}{\*\cs60 \additive \ul\cf12 \sbasedon10 FollowedHyperlink;}{\s61\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \cbpat9 \f15\fs20\cgrid \sbasedon0 \snext61 Document Map;}{\s62\li480\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid \sbasedon0 \snext62 Body Text 2;}{ \s63\fi-720\li1440\sb80\sl-240\slmult0\nowidctlpar\adjustright \f2\fs20\cgrid \sbasedon0 \snext63 Body Text Indent 2;}{\s64\li120\sb80\sl-240\slmult0\nowidctlpar\tqc\tx4320\tqr\tx8640\adjustright \f5\fs20\cgrid \sbasedon0 \snext64 header;}{ \s65\li120\sb80\sl-240\slmult0\nowidctlpar\tqc\tx4320\tqr\tx8640\adjustright \f5\fs20\cgrid \sbasedon0 \snext65 footer;}{\s66\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cf11\cgrid \sbasedon0 \snext66 Body Text Indent 3;}}{\*\listtable {\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid74976790}{\list\listtemplateid67698703 \listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid349260549}{\list\listtemplateid67698689\listsimple{\listlevel \levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid470094698}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0 \leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid640160996}{\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0 \levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid768165129}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1 \levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid781152802}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0 {\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid903878531}{\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1002394966}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext \'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1021513731}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers \'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1099714113}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360 \jclisttab\tx360 }{\listname ;}\listid1240552867}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1332292840}{\list\listtemplateid67698703\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1358388700} {\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1405952460} {\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid2025940873} {\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid2044863907}} {\*\listoverridetable{\listoverride\listid2025940873\listoverridecount0\ls1}{\listoverride\listid1002394966\listoverridecount0\ls2}{\listoverride\listid470094698\listoverridecount0\ls3}{\listoverride\listid1099714113\listoverridecount0\ls4} {\listoverride\listid1358388700\listoverridecount0\ls5}{\listoverride\listid2044863907\listoverridecount0\ls6}{\listoverride\listid640160996\listoverridecount0\ls7}{\listoverride\listid768165129\listoverridecount0\ls8}{\listoverride\listid903878531 \listoverridecount0\ls9}{\listoverride\listid781152802\listoverridecount0\ls10}{\listoverride\listid1240552867\listoverridecount0\ls11}{\listoverride\listid640160996\listoverridecount0\ls12}{\listoverride\listid349260549\listoverridecount0\ls13} {\listoverride\listid1021513731\listoverridecount0\ls14}{\listoverride\listid1405952460\listoverridecount0\ls15}{\listoverride\listid1332292840\listoverridecount0\ls16}}{\*\revtbl {Unknown;}{Tim Mann;}}{\info{\title + $ # KWinBoard: Chessboard for Windows}{\author TRIO} {\operator hgm}{\creatim\yr2009\mo9\dy9\hr14\min34}{\revtim\yr2011\mo6\dy9\hr9\min6}{\printim\yr1997\mo4\dy22\hr23\min5}{\version34}{\edmins860}{\nofpages90}{\nofwords22792}{\nofchars129918}{\*\company DEC SRC}{\nofcharsws159548}{\vern73}} \margl1417\margr1417\margt1417\margb1417 \widowctrl\endnotes\aendnotes\hyphhotz425\ftnnrlc\aftnnar\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\viewkind4\viewscale100 \fet1{\*\aftnsep \pard\plain \li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\chftnsep \par }}\sectd \linex0\headery709\footery709\colsx709\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4 \pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (} {\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid { \cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Contents}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Contents}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Contents}}}{\i\f1\fs32 WinBoard}{\f1\fs32 : Chessboard for Windows \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \par }\pard\plain \s2\li119\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\f1\cf11 An updated description with the release of version 4.2010xxxx. \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\f1\cf11 \tab \tab \tab \ldblquote For the ultimate WinBoard Experience\rdblquote \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 New features since WinBoard 4.2.7 that are implemented in Allessandro Scotti\rquote s Winboard_x are highlighted in red. }{\f1\cf11 New features in the WinBoard 4.3.xx series by H.G. Muller are highlighted in green}{\f1\cf2 , that in the unified 4.4 series in blue. }{\f1\cf5 Additions for the 4.5 series are in purple}{\f1\cf11 .}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Description}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Description}}}{\f1 Description \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\i\f1 WinBoard}{\f1 is a graphical user interface for chess. It displays a chessboa rd on the screen, accepts moves made with the mouse, and loads and saves game files in standard chess notation. WinBoard serves as a front-end for many different services, including: \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls3\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls3\adjustright \f5\fs20\cgrid {\b\i\f1 Chess engines}{\f1 that run on your PC. You can play a game against an engine, set up arbitrary positions, force variations, or watch a game between two engines. }{\i\f1\cf11 Fairy-Max}{\f1 is supplied with WinBoard }{\f1\cf11 4.3.14}{\f1 , and over 100 other free chess engines are available separately. Of these, Crafty is the most popular. See }{\f1\uldb Installing Chess Engines}{\v\f1 InstallingChessEngines}{\f1 for instructions on installing additional chess engines. \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls3\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls3\adjustright {\b\i\f1 Chess servers}{\b\f1 }{\f1 on the Internet. You can play against other Internet Chess Server (ICS) users, observe games they are playing, review games in the ICS libraries, chat, }{\f1\cf2 analyze observed games with a chess program}{\f1 , and more. WinBoard can also be used to run an automated computer player on the ICS, but this feature is for advanced users only and is subject to some caveats; see the separate file zippy.README for information. \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls3\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls3\adjustright {\b\i\f1 The Web}{\f1 and your own saved games. You can use WinBoard as a helper application to view files in your Web browser or the Explorer. You can use it to keep track of email postal games, browse games off the net, or review games you have saved. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Getting Started}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ GettingStarted}}}{\f1 Getting Started \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBo ard starts up in one of three major modes: chess engine mode, ICS client mode, or game viewer mode. You cannot change between ICS and other modes while WinBoard is running, but you can access all the game viewer features directly from the other two modes. You can switch from game viewer mode to chess engine mode by loading an engine through the Load Engine menu dialog, while WinBoard might make the reverse switch spontaneously if a specified engine is not valid. Also, you can start WinBoard several times t o get multiple chessboard windows running in any combination of modes. \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { You will usually run WinBoard by choosing an item from the Windows Start menu that runs it in the mode you want. If you just double-click on WinBoard.exe, you get a startup dialog asking which mode you want. If you choose chess engine mode, you can then select from the installed engines; if you choose ICS client mode, you can then select from a list of known chess servers. More advanced users can }{\uldb customize}{\v icsNames}{ these lists or type in WinBoard }{\uldb command line options}{\v Options}{ directly. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 After starting WinBoard, you can make }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super K}{\f1 move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 move}}}{\f1 moves in several different ways. To move by dragging, press the left mouse button while the cursor is on one of your pieces, move the cursor to another square, and releas e the button. You can also move by clicking the left mouse button once (press and release) over one of your pieces, moving the cursor to another square, and clicking again. You drop new pieces on the board (when applicable) }{\f1\cf2 by similarly dragging them from the holdings displayed next to the board}{\f1\cf5 . The old way of selecting them from a context menu can still be enabled by an option. In that case,}{\f1 press the right mouse button over a square to bring up the menu; no menu will come up in modes where dropping a new piece is not permitted. }{\f1\cf5 Normally pressing the right mouse button will enable you to see the position at the end of the PV given by an active engine as thinking output. Moving the mouse with the right button kept down will allow you to step through this PV.}{\f1\cf2 }{\f1 You can also make moves by typing them in standard algebraic chess notation. Either a dialog box will pop up for you to type into, or in ICS mode, your typing will be redirected into the ICS interaction window. }{\f1\cf2 In the dialog box you can also type a move number, to call up the position of the current game after that move in the display, or (in Edit Position mode) type a FEN. \par }{\f1 When WinBoard}{\i\f1 }{\f1 is iconized, its }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icon}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icon}}}{\f1 icon is a white knight if it is White's turn to move, a black knight if it is Black's turn. \par }{\f1\cf5 Next to the main window, WinBoard does use many auxiliary windows for dedicated tasks. We mention the Engine-Output window (formerly analysis window) for a better display of the thinking output of engines (which you can then right-click to play out the selected P V in the board window), the Game-History window (where the game is displayed in SAN, and where you can double-click a move to call up the corresponding position in the board window), the Evaluation Graph window (where you see a graph of engine scores vs. m o ve number, and can call up the corresponding position in the board window by clicking a point on the graph), the Comment popup (where you can right-click variation comments to play them out on the main board, or add and edit comments), the Game-List windo w (where you see an overview of all games in a game file you loaded, and can select a game for loading by clicking on it, and limit the list to games you are interested in by filtering). These auxiliary windows can be opened or closed as the need arises. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\f1 Additional Information \par }\pard\plain \s29\fi-240\li360\sb60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\uldb Menus}{\v\f1\uldb Menus}{\f1\uldb \par Shortcut Buttons}{\v\f1\uldb Buttons}{\f1\uldb \par Command Line Options}{\v\f1 Options}{\f1 \par }{\f1\uldb Initialization Files}{\v\f1\uldb Files}{\f1\uldb \par Installing Chess Engines}{\v\f1\uldb InstallingChessEngines}{\f1\uldb \par Firewalls}{\v\f1 Firewalls}{\f1 \par }{\f1\uldb Limitations}{\v\f1 Limitations}{\f1\uldb \par Authors}{\v\f1 Authors}{\f1 \par }{\f1\uldb Copyright}{\v\f1 Copyright}{\f1 \par }{\f1\uldb Frequently Asked Questions}{\v\f1 !ExecFile(FAQ.html)}{\f1 \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Menus}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Menus}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Menus}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 MENUS \par }\pard\plain \s29\fi-240\li360\sb60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\uldb File Menu}{\v\f1 FileMenu}{\f1 \par }{\f1\uldb Edit Menu}{\v\f1 EditMenu}{\f1 \par }{\f1\uldb View Menu}{\v\f1 ViewMenu}{\f1 \par }{\f1\uldb Mode Menu}{\v\f1 ModeMenu}{\f1 \par }{\f1\uldb Action Menu}{\v\f1 ActionMenu}{\f1 \par }{\f1\uldb Engine Menu}{\v\f1 EngineMenu}{\f1 \par }{\f1\uldb Options Menu}{\v\f1 OptionsMenu}{\f1 \par }{\f1\uldb Help Menu}{\v\f1 HelpMenu}{\f1 \par }{\f1\uldb ICS Interaction Context Menu}{\v\f1 ICSInteractionContextMenu}{\f1 \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 File Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 FileMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 File Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs18\up6 }{\f1\fs20 File Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 New Game}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 NewGame}}}{\f1\cf6 New Game (former }{\f1 Reset}{\f1\cf6 ) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Resets WinBoard and the chess engine (if any) to the beginning of a new chess game. In Internet Chess Server mode, clears the current state of WinBoard, then resynchronizes with ICS by sending a }{\b\f1 refresh }{\f1 command. If you want to stop playing, observing, or examining a game on ICS, use an appropriate command from the }{\f1\uldb Action}{\v\f1 ActionMenu}{\f1 menu, not }{\f1\cf6 New Game}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 New Shuffle Game}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 NewShuffleGame}}}{\f1\cf11 New Shuffle Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Brings you to a dialog box where you can enter the number of an opening setup for shuffle variants like FR C, or ask for a random number. After pressing OK, a new game is set up, using this position. The chosen position will continue to be used on every subsequent \ldblquote New Game\rdblquote , }{\f1\cf11 even if you are playing a variant that normally is not shuffled, until you select a new variant through the \ldblquote New Variant\'85\rdblquote menu.}{\f1\cf6 If you enter \ldblquote -1\rdblquote for the position number, new random number is drawn before every game. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf11 The type of shuffling that is done in reaction to a given position number obeys restrictions that depend on the selected va riant. In variants that allow castling, Kings remain on the central files, Rooks in the corners. In games with FRC-style castlings, the King starts between the Rooks, but apart from that they could be anywhere. In games without castling, there are no rest rictions on King and Rook placement. Pairs of color-bound pieces (such as Bishops) will be placed on oppositely colored squares. In ICS mode this feature has no effect, as the ICS determines the starting position. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 New Variant}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 NewVariant}}}{\f1\cf11 New Variant \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Select a new variant. There are controls to enter a board width, board height and holdings size, but normally you leave them at \lquote -1\rquote , which means the default value for the selected variant will be used (e.g. 8x8 for normal Chess, 9x10 for xiangqi, 10x8 for capablanca, holdings for 5 pieces in crazyhouse). You can set a deviating value for each of the three parameters (e.g. to play a crazyhouse version of xiangqi or capablanca you would set the holdings to 6 or 7). If the board width deviates from the default, the game will start with an empty board. \par The variant will remain in force until you select a new one; i.e. subsequent \ldblquote New Game\rdblquote commands will start a new game of the same variant. In ICS mode this command has no effect, as the ICS determines which variant will be played. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Load Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 LoadGame}}}{\f1 Load Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Plays a game from a record file. A popup dialog prompts you for the filename. If the file contains more than one game, a second popup dialog displays a list of games (with information drawn from their PGN tags, if any), and you can select the one you want. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The game file parser will accept PGN (portable game notation), or in fact almost any file that contains moves in algebraic notation. Notation of the form }{\i\f1 P@f7}{ \f1 is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. If the file includes a PGN position (FEN tag), or a WinBoard position diagram bracketed by "[--" and "--]" before the first move, the game starts from that position. Text enclosed in parentheses, square brackets, or curly braces is assumed to be commentary a nd is displayed in a pop-up window. Any other text in the file is ignored. PGN variations (enclosed in parentheses) }{\f1\cf5 appear in the comment popup amongst genuine comments; to walk the variation tree, you have to right-click them in this window. This will cause WinBoard to load them as the current line. You can revert to the previous line with the }{\f1\uldb\cf5 Revert}{ \v\f1\cf5 variant }{\f1\cf5 command. (Beware! Currently WinBoard\rquote s PGN parser is limited to 3 levels of nesting in variations.)}{\f1 The nonstandard PGN tag }{\f2 [Variant "varname"]}{\f1 functions similarly to the }{\f1\uldb variant}{\v\f1 variant }{\f1 command-line option, allowing games in certain chess variants to be loaded. }{\f1\cf5 Note that it has to appear before any FEN tag!}{\f1 There is also a heuristic to recognize chess variants from the }{\f2 Event}{\f1 tag, by looking for the strings that the Internet Chess Servers put there when saving variant ("wild") games. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Load Position}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 LoadPosition}}}{\f1 Load Position \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets up a position from a position file. A popup dialog prompts you for the filename. Position files must be in FEN (Forsythe-Edwards notation), or in the format that the } {\f1\uldb Save Position}{\f1 command writes when }{\f1\uldb oldSaveStyle}{\v\f1 oldSaveStyle}{\f1 is turned on. }{\f1\cf11 Note that many variants require an extension of the original FEN standard. WinBoard tries to be as universal as possible in understanding FENs when different standards a re raound, but has to make a choice when writing them. In FRC is uses Shredder-FEN (Haha castling notation) , but it understands KQkq as the outermost Rook, so it also reads X-FEN. In Crazyhouse / Bughouse it appends the holdings immediately behind the bo a rd info between brackets [], but on input it also understands bFEN (which puts it behind a slash / as if it were an extra board rank). It uses a tilde ~ behind a piece to indicate it is really a promoted Pawn (like bFEN). In Shogi the holdings are printed like in Crazyhouse, but promoted pieces are represented by a plus sign + before the letter of the original piece. Letters used for the pieces can be set with the /pieceToCharTable command-line option.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Save Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SaveGame}}}{\f1 Save Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Appends a record of the current game to a file. A popup dialog prompts you for the filename. If the game did not begin with the standard starting position, the game file includes the starting position used. Game files are saved in the PGN (portable game notation) format, unless the }{\f1\uldb oldSaveStyle}{\v\f1 oldSaveStyle}{\f1 option is True, in which case they are saved in an older format that is specific to WinBoard}{\i\f1 .}{\f1 Both formats are human-readable, and both can be read back by the Load Game command. Notation of the form }{ \i\f1 P@f7}{\f1 is generated for piece-drops in bughouse games; this is a nonstandard extension to PGN. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Save Position}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SavePosition}}}{\f1 Save Position \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Appends a diagram of the current position to a file. A popup dialog prompts you for the filename. Positions are saved in FEN (Forsythe-Edwards notation) format, unless the }{\f1\uldb oldSaveStyle}{\v\f1 oldSaveStyle}{\f1 option is True, in which case they are saved in an older, human-readable format that is specific to WinBoard}{\i\f1 .}{\f1 Both formats can be read back by the Load Position command; however, currently Load Position can load only the first position in a file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Save Diagram}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 Save Diagram}}}{\f1\cf11 Save Diagram \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Writes the current board display as a bitmap file. With this command you can use WinBoard as a diagram generator. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Exit}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Exit}}}{\f1 Exit \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Exits from WinBoard. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\f1\super K} {\f1 Edit Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Edit Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Edit Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Copy Ga me To Clipboard}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 CopyGameToClipboard}}}{\f1 Copy Game To Clipboard \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {Copies the record of the current game to the Windows clipboard in PGN (portable game notation) format. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Copy Position Clipboard}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 CopyPositionToClipboard}}}{\f1 Copy Position To Clipboard \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Places a diagram of the current position (in Forsythe-Edwards notation) into the Windows clipboard. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Paste Game From Clipboard}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PasteGameFromClipboard}}}{\f1 Paste Game From Clipboard \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {Plays a game from the Windows clipboard.}{\f1 See }{\f1\uldb Load Game}{\v\f1 LoadGame}{\f1 for a discussion of game file format and parser behavior.}{ \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Paste Position Clipboard}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PastePositionFromClipboard}}}{\f1 Paste Position From Clipboard \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets up a position from the Windows clipboard. Position must be in FEN (Forsythe-Edwards notation). Puts WinBoard into }{\f1\uldb Edit Game}{\v\f1 EditGame}{\f1 mode if it was not there already. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditGame}}}{\f1 Edit Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Allows you to make moves for both Black and White, and to change moves after backing up with the }{\f1\uldb Backward}{\v\f1 Backward}{\f1 command. The clocks do not run, but you can adjust their reading by clicking on them. A left-click subtracts one minute, a right-click adds one minute. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In chess engine mode, the chess engine continues to check moves for legality but does not participate in the game. You can bring the chess engine back into the game by selecting }{\f1\uldb Machine White}{\v\f1 MachineWhite}{\f1 , }{\f1\uldb Machine Black} {\v\f1 MachineBlack}{\f1 , or }{\f1\uldb Two Machines}{\v\f1 TwoMachines}{\f1 . \par In ICS mode, the moves are not sent to the ICS: Edit Game takes WinBoard out of ICS Client mode and lets you edit games locally. If you want to edit a game on ICS in a way that other ICS users can see, use the ICS }{\b\f1 examine}{\f1 command or start an ICS match against yourself. \par }{\f1\cf5 If you edit an existing game locally by playing new moves while not at the end, you will create a new variation. (New moves at the end will simply be appended to the existing game.) WinBoard will then shelve the original variation (\lquote main line\rquote ) from beyond the point where you played a new move. You can later revert to that new line with the }{\f1\uldb\cf5 Revert}{\f1\cf5 or }{\f1\uldb\cf5 Annotate}{\f1\cf5 commands. This will discard the variation you just entered, and restores the moves of the ori ginal main line that you overwrote. This procedure can be applied recursively, so you an make (sub-)variations on variations. Rather than entering variations move by move, you can also recall them from PGN variations in the Comment window, by right-clicki ng those. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Position}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditPosition}}}{\f1 Edit Position \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you set up an arbitrary board position. Use the left mouse button to drag pieces to new squares, or to delete a piece by dragging it off the board or dragging an empty square on top of it. To drop a new piece on a square, pre ss the right mouse button over the square. This brings up a menu of pieces. Additional menu choices let you empty the square or clear the board. You can set the side to play next by clicking on the White or Black indicator at the top of the screen. }{ \f1\cf11 The pop-up menu also contains options to \lquote promote\rquote or \lquote demote\rquote the piece currently in the square. (In variants like Crazyhouse a piece has a different representation when it is a promoted Pawn rater than an original piece.) This allows you to create some of the n ot-so-common pieces (e.g. a Unicorn is a promoted King, a Commoner is a demoted King).}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Selecting Edit Position causes WinBoard}{\i\f1 }{\f1 to discard all remembered moves in the current game. \par In ICS mode, change made to the position by Edit Position are not sent to th e ICS: Edit Position takes WinBoard out of ICS Client mode and lets you edit positions locally. If you want to edit positions on ICS in a way that other ICS users can see, use the ICS }{\b\f1 examine}{\f1 command, or start an ICS match against yourself. (See also }{\f1\uldb ICS Client}{\v\f1 ICSClient}{\f1 above.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Tags} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditTags}}}{\f1 Edit Tags \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you edit the PGN (portable game notation) tags for the current game. After editing, the tags must still conform to the PGN tag syntax: \par }\pard\plain \s43\li520\sa60\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs20\cgrid {\f2 \line ::= \line \line ::= [ ]\line ::= \line ::= \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 See the PGN Standard for full details. Here is an example: \par }\pard\plain \s43\li520\sa60\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs20\cgrid {\f2 \line [Event "Portoroz Interzonal"]\line [Site "Portoroz, Yugoslavia"]\line [Date "1958.08.16"]\line [Round "8"]\line [White "Rob ert J. Fischer"]\line [Black "Bent Larsen"]\line [Result "1-0"] \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Any characters that do not match this syntax are silently ignored. Note that the PGN standard requires all games to have at least the seven tags shown above. Any that you omit will be filled in by WinBoard with }{\f2 "?"}{\f1 (unknown value) or }{\f2 "-" }{\f1 (inapplicable value). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Comment}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditComment}}}{\f1 Edit Comment \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Adds or modifies a comment on the current position. Comments are saved by }{\f1\uldb Save Game}{\v\f1 SaveGame}{\f1 and are displayed by }{\f1\uldb Load Game}{\v\f1 LoadGame}{\f1 , }{\f1\uldb Forward}{\v\f1 Forward}{\f1 , and }{\f1\uldb Backward}{\v\f1 Backward}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Bookt }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditBook}}}{\f1 Edit Book \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Pops up a window listing the moves available in the GUI book (specified in the }{\f1\uldb Common Engine Settings}{\f1 dialog) from the currently displayed position, together with their weights and (optionally in braces) learn info. You can then edit this list, e.g. changing the weights or}{\v\f1 Backward}{\f1 learn info, delete a move (by deleting the line it is on), or even add moves by adding a line. (But be very careful to use the correct format and make sure the move is legal. Invalid lines will result in undefined behavior, which can include loss of all moves listed below it!) On pressing OK the modified info will be written back to the book, replacing the original book contents for that position. Note that the listed percentages are neither used nor updated when you change weigh ts; they are just there to aid interpretation of the weights originally in the book. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Enter Username}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 EnterUsername}}}{\f1\cf11 Enter Username \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf11 Allows you to type the name of the human player, which will appear in the PGN header and in the window title. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Revert}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Revert}}}{\f1 Revert \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you are examining a game on the ICS, issues the ICS command }{\b\f1 revert}{\f1 . }{\f1\cf2 In local mode, it reverts to the previous line that was loaded in WinBoard, before you started entering a variation on it in }{\f1\uldb\cf2 Edit Game}{\v\f1\cf2 EditGame}{\f1\cf2 or }{\f1\uldb\cf2 Analyze}{\v\f1\cf2 EditGame}{\f1\cf2 mode. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Annotate}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 Annotate}}}{\f1\cf5 Annotate \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Similar to the }{\f1\uldb\cf5 Revert}{\f1\cf5 command, but in l ocal mode it will add the variation you are abandoning as a comment to the move where it first deviated, in PGN variation format (i.e. in parentheses). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Truncate Game}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TruncateGame}}}{\f1 Truncate Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Discards all remembered moves of the game beyond the current position. Puts WinBoard into }{\f1\uldb Edit Game}{\v\f1 EditGame}{\f1 mode if it was not there already. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Backward}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Backward}}}{\f1 Backward \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Steps backward through a series of remembered moves. The }{\b\f1 <}{\f1 button is equivalent to selecting Backward}{\f1\cf2 , as is turning the mouse wheel towards you}{ \f1 . In most modes, Backward only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on the ICS, or loading a game. If you select Backward in any of these situations, you will not be allowed to make a d ifferent move. Use }{\f1\uldb Retract Move}{\v\f1 RetractMove}{\f1 or }{\f1\uldb Edit Game}{\v\f1 EditGame}{\f1 if you want to change past moves. \par If you are examining a game on the ICS, the behavior of Backward depends on whether WinBoard}{\i\f1 }{\f1 is in }{\f1\uldb Pause}{\v\f1 Pause}{\f1 mode. If Pause mode is off, Backward issues the ICS command}{\b\f1 backward}{\f1 , which backs up everyone's view of the game and allows you to make a different move. If Pause mode is on, Backward only backs up your local view. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Forward}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Forward}}}{\f1 Forward \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Steps forward through a series of remembered moves (undoing the effect of }{\f1\uldb Backward}{\v\f1\uldb Backward}{\f1 ) or through a game file. The }{\b\f1 >}{\f1 button is equivalent}{\f1\cf2 , as is turning the mouse wheel away from you}{\f1 . \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you are examining a game on the ICS, the behavior of Forward depends on whether WinBoard}{\i\f1 }{\f1 is in }{\f1\uldb Pause}{\v\f1 Pause}{\f1 mode. If Pause mode is off, Forward issues the ICS command}{\b\f1 forward}{\f1 , which moves everyone's view of the game forward along the current line. If Pause mode is on, Forward only moves your local view forward, and it will not go past the position the game was in when you paused. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Back to Start}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 BacktoStart}}}{\f1 Back to Start \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Jumps backward to the first remembered position in the game. The }{\b\f1 << }{\f1 button is equivalent. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In most modes, Back to Start only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing o r observing a game on the ICS, or loading a game. If you select Back to Start in any of these situations, you will not be allowed to make a different move. Use }{\f1\uldb Retract Move}{\v\f1 RetractMove}{\f1 or }{\f1\uldb Edit Game}{\v\f1 EditGame}{\f1 if you want to change past moves; or use }{\f1\uldb New Game}{\v\f1 NewGame}{\f1 to start a new game. \par If you are examining a game on the ICS, the behavior of Back to Start depends on whether WinBoard}{\i\f1 }{\f1 is in }{\f1\uldb Pause}{\v\f1 Pause}{\f1 mode. If Pause mode is off, Backward issues the ICS command }{\b\f1 backward 999999}{\f1 , which backs up everyone's view of the game to the start and allows you to make different moves. If Pause mode is on, Back to Start only backs up your local view. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Forwa rd to End}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ForwardtoEnd}}}{\f1 Forward to End \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Jumps forward to the last position in the game. The }{\b\f1 >>}{\f1 button is equivalent. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you are examining a game on the ICS, the behavior of Forward to End depends on whether WinBoard}{\i\f1 }{\f1 is in }{\f1\uldb Pause}{\v\f1 Pause}{\f1 mode. If Pause mode is off, Forward to End issues the ICS command }{\b\f1 forward 999999}{\f1 , which moves everyone's view of the game forward to the end of the current line. If Pause mode is on, Forward to End only moves your local view forward, and it will not go past the position the game was in when you paused. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\f1\super K} {\f1 View Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ViewMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 View Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 View Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Flip View} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 FlipView}}}{\f1 }{\f1\ul Flip View}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Inverts your view of the chessboard. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you are playing a game on the ICS, the board is always orie nted at the start of the game so that your pawns move from the bottom of the window towards the top. Otherwise, the starting position is determined by the }{\f1\uldb flipView}{\v\f1 flipViewOption}{\f1 command line option. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\ul\cf11 Swap Clocks}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\ul\cf11 SwapClocks}}}{\f1\cf11 }{\f1\ul\cf11 Swap Clocks}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Interchanges the position of the white and black clocks on the screen. Intended for manually-operated computer-computer games, where the monitor is standing to the side of the playing board, to make sure that the operator sees the time of his own machine on his side of the table. Note that it is possible to adjust the clocks in steps of one minute, by left- (decrement) or right-clicking (increment) it with the mouse in \ldblquote Edit Game\rdblquote mode. (Clicking the clocks in other modes is interpreted as claiming the flag.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Show Engine Output}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Show Engine Output}}}{\f1\cf6 Show Engine Output \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf6 Open a new window dedicated to showing the thinking output of the engine(s), as controlled by \ldblquote Show Thinking\rdblquote . }{\cf11 In ICS mode kibitzed info of an opponent engine can appear here as well, under control of the /autoKibitz option. }{\cf5 Right-clicking a line of thinking output will al low you to step through the PV it contains on the main board, by vertically moving the mouse, keeping the right-button pressed. \par WinBoard will display lines of thinking output of the same depth ordered by score, (highest score on top), rather than in the or der the engine produced them. Usually this amounts to the same, as a normal engine search will only find new PV (and emit it as thinking output) when it searches a move with a higher score than the previous variation. But when the engine is in multi-varia t ion mode this needs not always be true, and it is more convenient for someone analyzing games to see the moves sorted by score. The order in which the engine found them is only of interest o the engine author, and can still be deduced from the time or nod e count printed with the line.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Show Move History}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Show Move History}}}{\f1\cf6 Show Move History \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf6 Open a new window dedicated to showing the game currently in progress. Double-clicking on a move selects the corresponding position in the board display. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Show Evaluation Graph}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Show Evaluation Graph}}}{\f1\cf6 Show Evaluation Graph \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf6 Open a new window dedicated to displaying a graph, representing the development of the engine score(s) from the current game over time. (Needs \ldblquote show Thinking \rdblquote to be enabled in order to work). Clicking a point on the graph selects the corresponding position in the board display. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Show Ga me List}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ShowGameList}}}{\f1 Show Game List \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Shows or hides the list of games generated by the last }{\f1\uldb Load Game}{\v\f1 LoadGame}{\f1 command. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 Open Chat Window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 Open Chat Window}}}{\f1\cf2 Open Chat Window \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf2 Open a new window that in ICS mode can be used to display messages received from ICS tell commands from a specified ICS handle, from a chan nel (when you set the handle to the channel number), }{\cf5 shouts / c-shouts,}{\cf2 or whispers }{\cf5 / kibitzes}{\cf2 from co-observers of a game (when you set the handle to }{\cf5 \ldblquote \rdblquote shouts, \ldblquote c-shouts\rdblquote , \ldblquote whisper\rdblquote or \ldblquote kibitzes\rdblquote }{\cf2 ). You have to press the \ldblquote Change\rdblquote button in the chat window to activate the entered handle}{\cf5 , or type }{\cf2 . Typing into the bottom field of the window will send tell messages to the handle or channel, or whispers to co-observers. You can open up to }{\cf5 five}{\cf2 chat windows. Messages that are diverted to such a chat windo w will not appear in the ICS interaction window. }{\cf5 A window dedicated to shouts will also capture c-shouts (if there is no dedicated c-shout box) and \lquote It\rquote messages, recognizable on the type of brackets used around the shouter name ( [ ], ( ) or < >, respectively).}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Type In Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TypeInMove}}}{\f1 Type In Move \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Pops up a dialog box, into which you can type moves in standard algebraic chess notation. (You can also get this dialog box by simply starting to type over the chessboard, except in ICS mode, where such typing is redirected into the ICS interaction window.) }{\f1\cf5 Typing a number will have the same effect as stepping forward or backward to the position after that move. In Edit Position mode you can also type a FEN to set up the position.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tags}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Tags}}}{\f1 Tags \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Shows a window with PGN tags of the current game. Currently a duplicate of Edit Tags in the edit menu. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Comments}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Comments}}}{\f1 Comments \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Shows a window with Comments to the current move. Currently a duplicate of Edit Comment in the Edit menu. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Game List Tags}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 GameListTags}}}{\f1 }{\f1\ul Game List Tags}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you select which information is displayed in the Game List window. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\ul\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Board Options} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ BoardOptions}}}{\f1\ul Board \par }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Board Size}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 BoardSizeCmd}}}{\f1 Board Size \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Determines how large the board will be and what fonts and piece bitmaps will be used. On a Titanic board the piece bitmaps are 129x129 pixels, on Colossal 116x116, Giant 108x108, Huge 95x95, Big 87x87, Large 80x80, Bulky 72x7 2, Medium 64x64, Moderate 58x58, Average 54x54, Middling 49x49, Mediocre 45x45, Small 40x40, Slim 37x37, Petite 33x33, Dinky 29x29, Teeny 25x25, and Tiny 21x21. The smaller boards have no system menu, but you can minimize or close them from the File menu. \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 You can also change the board size by dragging the window edges or corners with the mouse. The board will snap to the largest size that fits into the area you outline. \par }{\cf11 Note that only sizes Bulky, Middling and to a lesser extent Petite have built-in bitmaps for the non-FIDE- pieces. Archbishop, Chancellor and the wildcard Lance exist in all sizes from Petite to Bulky, though. In size Moderate, variant shogi uses the traditional Japanese piece representation.}{\f1\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Board Colors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 BoardColors}}}{\f1 Board Colors \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the colors WinBoard is using to draw the board and pieces. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 All White}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 AllWhite}}}{\f1\cf11 All White \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Uses the representation of the white pieces (a filled-in black outline) also for the black pieces (where you can fill them with another color to distinguish them). If you do not choose a very dark color for the black pieces, they look very ugly without outline, and using this option can fix that. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Flip Black}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 FlipBlack}}}{\f1\cf11 Flip Black \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Displays the black pieces upside down (or the white pieces in \ldblquote Flip View\rdblquote ). This is useful in Shogi, when you want to use the traditional Japanese representation of the pieces. \par }\pard\plain \s5\li115\sb80\sl-240\slmult0\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid {\b \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Fonts}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Fonts}}}{\f1 }{\f1\ul Fonts}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the fonts WinBoard is using. The clock font, message font and coordinates font are specific to each board size. The tags font, comments font and ICS Interaction font are not dependent on the current size of the board. The \ldblquote Revert to Defaults\rdblquote button will reset the clock font, message font and coordinates font for the current board size, and will set the tags font, message font and Ics Interaction font for all board sizes. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\f1\super K} {\f1 Mode Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ModeMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Mode Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Mode Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Machine White}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 MachineWhite}}}{\f1 Machine White \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Forces the chess engine to play white. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Machine Black}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 MachineBlack}}}{\f1 Machine Black \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Forces the chess engine to play black. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Two Machines}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TwoMachines}}}{\f1 Two Machines \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Starts a game between two chess engines. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Machine Both}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 Machine Both}}}{\f1\cf11 Machine Both \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 A single chess engine plays itself. Mainly useful for pseudo-engines, that are in fact communication links to another machine, where you want to observe a game that is being played. (E.g. the gothic-chess.com server). This command is not implemented yet (version 4.3.14). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Analysis Mode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AnalysisMode}}}{\f1 Analysis Mode \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In this mode, you can make moves for both sides on the board. After each move, the chess engine will think about possible replies and display its analysis in a separate window. Some engines allow you to request not merely the score and continuation for the best move, but for several moves (\lquote multi-PV\rquote ). With such engines the number of moves that is displayed can be altered by right-clicking on the words \lquote fewer\rquote or \lquote more\rquote displayed above the engine output. Crafty was the first engine to support analysis, but by now there are many others that support it as well. }{\f1\cf5 With respect to playing variations, the same holds as in }{\f1\uldb\cf5 Edit Game}{\f1\cf5 mode.}{ \f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf2 From WinBoard 4.4 on this function can also be invoked in \lquote zippy mode\rquote , i.e. when you are logged on to an ICS with an engine loaded. In that case it is not your own moves that t he engine analyzes, but the moves that are played in a game on the ICS that you are observing. You must start observing before you start the analysis mode! See the file zippy.README for how to connect to an ICS and a chess engine running on your local com puter at the same time. (Basically this amounts to adding the /zp command-line option in addition to all options you would need for connecting to the ICS, as well as those needed for running the chess engine.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Analyze File}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AnalyzeFile}}}{\f1 Analyze File \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In this mode, you can load a ga me from a file, and the chess engine will analyze each move as in Analysis Mode. Crafty was the first engine to support this feature, but by now there are many others that support it as well. }{\f1\cf5 From WinBoard 4.5.0 on the operation of this feature has been sl ightly changed: after loading the file, WinBoard will auto-play the moves while the engine is analyzing, and store the results of the analysis. In particular, it captures the score and depth of the last analysis line for every position (so it will appear as comment in the PGN file when you save the game), and add the PV as a comment on PGN variation format. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditGameMode}}}{\f1 Edit Game \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Duplicate of the item in the Edit menu. Note that Edit Gama is WinBoard\rquote s idle mode, and can be used to switch off other, active modes. (E. g. it it can be used to leave AnalysisMode, stop a game between Two Machines, or leave Edit Position.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Edit Position}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EditPositionMode}}}{\f1 Edit Position \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Duplicate of the item in the Edit menu. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Training}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Training}}}{\f1 Training \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {Training mode lets you interactively guess the moves of a game for one of the player s. While in Training mode, the navigation buttons are disabled. You guess the next move of the game by playing the move on the board (or using the }{\uldb Type In Move}{\v\uldb TypeInMove}{ command). If the move played matches the next move of the game, the move is accepted and the opponent\rquote s response is autoplayed. If the move played is incorrect, an error message is displayed. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ICS Client }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ICSClient}}}{\f1 ICS Client \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This is the normal mode when WinBoard is connected to a chess server. If you have moved into Edit Game or Edit Position mode, you can select this option to get out. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 When you run WinBoard in ICS mode, it starts up a console window in which you can type commands and receive text responses from the chess server. You can use the standard Windows editing keys to edit your command line before pressing Enter. The console window keeps a history of the last few commands you typed. Press the up-arrow key to go back to a previous command; press the down-arrow key to go forward again to a later command. Press the right mouse button in the output are a for a }{\f1\uldb context menu}{\v\f1 ICSInteractionContextMenu}{\f1 of editing commands and ICS command shortcuts. \par Some useful ICS commands include }{\b\f1 who}{\f1 to see who is logged on, }{\b\f1 games}{\f1 to see what games are being played, }{\b\f1 match}{\f1 to challenge another player to a game, }{\b\f1 observe}{\f1 to observe an ongoing game, }{\b\f1 examine}{\f1 or }{\b\f1 smoves}{\f1 to review a recently completed game, and of course }{\b\f1 help}{\f1 . \par Whenever you ask to observe an ongoing game, review a completed game, or resume an adjourned game, WinBoard retrieves and parses the list of past moves from the ICS, so you can review them with }{\f1\uldb Forward}{\v\f1 Forward}{\f1 and }{\f1\uldb Backward}{\v\f1 Backward}{\f1 or save them with }{\f1\uldb Save Game}{\v\f1 SaveGame}{\f1 . \par }{\f1\cf5 In ICS mode a graph of players seeking games can be displayed in stead of the chess board, when you are idle (i.e. not playing, observing or examini ng). When this feature is enabled, left-clicking in the board area will switch between board and the seek graph. For details on this, see the }{\f1\uldb\cf5 Seek Graph}{\f1\cf5 command. \par }{\f1 Some special ICS Client features are activated when you are in }{\b\f1 examine}{\f1 or }{\b\f1 bsetup }{\f1 mode on ICS. See the descriptions of the menu commands }{\f1\uldb Forward}{\v\f1 Forward}{\f1 , }{\f1\uldb Backward}{\v\f1 Backward}{\f1 , } {\f1\uldb Pause}{\v\f1 Pause}{\f1 , and }{\f1\uldb Stop Examining}{\v\f1 StopExamining}{\f1 below. You can also issue the ICS position-editing commands with the mouse. Move pieces by dragging with the left mouse button, or by le ft-clicking once on the starting square and once on the ending square. Press the right mouse button over a square for a context menu that lets you drop a new piece, empty the square, or clear the board. Click on the White or Black clock to set the side to play. You cannot set the side to play or drag pieces to arbitrary squares while examining on ICC, but you can do so in bsetup mode on FICS. You can also make moves by typing them into the ICS window; you may have to do this occasionally if you are playing a chess variant whose rules WinBoard does not understand. }{\f1\cf5 (But this list is getting shorter, and Fischer Random is not on it anymore; you can enter castling there with the mouse by dragging the King on top of the Rook.)}{\f1 \par If you are playing a bughouse game on the ICS, a list of the offboard pieces that each player holds is shown in the window title bar, }{\f1\cf2 and graphically in the holdings area next to the board.}{\f1 To drop an offboard piece, }{\f1\cf2 drag it from the holdings to the board.}{\f1 }{\f1\cf5 (Pressing the right mouse button over an empty square to bring up a context menu will still work if you have set the /dropMenu option.)}{\f1 To observe your partner's games, start a second copy of WinBoard, log in as a guest, and use the ICS }{\b\f1 follow}{\f1 or }{\b\f1 pfollow}{\f1 command in the new window. }{\f1\cf5 You can also use the }{\f1\uldb\cf5 Background Observe}{\f1\cf5 or } {\f1\uldb\cf5 Dual Board}{\f1\cf5 features to follow your partner\rquote s game through a single connection on which you are also playing yourself, in the background (peeking at it by pressing the right mouse button), or on side-by-side boards in the board window.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Machine Match}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 MachineMatch}}}{\f1\cf5 Machines Match \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Starts or stops a match between two chess engines. The number of games in the match will be taken from the \ldblquote default match games\rdblquote setting in the Options-> Common Engine dialog. When a match is already running, clicking this menu item will cause it to stop after the current game finishes. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Machine Match}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 MachineMatch}}}{\f1 Machine Match \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Starts or stops a match between two chess programs. The number of games will be taken from the}{\f1\cf1 }{\f1\uldb\cf1 defaultMatchGames}{\f1\cf1 }{\f1 option, which is settable through the }{\f1\uldb\cf1 Common Engine Settings}{\f1 m enu dialog. When a match was already in progress, using this menu item will cause it to stop after the current game finishes. When a tournament file was specified, the match will be run as a tournament with the parameters taken from that file, and the tou rnament file will remain valid after stopping, so that you can resume the tournament using this item. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Pause}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Pause}}}{\f1 Pause \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Pauses updates to the board, and if you are playing against a local chess engine, also pauses your clock. To continue, select Pause again, and the display will au tomatically update to the latest position. The }{\b\f1 P}{\f1 (or }{\b\f1 C}{\f1 ) button is equivalent to selecting Pause. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you select Pause when you are playing{\*\bkmkstart WHATSelSavT}{\*\bkmkend WHATSelSavT} {\*\bkmkstart fWHATtopic}against{\*\bkmkend fWHATtopic} a chess engine and it is not your move, the chess engine\rquote s clock will continue to run and it will eventually m ake a move, at which point both clocks will stop. Since board updates are paused, however, you will not see the move until you exit from Pause mode (or select }{\f1\uldb Forward}{\v\f1 Forward}{\f1 ). This behavior is meant to simulate adjournment with a sealed move. \par If you select Pause while you are in }{\b\f1 examine}{\f1 mode on ICS, you can step backward and forward in the current history of the examined game without affecting the other examiners or observers. Select Pause again to reconnect yourself to the current state of the game on ICS. \par If you select Pause while you are loading a game, the game stops loading. You can load more moves one at a time by selecting }{\f1\uldb Forward}{\v\f1 Forward}{\f1 , or resume automatic loading by selecting Pause again. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Action Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ActionMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Action Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Action Menu \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Most of these commands are available in chess server mode only. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Accept}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Accept}}}{\f1 Accept \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Accepts a pending match offer. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Decline}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Decline}}}{\f1 Decline \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Declines a pending offer (match, draw, etc.). If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Rematch}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Rematch}}}{\f1 Rematch \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Issues the ICS }{\b\f1 rematch}{\f1 command, which asks for another game against your last opponent with the same time control and rule set. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Call Flag} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 CallFlag}}}{\f1 Call Flag \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Calls your opponent's flag, claiming a win on time, or claiming a draw if you are both out of time. You can also call your opponent's flag by clicking on his clock. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Draw}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Draw}}}{\f1 Draw \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Offers a draw to your opponent, accepts a pending draw offer from your opponent, or claims a draw by repetition or the 50-move rule, as appropriate. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Adjourn}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Adjourn}}}{\f1 Adjourn \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Asks your opponent to agree to adjourning the current game, or agrees to a pending adjournment offer from your opponent. You continue an adjourned ICS game by challengin g the same player again with the ICS }{\b\f1 match}{\f1 command. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Abort}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Abort}}}{\f1 Abort \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Asks your opponent to agree to abort the current game, or agrees to a pending abort offer from your opponent. An aborted ICS game ends immediately without affecting either player's rating. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Resign}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Resign}}}{\f1 Resign \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Resigns the game to your opponent. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Stop Observing}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 StopObserving}}}{\f1 Stop Observing \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Ends your participation in observing a game, by issuing the ICS }{\b\f1 unobserve}{\f1 command. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Stop Examining}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 StopExamining}}}{\f1 Stop Examining \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Ends your participation in observing a game, by issuing the ICS }{\b\f1 unobserve}{\f1 command. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Upload to Examine}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 Upload to Examine}}}{\f1\cf5 Upload to Examine \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Starts an examined game on the ICS, and uploads the game currently loaded in WinBoard (by pasting it, or loading from a file) to it. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Adjudicate To White}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicateToWhite}}}{\f1\cf6 Adjudicate To White \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 End the current game and stop participating engine. The result will appear in the PGN as a win for white. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Adjudicate To Black}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicateToBlack}}}{\f1\cf6 Adjudicate To Black \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Same as above, but game will appear as a win for black. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Adjudicate Draw}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicateDraw}}}{\f1\cf6 Adjudicate Draw \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Same as above, but game will appear as a draw. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20\cf6 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super K}{\f1 Engine Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 EngineMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Engine Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Engine Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Hint}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Hint}}}{\f1 Edit Engine List \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This pops up a window where you can edit the list of installe d engines, e.g. to delete or reorder them, or add options that could not be specified in the Load Engine dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Hint}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Hint}}}{\f1 Load Engine \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Pops up a dialog where you can select or specify an engine, to be loaded (possibly replacing a previously loaded engine). You wi ll always have to indicate whether you want to load the engine as first or second engine, through the \lquote Load Engine as\rquote combobox in the lower right. You can even replace engines during a game, without disturbing that game, provided the new engine will not f orce a switch of variant. (Beware that after loading an engine, WinBoard will always be in Edit Game mode, so if you want the new engine to continue playing or analyzing, you will have to use the Mode menu to tell it such.) When you select an already inst alled engine from the \lquote Select Engine from List\rquote combobox, all other fields of the dialog will be ignored. In other cases, you have to specify the engine executable, possible engine arguments (if the engine docs say the engine needs any), and the folder (dir ectory) where the engine should look for its files (if this cannot be deduced automatically from the specification of the engine executable). Usually it will be enough to use the browse button to locate the engine executable. But you will also have to tel l WinBoard (with the aid of checkboxes) if the engine is UCI. If \lquote Add to list\rquote is ticked (which it is by default), the engine will be added to the list of installed engines in your settings file, so that next time you can select it from the combobox. You can also specify a \lquote nickname\rquote , under which the engine will then appear in that combobox, and even choose to use that nickname for it in PGN files for engine-engine games. The info you supply with the checkboxes whether the engine should use GUI book, or (for variant engines) automatically switch to the current variant when loaded, will also be included in the list. For obsolete WinBoard engines, that would normally take a long delay to load because WinBoard is waiting for a response they will not give, you c an tick \lquote WB protocol v1\rquote to speed up the loading process. The UCCI / USI checkbox is for engines that need a special adapter (which should be configured through the }{\f1\uldb uxiAdapter}{\f1 option), which in practice is only important for Xiangqi and Shogi engines. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\ul\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\cf2\super K}{\cf2 } {\f1\ul\cf2 Engine Settings}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\cf2\super #}{\cf2 }{\f1\ul\cf2 Engine Settings}}}{\f1\ul\cf2 Engine #1 Settings }{\f1\cf2 , }{\f1\ul\cf2 Engine #2 Settings \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 This pops up a dialog that allows the user to set engine-defined options of the mentioned engine (if it is in use). What is in the dialog is entirely determined by the engine. Generally, any changes you make to the con trols are only sent to the engine after you press \ldblquote OK\rdblquote . An exception are engine-defined push buttons; the corresponding signal is sent to the engine immediately when you push those. To see the options of UCI engines, you need a Polyglot adapter that supports the recent WB-protocol extensions. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Hint}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Hint}}}{\f1 Hint \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Displays a move hint from the chess engine. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Book}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Book}}}{\f1 Book \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Displays a list of possible moves from the chess engine\rquote s opening book. The first column gives moves, the second column gives one possible response for each m ove, and the third column shows the number of lines in the book that include the move from the first column. If you select this option and nothing happens, the engine is out of its book or does not support the book command. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Move Now}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 MoveNow}}}{\f1 Move Now \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Forces the chess engine to move immediately. May not work with all chess engines. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Retract Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 RetractMove}}}{\f1 Retract Move \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Retracts your last move. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In chess engine mode, you can do this only after the chess engine has replied to your move. If the chess engine is still thinking, use }{\f1\uldb Move Now}{\v\f1 MoveNow}{ \f1 first. \par In ICS mode, Retract Move issues the command }{\b\f1 takeback 1 }{\f1 or }{\b\f1 takeback 2}{\f1 , depending on whether it is your opponent's move or yours. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Options Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 OptionsMenu}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Options Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Options Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 }{\f1\ul\cf2 Mute all Sounds}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 }{\f1\ul\cf2 MuteAllSounds}}}{\f1\cf2 }{\f1\ul\cf2 Mute all Sounds}{\f1\cf2 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 Provides a quick way to switch on or off all sounds, without affecting the settings for them. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\ul\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ General Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ GeneralOptions}}}{\f1\ul General}{\f1 \par }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Always On Top}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AlwaysOnTop}}}{\f1 Always On Top \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is on, WinBoard sets its chessboard to be a }{\i\f1 topmost}{\f1 window, meaning that it always appears on top of all ordinary windows on the screen. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Always Queen}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AlwaysQueen}}}{\f1 Always Queen \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Always Queen is off, WinBoard brings up a dialog box whenever you move a pawn to the last rank, asking what piece you want to promote it to. If the option is on, your pawns are always promoted to queens. Your opponent can still underpromote, however. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Animate Dragging}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AnimateDragging}}}{\f1 Animate Dragging \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Animate Dragging is on while y ou are dragging a piece with the mouse, an image of the piece follows the mouse cursor. If Animate Dragging is off, there is no visual feedback while you are \par dragging a piece, but if Animate Moving is on, the move will be animated when it is complete. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Animate Moving}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AnimateMoving}}}{\f1 Animate Moving \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Animate Moving is on, all piece moves are animated. An image of the piece is shown moving from the old square to the new square when the move is completed (unless the move was already animated by Animate Dragging). If Animate Moving is of f, a moved piece instantly disappears from its old square and reappears on its new square when the move is complete. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Auto Flag} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AutoflagCmd}}}{\f1 Auto Flag \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is on and one player runs out of time before the other, WinBoard will automatically call his flag, claiming a w in on time. In ICS mode, Auto Flag will only call your opponent's flag, not yours, and the ICS may award you a draw instead of a win if you have insufficient mating material. On most chess servers, you can now do}{\b\f1 set autoflag 1 }{\f1 instead and have the server call the flag. In local chess engine mode, WinBoard may call either player's flag and will not take material into account. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Auto Flip View}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ AutoFlipView}}}{\b Auto Flip View \par }{If this option is on when you}{\f1 start a game, the board will be automatically oriented so that your pawns move from the bottom of the window towards the top.}{ \par }{\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Auto Raise Board}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\super #}{ AutoRaiseBoard}}}{\b Auto Raise Board \par }{If this}{\v autoFlipViewOption}{ option is on, whenever a new game begins, the chessboard window will be deiconized (if necessary) and raised to the top of the stack of windows on your screen. \par }\pard\plain \s2\li120\sb80\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Blindfold}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ BlindfoldCmd}}}{Blindfold \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { If Blindfold is on, WinBoard displays a blank board. Moves can still be entered with the mouse, either by dragging the (invisible) piece or clicking the starting and ending square. You can also enter your move by typing it on the keyboard}{\f1 .}{ \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Highlight Dragging}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 HighlightDragging}}}{\f1 Highlight Dragging \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Highlight Dragging is on while you are dragging a piece with the mouse, the starting square and the square that the mouse cursor is over are highlighted. This option works even if Animate Dragging is off. }{\f1\cf5 Also controls if the option /showTargetSquares, which can cause marking of al squares a piece you \lquote pick up\rquote can legally move to, can be active.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Extended PGN Info}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 ExtendedPGNInfo}}}{\f1\cf6 Extended PGN Info \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 The PGN will contain the engine search depth, score and time for each move where the depth is non-zero, as a comment behind the mo ve if this option is on. Works only when \ldblquote Show Thinking\rdblquote is enabled. The recorded time is the time reported by the engine. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Extra Info In Move History}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 ExtraInfoInMoveHistory}}}{\f1\cf6 Extra Info In Move History \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Same as above, but in move-history window. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Highlight Last Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 HighlightLastMove}}}{\f1 Highlight Last Move \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Highlight Last Move is on, after a move is made, the starting and ending squares remain highlighted. In addition, after you use }{\f1\uldb Backward}{\v\f1 Backward}{\f1 or }{\f1\uldb Back to Start}{\v\f1 BackToStart}{\f1 , the starting and ending squares of the last move to be }{\i\f1 unmade}{\f1 are highlighted. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Periodic Updates}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PeriodicUpdatesCmd}}}{\f1 Periodic Updates \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Periodic Upda tes is on, the Analysis window is updated every two seconds. If not, it is updated only when the best move found changes. The Analysis window currently works only with Crafty, and Periodic Updates may not work with all versions of Crafty. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Ponder Next Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 PonderNextMoveCmd}}}{\f1 Ponder Next Move \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is off, the chess engine will think only when it is on move. If the option is on, the engine will also think while waiting for you to make your move. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Popup Exit Message}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PopupExitMessageCmd}}}{\f1 Popup Exit Message \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is on, when WinBoard wants to display a message jus t before exiting, it brings up a modal dialog box and waits for you to click OK before exiting. If the option is off, WinBoard prints exits immediately without showing the message. If }{\f1\uldb debugMode}{\v\f1 debugMode}{\f1 is on, however, the message will appear in the debug log. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Popup Move Errors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PopupMoveErrorsCmd}}}{\f1 Popup Move Errors \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is off, when you make an error in moving (such as attempting an illegal move or moving the wrong color piece), the error message is displayed in the message area. If the option is on, move errors are displayed in sm all popup windows like other errors. You can dismiss an error popup either by clicking its OK button or by clicking anywhere on the board, including downclicking to start a move. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Show Bu tton Bar}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ShowButtonBarCmd}}}{\f1 Show Button Bar \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Show Button Bar is on, WinBoard displays on-screen }{\f1\uldb buttons}{\v\f1 BUTTONS}{\f1 to step forward, backward, or pause the game. If it is off, the buttons are hidden, making the message line wider. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Show Coords}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ShowCoordsCmd}}}{\f1 Show Coords \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Show Coords is on, WinBoard displays algebraic coordinates along the board's left and bottom edges. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Show Thinking}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ShowThinkingCmd}}}{\f1 Show Thinking \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set, WinBoard displays the chess engine\rquote s current search depth and its notion of the score and best line of play from the current position as it is thinking. The score indicates how many pawns ahead (or if negative, behind) the engi ne thinks it is. In matches between two machines, the score is prefixed by W or B to indicate whether it is showing White's thinking or Black's. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Test Legality}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TestLegalityCmd}}}{\f1 Test Legality \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Test Legality is on, WinBoard tests whether the moves you enter with the mouse or read from game files are legal, and displays an error if they are not. Turn this option off if you are playing a chess variant that WinBoard does not understand. (Bughouse, suicide, and wild variants where the king may castle after starting on the }{\b\f1 d}{\f1 file are generally supported with Test Legality on. }{\f1\cf11 The same holds for variants with non-FIDE pieces, like shatranj, xangqi, shogi, gothic, capablanca, courier, knightmate: WinBoard knows how all pieces occurring in those variants move. Falcon, cylinder and berolina are only partly supported, though, and the latter two should definitely be played with legality testing off, and falcon uses a wildcard piece for the Falcons, so it considers any move of them legal, but might miss checkmates that involve a Falcon. So you shou ld not play it with claim verification switched on.}{\f1 ) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Hide Thinking From Human}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 HideThinkingFromHuman}}}{\f1\cf6 Hide Thinking From Human \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 An alternative to suppressing the Thinking Output in the display above the board by switching \ldblquote Show Thinking\rdblquote off, but doing it in a way that still allows the extended PGN info to be recorded. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Highlight Move With Arrow}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 HighlightMoveWithArrow}}}{\f1\cf6 Highlight Move With Arrow \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 A big, fat arrow is drawn between the start and target field of the last move, so you cannot possibly miss it. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Display Logos}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 DisplayLogos}}}{\f1\cf5 Display Logos \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Controls the display of engine, user or ICS logos above the board, next to the clocks, by switching on or off the option /autoLogo.. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Time Control}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TimeControlCmd}}}{\f1 }{\f1\ul Time Control}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the time control to be used in games against a chess engine. }{\f1\cf5 Three}{\f1 types of timing are available. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 With conventional chess clocks, each player begins with his clock set to the }{\f1\uldb timeControl}{\v\f1 timeControl}{\f1 period. When both players have made }{ \f1\uldb movesPerSession}{\v\f1 movesPerSession}{\f1 moves, a new time control period begins. The time in the new period is added to whatever time the players have left on their clocks. \par With incremental clocks, each player is given an initial time allotment, and a }{\f1\uldb timeIncrement}{\v\f1 timeIncrement}{\f1 is added to his clock after every move. The increment may be zero, in which case the entire game must be finished within the initial time allotment. \par }{\f1\cf5 With fixed time per move, each player gets a certain (maximum) time to make one move, and any left-over time is not carried to subsequent moves. \par Note that in local modes it is always possible to adjust the clocks during a game by Shift + click on it, where a right-click adds a minute, and a left-click subtracts one. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\ul\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{ \f1\ul\cf6 Global Settings}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\ul\cf6 Global Settings}}}{\f1\ul\cf5 Common Engine Settings \par }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Polyglot Directory}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 PolyglotDirectory}}}{\f1\cf6 Polyglot Directory \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If WinBoard knows where to find Polyglot, you can install UCI engines as if they were WinBoard engines, and WinBoard will automatically invoke Polyglot as an adapter to run them. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Hash Size}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 HashSize}}}{\f1\cf6 Hash Size, }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 EGTB Path}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 EGTBPath}}}{\f1\cf6 EGTB Path, }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 EGTB Cache Size}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 EGTBCacheSize}}}{\f1\cf6 EGTB Cache Size, }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Opening Book}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 OpeningBook}}}{\f1\cf6 Opening Book, }{ \cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Number of CPUs}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Number of CPUs}}}{\f1\cf6 Number of CPUs \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 These are options that UCI engines expect to be specified. }{\f1\cf2 WinBoard protocol now also allows native WinBoard engines to request similar information, so it might be used for these engines as well. The memory size specified by the WinBoard-protocol \lquote memory\rquote command is the sum of the hash and EGTB cache sizes. The specified opening book, when enabled through the \lquote Use Book\rquote check box, will be used as GUI book for engines that d o not have their own book (as indicated by the check boxes). It must be a book in Polyglot format. }{\f1\cf5 The selection of book moves can be controlled by the setting of \lquote Book Depth\rquote and \lquote Book Variation\rquote . The former determines the number of full moves into the ga me where the book is probed. The latter is a number from 0 to 100 that controls the interpretation of the move weights in the book (100 = ignore weights and select randomly from all listed moves; 0 = always play best move). At 50 the playing frequency exa ctly follows the book weight.}{\f1\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Default Match Games}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 DefaultMatchGames}}}{\f1\cf5 Default Match Games \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the number of games that will be played in response to the Mode -> Machine Match menu command. \par }\pard\plain \s5\sb80\sl-240\slmult0\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid {\b \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\ul\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{ \f1\ul\cf6 Adjudications}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\ul\cf6 Adjudications}}}{\f1\ul\cf6 Adjudications \par }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Ponder Next Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 PonderNextMove}}}{\f1\cf6 Ponder Next Move,}{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super K}{\f1 }{\f1\cf6 Show Thinking}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 ShowThinking}}}{\f1\cf6 Show Thinking, }{\cs58\f1\cf6\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Hide Thinking From Human}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 HideThinkingFromHuman}}}{\f1\cf6 Hide Thinking from Human and }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{ \f1 }{\f1\cf6 Periodic Updates}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 PeriodicUpdates}}}{\f1\cf6 Periodic Updates \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Duplicates of the controls in the \ldblquote General\rdblquote option menu. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Adjudicate Draw Moves}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicateDrawMoves}}}{\f1\cf6 Adjudicate Draw Moves \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Adjudicate a draw after the given number of moves, to prevent games from dragging on forever if two engines in a dead-drawn position, conspire to avoid 50-move draws. This and the folowing options are only active in \ldblquote Two Machines\rdblquote mode. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 Adjudicate Loss Threshold}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicateLossThreshold}}}{\f1\cf6 Adjudicate Loss Threshold \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Adjudicate the game as a loss when both engines agree that the (negative) score is below the given threshold for the duration of 6 consecutive plies. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Verify Claims}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 VerifyClaims}}}{\f1\cf11 Verify Claims \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Verify result claims made by engines when they terminate the game. If needed, correct the results to a loss for the engine making the false claim. Needs \ldblquote Test Legality\rdblquote to be on in order to work. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Detect Mates}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 DetectMates}}}{\f1\cf11 Detect Mates \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Let WinBoard detect checkmate and st alemate, even before the engine gets the chance to claim it. Useful with buggy engines, that exit without a claim, or just hang. Needs \ldblquote Test Legality\rdblquote to be on in order to work. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Draw If Insufficient Material}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 DrawIfInsufficientMaterial}}}{\f1\cf11 Draw If Insufficient Material \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is on, WinBoard will recognize KBKB positions with equally colored Bishops, KBK, KNK, and KK positions as draws, even before the engine can claim them. Needs \ldblquote Test Legality\rdblquote to be on in order to work. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 Adjudicate Trivial Draws}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 AdjudicateTrivialDraws}}}{\f1\cf11 Adjudicate Trivial Draws \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is on, KBKB (with B on unlike color), KBKN , KNKN, KNNK, KRKR and KQKQ positions will be adjudicated draw after 6 ply. For KQKQ this is not really sound, and in the future it might be taken out of this option. But as long as tablebase adjudications are not implemented, it seems best to group this end-game with the trivial draws. Needs \ldblquote Test Legality\rdblquote to be on in order to work. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 N-Move Rule}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 N-MoveRule}}}{\f1\cf11 N-Move Rule \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Here you can set the number of reversible moves (non-pawn, non-capture) after which WinBoard should adjudicate a game as draw. Engine draw claims are always con sidered valid after 50 moves (in the context of \ldblquote Verify Claims\rdblquote ), but you can set a different value here to either give the engine more leeway if it wants to play on, or test its claiming capabilities, or set it to a smaller value if you are impatient. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 N-Fold Repetition Rule}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 N-FoldRepetitionRule}}}{\f1\cf11 N-Fold Repetition Rule \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Here you can set the number of repetitions of the same position that should occur in order for WinBoard to adjudicate the game as draw. Engine draw claims are always considered valid after 3 repetitions (in the context of \ldblquote Verify Claims \rdblquote ) , but you can set a different value here to either give the engine more leeway if it wants to play on, or test its claiming capabilities, or set it to 2 if you are impatient. (Do not set it to 1!) \par }\pard\plain \s5\li115\sb80\sl-240\slmult0\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid {\b \par }{\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ Tournament Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ TournamentOptns}}}{\b Tournament \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tournament File}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TournamentFIle}}}{\f1 Tournament file \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 To run a tournament, WinBoard needs a file to record its progress, so that you can later resume the tournament when it was interrupted, or set other WinBoard instances to work on it in parallel. So when you want to conduct anything more complex than a simple two-player match with the currently loaded engines, (i.e. when you select a list of participants), you must not leave this field blank. When you enter the name of an existing tournament file, WinBoard will ignore all other input specified in the dialog, and will take it f r om that tournament file instead, effectively joining that tournament (switching to match mode as soon as you press OK, starting to play games for it). This could be useful for resuming an interrupted tournament, or increasing the number of games played co n currently in a tournament that was already running through other WinBoard instances. Specifying a not-yet-existing file will cause WinBoard to create one with that name, according to the tournament parameters specified in the rest of the dialog, before it starts the tournament on \lquote OK\rquote . Provided that you specify participants; without participants no tournament file will be made, but other entered values (e.g. for the file with opening positions) will take effect. WinBoard can be configured to propose a filen ame derived from date and time with the }{\f1\uldb defaultTourneyName}{\f1 option, such that it is likely to not yet exist, so that you will start a new tourney every time you OK the dialog without altering the name. Using an existing tournament file can be more conveniently done by clicking the file icon, when WinBoard is properly installed (so that the .TRN extension is associated with WinBoard in tourney mode). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Select Engine}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SelectEngine}}}{\f1 Select Engine / Tourney participants \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 With the Select Engine combobox you can pick an engine from your list of installed engines in the settings file, to be added to the tournament. The engines selected so far will be listed in the \lquote Tourney participants\rquote memo. The latter is a normal text edit, so you can use normal text-editing functions to delete engines you selected by accident, or change their order. Do not type names y ourself there, because names that do not exactly match one of the names from the combobox will lead to undefined behavior. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tourney type}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TourneyType}}}{\f1 Tourney type \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Here you can specify the type of tournament you want. WinBoard\rquote s intrinsic tournament manager support round-robins (t ype = 0), where each participant plays every other participant, and (multi-)gauntlets, where one (or a few) so-called \lquote gauntlet engines\rquote play an independent set of opponents. In the latter case, you specify the number of gauntlet engines. E.g. if you specified 10 engine, and tourney type = 2, the first 2 engines each play the remaining 8. Default:0 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tourney Cycles}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TourneyCycles}}}{\f1 Number of tourney cycles /}{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Games per Pairing}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 GamesPerPairing}} }{\f1 Games per pairing \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 You can specify tourneys where every two opponents play each other multiple times. Such multiple games can be played in a row, as specified by the \lquote number of games per pairing\rquote , or by repeating the entire tournament schedule a number of times (specified by the \lquote number of tourney cycles\rquote ). The total number of times two engine meet will be the product of these two. Games will be counted sequentially through different cycles for the purpose of color assignment or selection of starting positions. E.g. with 3 games per pairing, when engine A played B with w, b, w in the first cycle, it will play b, w, b against B in th e second cycle, and the first game in that cycle will be treated exactly as it would be when it was game number 4 of a simple two-player match. Default is 1 cycle; the number of games per pairing is the same as the default number of match games, stored in your settings file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Swiss pairing}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SwissPairing}}}{\f1 Use Swiss pairing engine \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard can also run Swiss tournaments, with the aid of an external \lquote pairing engine\rquote that tells it which engine to play against which, depending on previous results. In this case the pairing engine might atta ch significance to the order in which you specified the participants, and use it as seeding number (e.g. for systems that use ratings to determine pairing). Rounds are synonymous with tourney cycles in this case, and the number of games per pairing will b e forced to 1, meaning the actual specification for it (as well as for tourney type) will be ignored. In the standard install, WinBoard is configured (with the aid of the }{\f1\uldb pairingEngine}{\f1 option) to use a simple pairing engine that comes with it, and implements a non-official, but not all that bad approximation to Swiss. Default: no Swiss. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Sync after Round}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SyncAfterRound}}}{\f1 Sync after round / }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Sync after Cycle}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SyncAfterCycle}}}{ \f1 Sync after cycle \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 When multiple instances of WinBoard are used to concurrently run games for the same tourney, the games will be appended to the }{\f1\uldb saveGameFile}{\f1 in the order they finish, so that rounds or cycles could overlap (one starting before the other finishes). This can be inconvenient if you want to derive partial results from the games file, such as standings after each complete round. The sync opt ions, when on, will cause WinBoard to refrain from starting games of the next round or cycle before all games of the previous round or cycle are finished, which guarantees correct ordering in the games file. Default: sync after cycle, but not after round. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 File with Opening Lines}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 OpeningLines}}}{\f1 File with Opening Lines / Start Positions \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard can be requested to let games not start from the standard opening position, but from a position (possibly given as a sequence of moves from yet another position) specified in a file. Indeed, each game o f a pairing can start from a different position, or with a different given sequence of moves in such a file. The file, and the game in it can be specified with the command-line options }{\f1\uldb loadGameFile}{\f1 , }{\f1\uldb loadPositionFile}{\f1 , }{ \f1\uldb loadGameIndex}{\f1 , }{\f1\uldb loadPositionIndex}{\f1 , or in the Tournament Options dialog. (At most one of the two files should be given; games in PGN form also specify starting positions as FENs, and thus make the position file redundant, and therefore ignored.) The indexes can be used to specify the sequence nu mber of the game or position in the file to use for all games. To automatically step through all entities in a file, you have to tick \lquote Step through lines / positions in file\rquote . In this case the \lquote Use each line/position twice\rquote checkbox controls if you step aft er one or two games (so that each engine gets to play the position with both black and white). Note that the stepping occurs within a pairing; all pairings of a tourney will start with the first line or position in the file. You can specify that the index should \lquote rewind\rquote to 1 after it reaches a certain value. Default: No game or position file will be used. The default index if such a file is used is 1. \par }\pard\plain \s5\li115\sb80\sl-240\slmult0\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid {\b \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Load Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 LoadGameOptns}}}{\f1 }{\f1\ul Load Game}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change options used while loading games (}{\f1\uldb timeDelay}{\v\f1 timeDelay}{\f1 option). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Save Game} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SaveGameOptns}}}{\f1 }{\f1\ul Save Game}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change options used for saving games (}{\f1\uldb autoSaveGames}{\v\f1 autoSaveGames}{\f1 , }{\f1\uldb oldSaveStyle}{\v\f1 oldSaveStyle}{\f1 , and }{\f1\uldb saveGameFile}{\v\f1 saveGameFile}{\f1 options). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Game List Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 GameListOptions}}}{\f1 }{\f1\ul Game List}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you select which information is displayed in the Game List window. \par }\pard\plain \s5\li115\sb80\sl-240\slmult0\nowidctlpar\outlinelevel4\adjustright \f5\fs20\ul\cgrid {\b \par }{\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ ICS Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\super #}{ ICSOptions}}}{\b ICS \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Auto Comment}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AutoCommentCmd}}}{\f1 Auto Comment \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Auto C omment is on, any remarks made on ICS while you are observing or playing a game are recorded as a comment on the current move. This includes remarks made with the ICS commands }{\b\f1 say, tell, whisper, }{\f1 and }{\b\f1 kibitz}{\f1 . Limitation: remarks that you type yourself are not \par recognized; WinBoard scans only the output from ICS, not the input you type to it. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Auto Observe}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AutobsCmd}}}{\f1 Auto Observe \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Auto Observe is on and you add a player to your }{\b\f1 gnotify}{\f1 list on ICS, WinBoard will automatically observe all of that player's games, unless you are do ing something else (such as observing or playing a game of your own) when one starts. On most chess servers, you can now do }{\b\f1 follow }{\b\i\f1 player}{\f1 instead, and the server will automatically observe all of }{\b\i\f1 player\rquote s}{\f1 games. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Auto Kibitz}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 AutoKibitzCmd}}}{\f1\cf5 Auto Kibitz \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf5 Auto Kibitz controls how outp ut of computers playing on an ICS is handled. In many tournaments, computers are obliged to kibitz their thinking output to the ICS, and this option will do that automatically, without the engine having to know it. In addition, such kibitzed output by you r opponent will be kept out of the console window, and will be diverted to the engine-output window. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Get Move List}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 GetMoveListCmd}}}{\f1 Get Move List \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Get Move List is on, whenever WinBoard}{\i\f1 }{\f1 receives the first board of a new ICS game (or a different ICS game from the one it is currently displaying), it retrieves the list of past moves from the server. You can then review the moves with the Forward and Backward commands or save them with Save Game. You might want to turn off this option if you are observing several blitz games at once, to keep from wasting time and network bandwidth fetching the move lists over and over. If you turn this option on while a game is in progress, WinBoard}{\i\f1 }{\f1 immediately fetches the current move list. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Local Line Editing}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 LocalLineEditing}}}{\f1 Local Line Editing \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Local Line Editing is }{\b\f1 on}{\f1 , your machine handles echoing, backspacing, etc., for the characters that you type into the ICS Interaction window. Output is forwarded to the ICS only when you hit Enter.The Enter key produces a newline character, also known as Ctrl+J, \\ n, LF, linefeed, or decimal ASCII code 10. In this mode you can force a control character into the edit buffer by preceding it with Ctrl+Q (\ldblquote quote\rdblquote ); however, the edit buffer will not accept certain control characters even when they are quoted in this way. You can force a control character to be sent immediately to ICS, bypassing the edit buffer, by preceding it with Ctrl+S (\ldblquote send \rdblquote ). \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard keeps a history of lines you recently typed in Local Line Editing mode. You can bring back old lines by pressing the cursor up key in the text entry box. Press the cursor down key to go back down to newer lines. \par If Local Line Editing is }{\b\f1 off}{\f1 , all characters are sent to ICS as you type them. The Enter key produces a carriage return character, also known as Ctrl+M, \\r, CR, or decimal ASCII code 13. Use C trl+Backspace if you need the ASCII DEL character. You can enter any character code by holding down the Alt key and typing its decimal value (always beginning with 0) on the numeric keypad; this is a little-known standard feature of Windows. \par In both modes, if WinBoard}{\i\f1 \rquote s }{\f1 internal telnet protocol implementation is active, it translates all \\n characters to the standard telnet end-of-line sequence \\r\\n just before sending them out to ICS; see }{\f1\uldb telnetProgram}{ \v\f1 telnetProgram}{\f1 . \par It is generally not a good idea to turn off this option while connected to ICS. If you are tempted to do so because everything you type is being echoed an extra time, see the paragraph about extra echoes under }{\f1\uldb LIMITATIONS}{\v\f1 LIMITATIONS}{ \f1 below. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Quiet Play }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 QuietPlayCmd}}}{\f1 Quiet Play \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Quiet Play is on, WinBoard will automatically issue an ICS }{\b\f1 set shout 0}{\f1 command whenever you start a game and a }{\b\f1 set shout 1}{\f1 command whenever you finish one. Thus you will not be distracted by shouts from other ICS users while playing. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Seek Graph}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 SeekGraphCmd}}}{\f1\cf5 Seek Graph, }{\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{\f1\cf5 Auto Refresh}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 AutoRefreshCmd}}}{\f1\cf5 Auto Refresh \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf5 If Seek Graph is on, you can s ummon up a graphical representation of players seeking a game on the ICS in stead of the chess board, by left-clicking the latter when you are not using it. The requested games are separated out by rating and time control. Rated, unrated and wild games ar e displayed in different colors, computers as squares, humans as dots. Hovering the mouse over a dot in the graph will display the details of the corresponding seek ad in the message field above the board. Left-clicking the dot will take up the challenge. Right-clicking dots will \lquote push them to the back\rquote , so you can see seek ads that might have been hidden behind it. Right-clicking off dots will refresh the graph, left-clicking off dots will take the graph down ad display the chess board again. \par In combination with Auto Refresh, the seek graph will be updated automatically. This is only implemented for the FICS and ICC servers. To make switching on of this option effective might require you to log off and on again to the ICS, as it requires changing ICS settin gs that are locked during a session. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Background Observe}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 BackgndobsCmd}}}{\f1\cf5 Background Observe, }{\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{\f1\cf5 Dual Board}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{ \f1\cf5 DualBoardCmd}}}{\f1\cf5 Dual Board \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf5 If Background Observe is on, boards sent to you by the ICS when you are playing, but which are not of your game, (but of games you are observing), will not be displayed automatically. In stead WinBoard will remember the last board it received that way, and display it when you press the right mouse button in stead of the board of your own game. This feature is meant to enable bughouse players a peek at their partner\rquote s game, without the need to log on to the ICS a second time. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf5 If in addition Dual Board is also on, such background games are even displayed on a second board, side by side with your own game, so that it is always in view. This feature is experimental, and largely undeveloped; there is no animation of moves on this second board, while the effets are undefined if the board format of the observed game is not the same as that of your own game. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Premove}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 PremoveCmd}}}{\f1 Premove \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {Premove allows you to play a move on the board before you have received your opponent\rquote s move. This move is highlighted on the board using the }{\uldb Premove Highlight }{\v\uldb premoveHighlightColor}{ color, and is sent to the ICS as soon as your opponent\rquote s move is received. To cancel a premove, either click twice on the piece that was premoved or premove an illegal move. \par This group of controls allows you to set the following options: }{\uldb premove}{\v premove}{, }{\uldb premoveWhite}{\v premoveWhite}{, }{\uldb premoveWhiteText}{\v premoveWhiteText}{, }{\uldb premoveBlack}{\v premoveBlack}{, }{\uldb premoveBlackText}{\v premoveBlackText}{. \par }\pard\plain \s2\li120\sb80\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\cf5\super K}{\cf5 One-Click Move}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\cf5\super #}{\cf5 OneClickMoveCmd}}}{\cf5 One-Click Move \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf5 When One-Click Move is set, }{\v\cf5 icsAlarmTime}{\cf5 a click on an own piece will immediately move that piece if it only has a single legal move, without waiting for you to click a to-square. Similarly, clicking an opponent piece or empty square will immediately perform the move to th at square, if only a single legal move to it existed. This is the mouse equivalent of having to type only e4 when you mean e2-e4. Finally, double clicking an own piece (or clicking an already selected piece) will make it execute its only capture, which ca n save you some time if the target square was far away. Legality testing has to be switched on for this to work. \par }\pard\plain \s2\li120\sb80\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ ICS Alarm}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ ICSAlarm}}}{ICS Alarm \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {When }{\b icsAlarm}{ is set to True, the }{\uldb alarm sound}{\v soundIcsAlarm}{ is played when your clock counts down to }{\uldb icsAlarmTime}{\v icsAlarmTime}{ seconds . For ICS games with time controls that include an increment, the alarm will sound each time the clock counts down to the }{\uldb icsAlarmTime}{\v icsAlarmTime}{. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ICS Interaction Colors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ICSInteractionColors}}}{\f1 ICS Interaction Colors \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the colors and type styles that WinBoard uses to distinguish betw een different types of messages in the ICS Interaction window. The types distinguished are: shout, sshout, channel 1 tell, other channel tell, kibitz (or whisper), personal tell (or new message notification), challenge, request (including abort, adjourn, draw, pause, and takeback), seek, and normal (all other messages). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 Startup Chat Boxes}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 StartupChatBoxes}}}{\f1\cf5 Startup Chat Boxes \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 You can put a semicolon-separated list of ICS handles or channel numbers here, WinBoard will open a chat window for each handle at startup in ICS mode. (See the Open Ch at Window command.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Sounds}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Sounds}}}{\f1 }{\f1\ul Sounds}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the sounds that WinBoard plays for various events. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Move Sound}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 MoveSound}}}{\f1 If the Move sound is on, WinBoard alerts you by playing a sound after each of your opponent's moves (or after every move if you are observing a game on the I nternet Chess Server). The sound is not played after moves you make or moves read from a saved game file. If you turn on the Move sound when using WinBoard with the Internet Chess Server, you will probably want to give the }{\b\f1 set bell 0}{\f1 command to the ICS. Ot herwise the ICS will send a bell character after every move (not just yours), causing WinBoard to play the ICS Bell sound too. Alternatively, you could turn off the ICS Bell sound in WinBoard, but that might cause you to miss ICS alerts for other interest ing events. \par The other sound events correspond directly to the types of messages that the }{\f1\uldb ICS Interaction Colors}{\v\f1 ICSInteractionColors}{\f1 option knows how to colorize. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Communications}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Communications}}}{\f1 }{\f1\ul Communications}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Lets you change the communication port parameters when the }{\f1\uldb internetChessServerComPort}{\v\f1 internetChessServerComPort}{\f1 option is in use. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Save Settings Now}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SaveSettings}}}{\f1 }{\f1\ul Save Settings Now}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Save the current option settings to a file, along with the current window sizes and positions, to be automatically reloaded next time WinBoard is run. See }{\f1\uldb Settings}{\v\f1 Settings}{\f1 for the fine points. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Save Settings on Exit}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SaveSettingsOnExit}}}{\f1 }{\f1\ul Save Settings on Exit}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is on, the current settings are automatically saved when WinBoard exits, as with Save Settings Now. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Help Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 HelpMenu}}}{\b0\f1\fs18\up6 }{\cs58\f1\fs20\super ${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Help Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Help Menu \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Help Contents}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 HelpContents}}}{\f1 Help Contents \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Brings up this help file, starting at the Contents page. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Search for Help on}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 SearchHelp}}}{\f1 Help Index \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Brings up this help file, starting at the Index/Find dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 How to Use Help}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 HelpHelp}}}{\f1 How to Use Help \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Brings up the standard help file that explains how to use Windows Help. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 About WinBoard}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 AboutWinBoard}}}{\f1 About WinBoard \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Displays the WinBoard version number. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ICS Interaction Context Menu}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ICSInteractionContextMenu}}}{\b0\f1\fs18\up6 }{\cs58\f1\fs20\super ${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 ICS Interaction Context Menu}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +} {\f1 main}}}{\f1\fs20 ICS Interaction Context Menu \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 To see this m enu, press the right mouse button anywhere in the output (upper) pane of the ICS Interaction window. Pressing the right mouse button in the input (lower) pane gives a standard editing context menu, not described here. Use the }{\b\f1 help}{\f1 command on ICS to learn what these commands mean. \par You can customize the lower part of this menu (below the Paste option) by setting the }{\f1\uldb icsMenu}{\v\f1 icsMenu}{\f1 option. The easiest way to accomplish this is to edit your }{\f1\uldb settings file}{\v\f1 settings}{\f1 with Notepad or another plain text editor. Sorry, there is no graphical user interface for customizing the menu. \par }{\f1\cf5 Note that the menu will pop up under the mouse pointer on the down-click, and that you can already select an item from it on the up-click. The item that is configured to pop up under the mouse pointer can thus be selected by a \lquote blind \rquote static click. If you don\rquote t want that, but rather wants the menu to stay up after the first static click, you should configure an inactive menu item under the pointer. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Copy and Paste}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 CopyAndPaste}}}{\f1 Copy and Paste \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Copies the current selection to the clipboard, then pastes it to the input box. As a shortcut to this function, you can press the middle mouse button (if you have one), or Shift plus the right mouse button. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Copy}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Copy}}}{\f1 Copy \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Copies the current selection to the clipboard. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Paste}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Paste}}}{\f1 Paste \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Pastes the clipboard contents to the input box. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Who}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 Who}}}{\f1 Who \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote who\rdblquote }{\b\i\f1 }{\f1 to ICS. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Players}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 Players}}}{\f1 Players \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote players\rdblquote }{\b\i\f1 }{\f1 to ICS. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Games}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 Games}}}{\f1 Games \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote games\rdblquote }{\b\i\f1 }{\f1 to ICS. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Sought}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 Sought}}}{\f1 Sought \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote sought\rdblquote }{\b\i\f1 }{\f1 to ICS. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tell}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Tell}}}{\f1 Tell (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Inserts \ldblquote tell }{\i\f1 name }{\f1 \rdblquote }{\b\i\f1 }{\f1 into the input box. The string }{\i\f1 name }{\f1 is the current selection if it is not empty. Otherwise }{\i\f1 name }{\f1 is the word surrounding the mouse position, where a \ldblquote word\rdblquote is a string of letters, digits, or hyphens (-), such as an ICS user handle or game number. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\cf5\revised\super\revauth1\revdttm-1506646559 K}{\f1\cf5\revised\revauth1\revdttm-1506646559 }{\f1\cf5 Open Chat Box}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\cf5\revised\super\revauth1\revdttm-1506646559 #}{\f1\cf5\revised\revauth1\revdttm-1506646559 }{\f1\cf5 OpenChatbox}}}{\f1\cf5 Open Chat Box (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Causes WinBoard to open a new Chat Window, with }{\i\f1\cf5 name}{\f1\cf5 in the chat Partner field, where }{\i\f1\cf5 name}{\f1\cf5 is as defined above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Message}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Message}}}{\f1 Message (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Inserts \ldblquote message }{\i\f1 name }{\f1 \rdblquote }{\b\i\f1 }{\f1 into the input box, where }{\i\f1 name}{\f1 is as defined above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Finger}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Finger}}}{\f1 Finger (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote finger }{\i\f1 name}{\f1 \rdblquote }{\b\i\f1 }{\f1 to ICS, where }{\i\f1 name}{\f1 is as defined above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Vars}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Vars}}}{\f1 Vars (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote vars }{\i\f1 name}{\f1 \rdblquote }{\b\i\f1 }{\f1 to ICS, where }{\i\f1 name}{\f1 is as defined above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Observe}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Observe}}}{\f1 Observe (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote observe }{\i\f1 name}{\f1 \rdblquote }{\b\i\f1 }{\f1 to ICS, where }{\i\f1 name}{\f1 is as defined above. Here }{\i\f1 name}{\f1 can be either a user handle or a game number. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Match}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Match}}}{\f1 Match (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote match }{\i\f1 name}{\f1 \rdblquote }{\b\i\f1 }{\f1 to ICS, where }{\i\f1 name}{\f1 is as defined above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 Play}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 Play}}}{\f1 Play (name) \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sends the command \ldblquote play }{\i\f1 name}{\f1 \rdblquote }{\b\i\f1 }{\f1 to ICS, where }{\i\f1 name}{\f1 is as defined above. Here }{\i\f1 name}{\f1 can be either a user handle or a seek ad number. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Buttons}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Buttons}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Buttons}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\b0\f1\fs18\up6 }{\f1\fs20 BUTTONS \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Back to Start}}}{\f1 << \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Same as }{\f1\uldb Back to Start}{\v\f1 BacktoStart}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Backward}} }{\f1 < \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Same as }{\f1\uldb Backward}{\v\f1 Backward}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Pause}}}{ \f1 P \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Same as }{\f1\uldb Pause}{\v\f1 Pause}{\f1 . The button label changes to }{\b\f1 C}{\f1 while WinBoard is pausing. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Forward}}} {\f1 > \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Same as }{\f1\uldb Forward}{\v\f1 Forward}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Forward to End}}}{\f1 >> \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Same as }{\f1\uldb Forward to End}{\v\f1 ForwardtoEnd}{\f1 . \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \par }{\cf2 Note that using the mouse wheel has the same effect as using the < or > button. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Command Line Options}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Options}}}{\f1\fs20 }{\cs58\f1\fs20\super #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Options}}}{\f1\fs20 }{\cs58\f1\fs20\super ${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $ }{\f1 Command Line Options}}}{\f1\fs20 }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 COMMAND LINE OPTIONS \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 All WinBoard options can be set either on the command line (if you start WinBoard by typing into an MSDOS Prompt box), in the Properties/Shortcut/Target box of a Windows s hortcut, in a }{\f1\uldb settings file}{\v\f1 settings}{\f1 , or in the Additional Options box of the WinBoard startup dialog. Exactly the same syntax is used in all four places. Most options can also be set from the menus and saved using }{\f1\uldb Save Settings Now}{\v\f1 SaveSettings}{\f1 or }{\f1\uldb Save Settings on Exit}{\v\f1 SaveSettingsOnExit}{\f1 , so most people will not need to read this section. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Most options have two names, a long one that is easy to read and a short one that is easy to type. To turn on a boolean (true/false) option }{\i\f1 opt}{\f1 , you can just give its short name preceded by a minus sign or slash (-}{\i\f1 opt}{\f1 or /}{\i\f1 opt}{\f1 ); to turn one off, prefix the short name by an \ldblquote x\rdblquote or an extra minus sign (-x}{\i\f1 opt}{\f1 or /-}{\i\f1 opt}{\f1 ). To set any other kind of option, or to set a boolean option using its long name, give the value after the name, separated by a space, colon, or equal sign. (-}{\i\f1 opt}{\f1 23 or /}{\i\f1 option}{\f1 :true). If a string option contains spaces or special characters, enclose it in double quotes and use the \\ quoting convention of C to name the special characters. Alternatively, you can enclose a string value in curly braces (/opt=\{string\} ), as long as the value does not contain a closing curly brace. If a filename option contains spaces, enclose it in either single or double quotes. In filename options, the \\ character is not treated speciall y, so use single quotes around the outside of the value if it has double quotes inside (and vice versa). \par When you start WinBoard, it will pop up the Startup dialog box unless you provide sufficient options on the command line for WinBoard to determine whic h major mode to be in and what engines to use or chess server to connect to. To bypass this box, you must at minimum give one of the three options }{\f1\uldb /cp}{\v\f1 cp}{\f1 , /}{\f1\uldb ics}{\v\f1 ics}{\f1 , or /}{\f1\uldb ncp}{\v\f1 ncp}{\f1 . If you give the /cp option, you must also give the /}{\f1\uldb fcp}{\v\f1 fcp}{\f1 and /}{\f1\uldb scp}{\v\f1 scp}{\f1 options. If you give the /ics option, you must also give the /}{\f1\uldb icshost}{\v\f1 icshost}{\f1 option. \par }\pard\plain \s29\fi-240\li360\sb60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\uldb Chess Engine Options}{\v\f1 ChessEngineOptions}{\f1 \par }{\f1\uldb UCI Engine Support !NEW!}{\v\f1 UCIEngineSupport}{\f1 \par }{\f1\uldb Internet Chess Server Options}{\v\f1 InternetChessServerOptions}{\f1 \par }{\f1\uldb Load and Save Options}{\v\f1 LoadAndSaveOptions}{\f1 \par }{\f1\uldb User Interface Options}{\v\f1 UserInterfaceOptions}{\f1 \par }{\f1\uldb Adjudication Options !NEW!}{\v\f1 AdjudicationOptions}{\f1 \par }{\f1\uldb Other Options}{\v\f1 OtherOptions}{\f1 \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Chess Engine Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Chess Engine Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ChessEngineOptions}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 Chess Engine Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 cp}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 cp}}}{\f1 /cp}{\b0\f1 or}{\f1 /xcp}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 chessProgram}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 chessProgram}}}{\f1 /chessProgram }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If true, puts WinBoard in chess engine mode. In this mode, you can play against a chess program running on your PC or use it as an analysis partner. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tc}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tc}}}{\f1 /tc }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 timeControl}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 timeControl}}}{\f1 /timeControl }{\i\f1 minutes[:seconds] \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Each player begins with his clock set to the timeControl period. Default: 5 minutes. The additional options movesPerSession and timeIncrement are mutually exclusive. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 mps}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 mps}}}{\f1 /mps }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 movesPerSession}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 movesPerSession}}}{\f1 /movesPerSession }{\i\f1 moves}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 When both players have made movesPerSession moves, a new timeControl period is added to both clocks. Default: 40 moves. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 inc}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 inc}}}{\f1 /inc }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 timeIncrement}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 timeIncrement}}}{\f1 /timeIncrement }{\i\f1 seconds \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is specified, movesPerSession is ignored. Instead, after each player's move, timeIncrement seconds are added to his clock. Use -timeIncrement 0 if you want to require the entire game to be played in one timeControl period, with no increment. D efault: -1, which specifies movesPerSession mode. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 clock }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 clock }}}{\f1 /clock }{\b0\f1 or }{\f1 /xclock}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 clockMode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 clockMode}}}{\f1 /clockMode }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Determines whether or not to display the chess clocks. If clockMode is False, the clocks are not shown, but the side that is to play next is still highlighte d. Also, unless searchTime is set, the chess engine still keeps track of the clock time and uses it to determine how fast to make its moves. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 st}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 st}}}{\f1 /st }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 searchTime }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 searchTime }}}{\f1 /searchTime }{\i\f1 minutes[:seconds]}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Tells the chess engine to spend at most the given amount of time searchi ng for each of its moves. Without this option, the engine chooses its search time based on the number of moves and amount of time remaining until the next time control. Setting this option also sets clockMode to False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 sd}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 sd}}}{\f1 /depth }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 searchDepth}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 searchDepth}}}{\f1 /searchDepth }{\i\f1 number}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 T ells the chess engine to look ahead at most the given number of moves when searching for a move to make. Without this option, the engine chooses its search depth based on the number of moves and amount of time remaining until the next time control. With t he option, the engine will cut off its search early if it reaches the specified depth. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 firstNPS}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 firstNPS}}}{\f1\cf11 /firstNPS }{\i\f1\cf11 number}{\f1\cf11 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf11 secondNPS}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 secondNPS}}}{\f1\cf11 /secondNPS }{\i\f1\cf11 number}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Tells the chess engine to use an internal time standard based on its node count, rather then wall-clock time, to make its time de cisions. The time in virtual seconds should be obtained by dividing the node count through the given }{\i\f1\cf11 number}{\f1\cf11 , like the number was a rate in nodes per second. WinBoard will manage the clocks in accordance with this, relying on the number of nodes reported by the engine in its thinking output. If }{\i\f1\cf11 number}{\f1\cf11 equals zero, it can obviously not be used to convert nodes to seconds, and the time reported by the engine is used to decrement the WinBoard clock. The engine is supposed to report in CPU time it uses, rather t han wall-clock time in this mode. This option can provide fairer conditions for engine-engine matches on heavily loaded machines, or with very fast games (where the wall clock is too inaccurate). \ldblquote Show Thinking\rdblquote must be on for this option to work. Not many engines might support this yet! \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 firstTimeOdds}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 firstTimeOdds}}}{\f1\cf11 /firstTimeOdds }{\i\f1\cf11 factor}{\f1\cf11 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf11 secondTimeOdds}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 secondTimeOdds}}}{\f1\cf11 /secondTimeOdds }{\i\f1\cf11 factor}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Reduces the time given to the mentioned engine by the given }{\i\f1\cf11 factor}{\f1\cf11 . If pondering is off, the effect is indistinguishable from what would happen if the engine was running on a }{\i\f1\cf11 factor}{\f1\cf11 times slower machine. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 }{\f1\cf11 timeOddsMode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 }{\f1\cf11 timeOddsMode}}}{\f1\cf11 /timeOddsMode }{\i\f1\cf11 mode \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 This option determines how the case is handled when both engines have a time-odds handicap. If mode=1, the engine that gets the most time will always get the nominal time, as specified by the time-control options, and its opponent\rquote s time is normalized similarly. If mode=0, both play with reduced time. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 ponder}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid { \cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 ponder}}}{\f1 /ponder}{\b0\f1 or }{\f1 /xponder}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid {\cs58\f1\revised\super\revauth1\revdttm-1506646559 K}{\f1\revised\revauth1\revdttm-1506646559 ponderNextMove}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\pnrnot1\adjustright \f5\fs20\cgrid {\cs58\f1\revised\super\revauth1\revdttm-1506646559 #}{\f1\revised\revauth1\revdttm-1506646559 ponderNextMove}}}{\f1 /ponderNextMove }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Ponder Next Move}{\v\f1 ponderNextMoveCmd}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 thinking}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 thinking}}}{\f1 /thinking}{\b0\f1 or }{\f1 /xthinking}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 showThinking}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 showThinking}}}{\f1 /showThinking }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Show Thinking}{\v\f1 showThinkingCmd}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 periodic } }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 periodic}}}{\f1 /periodic }{\b0\f1 or }{\f1 /xperiodic}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 periodicUpdates}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 periodicUpdates}}}{ \f1 /periodicUpdates }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Periodic Updates}{\v\f1 periodicUpdatesCmd}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 mg }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 mg }}}{\f1 /mg }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 matchGames }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 matchGames}}}{\f1 /matchGames }{\i\f1 n \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Automatically runs an }{\b\i\f1 n}{\i\f1 -}{\f1 game match between two chess engines, with alternating colors. If the }{\f1\uldb loadGameFile}{\v\f1 loadGameFile}{\f1 or } {\f1\uldb loadPositionFile}{\v\f1 loadPositionFile}{\f1 option is set, WinBoard will start each game with the given opening moves or the given position; otherwise, the games will start with the standard initial chess position. If the }{\f1\uldb saveGameFile}{\v\f1 saveGameFile}{\f1 option is set, a move record for the match will be appended to the specified file. If the }{\f1\uldb savePositionFile}{\v\f1 savePositionFile}{\f1 option is set, the final position reached in each game of the match will be appended to the specified file. When the match is over, WinBoard will display the match score and exit. Default: 0 (do not run a match). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 mm }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 mm }}}{\f1 /mm }{\b0\f1 or }{\f1 /xmm}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 matchMode }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 matchMode }}}{\f1 /matchMode }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Provided for backward compatibility. If true and matchGames=0, sets matchGames=1. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 matchPause}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 matchPause}}}{\f1\cf11 /matchPause }{\i\f1\cf11 number}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Sets the length of the pause between games in match mode to }{\i\f1\cf11 number}{\f1\cf11 msec. Default value is 10000, i.e. 10 sec. (If this pause is too short, engines not implementing \lquote ping\rquote will sometimes send th e last move of their previous game only when a new game has started, at which time the move is illegal, and causes them to forfeit the game.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 fd}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 fd }}}{\f1 /fd }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 firstDirectory}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 firstDirectory}}}{\f1 /firstDirectory }{\i\f1 dir \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 sd}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 sd }}}{\f1 /sd }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondDirectory}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondDirectory}}}{\f1 /secondDirectory }{\i\f1 dir}{\cs58\f1\super }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf11 fcp }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super #}{\f1\cf11 fcp }}}{\f1 /fcp }{\b0\f1 or}{\f1 }{ \cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super K}{\f1\cf11 firstChessProgram }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super #}{\f1\cf11 firstChessProgram }}}{\f1 /firstChessProgram }{\i\f1 command\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super K}{\f1\cf11 scp }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super #}{\f1\cf11 scp }}}{\f1 /scp }{\b0\f1 or}{\f1 }{\cs58\f1\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super K}{\f1\cf11 secondChessProgram }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf11\super #}{\f1\cf11 secondChessProgram}{\f1 }}}{\f1 /secondChessProgram }{\i\f1 command}{\cs58\f1\super }{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Names of the chess engines and working directories in which they are to be run. The second chess engine is started only in Two Machines (match) mode. These arguments are parsed as filenames; that is, the \\ character is interpreted literally, not as a C-style escape. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The }{\i\f1 dir}{\f1 argument specifies the initial working directory for the chess engine. It should usually be the directory where the engine and its working files are installed. If }{\i\f1 dir}{\f1 is not an absolute pathname, it is interpreted relative to the directory from which WinBoard.exe itself was loaded. The }{\i\f1 dir}{\f1 argument is ignored if the chess engine is being run on a remote machine (see firstHost and secondHost below). The default value for }{\i\f1 dir }{ \f1 "", meaning that the chess engine is expected to be installed in the same directory as WinBoard. \par The }{\i\f1 command}{\f1 argument is actually the command line to the chess engine, so if the engine itself needs command line arguments, you can include them by enclosing }{\i\f1 command}{\f1 in single or double quotes. If the engine name or an engine argument has a space in it, use single quotes around the whole }{\i\f1 command, }{\f1 and inside them use double quotes around each item that contains spaces. If the engine name has more than one period in it (for example, }{\f2 QChess1.5.exe}{\f1 ), you must include the "}{\f2 .exe}{\f1 " extension; otherwise you can leave it out. The default value for }{\i\f1 command}{\f1 is "", which brings up the startup dialog to ask which engines you want. \par Examples: \par }\pard\plain \s19\fi-518\li1036\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2 WinBoard /cp /fd="C:\\Program Files\\Crafty" /fcp=WCrafty-15.12.exe /scp=GNUChess \par WinBoard /cp /fd="C:\\Miracle Games" /fcp='"Miracle Chess.exe" /wow' /scp=GNUChess \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 The basic rule is thus that what is inside the quotes delimiting the argument to /fcp and /scp, all goes to the engine, and is ignored by WinBoard. WinBoard 4.3.13 and later, however, knows an exception to this: If, within the quotes, the word WBopt appears, everything that follows this word will be interpreted as a WinBoard argument, in stead of being passed to the engine on startup of the latter. (The WBop t itself is also not passed to the engine.) This possibility of hiding WinBoard arguments in the engine command is provided in order to create options that follow the engine in a tournament, when a tournament manager like PSWBTM is used to invoke WinBoard. Because, in order to apply to a given engine, some options need to know if they apply to first or second engine, which might vary during the tournament, options hidden inside the engine command-line can contain \lquote %s\rquote which will be replaced at the time the option is used by \lquote first\rquote or \lquote second\rquote , as applicable. \par Examples: \par }\pard\plain \s19\fi-518\li1036\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\cf11 WinBoard /cp /fd="C:\\Engines\\Crafty" /fcp=\rdblquote WCrafty-15.12 WBopt /%sTimeOdds=2\rdblquote /scp=GNUChess \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Meaning that Crafty will have to play with half the time GNUChess will get. \par }\pard\plain \s19\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 fh }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 fh }}}{\f1 /fh }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 firstHost }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 firstHost }}}{\f1 /firstHost }{\i\f1 host\line }{ \cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 sh }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 sh }}}{\f1 /sh }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondHost }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondHost }}}{\f1 /secondHost }{\i\f1 host}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Hosts on which the chess engines are to run. The default for each is "localhost". If you specify another host, WinBoard}{\i\f1 }{\f1 uses }{\f1\uldb rsh}{\v\f1 rsh}{\f1 to run the chess program there. The /fd and /sd flags do not work in conjunction with the se flags; if you need a remote chess engine to run somewhere other than your default login directory on the remote machine, you will have to include a "cd" command in the argument to /fcp or /scp. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 initString }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 initString}}}{\f1 /firstInitString }{\b0\f1 or }{\f1 /initString }{\i\f1 string\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondInitString}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondInitString}}}{\f1 /secondInitString }{\i\f1 string}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The strings that are sent to initialize the chess engines. Default: "new\\nrandom\\n". The "\\n" sequences represent newlines. You can type "\\ n" on the command line or in a }{\f1\uldb settings file}{\v\f1 settings}{\f1 , and WinBoard will convert it to a newline. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 All chess engines require the "new" command to start a new game. \par You can remove the "random" command if you like; including it causes engines that implement this command (e.g. GNU Chess) to randomize their move selection slightly so that it doesn't play the same mo ves in every game. Even without "random", many engines randomize their choice of moves from their opening book. You can also try adding other commands to the initString; see the applicable engine documentati{\*\bkmkstart _Hlt386545814}o {\*\bkmkstart _Hlt386567280}{\*\bkmkend _Hlt386545814}n{\*\bkmkend _Hlt386567280} for details. Crafty ignores the "random" command; see its documentation for the commands it accepts. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 initString }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 initString}}}{\f1 /firstComputerString }{\i\f1 string\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondInitString}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondInitString}} }{\f1 /secondComputerString }{\i\f1 string}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If the chess engine is playing against another computer program (whether locally or on a chess server), by default the command "computer\\n " is sent to it. Some chess engines change their playing style when they receive this command. If you do not want the engine to know when it is playing another computer, you can set the string to "". \par }\pard\plain \s66\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cf11\cgrid {Note that the computer string is sent to the engine afte r most other initialization commands, and is thus ideal for hiding a WinBoard-protocol command in that should be sent only to one engine, when the WinBoard option that normally specifies this command cannot be differentiated by engine, but is always sent to both engines. E.g. if you want one of the engines to ponder, and the other not. Because it is sent last, it can overrule earlier commands. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 fb }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 fb }}}{\f1 /fb }{\b0\f1 or }{\f1 /xfb}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 firstPlaysBlack }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 firstPlaysBlack}}} {\f1 /firstPlaysBlack }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 In games between two chess programs, the firstChessProgram normal ly plays white. (This is a change from earlier versions of WinBoard.) If this option is True, firstChessProgram plays black. In a multi-game match, this option affects the colors only for the first game; they still alternate in subsequent games. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 reuse}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 reuse}}}{\f1 /reuse}{\cs58\f1\super }{\b0\f1 or }{\f1 /xreuse}{\b0\f1 , or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 reuseFirst}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 reuseFirst}}}{\f1 /reuseFirst}{\i\f1 true|false\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 reuse2}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 reuse2}}}{\f1 /reuse2}{\cs58\f1\super }{\b0\f1 or }{\f1 /xreuse2}{\b0\f1 , or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 reuseSecond}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 reuseSecond}}}{\f1 /reuseSecond}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is True (the default), WinBoard}{\i\f1 }{\f1 uses the same chess engine process repeatedly when playing multiple games. If the option is False, WinBoard kills off the chess engine after every game and starts a fresh one for the next game. Starting a fresh chess engine can be slow, so it is not recommended. However, some chess engines may not work properly when reused, such as versions of Crafty earlier than 12.0. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 firstProtocolVersion}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 firstProtocolVersion}}}{\f1 /firstProtocolVersion }{\i\f1 ver\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondProtocolVersion}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondProtocolVersion}}}{\f1 /secondProtocolVersion }{\i\f1 ver}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option specifies which version of the chess engine communication protocol to use. By default, version-number is 2. In version 1, the "protover" command is not sent to the engine; since version 1 i s a subset of version 2, nothing else changes. Other values for version-number are not supported. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 firstScoreAbs}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 firstScoreAbs}}}{\f1\cf6 /firstScoreAbs}{\i\f1\cf6 true|false\line }{\cs58\f1\cf6\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 secondScoreAbs}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 }{\f1\cf6 secondScoreAbs}}}{\f1\cf6 /secondScoreAbs}{\i\f1\cf6 true|false \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If this option is true, the score reported by the engine is taken to be that in favor of white, even when the engine plays black. Important when winboard uses the score for adjudications, or in PGN reporting. This can be a useful option in combination with WBopt in the engine command-line, see under /fcp.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 absoluteAnalysisScore}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 absoluteAnalysisScore}}}{\f1 /absoluteAnalysisScore }{\i\f1 true|false \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 When this opti on is switched on, scores will be reported in the Engine Output window from the white point of view during analysis. When off, and in other modes, it will be reported from the point of view of the side to move. (Note that many engines violate this rule wh ile pondering!) Default: true.}{ \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 niceEngines}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 niceEngines}}}{\f1\cf2 /niceEngines}{\i\f1\cf2 priority \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 This option allows you to lower the priority of the engine processes, so that the generally insatiable hunger for CPU time of chess engines does not interfere so much with smooth operation of WinBoard ( or the rest of your system). Try priority = 10 or even 20 to lower the priority of the engines. Negative values could increase the engine priority, which is not recommended.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 firstOptions}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 firstOptions}}}{\f1\cf2 /firstOptions}{\i\f1\cf2 string\line }{\cs58\f1\cf2\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 secondOptions}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\cf2\super #}{\f1\cf2 secondOptions}}}{\f1\cf2 /secondOptions}{\i\f1\cf2 string \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 The given string is a comma-separated list of (option name, option value) pairs, like the following example: \ldblquote style=Karpov,blunder rate=0\rdblquote . If the options announced by the engine at startup through the feature commands of WinBoard protocol matches one of the option names (i.e. \ldblquote style\rdblquote or \ldblquote blunder rate\rdblquote ), it would be set to the given value (i.e. \ldblquote Karpov\rdblquote or 0) through a corresponding option command to the engine. This provided that the type of the value (text or numeric) matches as well.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 firstNeedsNoncompliantFEN}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 firstNeedsNoncompliantFEN}}}{\f1\cf2 /firstNeedsNoncompliantFEN}{\i\f1\cf2 string \line }{\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 secondNeedsNoncompliantFEN}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 secondNeedsNoncompliantFEN}}}{\f1\cf2 /secondNeedsNoncompliantFEN}{\i\f1\cf2 string \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 The castling rights and e.p. fields of the FEN sent to the mentioned engine with the setboard command will be replaced by the given string. This can for instance be used to run engines that do not understand Chess960 FENs in variant fisch erandom, to make them at least understand the opening position, through setting the string to \ldblquote KQkq -\rdblquote . (Note you also have to give the e.p. field!) Other possible applications are to provide work-arounds for engines that want to see castling and e.p. fiel ds in variants that do not have castling or e.p. (shatranj, courier, xiangqi, shogi) so that WinBoard would normally omit them (string = \ldblquote - -\ldblquote , or to add variant-specific fields that are not yet supported by WinBoard (e.g. to indicate the number of checks in 3check). \par }{ \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Tournament Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Tournament Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 TournamentOptions}}}{\f1\fs20 Tournament Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tf}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tf}}}{\f1 /tf }{\i\f1 filename}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tourneyFile}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tourneyFile}}}{\f1 /tourneyFile }{\i\f1 filename}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Specifies the name of the tournament file used in match mode to conduct a multi-player tournament}{\v\f1 ICSLogon}{\f1 . This file is a special settings file, which stores the description of the tournament (including progress info), through normal options (e.g. for time control, load and save files), and through some special-purpose options listed below. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tt }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tt }}}{\f1 /tt }{\i\f1 number}{\b0\f1 or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tourneyType }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tourneyType }}}{\f1 /tourneyType }{\i\f1 number}{ \f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Specifies the type of tourney: 0 = round-robin, N>0 = (multi-)gauntlet with N gauntlet engines, -1 = Swiss through external pairing engine}{\v\f1 ICSLogon}{\f1 . Volatile option, but stored in tourney file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 cy }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 cy }}}{\f1 /cy }{\i\f1 number}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tourneyCycles }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tourneyCycles }}}{ \f1 /tourneyCycles }{\i\f1 number}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Specifies the number of cycles in a tourney}{\v\f1 ICSLogon}{\f1 . Volatile option, but stored in tourney file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 participants }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 participants}}}{\f1 /participants }{\i\f1 list}{\f1 \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The list is a multi-line text string that specifies engines occurring in the /firstChesProgramNames list in the settings file by their (implied or explicitly given) nickname, one engine per line. The ment ioned engines will play in the tourney. Volatile option, but stored in tourney file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 results }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 results}}}{\f1 /results }{\i\f1 string}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The string of +=- characters lists the result of all played games in a toruney. Games currently playing are listed as *, while a space indicates a game that is not yet played or playing (usually because it was playing, and the aborted). Volatile option, but stored in tourney file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 defaultTourneyName }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 defaultTourneyName}}}{\f1 /defaultTourneyName }{\i\f1 string}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Specifies the name of the tournament file WinBoard should propose when the Tournament Options di alog is opened. Any %y, %M, %d, %h, %m, %s in the string are replaced by the current year, month, day of the month, hours, minutes, seconds of the current time, respectively, as two-digit number. A %Y would be replaced by the year as 4-digit number. Defau lt: empty string. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 pairingEngine}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 pairingEngine}}}{\f1 /pairingEngine }{\i\f1 filename}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Specifies the external program to be used to pair the participants in Swiss tourneys. WinBoard communicates with this engine in the same way as it communicates with Chess engines. The only commands sent to the pairing engine are \ldblquote results }{ \i\f1 N string}{\f1 \rdblquote , where }{\i\f1 N}{\f1 is the number of participants, and }{\i\f1 string}{\f1 the results so far in the format of the results option, and \ldblquote pairing }{\i\f1 N}{\f1 \rdblquote , where N is the number of the tourney game. To the latter the pairing engine should answer with \ldblquote A-B\rdblquote , where A and B are participant numbers (in the range 1-N). (There should be no reply to the results command.) Default: empty string. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\cf6\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 UCI Engine Support}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 }{\f1\cf6 UCI Engine Support}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 UCIEngineSupport}}}{ \f1\fs20\cf6 UCI Engine Support \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 fUCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fUCI}{\f1 }}}{\f1\cf6 /fUCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 firstIsUCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 firstIsUCI}}}{\f1\cf6 /firstIsUCI}{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 sUCI}{\f1 }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 sUCI}{\f1 }}}{\f1\cf6 /sUCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 secondIsUCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 secondIsUCI}}}{\f1\cf6 /secondIsUCI}{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Indicates if the mentioned engine executable file is an UCI engine,}{\v\cf6 ICSLogon}{\cf6 and should be run with the aid of a protocol adapter rather than directly. The adapterCommand option specifies wchich adapter to use, and which info to pass to it on the command line. In a normal WinBoard install, this will invoke Polyglot. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 fUCCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fUCCI}{\f1 }}}{\f1\cf6 /fUCCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 fUSI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fUSI}}}{ \f1\cf6 /fUSI \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 sUCCI}{\f1 }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 sUCCI}{\f1 }}}{\f1\cf6 /sUCCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 sUSI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 sUSI}}}{ \f1\cf6 /sUSI \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Similar to the fUCI and sUCI options, but invoking a secondary adapter, specified through he uxiAdapter option. Useful in environments where engines of several alien protocols are around, e.g. for Xiangqi, where UCI and UCCI engines need different adapters.}{\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 PolyglotDir}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 PolyglotDir}{\f1 }}}{\f1\cf6 /PolyglotDir }{\i\f1\cf6 filename}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Gives the name of the folder in which Polyglot is installed}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 adapterCommand}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 adapteCommand}{\f1 }}}{\f1\cf6 /adapterCommand }{\i\f1\cf6 command}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 uxiAdapter}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 uxiAdapter}{\f1 }}}{\f1\cf6 /uxiAdapter }{\i\f1\cf6 command}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Specifies the comma nds to use in stead of the engine command when the fUCI / sUCI (or for uxiAdapter fUCCI and sUCCI) are in force. The command line can contain words of the form %xxx, where xxx is the name of a WinBoard option, such as fcp, fd, cacheSizeEGTB, which will th e n automatically be replaced by the value of that option. (For the second engine the leading f or first will automatically be replaced by s or second.) This allows the engine name and directory, as well as other info known to WinBoard, to be passed to the adapter on its command line}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par Default adapterCommand is \{polyglot \endash noini \endash ec \ldblquote %fcp\rdblquote \endash ed \ldblquote %fd\rdblquote \} \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 usePolyglotBook}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 usePolyglotBook}{\f1 }}}{\f1\cf6 /usePolyglotBook }{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Specifies if the Polygot book should be used}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 PolyglotBook}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 PolyglotBook}{\f1 }}}{\f1\cf6 /PolyglotBook }{\i\f1\cf6 filename}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Gives the filename of the opening book that Polyglot should use}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 bookDepth }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 bookDepth}}}{\f1\cf5 /bookDepth }{\i\f1\cf5 number}{\f1\cf5 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Restricts the use of the GUI book to the first }{\i\f1\cf5 number}{\f1\cf5 full moves of the game. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 bookVariation }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 bookVariation}}}{\f1\cf5 /bookVariation }{\i\f1\cf5 number}{\f1\cf5 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Controls the selection of book moves. The default setting of 50 would play the moves with a frequency proportional to the weight listed in the book. Useful settings vary from 0 (always play best move) to 100 (select completely randomly from all listed moves). \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 fNoOwnBookUCI}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fNoOwnBookUCI}{\f1 }}}{\f1\cf6 /fNoOwnBookUCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 firstXBook}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 }{\f1\cf6 firstXBook}{\f1 }}}{\f1\cf6 /firstXBook }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 firstHasOwnBookUCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 firstHasOwnBookUCI}}}{\f1\cf6 /firstHasOwnBookUCI}{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 sNoOwnBookUCI}{\f1 }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 sNoOwnBookUCI}{\f1 }}}{\f1\cf6 /sNoOwnBookUCI }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 secondXBook}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #} {\f1 }{\f1\cf6 secondXBook}{\f1 }}}{\f1\cf6 /secondXBook }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 secondHasOwnBookUCI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 secondHasOwnBookUCI}}}{\f1\cf6 /secondHasOwnBookUCI}{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Indicates if the mentioned engine lacks an opening book or not}{\cf6 . }{\cf2 Engines that have an own opening book will not use the GUI book (as given by /polyglotBook) even if /usePolyglotBook is set to true.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 defaultHashSize}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 defaultHashSize}{\f1 }}}{\f1\cf6 /defaultHashSize }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the size of the hash table to }{\i\f1\cf6 number}{\f1\cf6 MegaBytes}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 defaultCacheSizeEGTB}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 defaultCacheSizeEGTB}{\f1 }}}{\f1\cf6 /defaultCacheSizeEGTB }{\i\f1\cf6 number}{ \f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the size of the EGTB cache to }{\i\f1\cf6 number}{\f1\cf6 MegaBytes}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 defaultPathEGTB}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 defaultPathEGTB}{\f1 }}}{\f1\cf6 /defaultPathEGTB }{\i\f1\cf6 filename}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Gives the name of the folder where the end-game tablebases are installed}{\v\f1\cf6 ICSLogon}{\f1\cf6 . \par }{ \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Internet Chess Server Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Internet Chess Server Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 InternetChessServerOptions}}}{ \f1\fs20 Internet Chess Server Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ics }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ics }}}{\f1 /ics }{\b0\f1 or }{\f1 /xics}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 internetChessServerMode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 internetCh essServerMode}}}{\f1 /internetChessServerMode}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Connect with an Internet Chess Server to play chess against its other users, observe games they are playing, or review games that have recently finished. See }{\f1\uldb ICS Client}{\v\f1 ICSClient}{\f1 Default: False. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 You can create a script file containing ICS commands that WinBoard will type in for you whenever you connect to the ICS. See }{\f1\uldb ICS Logon}{\v\f1 ICSLogon}{\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icshost }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icshost }}}{\f1 /icshost }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 internetChessServerHost }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 internetChessServerHost }}}{\f1 /internetChessServerHost }{\i\f1 hostname}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The host name or numeric address of the Internet Chess Server to connect to when in ICS mode. The default is the empty string, which causes WinBoard to pop up a menu of known ICS sites. The file ics-address{\*\bkmkstart _Hlt386546221}e {\*\bkmkend _Hlt386546221}s.txt in the WinBoard distribution gives slightly more information on these sites. It includes their numeric addresses, which you can use if your site does not have a working name server. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icsport }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icsport }}}{\f1 /icsport }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 internetChessServerPort }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 internetChessServerPort }}}{\f1 /internetChessServerPort }{\i\f1 portnumber}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The port number to use when connecting to a chess server in ICS mode. Default: 5000. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 via }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 via }}}{\f1 /icshelper }{\i\f1 program}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 An external helper program used to communicate with the chess server. Typically }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 timestamp}}}{\i\f1 timestamp}{\f1 for the ICC (chessclub.com) or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super K}{\f1 timeseal}}}{\i\f1 timeseal}{\f1 for FICS (freechess.org, eics.daimi.aau.dk, etc.). This option is shorthand for \ldblquote /useTelnet /telnetProgram }{\i\f1 program}{\f1 \rdblquote }{\b\f1 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 telnet}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 telnet}}}{\f1 /telnet}{\b0\f1 or }{\f1 /xtelnet}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 useTelnet}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 useTelnet}}}{\f1 /useTelnet}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option is poorly named; it should be called }{\b\f1 /useHelper}{\f1 . If set to True, it instructs WinBoard to use an external helper program to communicate with the ICS, as spe cified by the telnetProgram option. The external program must be a pure console application that can communicate with WinBoard through pipes; the Windows telnet application is not suitable. If the option is False (the default), WinBoard communicates with the ICS by opening a Winsock TCP socket and using its own internal implementation of the telnet protocol. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 gateway}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 gateway}}}{\f1 /gateway }{\i\f1 hostname}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set to a host name, WinBoard uses }{\f1\uldb rsh}{\v\f1 rsh}{\f1 to run the telnetProgram remotely on the given host to communicate with the Internet Chess Server instead of using its own internal implementation of the telnet protocol. See the }{\f1\uldb FIREWALLS}{\v\f1 FIREWALLS}{\f1 section below for an explanation of when this option is useful. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 telnetProgram}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 telnetProgram}}}{\f1 /telnetProgram }{\i\f1 program}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option is poorly named; it should be called }{\b\f1 /helperProgram}{\f1 . It gives the name of the remote or external helper program to be used with the gateway or useTelnet option. The default is "telnet". The telnet program is invoked with the value of internetChessServer as the first argument and the v alue of internetChessServerPort as the second argument on its command line. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icscom }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icscom }}}{\f1 /icscom }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 internetChessServerComPort }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 internetChessServerComPort }}}{\f1 /internetChessServerComPort }{\i\f1 name}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set, WinBoard communicates with the Internet Chess Server using a serial communication port instead of a network c onnection. Use this option if your machine is not connected to a network (not even via SLIP or PPP), but you do have Internet access through another machine by dialing in using a modem or by connecting directly to a serial terminal port. Example: \par }\pard\plain \s19\li120\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2 WinBoard /ics /icscom:com1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 After you start WinBoard in this way, type whatever modem commands are necessary to dial out to your Internet provider and log in. You may need to turn off }{\f1\uldb Local Line Editing}{\v\f1 LocalLineEditing}{\f1 on the Options menu while typing commands to the modem, but turn it on again afterwards. Then telnet to the ICS, using a command like "telnet chessclub.com 5000". Important: See the paragraph in the }{ \f1\uldb LIMITATIONS}{\v\f1 LIMITATIONS}{\f1 section below about extra echoes. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 comPortSettings }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 comPortSettings }}}{\f1 /comPortSettings}{\b0\f1 }{\i\f1 \ldblquote dataRate,dataBits,parity,stopBits,flow \rdblquote \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option allows serial port parameters to be set from the command line or a settings file. The values are simply filled in to the }{\f1\uldb Communications}{\v\f1 Communications}{\f1 dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icslogon } }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icslogon }}}{\f1 /icslogon }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 internetChessServerLogonScript }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 internetChessServerLogonScript }} }{\f1 /internetChessServerLogonScript }{\i\f1 filename \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option lets you change the name used for the }{\f1\uldb ICS Logon}{\v\f1 ICSLogon}{\f1 file. Default: "ICS.ini". The filename is interpreted relative to WinBoard's installation directory (the directory containing WinBoard.exe). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autocomm } }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autocomm }}}{\f1 /autocomm }{\b0\f1 or }{\f1 /xautocomm}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autoComment }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autoComment }}}{\f1 /autoComment}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Auto Comment}{\v\f1 AutoCommentCmd}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autoflag } }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autoflag }}}{\f1 /autoflag}{\b0\f1 or }{\f1 /xautoflag}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autoCallFlag }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autoCallFlag }}}{\f1 /autoCallFlag}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Auto Flag}{\v\f1\uldb AutoFlag}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autobs }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autobs }}}{\f1 /autobs}{\b0\f1 or }{\f1 /xautobs}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autoObserve }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autoObserveCmd }}}{\f1 /autoObserve}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Auto Observe}{\v\f1 autoObserveCmd}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 autoKibitz}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 autoKibitz}{\f1 }}}{\f1\cf11 /autoKibitz \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Kibitzes the engines last thinking output (depth, score, time, speed, PV) to the ICS in zippy mode. Show Thinking must be on for this option to work. }{\f1\cf2 Also diverts similar kibitz information of an opponent engine that is playing you through the ICS to the engine-output window, as if the engine was playing locally.}{\f1\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 moves }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 moves }}}{\f1 /moves}{\b0\f1 or }{\f1 /xmoves}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 getMoveList }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 getMoveList }}}{\f1 /getMoveList}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Get Move List}{\v\f1 getMoveListCmd}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 edit}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 edit}}}{\f1 /edit}{\cs58\f1\super }{\b0\f1 or }{\f1 /xedit}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 localLineEditing}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 localLineEditingOption}}}{\f1 /localLineEditing}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Local Line Editing}{\v\f1 localLineEditing}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 quiet }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 quiet }}}{\f1 /quiet }{\b0\f1 or }{\f1 /xquiet}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 quietPlay }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 quietPlay }}}{\f1 /quietPlay}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Quiet Play}{\v\f1 quietPlayCmd}{\f1 option. Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 seekGraph (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_seekGraph }}}{\f1\cf5 /seekGraph }{\i\f1\cf5 true|false}{\b0\f1\cf5 , or }{ \cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{\f1\cf5 sg (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_sg}}}{\f1\cf5 /sg \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Enables summoning up of the }{\f1\uldb\cf5 Seek Graph}{\f1\cf5 by left-clicking the board. Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 autoRefresh (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_autoRefresh }}}{\f1\cf5 /autoRefresh }{\i\f1\cf5 true|false}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the }{\f1\uldb\cf5 Auto Refresh}{\v\f1\cf5 BlindfoldCmd}{\f1\cf5 option of the }{\f1\uldb\cf5 Seek Graph}{\f1\cf5 . Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 backgroundObserve (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_backgroundObserve }}}{\f1\cf5 /backgroundObserve }{\i\f1\cf5 true|false}{ \f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the }{\f1\uldb\cf5 Background Observe}{\v\f1\cf5 BlindfoldCmd}{\f1\cf5 option for observing other games during play. Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 dualBoard (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_dualBoard }}}{\f1\cf5 /dualBoard }{\i\f1\cf5 true|false}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the }{\f1\uldb\cf5 Dual Board}{\v\f1\cf5 BlindfoldCmd}{\f1\cf5 option for observing your partner\rquote s bughouse game. Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 blindfold (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 opt_blindfold }}}{\f1 /blindfold }{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Blindfold}{\v\f1 BlindfoldCmd}{\f1 option. Default: False \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ pre}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ pre}}}{\f1 /pre }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ xpre}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ xpre}}}{\f1 /xpre}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premove (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premove}}}{\f1 /p remove}{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Premove}{\v\f1 PremoveCmd}{\f1 option. If set to True, the premove feature is enabled. If set to False, premove is disabled and the other }{\f1\uldb Premove}{\v\f1 PremoveCmd}{\f1 settings are ignored. Default: False. \par }\pard\plain \s2\li115\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ preWhite}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ preWhite}}}{\f1 /prewhite }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ xpreWhite}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ xpreWhite}}}{\f1 /xprewhite}{\b0\f1 , or }{\cs58\f1\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premoveWhite}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premoveWhite}}}{\f1 /premoveWhite}{\i\f1 true|false \par }\pard \s2\li115\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premoveWhiteText}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premoveWhiteText}}}{\f1 /premoveWhiteText}{\i\f1 movetext \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If }{\b\f1 premoveWhite}{\f1 is set to True and you are playing white in an ICS game, the text specified by the }{\b\f1 premoveWhiteText}{\f1 option is sent to the ICS as soon as the game starts. These options can be set from the }{\f1\uldb Premove}{\v\f1 PremoveCmd}{\f1 section of the }{\f1\uldb ICS Options}{\v\f1\uldb ICSOptions}{\f1 dialog box. The default for }{\b\f1 premoveWhite}{\f1 is False. \par }\pard\plain \s2\li115\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ preBlack}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ preBlack}}}{\f1 /preblack }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ xpreBlack}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ xpreBlack}}}{\f1 /xpreblack}{\b0\f1 , or }{\cs58\f1\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premoveBlack}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premoveBlack}}}{\f1 /premoveBlack}{\i\f1 true|false \par }\pard \s2\li115\sa120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premoveBlackText}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premoveBlackText}}}{\f1 /premoveBlackText}{\i\f1 movetext \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If }{\b\f1 premoveBlack}{\f1 is set to True and you are playing black in an ICS game, the text specified by the }{\b\f1 premoveBlackText}{\f1 option is sent to the ICS as soon as the first move is received from your opponent, even if you make a different premove on the board before the first white move is received. These options can be set from the }{\f1\uldb Premove}{\v\f1 PremoveCmd}{\f1 section of the }{\f1\uldb ICS Options}{\v\f1\uldb ICSOptions}{\f1 dialog box. The default for }{\b\f1 premoveBlack}{\f1 is False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 \'f2neClickMove (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_oneClickMove }}}{\f1\cf5 /oneClickMove }{\i\f1\cf5 true|false}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the }{\f1\uldb\cf5 One-ClickMove}{\v\f1\cf5 BlindfoldCmd}{\f1\cf5 option. Default: False \par }\pard\plain \li115\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \f5\fs20\cgrid {\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ alarm}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ alarm}}}{\b /alarm }{or}{\b }{\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\super K}{ xalarm}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ xalarm}}}{\b /xalarm}{, or }{\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ icsAlarm}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ icsAlarm}}}{\b /icsAlarm }{\b\i true|false}{\b \par }\pard \li115\sa120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ icsAlarmTime}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ icsAlarmTime}}}{\b /icsAlarmTime }{\b\i milliseconds \par }\pard \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright {When }{\b icsAlarm}{ is set to True, the }{\uldb alarm sound}{\v soundIcsAlarm}{ is played when your clock counts down to }{\b icsAlarmTime}{ seconds. For ICS games with time controls that include an increment, the alarm will sound each time the clock counts down to the }{\b icsAlarmTime}{. The }{\b icsAlarmTime}{ can be set by selecting }{\uldb ICS Alarm}{\v ICSAlarm}{ from the }{\uldb ICS options}{\v\uldb ICSOptions}{ dialog. The default is 5 seconds. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 keepAlive }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 keepAlive }}}{\f1\cf2 /keepAlive }{\i\f1\cf2 time}{\f1\cf2 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 When }{\i\f1\cf2 time}{\f1\cf2 is non-zero, send a \ldblquote date\rdblquote command every }{\i\f1\cf2 time}{\f1\cf2 minutes after your last move to the ICS, to prevent it from logging you off. (Do not use frivolously! The ICS operator might ban you.) Default: 0.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 chatBoxes (option)}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 opt_chatBoxes }}}{\f1\cf5 /chatBoxes }{\i\f1\cf5 handles}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 Sets the list of }{\f1\uldb\cf5 Chat Windows}{\v\f1\cf5 BlindfoldCmd}{\f1\cf5 to be opened at startup. The given string }{\i\f1\cf5 handles}{\f1\cf5 should be a semicolon-separated list, like \ldblquote shouts;53;Johnny\rdblquote to open 3 chat boxes, to capture all shouts (including c-shouts and \lquote it\rquote messages), the traffic on channel 53, and for a player named Johnny. Default: no chat windows. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20\cf5 \page }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Load and Save Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Load and Save Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 LoadandSaveOptions}}}{\b0\f1\fs18\up6 }{ \f1\fs20 Load and Save Options \par }\pard\plain \s2\li115\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 lgf }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 lgf }}}{\f1 /lgf }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 loadGameFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 loadGameFile }}}{\f1 /loadGameFile }{\i\f1 filena me}{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 lgi }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 lgi }}}{\f1 /lgi }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 loadGameIndex }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 loadGameIndex }}}{\f1 /loadGameIndex }{\i\f1 N}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If loadGameFile is set, WinBoard reads the specified game file at startup. You can leave out the name of this option and give just the file name, which is handy if you want to configure WinBoard as a game viewer with a bro wser such as the Windows Explorer or Netscape. The filename is interpreted relative to WinBoard's initial working directory. The filename "-" specifies the standard input. If there is more than one game in the file, WinBoard pops up a menu of the availabl e games, with entries based on their PGN tags. If loadGameIndex is set to }{\i\f1 N, }{\f1 the menu is suppressed and the }{\i\f1 N}{\f1 th game found in the file is loaded immediately. An index value of \endash 1 will cause automatic stepping through the games in match mode, a value of \endash 2 will use each game twice before stepping to the next. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 td }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 td }}}{\f1 /td }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 timeDelay }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 timeDelay }}}{\f1 /timeDelay }{\i\f1 seconds}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Time delay between moves during }{\f1\uldb Load Game}{\v\f1 LoadGame}{\f1 . Fractional seconds are allowed; try 0.4. A time delay value of -1 tells WinBoard not to step through game files automatically. Default: 1 second. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 sgf }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 sgf }}}{\f1 /sgf }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 saveGameFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 saveGameFile }}}{\f1 /saveGameFile }{\i\f1 filename}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set, WinBoard appends a record of every game played to the specified file. The filename is interpreted relative to WinBoard's initial working directory. The filename "-" specifies the standard output. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autosave } }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autosave }}}{\f1 /autosave}{\b0\f1 or }{\f1 /xautosave}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 autoSaveGames }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 autoSaveGames }}}{\f1 /autoSaveGames}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is True, at the end of every game WinBoard prompts you for a filename and appends a record of the game to the file you specify. Ignored if saveGameFile is set. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 lpf}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 lpf}}}{\f1 /lpf }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 loadPositionFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 loadPositionFile }}}{\f1 /loadPositionFile }{ \i\f1 filename}{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 lpi }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 lpi }}}{\f1 /lpi }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 loadPositionIndex }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 loadPositionIndex }}}{\f1 /loadPositionIndex }{\i\f1 N}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If loadPositionFile is set, WinBoard loads the specified position file at startup. The filename is interpreted relative to WinBoard's initial working directory . The filename "-" specifies the standard input. If loadPositionIndex is set to }{\i\f1 N}{\f1 , the }{\i\f1 N}{\f1 th position found in the file is loaded; otherwise the first is loaded. An index value of \endash 1 will cause automatic stepping through the positions in math mode, a value of \endash 2 will use each position twice before stepping to the next. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 spf }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 spf }}}{\f1 /spf }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 savePositionFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 savePositionFile }}}{\f1 /savePositionFile }{ \i\f1 filename}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set, WinBoard appends the final position reached in every game played to the specified file. The filename is interpreted relative to W inBoard's initial working directory. The file name "-" specifies the standard output. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 pgnExtendedInfo}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 pgnExtendedInfo}{\f1 }}}{\f1\cf6 /pgnExtendedInfo }{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If this option is set, WinBoard saves depth, score and time used for each move that the engine found as a comment in the PGN file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 pgnEventHeader}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 pgnEventHeader}{\f1 }}}{\f1\cf6 /pgnEventHeader }{\i\f1\cf6 string}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the name used in the PGN event tag to }{\i\f1\cf6 string}{\f1\cf6 . \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 saveOutOfBookInfo}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 saveOutOfBookInfo}}}{\f1\cf6 /saveOutOfBookInfo }{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Include the information on how the engine(s) game out of its opening book in a special \lquote annotator\rquote tag with the PGN file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 oldsave }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 oldsave }}}{\f1 /oldsave }{\b0\f1 or }{\f1 /xoldsave}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 oldSaveStyle }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 oldSaveStyle }}}{\f1 /oldSaveStyle}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is False (the default), WinBoard saves games in PGN (portable game notation) and positions in FEN (Forsythe-Edwards notation). If the option is True, a save style that is compatible with older versions of WinBoard (a nd of xboard) is used instead. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 debug}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 debug}}}{\f1 /debug}{\b0\f1 or }{\f1 /xdebug}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 debugMode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 debugMode}}}{\f1 /debugMode}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Writes debugging information to the file \ldblquote WinBoard.debug\rdblquote , including all commands sent to the chess engine, all output received from it, and all commands sent to ICS. You can press Ctrl+Alt+F12 to turn this option on or off while WinBoard is running. Each time you turn it on, any existing debug file is overwritten. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 debugFile}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 debugFile}{\f1 }}}{\f1\cf6 /debugFile}{\cs58\f1\cf6\super }{\f1\cf6 }{\i\f1\cf6 filename}{ \f1\cf6 }{\b0\f1\cf6 or}{\f1\cf6 }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 nameOfDebugFile}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 nameOfDebugFile}{\f1 }}}{\f1\cf6 /nameOfDebugFile}{\i\f1\cf6 filename}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the name of the file to which WinBoard saves debug information (including all communication to and from the engines). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 engineDebugOutput}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 engineDebugOutput}{\f1 }}}{\f1\cf11 /engineDebugOutput}{\cs58\f1\cf11\super }{ \f1\cf11 }{\i\f1\cf11 number}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Specifies how WinBoard should handle unsolicited output from the engine, with respect to saving it in the debug file. The output is further (hopefully) ignored. If }{ \i\f1\cf11 number}{\f1\cf11 =0, WinBoard refrains from writing such spurious output to the debug file. If}{\i\f1\cf11 number}{\f1\cf11 =1, all engine output is written faithfully to the debug file. If }{\i\f1\cf11 number}{\f1\cf11 =2, any protocol-violating line is prefixed with a \lquote #\rquote character, as the engine itself should have done if it wanted to submit info for inclusion in the debug file. }{\f1\cf5 The case }{\i\f1\cf5 number}{\f1\cf5 =3 is similar, but now marks non-compliant engine output with a more conspicuous prefix.}{\f1\cf11 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf11 This option is provided for the benefit of applications that use the debug fi le as a source of information, such as the broadcaster of live games TLCV / TLCS. Such applications can be protected from spurious engine output that might otherwise confuse them. \par }{ \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 User Interface Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 User Interface Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 UserInterfaceOptions}}}{\b0\f1\fs18\up6 }{\f1\fs20 User Interface Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 language}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 language}}}{\f1\cf5 /language}{\i\f1\cf5 filename}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 This persistent option lets WinBoard load a \lquote language file\rquote with the given }{\i\f1\cf5 filename}{\f1\cf5 , which can contain translation lines of the form \ldblquote english text\rdblquote === \ldblquote translated text\rdblquote . WinBoard will then perform the indicated substitutions in its menus, dialogs, and displayed messages. If the }{\i\f1\cf5 filename}{\f1\cf5 does not contain a period, the extension \ldblquote .lng\rdblquote will be appended to it before use. If a file of the given }{\i\f1\cf5 filename}{\f1\cf5 does not exist, no translation will take place, which can be used to switch WinBoard back to English. A full Spanish translation is available through the file espa\'f1 ol.lng. More translation are expected to become available soon, and of course you could make your own by changing the translations in an existing one to the language of your choice. Default: no translation. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 firstLogo}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 firstLogo}}}{\f1\cf2 /firstLogo }{\i\f1\cf2 filename}{\f1\cf2 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 secondLogo}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 secondLogo}}}{\f1\cf2 /secondLogo }{\i\f1\cf2 filename}{\f1\cf2 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 The appearance of either of these options causes WinBoard to reserve space for displaying logos on both sides of the clocks. Normally the first logo goes left, the second right, unless the option \lquote swap clocks\rquote is in effect. The }{\i\f1\cf2 filename}{\f1\cf2 must refer to a bitmap file (.bmp) containing a logo for the particular player (usually a 130x65 or 100x50 bitmap, which will be scaled to the height of two clock lines.) \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 autoLogo}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 autoLogo}}}{\f1\cf2 /autoLogo}{\i\f1\cf2 true|false}{\f1\cf2 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 When true, causes WinBoard to automatically supply a logo for the first and second chess program, by looking for a file named logo.bmp in the engine directory (as specified by the /fd or /sd option), and then displays it like this file was given as an argument to the /firstLogo or /secondLogo option. In this mode it will also look in a sub-folder of its installation folder called \ldblquote logos\rdblquote , for finding logos with names corresponding to the ICS (e.g. \ldblquote chessclub.com.bmp\rdblquote ) or to the human user, should they be involved in a game. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 hideThinkingFromHuman}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 hideThinkingFromHuman}}}{\f1\cf6 /hideThinkingFromHuman}{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Prevents the engine thinking output to appear in the display, without necessitating to suppress the sending of this information altogether (so it can still appear in the PGN). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{ \f1\cf2 noGUI}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 noGUI}}}{\f1\cf2 /noGUI \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 Suppresses all GUI functions of WinBoard (to speed up automated ultra-fast engine-engine games, which you don\rquote t want to watch). There will be no board or clock updates, no printing of moves, and no update of the icon on the task bar in this mode.}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 pieceNickNames}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 pieceNickNames}}}{\f1\cf5 /pieceNickNames }{\i\f1\cf5 string}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 A volatile option that allows the user to set al ternative characters by which the pieces could be recognized in FEN or SAN. Does not affect FEN or SAN output. This can be useful to load games and positions given in other languages. Piece indicators in FEN and SAN are first matched to the letters in the given }{\i\f1\cf5 string}{\f1\cf5 ; when this match fails, they are matched against the default names. The format of string is the same as that of the /pieceToCharTable option; you can only set a single alternative for each piece. Will only be applied in the variant active when WinBoard was started up. Default value: no nicknames. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 colorNickNames}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 colorNickNames}}}{\f1\cf5 /colorNickNames }{\i\f1\cf5 string}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 A volatile option that allows the user to set alternative characters by which the side to move could be indicated in FEN. Does not affect FEN output. This can be useful to loa d positions given in other languages, or for variants using non-compliant color indicators. The color field in a FEN is first matched to the letters in the given }{\i\f1\cf5 string}{\f1\cf5 ; when this match fails, they are matched against the default names. The first character of }{\i\f1\cf5 string}{\f1\cf5 will be recognized as white, the second as black. Default value: no nicknames. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 top}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 top}}}{\f1 /top }{\b0\f1 or }{\f1 /xtop}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 alwaysOnTop}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 alwaysOnTopOpt}}}{\f1 /alwaysOnTop}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Always On Top}{\v\f1 AlwaysOnTop}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 queen}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 queen}}}{\f1 /queen}{\b0\f1 or }{\f1 /xqueen}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 alwaysPromoteToQueen}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 alwaysPromoteToQueen}}}{\f1 /alwaysPromoteToQueen}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Always Queen}{\v\f1 AlwaysQueen}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 drag}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 drag}}}{\f1 /drag}{\b0\f1 or }{\f1 /xdrag}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 animateDragging}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 animateDraggingOpt} }}{\f1 /animateDragging}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Animate Dragging}{\v\f1 animateDragging}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 animate}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 animate}}}{\f1 /animate }{\b0\f1 or }{\f1 /xanimate}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 animateMoving}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 animateMovingOpt}}}{ \f1 /animateMoving}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Animate Moving}{\v\f1 animateMoving}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 flip}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 flip}}}{\f1 /flip }{\b0\f1 or }{\f1 /xflip}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 flipView}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 flipViewOption}}}{\f1 /flipView}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If Auto Flip View is not set, or if you are observing but not participating in a game, then the positioning of the board at the start of each game depends on the flipView opti on. If flipView is False (the default), the board is positioned so that the white pawns move from the bottom to the top; if True, the black pawns move from the bottom to the top. In any case, the }{\f1\uldb Flip View}{\v\f1 FlipView}{\f1 menu command can be used to flip the board after the game starts \par }\pard\plain \li115\sb120\sa60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ autoflip}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ autoflip}}}{\b /autoflip}{ or }{\b /xautoflip}{, or }{\cs58\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ autoFlipView}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ autoFlipViewOption}}}{\b /autoFlipView }{\b\i true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Auto Flip View}{\v\f1 AutoFlipView}{\f1 option. Default: True. \par }\pard\plain \li115\sb120\sa60\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\b\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ autoraise}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ autoraise}}}{\b /autoraise}{ or }{\b /xautoraise}{, or }{\cs58\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ autoRaiseBoardOption}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ autoRaiseBoardOption}}}{\b /autoRaiseBoard }{\b\i true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Auto Raise Board}{\v\f1 AutoFlipView}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 highdrag}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 highdrag}}}{\f1 /highdrag }{\b0\f1 or }{\f1 /xhighdrag}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 highlightDragging\tab \tab }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 highlightDraggingOpt}}}{\f1 /highlightDragging }{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Highlight Dragging}{\v\f1 highlightDragging}{\f1 option. }{\f1\cf5 Must be on for /showTargetSquares to work.}{\f1 Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 showTargetSquares\tab \tab }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 showTargetSquaresOpt}}}{\f1\cf5 /showTargetSquares }{\i\f1\cf5 true|false}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 When set, causes WinBoard to mark all squares the piece you \lquote pick up\rquote can legally move to with big fat dot, in different colors for captures and non-captures. }{\f1\uldb\cf5 Highlight Dragging}{\v\f1\cf5 highlightDragging}{\f1\cf5 must be on for this to work. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 dropMenu\tab \tab }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 dropMenuOpt}}}{\f1\cf5 /dropMenu }{\i\f1\cf5 true|false}{\f1\cf5 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 When set, the right mouse button use d on the board will call up a context menu, (old behavior) rather than allowing you to walk the latest engine PV (new behavior). Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 highlight} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 highlight}}}{\f1 /highlight }{\b0\f1 or }{\f1 /xhighlight}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 highlightLastMove}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 highlightLastMoveOpt}}}{\f1 /highlightLastMove}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Highlight Last Move}{\v\f1 highlightLastMoveOpt}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 popup}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 popup}}}{\f1 /exit}{\b0\f1 or }{\f1 /xexit}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 popupMoveErrors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 popupMoveErrorsOpt} }}{\f1 /popupExitMessage}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Popup Exit Message}{\v\f1 popupExitMessageCmd}{\f1 menu option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 popup}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 popup}}}{\f1 /popup}{\b0\f1 or }{\f1 /xpopup}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 popupMoveErrors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 popupMoveErrorsOpt} }}{\f1 /popupMoveErrors}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Popup Move Errors}{\v\f1 popupMoveErrorsCmd}{\f1 menu option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 coords }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 coords }}}{\f1 /coords }{\b0\f1 or }{\f1 /xcoords}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 showCoords}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 showCoords}}}{\f1 /showCoords}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Show Coords}{\v\f1 showCoords}{\f1 option. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 legal }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 legal }}}{\f1 /legal }{\b0\f1 or }{\f1 /xlegal}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 testLegality }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 testLegality }}}{\f1 /testLegality}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Test Legality}{\v\f1 testLegalityCmd}{\f1 option. Default: True. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 size }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 size }}}{\f1 /size }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 boardSize }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 boardSize }}}{\f1 /boardSize }{\i\f1 sizename}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the }{\f1\uldb Board Size}{\v\f1 BoardSizeCmd}{\f1 option. Also chooses which board size any following Font options will affect. The default is the largest size that will fit on your screen. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ wpc}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ wpc}}}{\f1 /wpc}{\b0\f1 or }{\cs58\b0\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 whitePieceColor}}}{\cs58\f1\super #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 whitePieceColor}}}{\f1 /whitePieceColor }{\i\f1 color \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ bpc}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\super #}{ bpc}}}{\f1 /bpc }{\b0\f1 or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 blackPieceColor}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 blackPieceColor}}}{\f1 /blackPieceColor }{\i\f1 color\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ lsc}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ lsc}}}{\f1 /lsc }{\b0\f1 or}{\i\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 lightSquareColor}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 lightSquareColor}}}{\f1 /lightSquareColor }{\i\f1 color}{\cs58\f1\super }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ dsc}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ dsc}}}{\f1 /dsc }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super K}{\f1 darkSquareColor}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 darkSquareColor}}}{\f1 /darkSquareColor }{\i\f1 color}{\cs58\f1\super }{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Color specifications for white pieces, black pieces, light squares, and dark squares. Colors can be specified only by red/green/blue intensity, either in hexadecimal (as }{ \i\f1 #rrggbb}{\f1 ) or in decimal (as }{\i\f1 rrr,ggg,bbb}{\f1 ). In the latter format, you must enclose the string in quotation marks if you leave spaces after the commas. The defaults are respectively #FFFFCC, #202020, #C8C365, and #77A26D. Available on the }{\f1\uldb Board Colors}{\v\f1 BoardColors}{\f1 section of the }{\f1\uldb Board Options}{\v\f1 BoardOptions}{\f1 dialog. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you are using a }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 grayscale} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 grayscale}}}{\f1 grayscale monitor, try setting the colors to: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\fs20 -whitePieceColor:#FFFFFF\line -blackPieceColor:#000000\line -lightSquareColor:#CCCCCC\line -darkSquareColor:#999999 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ hsc}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ hsc}}}{\f1 /hsc }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 highlightSquareColor}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 highlightSquareColor}}}{\f1 /highlightSquareColor }{\i\f1 color}{ \cs58\f1\super }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ phc}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ phc}}}{\f1 /phc }{\b0\f1 or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 premoveHighlightColor}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 premoveHighlightColor}}}{\f1 /premoveHighlightColor }{\i\f1 color}{\cs58\f1\super }{\f1 \par }{\b0\f1 Color specifications for the }{\b0\f1\uldb Highlight Last Move}{\b0\v\f1 HighlightLastMove}{\b0\f1 and }{\b0\f1\uldb Premove}{\b0\v\f1 PremoveCmd}{\b0\f1 options, respectively. Colors can be specified only by red/green/blue intensity, either in hexadecimal (as }{\b0\i\f1 #rrggbb}{\b0\f1 ) or in decimal (as }{\b0\i\f1 rrr,ggg,bbb}{\b0\f1 ). In the latter format, you must enclose the string in quotation marks if you leave spaces after the commas. The defaults are respectively #FFFF00 and #FF0000, respectively. \par }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 mono }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 mono }}}{\f1 /mono}{\b0\f1 or }{\f1 /xmono}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 monoMode}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 monoMode}}}{\f1 /monoMode}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Determines whether WinBoard displays its pieces and squares in black and white (True) or color (False, the default). Available in the }{\f1\uldb Board Colors}{\v\f1 BoardColors}{\f1 section of the }{\f1\uldb Board Options}{\v\f1 BoardOptions}{\f1 dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 flipBlack}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 flipBlack}{\f1 }}}{\f1\cf11 /flipBlack}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Determines whether Win Board displays the black pieces upside down (or the white pieces in Flip View). Useful with Shogi with the traditional Japanese pieces, which are not distinguished by color but by orientation. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 allWhite}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 allWhite}{\f1 }}}{\f1\cf11 /allWhite}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Determines whether the white piece bitm aps will be used to display black pieces. The white pieces have a dark outline, which the black pieces lack. This makes the latter look vague if the color you give them is not very dark. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 renderPiecesWithFont}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 renderPiecesWithFont}{\f1 }}}{\f1\cf6 /renderPiecesWithFont }{\i\f1\cf6 fontname} {\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Uses the named true-type font to re nder the pieces, rather than the built-in bitmaps. The font must be installed on your computer. If the name starts with a * it is ignored, allowing you to easily disable a font temporarily in the whinboard.ini file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 fontPieceToCharTable}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fontPieceToCharTable}{\f1 }}}{\f1\cf6 /fontPieceToCharTable }{\i\f1\cf6 characterstring}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If font-based rendering of the pieces is used, this table specifies which character of the font alphabet should be used for which piece. The format of the character strings is the same as that of the argument of /pieceToCharTable. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 fontPieceSize}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 fontPieceSize}{\f1 }}}{\f1\cf6 /fontPieceSize }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 The number gives the size of the piece, as a percentage of the square size. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{\f1\cf6 fontPieceBackColorWhite}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\cf6 fontPieceBackColorWhite}}}{\f1\cf6 /fontPieceBackColorWhite }{\i\f1\cf6 color\line }{ \cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{\f1\cf6 fontPieceForeColorWhite}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\cf6 fontPieceForeColorWhite}}}{\f1\cf6 /fontPieceForeColorWhite }{\i\f1\cf6 color\line }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{\f1\cf6 fontPieceBackColorBlack}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\cf6 fontPieceBackColorBlack}}}{\f1\cf6 /fontPieceBackColorBlack }{\i\f1\cf6 color\line }{\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super K}{ }{\f1\cf6 fontPieceForeColorBlack}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\super #}{ }{\f1\cf6 fontPieceForeColorBlack}}}{\f1\cf6 /fontPieceForeColorBlack }{\i\f1\cf6 color}{\cs58\f1\cf6\super }{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Color specifications for white pieces, black pieces that are generated with font-based rendering. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 liteBackTextureFile}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 liteBackTextureFile}{\f1 }}}{\f1\cf6 /liteBackTextureFile }{\i\f1\cf6 filename}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 darkBackTextureFile}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 darkBackTextureFile}{\f1 }}}{\f1\cf6 /darkBackTextureFile }{\i\f1\cf6 filename}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 The filename indicates a bitmap file that should be used to display the light or dark squares, allowing you to make boards that look like wood, marble, etc. A filename starting with * is ignored. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 liteBackTextureMode}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 liteBackTextureMode}{\f1 }}}{\f1\cf6 /liteBackTextureMode }{\i\f1\cf6 number}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 darkBackTextureMode}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 darkBackTextureMode}{\f1 }}}{\f1\cf6 /darkBackTextureMode }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf6 The number indicates the way the files given in the background-texture options should be used to fill in the squares.}{\cf6\lang1043\cgrid0 Valid texture mod es are 1 (default) and 2. In mode 1 the squares are taken from portions of the texture bitmap and copied without further processing. In mode 2, squares can also be rotated, mirrored and so on in order to provide a little more variety to the texture. The o perations are selected at random so the board will look slightly different every time the program is run.\line }{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 overideLineGap}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 overideLineGap}{\f1 }}}{\f1\cf6 /overideLineGap }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 The number specifies the width, in pixels, of the grid lines used to separate the squares. If it is very small (like a singl e pixel), it becomes vey hard to see which squares are highlighted (to indicate the last move), as this highlighting is a color change of these grid lines. Highlighting the moves with an arrow is then recommended. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 highlightMovesWithArrow}{\f1 }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 highlightMovesWithArrow}{\f1 }}}{\f1\cf6 /highlightMovesWithArrow }{ \i\f1\cf6 true|false}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If this option is true, a big, fat arrow is drawn to indicate the last move. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 highlightArrowColor}{\f1 }} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 highlightArrowColor}{\f1 }}}{\f1\cf6 /highlightArrowColor }{\i\f1\cf6 color}{ \f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Specifies the color of the arrow that highlights the moves. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 evalHistoColorWhite}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 evalHistoColorWhite}{\f1 }}}{\f1\cf6 /evalHistoColorWhite }{\i\f1\cf6 color}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 evalHistoColorBlack}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 evalHistoColorBlack}{\f1 }}}{\f1\cf6 /evalHistoColorBlack }{\i\f1\cf6 color}{\f1\cf6 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf6 Specifies the colors to be used to plot the white and black scores in the evaluation graph}{\cf6\lang1043\cgrid0 .\line }{ \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorShout }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorShout}}}{\f1 /colorShout}{\i\f1 \ldblquote effects color\rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorSShout}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorSShout}}}{\f1 /colorSShout }{\i\f1 \ldblquote effects color\rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorChannel1}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorChannel1}}}{\f1 /colorChannel1 }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorChannel}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorChannel}}}{\f1 /colorChannel }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorKibitz}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorKibitz}}}{\f1 /colorKibitz }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorTell}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorTell}}}{\f1 /colorTell }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorChallenge}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorChallenge}}}{\f1 /colorChallenge }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorRequest}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorRequest}}}{\f1 /colorRequest }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorSeek}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorSeek}}}{\f1 /colorSeek }{\i\f1 \ldblquote effects color\rdblquote }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorNormal}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorNormal}}}{\f1 /colorNormal }{\i\f1 \ldblquote effects color\rdblquote \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Select colors and effects to colorize messages in the ICS Interaction window. The effects may be any combination of }{\b\f1 b}{\f1 old, }{\b\f1 i}{\f1 talic, }{\b\f1 u}{ \f1 nderline, and }{\b\f1 s}{\f1 trikeout. Colors are specified as for squares and pieces. Available on the }{\f1\uldb ICS Interaction Colors}{\v\f1 ICSInteractionColors}{\f1 section of the }{\f1\uldb ICS Options}{\v\f1 ICSOptions}{\f1 dialog. Limitation: On 256 color displays, Windows chooses the nearest solid color from the system palette, which will not always be close to the color you selected. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorBackground}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorBackground}}}{\f1 /colorBackground }{\i\f1 color \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the background color for the ICS Interaction window. Available on the }{\f1\uldb ICS Interaction Colors}{\v\f1 ICSInteractionColors}{\f1 section of the }{\f1\uldb ICS Options}{\v\f1 ICSOptions}{\f1 dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorize}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorize}}}{\f1 /colorize}{\cs58\f1\super }{\b0\f1 or }{\f1 /xcolorize}{\b0\f1 , or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 colorizeMessages}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 colorizeMessages}}}{\f1 /colorizeMessages}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If True, WinBoard colorizes messages in the ICS Interaction window with the colors listed above. Default: True. Available in the }{\f1\uldb ICS Interaction Colors}{\v\f1 ICSInteractionColors}{\f1 section of the }{\f1\uldb ICS Options}{\v\f1 ICSOptions}{\f1 dialog. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 clockFont} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 clockFont}}}{\f1 /clockFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 messageFont}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 messageFont }}}{\f1 /messageFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 coordFont}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 coordFont}}}{\f1 /coordFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 tagsFont}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 tagsFont}}}{ \f1 /tagsFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 commentFont}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 commentFont}}}{\f1 /commentFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icsFont}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icsFont}}}{\f1 /icsFont \ldblquote }{\i\f1 fontname:size effects}{\f1 \rdblquote \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The fonts used respectively for the clocks, the message display line, rank and file coordinate labels, the Edit Tags dialog, the Edit Comment dialog, and the ICS Interaction window. These options may be given more than once. Each occurrence a ffects the fonts for the current board size; that is, the size given in the last preceding /boardSize option, if any, or else the default size. The font size may contain a decimal point, and the effects may be any combination of }{\b\f1 b}{\f1 old, }{ \b\f1 i}{\f1 talic, }{\b\f1 u}{\f1 nderline, and }{\b\f1 s}{\f1 trikeout. Example: }{\f2\fs16 /clockFont="Arial:20.0 bi".}{\f1 Available on the }{\f1\uldb Fonts}{\v\f1 Fonts}{\f1 menu.}{\f2\fs16 \par }\pard\plain \s2\li115\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundShout}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundShout}}}{ /soundShout}{\i sound\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundSShout}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundSShout}}}{ /soundSShout }{\i sound\line }{ \cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundChannel1}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundChannel1}}}{ /soundChannel1 }{\i sound}{\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundChannel}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundChannel}}}{ /soundChannel }{\i sound}{\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundKibitz}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundKibitz}}}{ /soundKibitz }{\i sound}{\line }{ \cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundTell}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super #}{\f1 soundTell}}}{ /soundTell }{\i sound}{\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundChallenge}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundChallenge}}}{ /soundChallenge }{\i sound}{\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundRequest}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundRequest}}}{ /soundRequest }{\i sound}{\line }{\cs58\f1\super K {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundMove}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{ \f1 soundMove}}}{ /soundMove }{\i sound}{\cs58\f1\super }{\line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundBell}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundBell}}}{ /soundBell }{\i sound}{\cs58\f1\super }{ \par }\pard \s2\li115\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundIcsWin}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundIcsWin}}}{\f1 /soundIcsWin }{\i\f1 sound}{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundIcsLoss}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundIcsLoss}}}{\f1 /soundIcsLoss }{\i\f1 sound}{\cs58\f1\super }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundIcsDraw}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundIcsDraw}}}{\f1 /soundIcsDraw }{\i\f1 sound}{\cs58\f1\super }{\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{ \f1 soundIcsUnfinished}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundIcsUnfinished}}}{\f1 /soundIcsUnfinished }{\i\f1 sound}{\cs58\f1\super }{\f1 \par }\pard \s2\li115\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 soundIcsAlarm}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 soundIcsAlarm}}}{\f1 /soundIcsAlarm }{\i\f1 sound}{\cs58\f1\super }{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Associate sounds with WinBoard events. Most of the events are the same ones that cause text colorization. In addition, }{\b\f1 soundMove}{\f1 is played if a chess engine or another player makes a move. }{\b\f1 SoundBell}{\f1 is played if the chess server sends an ASCII BEL character (Ctrl+G). Available on the }{\f1\uldb Sounds}{\v\f1 Sounds}{\f1 menu. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\b SoundIcsWin}{, }{\b soundIcsLoss}{, }{\b soundIcsDraw}{ and }{\b soundIcsUnfinished}{ are played at the conclusion of an ICS game. The result of the game determines which sound is played. \par }{\b SoundIcsAlarm}{ is played when your game clock counts down to }{\uldb icsAlarmTime}{\v\uldb icsAlarmTime}{. \par }\pard \li120\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480\adjustright {\f1 The }{\i\f1 sound}{\f1 argument may be one of the following: \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls2\adjustright {\f1 The name of a }{\f2 .wav}{\f1 file. The filename is interpreted relative to WinBoard's installation directory (the directory containing WinBoard.exe). \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls2\adjustright {\f2 $}{ \f1 , indicating the default system sound. \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls2\adjustright {\f2 !}{ \f1 followed by the name of a built-in WinBoard wave resource. \par {\pntext\pard\plain\f3\fs20\lang1033\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls2\adjustright {\f2 !}{ \f1 alone, or \ldblquote \rdblquote (empty string), indicating silence. \par }\pard \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright {\f1 The default for soundMove and soundBell is }{\f2 $}{\f1 , while the others default to silence. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icsMenu}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icsMenu}}}{\f1 /icsMenu=\{}{\i\f1 entries}{\f1 \} }{\b0\f1 or }{\f1 /icsMenu=@}{\i\f1 filename \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option lets you customize the right-button }{\f1\uldb context menu}{\v\f1 ICSInteractionContextMenu}{\f1 that is available in the upper (output) pane of the ICS Interaction window. It consists of a list of menu entries, one per line. If the option value starts with an @ sign, it is the name of a file that contains the entries. Each entry contains either f our fields separated by commas or the single character }{\f2 "-"}{\f1 . The fields are: \par {\pntext\pard\plain\f5\fs20\lang1033\cgrid \hich\af5\dbch\af0\loch\f5 1.\tab}}\pard\plain \fi-360\li480\sb80\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls14\adjustright \f5\fs20\cgrid {The menu text. If this field begins with }{\f2 "|"}{, the item begins a new column in the menu and the }{\f2 "|"}{ is not shown. If this field contains an }{\f2 "&"}{, the character after the ampersand is underlined in the menu and acts as a keyboard shortcut for the item when the menu is displayed. Do not assign the same shortcut key to two different menu items. \par {\pntext\pard\plain\s26 \f1\fs20\lang1033\cgrid \hich\af1\dbch\af0\loch\f1 2.\tab}}\pard\plain \s26\fi-360\li480\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls14\adjustright \f5\fs20\cgrid {\f1 Text to insert into the input pane. The text cannot include a comma. You can use ICS aliases to get around this limitation. \par {\pntext\pard\plain\s26 \f1\fs20\lang1033\cgrid \hich\af1\dbch\af0\loch\f1 3.\tab}}\pard \s26\fi-360\li480\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls14\adjustright {\f1 A flag (1 or 0) saying whether to insert a space and }{\i\f1 name }{\f1 (see }{\f1\uldb above}{\v\f1 Tell}{\f1 ) after the text. If you set this flag, you might also want to put "(name)" into the menu text as a memory aid. \par {\pntext\pard\plain\s26 \f1\fs20\lang1033\cgrid \hich\af1\dbch\af0\loch\f1 4.\tab}}\pard \s26\fi-360\li480\sl-240\slmult0\nowidctlpar\jclisttab\tx480{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pndec\pnstart1\pnindent360\pnhang{\pntxta .}}\ls14\adjustright {\f1 A flag (1 or 0) saying whether the result should be sent immediately to ICS or left in the input pane for further editing. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 You can now use two special insert texts \ldblquote chat\rdblquote and \ldblquote none\rdblquote in the entry definitions. In stead of being sent to the ICS, WinBoard will recognize them as special cases (they are not valid ICS commands anyway). \ldblquote Chat\rdblquote will open a chat box for the handle you clicked on, \ldblquote none\rdblquote will define a disabled entry (usually used with an item name of spaces), which you could put in the position of the menu that pops up under your mouse pointer, so there would be no default action when you up-click without moving the mouse first. \par }{The entry }{\f2 "-"}{ produces a separator line in the menu. The top three menu entries are always }{\b Copy and Paste}{, }{\b Copy}{, and }{\b Paste}{, but you have full control over the rest of the menu. \par }{\f1 The default menu is: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\fs20 \endash \line &Who,who,0,1\line Playe&rs,players,0,1\line &Games,games,0,1\line &Sought,sought,0,1\line |}{\f2\fs20\cf5 ,none,0,0 \par Open Chat Box (name),chat,1,0}{\f2\fs20 \par &Tell (name),tell,1,0\line M&essage (name),message,1,0\line \endash \line &Finger (name),finger,1,1\line &Vars (name),vars,1,1\line &Observe (name),observe,1,1\line &Match (name),match,1,1\line Pl&ay (name),play,1,1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 There is no graphical user interface to set this option. To change it, edit your }{\f1\uldb settings}{\v\f1 settings}{\f1 file with a plain text editor such as Notepad. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 icsNames}} #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 icsNames}}}{\f1 /icsNames=\{}{\i\f1 names}{\f1 \} }{\b0\f1 or }{\f1 /icsNames=@}{\i\f1 filename \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option lets you customize the drop-down list of ICS names that appears in the WinBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text \rdblquote /ics /icsHost=\rdblquote and adds the result to the command-line options. There is no graphical user interface to set this option. To change it, edit your }{\f1\uldb settings} {\v\f1 settings}{\f1 file with a plain text editor such as Notepad. \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 firstChessProgramNames}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 firstChessProgramNames}}}{\f1 /firstChessProgramNames=\{}{\i\f1 names}{\f1 \} }{\b0\f1 or }{\f1 /firstChessProgramNames="@}{\i\f1 filename}{\f1 " \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option lets you customize the first drop-down list of chess engine names that appears in the WinBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text \rdblquote /cp /firstChessProgram=\rdblquote and adds the result to the command-line options. \par \par There is no graphical user interface to set this option. To change it, edit your }{\f1\uldb settings}{\v\f1 settings}{\f1 file with a plain text editor such as Notepad. Example: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2 /firstChessProgramNames=\{GNUChess\line WCrafty-15_11 /fd="C:\\Program Files\\Crafty"\line ArasanX /fd="C:\\Program Files\\Arasan \\Arasan 4.1"\line "EXchess xb" /fd=C:\\EXchess\line Comet-WB /fd=C:\\Comet\line \} \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 secondChessProgramNames}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 secondChessProgramNames}}}{\f1 /secondChessProgramNames=\{}{\i\f1 names}{\f1 \}}{\b0\f1 or }{\f1 /secondChessProgramNames="@}{\i\f1 filename}{\f1 "}{\i\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 This option lets you customize the second drop-down list of chess engine names that appears in the W inBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text \rdblquote /cp /secondChessProgram=\rdblquote and adds the result to the command-line options. \par \par There is no graphical user interface to set this option. To change it, edit your }{\f1\uldb settings}{\v\f1 settings}{\f1 file with a plain text editor such as Notepad. Example: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {/secondChessProgramNames=\{GNUChess\line WCrafty-15_11 /sd="C:\\\\Program Files\\\\Crafty\\"\line ArasanX /sd="C:\\Program Files\\ Arasan\\Arasan 4.1"\line "EXchess xb" /sd=C:\\EXchess\line Comet-WB /sd=C:\\Comet\line \}}{\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 singleEngineList}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 singleEngineList}}}{\f1 /singleEngineList }{\i\f1 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is set to true, the }{\f1\uldb secondChessProgramNames}{\f1 option will be ignored, and the value of the }{\f1\uldb firstChessProgramNames}{\f1 option will be used in its place with the required modifications (every option referring to the first engine being replaced by the corresponding one referring to the second). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xy coordinates of board}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xy}}}{\f1 /x=}{\i\f1 xcoord }{\f1 /y=}{\i\f1 ycoord \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the initial location of the board window, giving the screen coordinates of the upper left-hand corner. Both arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Analysis window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1 /analysisX=}{\i\f1 xcoord }{\f1 /analysisY=}{\i\f1 ycoord}{\f1 /analysisW=}{ \i\f1 width}{\f1 /analysisH=}{\i\f1 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf2 These options have been deprecated, as the analysis window is replaced by the more general engine-output window. They are recognized, but ignored, and no longer saved in the winboard.ini file. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Comment window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1 /commentX=}{\i\f1 xcoord }{\f1 /commentY=}{\i\f1 ycoord}{\f1 /commentW=}{ \i\f1 width}{\f1 /commentH=}{\i\f1 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the initial location and size of the Comment window, giving the screen coordinates of the upper left-hand corner }{\f1\cf2 (relative to the main window)}{\f1 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Game List window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1 /gameListX=}{\i\f1 xcoord }{\f1 /gameListY=}{\i\f1 ycoord}{\f1 /gameListW=}{ \i\f1 width}{\f1 /gameListH=}{\i\f1 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the initial location and size of the Game List window, giving the screen coordinates of the upper left-hand corner }{\f1\cf2 (relative to the main window), }{\f1 the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of ICS Interaction window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1 /icsX=}{\i\f1 xcoord }{\f1 /icsY=}{\i\f1 ycoord}{\f1 /icsW=}{\i\f1 width}{\f1 /icsH=}{\i\f1 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the initial location and size of the ICS Interaction window, giving the screen coordinates of the upper left-hand corner }{\f1\cf2 (relative to the main window)}{\f1 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Tags window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1 /tagsX=}{\i\f1 xcoord }{\f1 /tagsY=}{\i\f1 ycoord}{\f1 /tagsW=}{\i\f1 width}{\f1 /tagsH=}{\i\f1 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Sets the initial location and size of the Tags window, giving the screen coordinates of the upper left-hand corner }{\f1\cf2 (relative to the main window)}{\f1 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Move History window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1\cf6 /moveHistoryX=}{\i\f1\cf6 xcoord }{\f1\cf6 moveHistoryY=}{\i\f1\cf6 ycoord}{\f1\cf6 /moveHistoryW=}{\i\f1\cf6 width}{\f1\cf6 /moveHistoryH=}{\i\f1\cf6 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the initial location and size of the move-history window, giving the screen coordinates of the upper left-hand corner}{\f1 }{\f1\cf2 (relative to the main window) }{\f1\cf6 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Evaluation Graph window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1\cf6 /evalGraphX=}{\i\f1\cf6 xcoord }{\f1\cf6 /evalGraphY=}{\i\f1\cf6 ycoord}{\f1\cf6 /evalGraphW=}{\i\f1\cf6 width}{\f1\cf6 /evalGraphH=}{\i\f1\cf6 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the initial location and size of the evaluation-graph window, giving the screen coordinates of the upper left-hand corner}{\f1 }{\f1\cf2 (relative to the main window)}{\f1\cf6 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 xywh coordinates of Engine Output window}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 xywh}}}{\f1\cf6 /engineOutputX=}{\i\f1\cf6 xcoord }{\f1\cf6 /engineOutputY=}{ \i\f1\cf6 ycoord}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\f1\cf6 /engineOutputW=}{\i\f1\cf6 width}{\f1\cf6 /engineOutputH=}{\i\f1\cf6 height \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Sets the initial location and size of the engine-output window, giving the screen coordinates of the upper left-hand corner}{\f1 }{\f1\cf2 (relative to the main window)}{\f1\cf6 , the width, and the height. All four arguments must be given together. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 engineOutputUp}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Window Up}}}{\f1\cf6 /engineOutputUp }{\i\f1\cf6 true|false \par }\pard \s2\li119\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 evalGraphUp}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Window Up}}}{\f1\cf6 /evalGraphUp }{\i\f1\cf6 true|false}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 moveHistoryUp}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 Window Up}}}{\f1\cf6 /moveHistoryUp }{\i\f1\cf6 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If set to True, the corresponding window is displayed, if False, the window is absent. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 stickyWindows}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 stickyWindows}}}{\f1\cf6 /stickyWindows }{\i\f1\cf6 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Auxiliary windows touching the main window will stay attached to the latter when you move it. \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 autoDisplayComment}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 autoDisplayComment}}}{\f1\cf6 /autoDisplayComment }{\i\f1\cf6 true|false \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 autoDisplayTags}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 autoDisplayTags}}}{\f1\cf6 /autoDisplayTags }{\i\f1\cf6 true|false \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If set to True, these options cause the window with the move comments, and the window with PGN tags, respectively, to pop up automatically when such tags or comments are encountered during the replaying a stored or loaded game. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 gameListTags}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 gameListTags}{\f1 }}}{\f1\cf6 /gameListTags }{\i\f1\cf6 string}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 The }{\i\f1\cf6 string}{\f1\cf6 contains single-character codes specifying the PGN tags that have to be listed for each game in the game-list window, and their order. The meaning of the characters is a=out-of-book info, b=black Elo, e=event, d=date, o=round, p=players, r=result, }{ \f1\cf2 c=result comment, }{\f1\cf6 w=white Elo, s=site, t=time control and v=variant, Default: \ldblquote eprd\rdblquote . \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\cf6\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 Adjudication Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 }{\f1\cf6 Adjudication Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 AdjudicationOptions}}}{ \b0\f1\fs18\cf6\up6 }{\f1\fs20\cf6 Adjudication Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 adjudicateLossThreshold}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 adjudicateLossThreshold}{\f1 }}}{\f1\cf6 /adjudicateLossThreshold }{\i\f1\cf6 scorethreshold}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If the given value is non-zero, WinBoard adjudicates the game as a lo ss if both engines agree for a duration of 6 consecutive ply that the score is below the given score threshold for that engine. Make sure the score is interpreted properly by WinBoard, using /firstScoreAbs and /secondScoreAbs if needed.}{\cf6 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 adjudicateDrawMoves}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 adjudicateDrawMoves}{\f1 }}}{\f1\cf6 /adjudicateDrawMoves }{\i\f1\cf6 number}{ \f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 If the given value is non-zero, WinBoard adjudicates the game as a draw if after the given }{\i\f1\cf6 number}{\f1\cf6 of moves it was not yet decided. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 checkMates}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 checkMates}{\f1 }}}{\f1\cf11 /checkMates}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is True, WinBoard detects all checkmates and stalemates, and ends the game as soon as they occur. Legality-testing must be on for this option to work.} { \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 testClaims}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 testClaims}{\f1 }}}{\f1\cf11 /testClaims}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is True, WinBoard verifies all result claims made by engines, and those who send false claims will forfeit the game because of it. Legal ity-testing must be on for this option to work.}{\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 materialDraws}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 materialDraws}{\f1 }}}{\f1\cf11 /materialDraws}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is True, WinBoard adjudicates games as draws when there is no sufficient material left to create a checkmate. This applies to KBKB with like bishops, and to KBK, KNK and KK. Legality-testing must be on for this option to work.}{\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 trivialDraws}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 trivialDraws}{\f1 }}}{\f1\cf11 /trivialDraws}{\i\f1\cf11 true|false}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If this option is True, WinBoard adjudicates games as draws that cannot be usualy won without opponent assistance. This applies to KBKB with unlike bishops, and to K BKN, KNKN, KNNK, KRKR and KQKQ. The draw is called after 6 ply into these end-games, to allow quick mates that can occur in some positions. KQKQ does not really belong in this category, and might be taken out in the future. (When bitbase-based adjudicatio ns are implemented.) Legality-testing must be on for this option to work.}{\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 ruleMoves}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 ruleMoves}{\f1 }}}{\f1\cf11 /ruleMoves }{\i\f1\cf11 number}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If the given value is non-zero, WinBoard adjudicates the game as a draw after the given }{\i\f1\cf11 number}{\f1\cf11 of consecutive reversible moves. Engines can claim draws after 50 moves, irrespective of the value of }{\i\f1\cf11 number}{\f1\cf11 .}{\cf11 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 repeatsToDraw}{\f1 }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 repeatsToDraw}{\f1 }}}{\f1\cf11 /repeatsToDraw }{\i\f1\cf11 number}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 If the given value is non-zero, WinBoard adjudicates the game as a draw if a position is repeated the given }{\i\f1\cf11 number}{\f1\cf11 of times. Engines can claim draws after 3 repeats, (on the 3rd occurrence, actually), irrespective of the value of }{\i\f1\cf11 number}{\f1\cf11 . Beware that positions that have different castling or en-passant rights do not count as repeats, WinBoard is fully e.p. and castling aware!}{\cf11 \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20\cf11 \page }{\cs58\f1\fs20\super +{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super +}{\f1 main}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Other Options}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Other Options}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 OtherOptions}}}{\b0\f1\fs18\up6 }{\f1\fs20 Other Options \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ncp }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ncp }}}{\f1 /ncp}{\b0\f1 or }{\f1 /xncp}{\b0\f1 ,}{\f1 }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 noChessProgram}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 noChessProgram}}}{ \f1 /noChessProgram}{\i\f1 true|false}{\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is True, WinBoard acts as a passive chessboard; it does not start a chess program or connect to ICS. This option also sets clockMode to False. Default: False. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 mode}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 mode}}}{\f1 /mode}{\b0\f1 or }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 initialMode}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 initialMode}}}{\f1 /initialMode }{\i\f1 modename \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If this option is given, WinBoard selects the given }{\i\f1 modename}{\f1 from the }{\f1\uldb Mode menu}{\v\f1 ModeMenu }{\f1 after starting and (if applicable) processing the }{\f1\uldb loadGameFile}{\v\f1 loadGameFile }{\f1 or }{\f1\uldb loadPositionFile}{\v\f1 loadPositionFile }{\f1 option. Default: "". Other supported values are TwoMachines, AnalyzeFile, Analysis, MachineWhite, MachineBlack, EditGame, EditPosition, and Training. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 variant}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 variant}}}{\f1 /variant}{\b0\f1 }{\i\f1 varname}{\f1 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { Activates preliminary, partial support for playing chess variants against a local engine or editing variant games. This flag is not needed in ICS mode. Recognized variant names are: \par }\pard\plain \s20\li119\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {normal\tab \tab Normal chess\line wildcastle\tab Shuffle chess, king can castle from d file\line nocastle\tab Shuffle chess, no castling allowed\line fischerandom\tab Fischer Random shuffle chess\line bughouse\tab Bughouse, ICC/FICS rules\line crazyhouse\tab Crazyhouse, ICC/FICS rules\line losers \tab Lose all pieces or get mated (ICC wild 17)\line suicide\tab Lose all pieces including king (FICS)\line giveaway\tab Try to have no legal moves (ICC wild 26)\line twokings\tab Weird ICC wild 9\line kriegspiel\tab Opponent's pieces are invisible\line atomic \tab Capturing piece explodes (ICC wild 27)\line 3check\tab Win by giving check 3 times (ICC wild 25) \par }\pard\plain \s66\li119\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cf11\cgrid {xiangqi\tab Chinese Chess (on a 9x10 board)\line shogi\tab \tab Japanese Chess (on a 9x9 board, with piece drops) \line capablanca\tab Capablanca Chess (10x8 board, with Archbishop and Chancellor pieces)\line gothic\tab \tab similar, with a better initial position\line caparandom\tab An FRC-like version of Capablanca Chess (10x8 board) \line janus\tab \tab A game with two Archbishops (10x8 board)\line shatranj\tab Ancient Arabic Chess, with Elephants and General replacing B and Q.\line courier\tab Medieval intermedite between shatranj and modern Chess (on 12x8 board) \line falcon\tab \tab A patented Chess variant with two Falcon pieces (10x8) board \line berolina\tab Pawns capture straight ahead, and move diagonal (legality testing off!)\line cylinder\tab Pieces wrap around the board, as if it were a cylinder (legality testing off!) \line fairy\tab \tab A variant in which all pieces known to WinBoard can participate\line knightmate\tab King moves a Knight, and vice versa \par }{\cf2 makruk\tab Thai Chess (shatranj-like, pawns promote on 6th rank)\line super\tab \tab Superchess, a shuffle variant with B+N, R+N, K+N and Q+N compound\line great\tab \tab Great Shatranj, variant without sliders, on 10x8 board (legality testing off!)\line }{ \par }\pard \s66\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright {In the shuffle variants, WinBoard does now shuffle the pieces, although you can still do it by hand using Edit Position. }{\cf0 Some variants are supported only in ICS mode, in cluding bughouse, and kriegspiel.}{ }{\cf0 The winning/drawing conditions in crazyhouse (off-board interposition on mate) are not fully understood}{\cf2 , but losers, suicide, giveaway, atomic, and 3check this should be OK.}{\cf0 In crazyhouse}{\cf2 , WinBoard now does keep track of off-board pieces.In shatranj it does implement the baring rule when mate detection is switched on}{. }{\cf2 In xiangqi it does implement the rules for perpetual checking and chasing (in Two-Machines mode).}{ \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf5\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super K}{ \f1\cf5 shuffleOpenings}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf5\super #}{\f1\cf5 shuffleOpenings}}}{\f1\cf5 /shuffleOpenings \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf5 This volatile option will cause shufflin g of all pieces on the back rank, even in variants that normally have a fixed opening setup, according to the setting of the /defaultFrcPosition. It will remain in effect untill you select a new variant. In variants with normal castling, corner Rooks and King will be exempted from shuffling. Color-bound pieces such as Bishops will be kept on differently colored squares. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 boardHeight}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 boardHeight}}}{\f1\cf11 /boardHeight }{\i\f1\cf11 height}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Allows you to set a non-standard number of board ranks in any variant. If the height is given as \lquote -1\rquote , the default height for the variant is used. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 boardWidth}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 boardWidth}}}{\f1\cf11 /boardWidth }{\i\f1\cf11 width}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Allows you to set a non-standard number of board files in any variant. If the width is given as \lquote -1\rquote , the default width for the variant is used. Width a non-standard width, the initial position will always be an empty board, as the usual opening array will not fit. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 holdingsSize}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 holdingsSize}}}{\f1\cf11 /holdingsSize }{\i\f1\cf11 size}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Allows you to set a non-standard size for the holdings in any variant. If the size is given as \lquote -1\rquote , the default holdings size for the variant is used. The first }{\i\f1\cf11 size}{\f1\cf11 piece types will go into the holdings on capture, and you will be able to drop them on the board in stead of making a normal move. If }{\i\f1\cf11 size}{\f1\cf11 equals 0, there will be no holdings. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf6 defaultFrcPosition}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 defaultFrcPosition}}}{\f1\cf6 /defaultFrcPosition }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 Specifies the number of the opening position in shuffle games like FRC. A value of \lquote -1\rquote means the position is randomly generated by WinBoard. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 pieceToCharTable}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 pieceToCharTable}}}{\f1\cf11 /pieceToCharTable }{\i\f1\cf11 characterstring}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 The characters that are used to represent the piece types WinBoard knows in FEN diagrams and SAN moves. The string argument has to h ave an even length (or it will be ignored), as white and black pieces have to be given separately (in that order). The last letter for each color will be the King. The letters before that will be PNBRQ and then a whole host of fairy pieces in an order tha t has not fully crystallized yet (currently FEACWMOHIJGDVSLU, F=Ferz, Elephant, A=Archbishop, C=Chancellor, W=Wazir, M=Commoner, O=Cannon, H=Nightrider). You should list at least all pieces that occur in the variant you are playing. If you have less than 4 4 characters in the string, the pieces not mentioned will get assigned a period, and you will not be able to distinguish them in FENs. You can also explicitly assign pieces a period, in which case they will not be counted in deciding which captured pieces can go into the holdings. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cf11 A tilde as a piece name does mean this piece is used to represent a promoted Pawn in Crazyhouse-like games, i.e. on capture it turns back onto a Pawn. A + similarly indicate the piece is a Shogi-style promoted piece, that should re vert to its non-promoted version on capture (rather than to a Pawn). \par Note that promoted pieces are represented by pieces 11 further in the list. \par You should not have to use this option often: each variant has its own default setting for the piece representation in FEN, which should be sufficient in normal use. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 rsh }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 rsh }}}{\f1 /rsh }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 remoteShell }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 remoteShell }}}{\f1 /remoteShell }{\i\f1 shellname} {\f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Name of the command used to run programs remotely. If this option is not given, WinBoard}{\i\f1 }{\f1 uses its own built-in implementation of the Unix }{\i\f1 rcmd}{\f1 protocol (the protocol used by }{\i\f1 rsh}{\f1 ). \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ruser }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ruser }}}{\f1 /ruser }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 remoteUser }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 remoteUser }}}{\f1 /remoteUser }{\i\f1 username}{ \f1 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 User name on the remote system when running programs with the remoteShell. The default is your local user name. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf11\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{ \f1\cf11 userName}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf11 userName}}}{\f1\cf11 /userName }{\i\f1\cf11 username}{\f1\cf11 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Name under which the Human player will be listed in the PGN file. (Default is the login name on your local computer.) \par }\pard\plain \s2\li119\sb120\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 delayBeforeQuit}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 delayBeforeQuit}}}{\f1\cf6 /delayBeforeQuit }{\i\f1\cf6 number}{\f1\cf6 \par }\pard \s2\li119\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright {\cs58\f1\cf6\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 }{\f1\cf6 delayAfterQuit}}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 }{\f1\cf6 delayAfterQuit}}}{\f1\cf6 /delayAfterQuit }{\i\f1\cf6 number}{\f1\cf6 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf6 These options specify how long WinBoard has to wait before sending a termination signal to rogue engine processes, that do not want to react to the \lquote quit\rquote command. The second one determines the pause after killing the engine, to make sure it dies. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ini }}# {\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ini }}}{\f1 /ini }{\b0\f1 or}{\f1 }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 settingsFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 settingsFile }}}{\f1 /settingsFile }{\i\f1 filename\line }{\cs58\f1\cf2\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super K}{\f1\cf2 saveSettingsFile }}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\cf2\super #}{\f1\cf2 saveSettingsFile }}}{\f1\cf2 /saveSettingsFile }{\i\f1\cf2 filename}{\i\f1 \line }{\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 at sign}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 atsign }}}{\f1 @ }{\i\f1 file-name \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 See }{\f1\uldb Settings}{\v\f1 Settings}{\f1 . \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Initialization files}}K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Files}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Files}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Files}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 INITIALIZATION FILES \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Settings } }}{\f1\fs18\up6 }{\cs58\f1\super #{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Settings }}}{\f1 Settings \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {When WinBoard starts up, it reads option settings from a file named }{\i winboard.ini }{ in its installation directory (the directory containing winboard.exe). Options in this file have the same format as }{\uldb command line options}{\v Options}{, except that they do not all have to be on a sing le line. You can put a comment in a settings file by preceding it with a semicolon (}{\f2 ;}{). \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {The winboard.ini file is read before the command line is processed, so any options you give on the command line override options in the file. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If WinBoard encounters a /}{\f1\uldb settingsFile}{\v\f1 settingsFile}{\f1 }{\i\f1 filename }{\f1 or }{\f1\uldb @}{\v\f1 atsign}{\i\f1 filename }{\f1 option while reading settings (whether from the command line or a file), it reads more settings from the given file before reading the next option. \par The }{\f1\uldb Save Settings Now}{\v\f1 SaveSettings}{\f1 menu command writes the current values of most options to a file. In addition, settings are saved automatically when WinBoard exits if }{\f1\uldb Save Settings on Exit}{\v\f1 SaveSettingsOnExit}{ \f1 is checked. The settings are written to the last file named in a /settingsFile command }{\f1\cf2 that could be s uccessfully read, or in a /saveSettingsFile command (where no attempt is made to read it at all, making it work even if the mentioned file did not exist yet),}{\f1 if any; otherwise to winboard.ini}{\i\f1 .}{\f1 The @ option does not affect which file settings are saved to. \par Warning: Because Save Settings overwrites the last settings file (usually winboard.ini) and only saves a subset of WinBoard's options, you should not add settings of more options to such a file with a text editor. If you do this, your additional options w ill be lost on the next Save Settings. You can change the values of existing settings freely, using Notepad or any plain text editor. Be careful not to do this while WinBoard is running, however, unless you know that Save Settings on Exit is off. Otherwis e all your changes will be overwritten and lost when WinBoard exits. \par }{\f1\cf11 Notice that tournament managers, like PSWBTM, usually call WinBoard with the option not to save settings on exit, so that the entire tournament uses the same settings. So it does make sense to edit \lquote volatile\rquote options, such as /variant, into the settings file before such a tournament.}{\f1 }{\f1\cf2 Also note that a settings file that contains a /settingsFile or /saveSettingsFile option to redirect later saving to another file effectively protects its own contents against being overwritten by saving settings.}{\f1 \par }\pard\plain \s66\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cf11\cgrid {\f1 \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\cs58\f1\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 ICS Logon} }#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 ICSLogon}}}{\f1 ICS Logon \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Whenever WinBoard connects to the Internet Chess Server, if it finds a file called }{\i\f1 ICS.ini }{\f1 in its installation directory}{\i\f1 ,}{\f1 it feeds the file's contents to the ICS as commands. Usually the first two lines of the file should be your ICS user name and password. You can specify a different name instead of }{\i\f1 ICS.ini}{\f1 by using the }{\f1\uldb icslogon}{\v\f1 icslogon}{ \f1 command line option. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Installing Chess Engines}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Installing Chess Engines}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0 \nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 InstallingChessEngines}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs20 INSTALLING CHESS ENGINES \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\f1 Introduction \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard is capable of operating with many different chess engines. You can play chess against a compatible engine, set up matches between two engines, or (advanced users only) run an automated computer player on an ICS. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Typically, the main difficulty in installing a new chess engine for use b y WinBoard comes in getting the engine itself running and setting its options appropriately. The connection to WinBoard is relatively straightforward. \par WinBoard-compatible chess engines are Win32 command line programs that you can run by hand in an MS-DOS P rompt box and type human-readable commands to. WinBoard connects to an engine simply by starting the engine up in the background and communicating with it through a pair of pipes. Therefore the basic procedure for installing an engine is: \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 1. Get a copy of the engine and any supporting files it needs. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 2. Install and configure the engine as a command-line program by following the instructions that come with it. Try it out by running it from the command line in an MS-DOS Prompt box and make sure it works. \par 3. Optional, but recommended: Try out the WinBoard plus engine combination by running WinBoard with the proper command line arguments in an MS-DOS Prompt box. \par 4. Create a shortcut on your desktop or Start menu to run the engine with WinBoard. \par 5. Optionally edit your WinBoard.ini file to add the engine to the drop-down lists on WinBoard's startup dialog. \par This document cannot explain steps 1 and 2 in detail for all engines, but we will take you through all five steps in outline, using Crafty as an example. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\f1 Example: Crafty \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 1. Choose a directory to put Crafty in. We'll use }{\f2 C:\\Program Files\\Crafty}{\f1 in this example. Download your copy of Crafty into this directory from its author's FTP site, }{\f2 ftp://ftp.cis.uab.edu/pub/hyatt}{\f1 . At this writing, you will need at least the following files: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\fs20 read.me\line v15/crafty.doc\line v15/crafty.faq\line v15/wcrafty-15.*.exe}{\f1\fs20 (where * is replaced by the largest number there)\line }{\f2\fs20 common/start.zip}{\fs20 \line }{\f2\fs20 common/medium.zip}{\fs20 }{\f1\fs20 (or another book). \par }\pard\plain \s16\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 2. The first three files are documentation that you can read with a text edit or. Read the read.me file first and follow the instructions carefully. This will take some time. Do not write to the author of WinBoard if you have trouble with the instructions in the Crafty read.me. Try running Crafty from an MS-DOS Prompt box and make sure it works before you go on. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 3. Optional, but recommended: In an MS-DOS Prompt box,}{ }{\f2 cd }{\f1 to the directory where WinBoard is installed, typically }{\f2 "C:\\Program Files\\WinBoard"}{\f1 . Then type the following command line. Use the actual name of the wcrafty file you downloaded, not an }{\f2 *}{\f1 , and if your browser changed the first period to an underscore when you downloaded the file, make that change in the command line too. \par }\pard\plain \s63\fi-720\li1440\sb80\sl-240\slmult0\nowidctlpar\adjustright \f2\fs20\cgrid {WinBoard /cp /fcp=WCrafty-15.* /fd="C:\\Program Files\\Crafty" /scp=WCrafty-15.* /sd="C:\\Program Files\\Crafty" \par }\pard\plain \s16\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard should start up, with Crafty running as its chess engine. Check that you can play chess against Crafty. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 4. To make a shortcut or Start menu entry for Crafty: Right-click on the desktop and select New/Shortcut. Use the Browse button to fin d your winboard.exe file and get its name into the Command Line box. (It usually will be "C:\\Program Files\\WinBoard\\winboard.exe".) Click in the Command Line box and hit the End key to go to the end. Add the following to the end of the command line, }{ \i\f1 after}{\f1 the closing quotation mark. Use the actual name of the wcrafty file you downloaded, not an }{\f2 *}{\f1 , and if your browser changed the first period to an underscore when you downloaded the file, make that change in the command line too. \par }\pard\plain \s63\fi-720\li1440\sb80\sl-240\slmult0\nowidctlpar\adjustright \f2\fs20\cgrid {/cp /fcp=WCrafty-15.* /fd="C:\\Program Files\\Crafty" \line /scp=WCrafty-15.* /sd="C:\\Program Files\\Crafty" \par }\pard\plain \s62\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Press Next, choose a name for the shortcut, and press Finish. You can now use this shortcut to run WinBoard with Crafty. Double-click it to check that it works. You can drag or copy the shortcut into your Start menu if you like. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 5. To add Crafty as an option in the WinBoard Startup dialog, edit your }{\f1\uldb WinBoard.ini file}{\v\f1 Settings}{\f1 with Notepad or another plain text editor, carefully following the example shown under }{\f1\uldb /firstChessProgramNames}{\v\f1 firstChessProgramNames}{\f1 above. \par }\pard\plain \s2\li120\sb120\sa60\sl-240\slmult0\nowidctlpar\outlinelevel1\adjustright \b\f5\fs20\cgrid {\f1 For more information \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 If you would like to run an automated computer player on the ICS, see the separate file }{\f2 zippy.README}{\f1 . If you would like to write your own engine to interface to WinBoard, see the separate file }{\f2 engine-intf.html}{\f1 , and join the mailing list mentioned there. Both files are included in the WinBoard distribution. You might also want to get the source code for WinBoard. It is available from the author's Web page, http://www.tim-mann.org/chess.html}{\f2 .}{\f1 \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Firewalls}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Firewalls}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Firewalls}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs18\up6 }{\f1\fs20 FIREWALLS \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 By default, "WinBoard /ics"}{\i\f1 }{\f1 communicates with an Internet Chess Server by opening a TCP socket directly from the machine it is running on to the ICS. If there is a firewall between your machine and the ICS, this won't work. Here are some recipes for getting around common kinds of firewalls using special options to WinBoard}{\i\f1 .}{\f1 Important: See the paragraph in the }{\f1\uldb LIMITATIONS}{\v\f1 LIMITATIONS}{\f1 section below about extra echoes. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Suppose that you can't telnet directly to ICS, but you can telnet to a firewall host, log in, a nd then telnet from there to ICS. Let's say the firewall is called fire.wall.com. Set command-line options as follows: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\fs20 WinBoard -ics -icshost fire.wall.com -icsport 23 \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Then when you run WinBoard}{\i\f1 }{\f1 in ICS mode, you will be prompted to log in to the firewall host. (This works because port 23 is the standard telnet login service.) Do so, then telnet to ICS, using a command like "telnet chessclub.com 5000", or whatever command the firewall provides for telnetting to port 5000. \par If your firewall lets you telnet (o r rlogin) to remote hosts, but doesn't let you telnet to port 5000, you will have to find some other host outside the firewall that does let you do this, and hop through it. For instance, suppose you have an account at foo.edu. Follow the recipe above, bu t instead of typing "telnet chessclub.com 5000" to the firewall, type "telnet foo.edu" (or "rlogin foo.edu"), log in there, and then type "telnet chessclub.com 5000". \par Exception: chessclub.com itself lets you connect to the chess server on the default telnet port (23), which is what you get if you don\rquote t specify a port to the telnet program. But the other chess servers don\rquote t allow this. \par Suppose that you can't telnet directly to ICS, but you can use rsh to run programs on a firewall host, and that host can telnet to ICS. Let's say the firewall is called rsh.wall.com. Set command-line options as follows: \par }\pard\plain \s19\li520\sb60\sl-240\slmult0\keep\nowidctlpar\tx520\tx920\tx1320\tx1720\tx2120\adjustright \f6\fs16\cgrid {\f2\fs20 WinBoard -ics -gateway rsh.wall.com -icshost chessclub.com \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Then when you run WinBoard}{\i\f1 }{\f1 in ICS mode, it will connect to the ICS by using rsh to run the command "telnet chessclub.com 5000" on host rsh.wall.com. \par ICC timestamp and FICS timeseal do not work through many}{\b\f1 }{\f1 firewalls. You can use them only if your firewall gives a clean TCP connection with a full 8-bit wide path. If your firewall allows you to get out only by running a special telnet program, you can't use timestamp or timeseal across it. But if you have access to a computer just outside your firewall, and you have much lower netlag when talking to that computer than to the ICS, it might be worthwhile runn ing timestamp there. Follow the instructions above for hopping through a host outside the firewall (foo.edu in the example), but run timestamp or timeseal on that host instead of telnet. \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Suppose that you have a SOCKS firewall that requires you to go through some extra level of authentication, but after that will give you a clean 8-bit wide TCP connection to the chess server. In that case, if you are using timestamp or timeseal, you need to somehow socksify it; if not, you need to socksify WinBoard itself. S ocksification is beyond the scope of this document, but see the SOCKS Web site at http://www.socks.nec.com/how2socksify.html. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Limitations}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Limitations}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Limitations}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs18\up6 }{\f1\fs20 LIMITATIONS }{\f1\fs20\cf11 AND NON-LIMITATIONS}{\f1\fs20 \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard}{\i\f1 }{\f1 is a Win32 application. It runs only on Windows NT and Windows 95. It does not work on Windows 3.11 or earlier, even with the Win32s compatibility package. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\i\f1 CMail, }{\f1 the companion program to xboard for playing electronic mail correspondence chess, has not been ported to Win32. \par There is no way for two people running copies of WinBoard}{\i\f1 }{\f1 to play each other without going through the Internet Chess Server. \par Under some circumstances, your ICS password may be echoed when you log on. \par If you are connecting to the ICS by running telnet, timestamp, or timeseal on an Internet provider host, you may find th at each line you type is echoed back an extra time after you hit Enter. You can probably turn this echo off. If your Internet provider is a Unix system, type "}{\f2 stty -echo}{\f1 " after you log in to the provider but before you run telnet, timestamp, or timeseal. In addition, you may need to type the sequence \ldblquote }{\f2 Ctrl+Q Ctrl+E Enter}{\f1 \ldblquote after you have finished logging in to ICS. On VMS, type \ldblquote } {\f2 set terminal /noecho /nowrap}{\f1 \rdblquote , and after you telnet to the ICS, type \ldblquote }{\f2 Ctrl+Q Ctrl+] Enter set mode char Enter Enter}{\f1 \rdblquote . It is a good idea to turn off the extra remote echo if you can, because otherwise it can get interleaved with output from the ICS and confuse WinBoard's parsing routines. Don\rquote t just turn off }{\f1\uldb Local Line Editing}{\v\f1 localLineEditing}{\f1 so that you see only the remote echo and not the local one; that will make the interleaving problem worse. \par The game parser recognizes only algebraic notation (SAN). \par The }{\f1\uldb ICS logon}{\v\f1 ICSLogon}{\f1 file does not work properly when you connect to ICS through a Unix gateway host by setting }{\f1\uldb icsPort}{\v\f1 icsPort}{\f1 to 23. The Unix login process apparently discards type-ahead. \par Some WinBoard functions may not work with versions of GNU Chess earlier than 4.0, patchlevel 77. The current version of WinBoard}{\i\f1 }{\f1 works best with Crafty version 15.11 or later. \par }{\f1\cf11 Many of the following points used to be limitations in WinBoard 4.2.7 and earlier, but are now fixed: \par The internal move legality tester in WinBoard 4.3.xx does look at the game history, and is fully aware of castling or en passant-capture rights. }{\f1 It permits castling with the king on the }{\b\f1 d}{\f1 file because this is possible in some "wild 1" games on ICS. The piece-drop menu does not check piece drops in bughouse to see if you actually hold the piece you are trying to drop.}{\f1\cf11 But this way of dropping pieces should be considered an obsolete feature, now that pieces can be dropped by dragging them from the holdings to the board. }{\f1 Anyway, if you would attempt an illegal move when using a chess engine or the ICS,}{\f1\cf11 }{\f1 WinBoard will accept the error message that comes back, undo the move, and let you try another. \par }{\f1\cf11 FEN positions saved by WinBoard}{\i\f1\cf11 }{\f1\cf11 do include correct information about whether castling or en passant are legal, and also handle the 50-move counter. \par }\pard\plain \s20\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The mate detector does not understand that non-contact mate is not really mate in bughouse.}{\f1\cf11 }{\f1 The only problem this causes while playing is minor: a "#" (mate indicator) character will show up after a non-contact mating move in the move list. WinBoard will not assume the game is over at that point,}{\f1\cf11 not even when the option Detect Mates is on. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1\cf11 Edit Gam e mode always uses the rules of the selected variant, which can be a variant that uses piece drops. You can load and edit games that contain piece drops. The (obsolete) piece menus are not active, but you can perform piece drops by dragging pieces from t he holdings. \par Edit Position mode does not allow you to edit the Crazyhouse holdings properly. You cannot drag pieces to the holding, and using the popup menu to put pieces there does not adapt the holding counts and leads to an inconsistent state. Set up Cra zyhouse positions by loading / pasting a bFEN, from there you can set the holdings. \par Fischer Random castling is fully understood. You can enter castlings by dragging the King on top of your Rook. You can probably also play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window. \par }{\f1 Also see the ToDo file included with the distribution for many other possible bugs, limitations, and ideas for improvement that have been suggested. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Authors}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Authors}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid { \cs58\f1\super $}{\f1 Authors}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs18\up6 }{\f1\fs20 AUTHORS AND CONTRIBUTORS \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 WinBoard is partly based on }{\i\f1 xboard}{\f1 , a chessboard program for Unix and the X Window System. Tim Mann has been responsible for all versions of WinBoard,}{ \i\f1 }{\f1 and for xboard versions 1.3 and beyond. }{\f1\cf11 H.G.Muller is responsible for version 4.3.}{\f1 \par Mark Williams added many features to Wi nBoard 4.1.0, including copy/paste, premove, icsAlarm, autoFlipView, training mode, auto raise, and blindfold. Hugh Fischer added piece animation to xboard, and Henrik Gram added it to WinBoard. Frank McIngvale contributed many xboard}{\i\f1 }{\f1 user interface improvements and improved Crafty support. Jochen Wiedmann ported xboard}{\i\f1 }{\f1 to the Amiga, creating }{\i\f1 AmyBoard}{\f1 , and converted the documentation to texinfo. Elmar Bartel contributed the new piece bitmaps for version 3.2. Evan Welsh wrote }{\i\f1 CMail. }{\f1 John Chanak contributed t he initial implementation of ICS mode. The default color scheme was adapted from Wayne Christopher's }{\i\f1 XChess }{\f1 program. Chris Sears and Dan Sears wrote the original xboard}{\i\f1 . }{\f1 They were responsible for xboard}{\i\f1 }{\f1 versions 1.0 through 1.2. }{\f1\cf6 Allessandro Scotti added ma ny elements to the user interface, including the board textures and font-based rendering, the evaluation-graph, move-history and engine-output window. He was also responsible for adding the UCI support.}{\f1 }{\f1\cf11 H.G. Muller made WinBoard castling- and e.p.-aware, a dded variant support with adjustable board sizes, the Crazyhouse holdings, and the fairy pieces. In addition he added most of the adjudication options, made WinBoard ore robust in dealing with buggy and crashing engines, and extended time control with a t ime-odds and node-count-based modes.}{\f1 \par Send bug reports to . Please run WinBoard with the /debug option and include the output from the resulting WinBoard.debug file in your message. \par }\pard\plain \s66\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cf11\cgrid {\f1 The WinBoard 4.3.xx line is being developed by H.G. Mull er independently of the GNU Savannah xboard project. Bug reports on this version, and suggestions for improvements and additions, are best posted in the WinBoard forum, development section (}{\field{\*\fldinst {\f1 HYPERLINK http://www.open-aurec.com/wbforum) }{\f1 {\*\datafield 00d0c9ea79f9bace118c8200aa004ba90b02000000170000002300000068007400740070003a002f002f007700770077002e006f00700065006e002d00610075007200650063002e0063006f006d002f007700620066006f00720075006d0029000000e0c9ea79f9bace118c8200aa004ba90b460000006800740074007000 3a002f002f007700770077002e006f00700065006e002d00610075007200650063002e0063006f006d002f007700620066006f00720075006d00290000000000000000000000000000000000000000000000000000}}}{\fldrslt {\cs59\ul\cf2 http://www.open-aurec.com/wbforum)}}}{\f1 . \par }{\f1\cf2 Michel van den Bergh provided the code for reading Polyglot opening books. \par Arun Persaud worked with H.G. Muller to combine all the features of the never-released WinBoard 4.2.8 of the Savannah project (mainly by Daniel Mehrmann), and th e never-released 4.3.16 into a unified WinBoard 4.4, which is now available both from the Savannah web site and the WinBoard forum. \par }\pard\plain \s1\li120\sb280\sa120\sl-320\slmult0\nowidctlpar\outlinelevel0\adjustright \b\f5\cgrid {\f1\fs20 \page }{\cs58\f1\fs20\super K{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super K}{\f1 Copyright}}#{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super #}{\f1 Copyright}}${\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super $}{\f1 Copyright}}+{\footnote\ftnalt \pard\plain \s57\li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\cs58\f1\super +}{\f1 main}}}{\f1\fs18\up6 }{\f1\fs20 COPYRIGHT \par }\pard\plain \s26\li120\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts. \line Enhancements Copyright 1992-2009 Free Software Foundation, Inc. \par }\pard\plain \li120\sb80\sl-240\slmult0\nowidctlpar\adjustright \f5\fs20\cgrid {\f1 The following terms apply to Digital Equipment Corporation's copyright interest in WinBoard: \par All Rights Reserved \par Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without f ee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity per taining to distribution of the software without specific, written prior permission. \par DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY S PECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOF TWARE. \par The following terms apply to the enhanced version of WinBoard distributed by the Free Software Foundation: \par This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. \par This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. \par You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. \par }}xboard-4.7.3/winboard/woptions.h0000644000175000001440000000275512262415351013573 00000000000000/* * woptions.h -- Options dialog box routines for WinBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include VOID GeneralOptionsPopup(HWND hwnd); VOID BoardOptionsPopup(HWND hwnd); VOID IcsOptionsPopup(HWND hwnd); VOID FontsOptionsPopup(HWND hwnd); VOID SoundOptionsPopup(HWND hwnd); VOID CommPortOptionsPopup(HWND hwnd); VOID LoadOptionsPopup(HWND hwnd); VOID SaveOptionsPopup(HWND hwnd); VOID TimeControlOptionsPopup(HWND hwnd); VOID EnginePlayOptionsPopup(HWND hwnd); VOID UciOptionsPopup(HWND hwnd); xboard-4.7.3/winboard/wsnap.c0000644000175000001440000001504412262415351013027 00000000000000/* * Smart "snapping" for window moving and sizing * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "wsnap.h" /* Imports from winboard.c */ extern HINSTANCE hInst; extern HWND hwndMain; extern HWND moveHistoryDialog; extern HWND evalGraphDialog; extern HWND engineOutputDialog; extern HWND gameListDialog; static BOOL SnappingEnabled = TRUE; static void AddSnapPoint( int * grid, int * grid_len, int value ) { int len = *grid_len; if( len < MAX_SNAP_POINTS ) { int i; for( i=0; ix_grid, &sd->x_grid_len, rc->left ); AddSnapPoint( sd->x_grid, &sd->x_grid_len, rc->right ); AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->top ); AddSnapPoint( sd->y_grid, &sd->y_grid_len, rc->bottom ); } static void AddSnapWindow( HWND hWndCaller, SnapData * sd, HWND hWndSnapWindow ) { if( hWndSnapWindow != NULL && hWndCaller != hWndSnapWindow && IsWindowVisible(hWndSnapWindow) ) { RECT rc; GetWindowRect( hWndSnapWindow, &rc ); AddSnapRectangle( sd, &rc ); } } static BOOL AdjustToSnapPoint( int * grid, int grid_len, int value, int * snap_size, int * delta ) { BOOL result = FALSE; int i; for( i=0; ix_grid_len = 0; snapData->y_grid_len = 0; /* Add desktop area */ if( SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 ) ) { AddSnapRectangle( snapData, &rc ); } if( hWnd != hwndMain ) { /* Add other windows */ AddSnapWindow( hWnd, snapData, hwndMain ); AddSnapWindow( hWnd, snapData, moveHistoryDialog ); AddSnapWindow( hWnd, snapData, evalGraphDialog ); AddSnapWindow( hWnd, snapData, engineOutputDialog ); AddSnapWindow( hWnd, snapData, gameListDialog ); } return 0; } LRESULT OnMoving( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) { LPRECT lprc = (LPRECT) lParam; int delta_x = 0; int delta_y = 0; int snap_size_x = SNAP_DISTANCE; int snap_size_y = SNAP_DISTANCE; if( ! SnappingEnabled ) { return FALSE; } AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); OffsetRect( lprc, delta_x, delta_y ); return TRUE; } LRESULT OnSizing( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) { LPRECT lprc = (LPRECT) lParam; int delta_x = 0; int delta_y = 0; int snap_size_x = SNAP_DISTANCE; int snap_size_y = SNAP_DISTANCE; if( ! SnappingEnabled ) { return FALSE; } switch( wParam ) { case WMSZ_BOTTOM: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); lprc->bottom += delta_y; break; case WMSZ_BOTTOMLEFT: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); lprc->bottom += delta_y; AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); lprc->left += delta_x; break; case WMSZ_BOTTOMRIGHT: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->bottom, &snap_size_y, &delta_y ); lprc->bottom += delta_y; AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); lprc->right += delta_x; break; case WMSZ_LEFT: AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); lprc->left += delta_x; break; case WMSZ_RIGHT: AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); lprc->right += delta_x; break; case WMSZ_TOP: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); lprc->top += delta_y; break; case WMSZ_TOPLEFT: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); lprc->top += delta_y; AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->left, &snap_size_x, &delta_x ); lprc->left += delta_x; break; case WMSZ_TOPRIGHT: AdjustToSnapPoint( snapData->y_grid, snapData->y_grid_len, lprc->top, &snap_size_y, &delta_y ); lprc->top += delta_y; AdjustToSnapPoint( snapData->x_grid, snapData->x_grid_len, lprc->right, &snap_size_x, &delta_x ); lprc->right += delta_x; break; default: return FALSE; } return TRUE; } LRESULT OnExitSizeMove( SnapData * snapData, HWND hWnd, WPARAM wParam, LPARAM lParam ) { return 0; } xboard-4.7.3/winboard/wevalgraph.c0000644000175000001440000002240612262415351014037 00000000000000/* * wevalgraph.c - Evaluation graph front-end part * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // code refactored by HGM to obtain front-end / back-end separation #include "config.h" #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "evalgraph.h" #include "wsnap.h" #define WM_REFRESH_GRAPH (WM_USER + 1) /* Module globals */ static BOOLEAN evalGraphDialogUp; static COLORREF crWhite = RGB( 0xFF, 0xFF, 0xB0 ); static COLORREF crBlack = RGB( 0xAD, 0x5D, 0x3D ); static HDC hdcPB = NULL; static HBITMAP hbmPB = NULL; static HPEN pens[6]; // [HGM] put all pens in one array static HBRUSH hbrHist[3] = { NULL, NULL, NULL }; Boolean EvalGraphIsUp() { return evalGraphDialogUp; } // [HGM] front-end, added as wrapper to avoid use of LineTo and MoveToEx in other routines (so they can be back-end) void DrawSegment( int x, int y, int *lastX, int *lastY, int penType ) { POINT stPt; if(penType == PEN_NONE) MoveToEx( hdcPB, x, y, &stPt ); else { HPEN hp = SelectObject( hdcPB, pens[penType] ); LineTo( hdcPB, x, y ); SelectObject( hdcPB, hp ); } if(lastX != NULL) { *lastX = stPt.x; *lastY = stPt.y; } } // front-end wrapper for drawing functions to do rectangles void DrawRectangle( int left, int top, int right, int bottom, int side, int style ) { HPEN hp = SelectObject( hdcPB, pens[PEN_BLACK] ); RECT rc; rc.top = top; rc.left = left; rc.bottom = bottom; rc.right = right; if(style == FILLED) FillRect( hdcPB, &rc, hbrHist[side] ); else { SelectObject( hdcPB, hbrHist[side] ); Rectangle( hdcPB, left, top, right, bottom ); } SelectObject( hdcPB, hp ); } // front-end wrapper for putting text in graph void DrawEvalText(char *buf, int cbBuf, int y) { SIZE stSize; SetBkMode( hdcPB, TRANSPARENT ); GetTextExtentPoint32( hdcPB, buf, cbBuf, &stSize ); TextOut( hdcPB, MarginX - stSize.cx - 2, y - stSize.cy / 2, buf, cbBuf ); } // front-end static HBRUSH CreateBrush( UINT style, COLORREF color ) { LOGBRUSH stLB; stLB.lbStyle = style; stLB.lbColor = color; stLB.lbHatch = 0; return CreateBrushIndirect( &stLB ); } // front-end. Create pens, device context and buffer bitmap for global use, copy result to display // The back-end part n the middle has been taken out and moed to PainEvalGraph() static VOID DisplayEvalGraph( HWND hWnd, HDC hDC ) { RECT rcClient; int width; int height; /* Get client area */ GetClientRect( hWnd, &rcClient ); width = rcClient.right - rcClient.left; height = rcClient.bottom - rcClient.top; /* Create or recreate paint box if needed */ if( hbmPB == NULL || width != nWidthPB || height != nHeightPB ) { if( pens[PEN_DOTTED] == NULL ) { pens[PEN_BLACK] = GetStockObject(BLACK_PEN); pens[PEN_DOTTED] = CreatePen( PS_DOT, 0, RGB(0xA0,0xA0,0xA0) ); pens[PEN_BLUEDOTTED] = CreatePen( PS_DOT, 0, RGB(0x00,0x00,0xFF) ); pens[PEN_BOLDWHITE] = CreatePen( PS_SOLID, 2, crWhite ); pens[PEN_BOLDBLACK] = CreatePen( PS_SOLID, 2, crBlack ); hbrHist[0] = CreateBrush( BS_SOLID, crWhite ); hbrHist[1] = CreateBrush( BS_SOLID, crBlack ); hbrHist[2] = CreateBrush( BS_SOLID, GetSysColor( COLOR_3DFACE ) ); // background } if( hdcPB != NULL ) { DeleteDC( hdcPB ); hdcPB = NULL; } if( hbmPB != NULL ) { DeleteObject( hbmPB ); hbmPB = NULL; } hdcPB = CreateCompatibleDC( hDC ); nWidthPB = width; nHeightPB = height; hbmPB = CreateCompatibleBitmap( hDC, nWidthPB, nHeightPB ); SelectObject( hdcPB, hbmPB ); } // back-end painting; calls back front-end primitives for lines, rectangles and text PaintEvalGraph(); SetWindowText(hWnd, MakeEvalTitle(T_("Evaluation Graph"))); /* Copy bitmap into destination DC */ BitBlt( hDC, 0, 0, nWidthPB, nHeightPB, hdcPB, 0, 0, SRCCOPY ); } // Note: Once the eval graph is opened, this window-proc lives forever; een closing the // eval-graph window merely hides it. On opening we re-initialize it, though, so it could // as well hae been destroyed. While it is open it processes the REFRESH_GRAPH commands. LRESULT CALLBACK EvalGraphProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { static SnapData sd; PAINTSTRUCT stPS; HDC hDC; switch (message) { case WM_INITDIALOG: Translate(hDlg, DLG_EvalGraph); if( evalGraphDialog == NULL ) { evalGraphDialog = hDlg; RestoreWindowPlacement( hDlg, &wpEvalGraph ); /* Restore window placement */ } return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; case WM_ERASEBKGND: return TRUE; case WM_PAINT: hDC = BeginPaint( hDlg, &stPS ); DisplayEvalGraph( hDlg, hDC ); EndPaint( hDlg, &stPS ); break; case WM_REFRESH_GRAPH: hDC = GetDC( hDlg ); DisplayEvalGraph( hDlg, hDC ); ReleaseDC( hDlg, hDC ); break; case WM_LBUTTONDOWN: if( wParam == 0 || wParam == MK_LBUTTON ) { int index = GetMoveIndexFromPoint( LOWORD(lParam), HIWORD(lParam) ); if( index >= 0 && index < currLast ) { ToNrEvent( index + 1 ); } } return TRUE; case WM_SIZE: InvalidateRect( hDlg, NULL, FALSE ); break; case WM_GETMINMAXINFO: { MINMAXINFO * mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; } break; /* Support for captionless window */ case WM_CLOSE: EvalGraphPopDown(); break; case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } return FALSE; } // creates the eval graph, or unhides it. VOID EvalGraphPopUp() { FARPROC lpProc; CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_CHECKED); if( evalGraphDialog ) { SendMessage( evalGraphDialog, WM_INITDIALOG, 0, 0 ); if( ! evalGraphDialogUp ) { ShowWindow(evalGraphDialog, SW_SHOW); } } else { crWhite = appData.evalHistColorWhite; crBlack = appData.evalHistColorBlack; lpProc = MakeProcInstance( (FARPROC) EvalGraphProc, hInst ); /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ CreateDialog( hInst, MAKEINTRESOURCE(DLG_EvalGraph), hwndMain, (DLGPROC)lpProc ); FreeProcInstance(lpProc); } evalGraphDialogUp = TRUE; } // Note that this hides the window. It could as well have destroyed it. VOID EvalGraphPopDown() { CheckMenuItem(GetMenu(hwndMain), IDM_ShowEvalGraph, MF_UNCHECKED); if( evalGraphDialog ) { ShowWindow(evalGraphDialog, SW_HIDE); } evalGraphDialogUp = FALSE; } // This function is the interface to the back-end. It is currently called through the front-end, // though, where it shares the HistorySet() wrapper with MoveHistorySet(). Once all front-ends // support the eval graph, it would be more logical to call it directly from the back-end. VOID EvalGraphSet( int first, int last, int current, ChessProgramStats_Move * pvInfo ) { /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */ currFirst = first; currLast = last; currCurrent = current; currPvInfo = pvInfo; if( evalGraphDialog ) { SendMessage( evalGraphDialog, WM_REFRESH_GRAPH, 0, 0 ); } } xboard-4.7.3/winboard/wgamelist.c0000644000175000001440000003514112262415351013673 00000000000000/* * wgamelist.c -- Game list window for WinBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "wsnap.h" #define _(s) T_(s) /* Module globals */ static BOOLEAN gameListUp = FALSE; static FILE* gameFile; static char* gameFileName = NULL; struct GameListStats { int white_wins; int black_wins; int drawn; int unfinished; }; /* [AS] Setup the game list according to the specified filter */ static int GameListToListBox( HWND hDlg, BOOL boReset, char * pszFilter, struct GameListStats * stats, BOOL byPos, BOOL narrow ) { ListGame * lg = (ListGame *) gameList.head; int nItem; char buf[MSG_SIZ]; BOOL hasFilter = FALSE; int count = 0; struct GameListStats dummy; /* Initialize stats (use a dummy variable if caller not interested in them) */ if( stats == NULL ) { stats = &dummy; } stats->white_wins = 0; stats->black_wins = 0; stats->drawn = 0; stats->unfinished = 0; if( boReset ) { SendDlgItemMessage(hDlg, OPT_GameListText, LB_RESETCONTENT, 0, 0); } if( pszFilter != NULL ) { if( strlen( pszFilter ) > 0 ) { hasFilter = TRUE; } } if(byPos) InitSearch(); for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ char * st = NULL; BOOL skip = FALSE; int pos = -1; if(nItem % 2000 == 0) { snprintf(buf, MSG_SIZ, _("Scanning through games (%d)"), nItem); SetWindowText(hwndMain, buf); } if(!narrow || lg->position >= 0) { if( hasFilter ) { st = GameListLine(lg->number, &lg->gameInfo); if( !SearchPattern( st, pszFilter) ) skip = TRUE; } if( !skip && byPos) { if( (pos = GameContainsPosition(gameFile, lg)) < 0) skip = TRUE; } if( ! skip ) { if(!st) st = GameListLine(lg->number, &lg->gameInfo); SendDlgItemMessage(hDlg, OPT_GameListText, LB_ADDSTRING, 0, (LPARAM) st); count++; /* Update stats */ if( lg->gameInfo.result == WhiteWins ) stats->white_wins++; else if( lg->gameInfo.result == BlackWins ) stats->black_wins++; else if( lg->gameInfo.result == GameIsDrawn ) stats->drawn++; else stats->unfinished++; if(!byPos) pos = 0; } } lg->position = pos; if(st) free(st); lg = (ListGame *) lg->node.succ; } SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, 0, 0); SetWindowText(hwndMain, "WinBoard"); return count; } /* [AS] Show number of visible (filtered) games and total on window caption */ static int GameListUpdateTitle( HWND hDlg, char * pszTitle, int item_count, int item_total, struct GameListStats * stats ) { char buf[256]; snprintf( buf, sizeof(buf)/sizeof(buf[0]),_("%s - %d/%d games"), pszTitle, item_count, item_total ); if( stats != 0 ) { sprintf( buf+strlen(buf), " (%d-%d-%d)", stats->white_wins, stats->black_wins, stats->drawn ); } SetWindowText( hDlg, buf ); return 0; } #define MAX_FILTER_LENGTH 128 LRESULT CALLBACK GameListDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static char szDlgTitle[64]; static HANDLE hwndText; int nItem; RECT rect; static int sizeX, sizeY; int newSizeX, newSizeY, flags; MINMAXINFO *mmi; static BOOL filterHasFocus = FALSE; int count; struct GameListStats stats; static SnapData sd; switch (message) { case WM_INITDIALOG: Translate(hDlg, DLG_GameList); GetWindowText( hDlg, szDlgTitle, sizeof(szDlgTitle) ); szDlgTitle[ sizeof(szDlgTitle)-1 ] = '\0'; if (gameListDialog) { SendDlgItemMessage(hDlg, OPT_GameListText, LB_RESETCONTENT, 0, 0); } /* Initialize the dialog items */ hwndText = GetDlgItem(hDlg, OPT_TagsText); /* Set font */ SendDlgItemMessage( hDlg, OPT_GameListText, WM_SETFONT, (WPARAM)font[boardSize][GAMELIST_FONT]->hf, MAKELPARAM(TRUE, 0 )); count = GameListToListBox( hDlg, gameListDialog ? TRUE : FALSE, NULL, &stats, FALSE, FALSE ); SendDlgItemMessage( hDlg, IDC_GameListFilter, WM_SETTEXT, 0, (LPARAM) "" ); SendDlgItemMessage( hDlg, IDC_GameListFilter, EM_SETLIMITTEXT, MAX_FILTER_LENGTH, 0 ); filterHasFocus = FALSE; /* Size and position the dialog */ if (!gameListDialog) { gameListDialog = hDlg; flags = SWP_NOZORDER; GetClientRect(hDlg, &rect); sizeX = rect.right; sizeY = rect.bottom; if (wpGameList.x != CW_USEDEFAULT && wpGameList.y != CW_USEDEFAULT && wpGameList.width != CW_USEDEFAULT && wpGameList.height != CW_USEDEFAULT) { WINDOWPLACEMENT wp; EnsureOnScreen(&wpGameList.x, &wpGameList.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = SW_SHOW; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpGameList.x; wp.rcNormalPosition.right = wpGameList.x + wpGameList.width; wp.rcNormalPosition.top = wpGameList.y; wp.rcNormalPosition.bottom = wpGameList.y + wpGameList.height; SetWindowPlacement(hDlg, &wp); GetClientRect(hDlg, &rect); newSizeX = rect.right; newSizeY = rect.bottom; ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; } else GetActualPlacement( gameListDialog, &wpGameList ); } GameListUpdateTitle( hDlg, _("Game List"), count, ((ListGame *) gameList.tailPred)->number, &stats ); // [HGM] always update title GameListHighlight(lastLoadGameNumber); return FALSE; case WM_SIZE: newSizeX = LOWORD(lParam); newSizeY = HIWORD(lParam); ResizeEditPlusButtons(hDlg, GetDlgItem(hDlg, OPT_GameListText), sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; break; case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: return OnExitSizeMove( &sd, hDlg, wParam, lParam ); case WM_GETMINMAXINFO: /* Prevent resizing window too small */ mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; break; case WM_COMMAND: /* [AS] If is pressed while editing the filter, it's better to apply the filter rather than selecting the current game. */ if( LOWORD(wParam) == IDC_GameListFilter ) { switch( HIWORD(wParam) ) { case EN_SETFOCUS: filterHasFocus = TRUE; break; case EN_KILLFOCUS: filterHasFocus = FALSE; break; } } if( filterHasFocus && (LOWORD(wParam) == IDOK) ) { wParam = IDC_GameListDoFilter; } /* [AS] End command replacement */ switch (LOWORD(wParam)) { case OPT_GameListLoad: LoadOptionsPopup(hDlg); return TRUE; case IDOK: nItem = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); if (nItem < 0) { /* is this possible? */ DisplayError(_("No game selected"), 0); return TRUE; } break; /* load the game*/ case OPT_GameListNext: nItem = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); nItem++; if (nItem >= ((ListGame *) gameList.tailPred)->number) { /* [AS] Removed error message */ /* DisplayError(_("Can't go forward any further"), 0); */ return TRUE; } SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, nItem, 0); break; /* load the game*/ case OPT_GameListPrev: #if 0 nItem = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); nItem--; if (nItem < 0) { /* [AS] Removed error message, added return */ /* DisplayError(_("Can't back up any further"), 0); */ return TRUE; } SendDlgItemMessage(hDlg, OPT_GameListText, LB_SETCURSEL, nItem, 0); break; /* load the game*/ #endif /* [AS] */ case OPT_GameListFind: case IDC_GameListDoFilter: { char filter[MAX_FILTER_LENGTH+1]; if( GetDlgItemText( hDlg, IDC_GameListFilter, filter, sizeof(filter) ) >= 0 ) { filter[ sizeof(filter)-1 ] = '\0'; count = GameListToListBox( hDlg, TRUE, filter, &stats, LOWORD(wParam)!=IDC_GameListDoFilter, LOWORD(wParam)==OPT_GameListNarrow ); GameListUpdateTitle( hDlg, _("Game List"), count, ((ListGame *) gameList.tailPred)->number, &stats ); } } return FALSE; break; case IDCANCEL: case OPT_GameListClose: GameListPopDown(); return TRUE; case OPT_GameListText: switch (HIWORD(wParam)) { case LBN_DBLCLK: nItem = SendMessage((HWND) lParam, LB_GETCURSEL, 0, 0); break; /* load the game*/ default: return FALSE; } break; default: return FALSE; } /* Load the game */ { /* [AS] Get index from the item itself, because filtering makes original order unuseable. */ int index = SendDlgItemMessage(hDlg, OPT_GameListText, LB_GETCURSEL, 0, 0); char * text; LRESULT res; if( index < 0 ) { return TRUE; } res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXTLEN, index, 0 ); if( res == LB_ERR ) { return TRUE; } text = (char *) malloc( res+1 ); res = SendDlgItemMessage( hDlg, OPT_GameListText, LB_GETTEXT, index, (LPARAM)text ); index = atoi( text ); nItem = index - 1; free( text ); /* [AS] End: nItem has been "patched" now! */ if (cmailMsgLoaded) { CmailLoadGame(gameFile, nItem + 1, gameFileName, TRUE); } else { LoadGame(gameFile, nItem + 1, gameFileName, TRUE); SetFocus(hwndMain); // [HGM] automatic focus switch } } return TRUE; default: break; } return FALSE; } VOID GameListPopUp(FILE *fp, char *filename) { FARPROC lpProc; gameFile = fp; if (gameFileName != filename) { if (gameFileName) free(gameFileName); gameFileName = StrSave(filename); } CheckMenuItem(GetMenu(hwndMain), IDM_ShowGameList, MF_CHECKED); if (gameListDialog) { SendMessage(gameListDialog, WM_INITDIALOG, 0, 0); if (!gameListUp) ShowWindow(gameListDialog, SW_SHOW); else SetFocus(gameListDialog); } else { lpProc = MakeProcInstance((FARPROC)GameListDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_GameList), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } gameListUp = TRUE; } FILE *GameFile() { return gameFile; } VOID GameListPopDown(void) { CheckMenuItem(GetMenu(hwndMain), IDM_ShowGameList, MF_UNCHECKED); if (gameListDialog) ShowWindow(gameListDialog, SW_HIDE); gameListUp = FALSE; } VOID GameListHighlight(int index) { char buf[MSG_SIZ]; int i, res = 0; if (gameListDialog == NULL) return; for(i=0; res != LB_ERR; i++) { res = SendDlgItemMessage( gameListDialog, OPT_GameListText, LB_GETTEXT, i, (LPARAM)buf ); if(index <= atoi( buf )) break; } SendDlgItemMessage(gameListDialog, OPT_GameListText, LB_SETCURSEL, i, 0); } VOID GameListDestroy() { GameListPopDown(); if (gameFileName) { free(gameFileName); gameFileName = NULL; } } VOID ShowGameListProc() { if (gameListUp) { if(gameListDialog) SetFocus(gameListDialog); // GameListPopDown(); } else { if (gameFileName) { GameListPopUp(gameFile, gameFileName); } else { DisplayError(_("No game list"), 0); } } } HGLOBAL ExportGameListAsText() { HGLOBAL result = NULL; LPVOID lpMem = NULL; ListGame * lg = (ListGame *) gameList.head; int nItem; DWORD dwLen = 0; if( ! gameFileName || ((ListGame *) gameList.tailPred)->number <= 0 ) { DisplayError(_(_("Game list not loaded or empty")), 0); return NULL; } /* Get list size */ for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ char * st = GameListLineFull(lg->number, &lg->gameInfo); dwLen += strlen(st) + 2; /* Add extra characters for "\r\n" */ free(st); lg = (ListGame *) lg->node.succ; } /* Allocate memory for the list */ result = GlobalAlloc(GHND, dwLen+1 ); if( result != NULL ) { lpMem = GlobalLock(result); } /* Copy the list into the global memory block */ if( lpMem != NULL ) { char * dst = (char *) lpMem; size_t len; lg = (ListGame *) gameList.head; for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ char * st = GameListLineFull(lg->number, &lg->gameInfo); len = sprintf( dst, "%s\r\n", st ); dst += len; free(st); lg = (ListGame *) lg->node.succ; } GlobalUnlock( result ); } return result; } xboard-4.7.3/winboard/winboard.h0000644000175000001440000001731412262415351013513 00000000000000/* * WinBoard.h -- Definitions for Windows NT front end to XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "resource.h" #include /* Types */ typedef struct { char faceName[LF_FACESIZE]; float pointSize; BYTE bold, italic, underline, strikeout; BYTE charset; } MyFontParams; typedef struct { char *def; MyFontParams mfp; LOGFONT lf; HFONT hf; } MyFont; typedef enum { SizeTiny, SizeTeeny, SizeDinky, SizePetite, SizeSlim, SizeSmall, SizeMediocre, SizeMiddling, SizeAverage, SizeModerate, SizeMedium, SizeBulky, SizeLarge, SizeBig, SizeHuge, SizeGiant, SizeColossal, SizeTitanic, NUM_SIZES } BoardSize; typedef struct { COLORREF color; int effects; char *name; } MyColorizeAttribs; typedef struct { char* name; void* data; int flag; // [HGM] needed to indicate if data was malloc'ed or not } MySound; typedef struct { COLORREF color; int effects; MySound sound; } MyTextAttribs; /* Functions */ BOOL InitApplication(HINSTANCE); BOOL InitInstance(HINSTANCE, int, LPSTR); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK BoardSizeDlg(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ButtonProc(HWND, UINT, WPARAM, LPARAM); VOID InitAppData(LPSTR); VOID InitDrawingColors(VOID); VOID InitDrawingSizes(BoardSize boardSize, int flags); VOID InitMenuChecks(VOID); int ICSInitScript(VOID); BOOL CenterWindow(HWND hwndChild, HWND hwndParent); VOID ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX, int newSizeY); VOID PromotionPopup(HWND hwnd); FILE *OpenFileDialog(HWND hWnd, char *write, char *defName, char *defExt, char *nameFilt, char *dlgTitle, UINT *number, char fileTitle[MSG_SIZ], char fileName[MSG_SIZ]); VOID InputEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); DWORD InputThread(LPVOID arg); DWORD NonOvlInputThread(LPVOID arg); DWORD SocketInputThread(LPVOID arg); BOOL ChangeColor(HWND hwnd, COLORREF *which); VOID ChangeBoardSize(BoardSize newSize); BOOL APIENTRY MyCreateFont(HWND hwnd, MyFont *font); VOID ErrorPopDown(VOID); VOID EnsureOnScreen(int *x, int *y, int minX, int minY); HBITMAP DoLoadBitmap(HINSTANCE hinst, char *piece, int squareSize, char *suffix); COLORREF ParseColorName(char *name); void ParseAttribs(COLORREF *color, int *effects, char* argValue); VOID CreateFontInMF(MyFont *mf); VOID ChangedConsoleFont(); VOID ParseFontName(char *name, MyFontParams *mfp); void InitComboStrings(HANDLE hwndCombo, char **cd); BOOLEAN MyLoadSound(MySound *ms); BOOLEAN MyPlaySound(MySound *ms); VOID ExitArgError(char *msg, char *badArg, Boolean quit); void SaveSettings(char* name); BOOL BrowseForFolder( const char * title, char * path ); VOID TourneyPopup(); VOID LoadEnginePopUp(); VOID LoadOptionsPopup(HWND hDlg); VOID InitTextures(); void ThemeOptionsPopup(HWND hwnd); /* Constants */ #define CLOCK_FONT 0 #define MESSAGE_FONT 1 #define COORD_FONT 2 #define CONSOLE_FONT 3 #define COMMENT_FONT 4 #define EDITTAGS_FONT 5 #define MOVEHISTORY_FONT 6 #define GAMELIST_FONT 7 #define NUM_FONTS 8 /* Positions of some menu items. Origin is zero and separator lines count. */ /* It's gross that these are needed. */ #define ACTION_POS 4 /* Posn of "Action" on menu bar */ #define OPTIONS_POS 6 /* Posn of "Options" on menu bar */ /* end grossness */ extern MyFont *font[NUM_SIZES][NUM_FONTS]; #define WM_USER_Input (WM_USER + 4242) #define WM_USER_Mouseleave (WM_USER + 4243) #define WM_USER_GetConsoleBackground (WM_USER + 4244) #define CLOCK_TIMER_ID 51 #define LOAD_GAME_TIMER_ID 52 #define ANALYSIS_TIMER_ID 53 #define MOUSE_TIMER_ID 54 #define DELAYED_TIMER_ID 55 #define SOLID_PIECE 0 #define OUTLINE_PIECE 1 #define WHITE_PIECE 2 #define COPY_TMP "wbcopy.tmp" #define PASTE_TMP "wbpaste.tmp" /* variables */ extern HINSTANCE hInst; extern HWND hwndMain; extern BoardSize boardSize; // [HGM] Some stuff to allo a platform-independent reference to windows // This should be moved to frontend.h in due time typedef enum { W_Main, W_Console, W_Comment, W_Tags, W_GameList, W_MoveHist, W_EngineOut, NUM_WINDOWS } WindowID; extern WindowPlacement placementTab[NUM_WINDOWS]; extern HWND hwndTab[NUM_WINDOWS]; // this remains pure front-end. void Translate( HWND hDlg, int id); VOID InitWindowPlacement( WindowPlacement * wp ); VOID RestoreWindowPlacement( HWND hWnd, WindowPlacement * wp ); VOID ReattachAfterMove( LPRECT lprcOldPos, int new_x, int new_y, HWND hWndChild, WindowPlacement * pwpChild ); VOID ReattachAfterSize( LPRECT lprcOldPos, int new_w, int new_h, HWND hWndChild, WindowPlacement * pwpChild ); BOOL GetActualPlacement( HWND hWnd, WindowPlacement * wp ); VOID MoveHistoryPopUp(); VOID MoveHistoryPopDown(); extern HWND moveHistoryDialog; VOID EvalGraphPopUp(); VOID EvalGraphPopDown(); extern HWND evalGraphDialog; extern HWND engineOutputDialog; VOID ShowGameListProc(void); extern HWND gameListDialog; VOID EditTagsProc(void); extern HWND editTagsDialog; extern int screenWidth, screenHeight; extern RECT screenGeometry; // Top-left coordiate of the screen can be different from (0,0) xboard-4.7.3/winboard/language.txt0000644000175000001440000007717312262415351014072 00000000000000## WinBoard language file ## ## LANGUAGE NAME IN ENGLISH / TRANSLATED ## v1.0 beta 1 ## ## Translation by NAME (DATE) ## SAME AS ABOVE, TRANSLATED ## WEB ADDRESS OF TRANSLATOR ## ## If you revise this, please insert your date, name and description. ## TRANSLATION OF MESSAGE ABOVE ## ## For example: ## TRANSLATION OF FOR EXAMPLE ## 24-ago-2010. Juan Prez (j@xyz.p). Corrected translation for xyzzy. ## Notes for translators (can be deleted from he file after translation): ## Just write the translations between the second pair of quotes ## Things like %s, %d and %c must be preserved in the original order ## Empty translated strings will be ignored, so there is no reason ## to delete those for which you don't know a translation, ## and you can start testing everything immediately. ## Simply rename this file to LANGUAGE.lng, and WinBoard should see it, ## and allow you to use the option /language=LANGUAGE. ## You are encouraged to call up the corresponding WinBoard dialog while ## working on the translation, to see in which context the strings are used. ## This is why the strings below are sorted by dialog ## ## Of duplicats, only the first occurrence will be used, even if it was in ## a different dialog! For this reason you will only see an 'OK' in the ## About Box. After you translated it there, this translation will be used ## for all other dialogs as well. ## o Use ## for comments, to make iteasy to find them scattered throughout the translation ## o Careful with temptation of direct translation, by example 'movimiento' for 'move' when 'jugada' is better. ## o Try to use short phrases, more text doesn't imply more clearness. ## o Check that your translation is right, does it mean what it does? ## o Test your translation, check every dialog. ## o For standard chess names check Wikipedia for confirmation. ## o For menus, assign shortcuts (character &) until you finish the translation. ## preferably it should be unique in the applicable menu, so it depends on translation of other items! winboard.rc MENUS: ## Pleace keep the accelerator-key indications on the menu items, and keep ## the keystrokes the same (for now). (Alt, Ctrl and Shift can be translated.) "&New Game\tCtrl-N" === "" "New Sh&uffle Game..." === "" "New &Variant...\tAlt+Shift+V" === "" "&Load Game...\tCtrl-O" === "" "&Save Game...\tCtrl-S" === "" "L&oad Position...\tCtrl+Shift+O" === "" "S&ave Position...\tCtrl+Shift+S" === "" "Save as &Diagram..." === "" "&Quit" === "" ## Next six currently not used "Load &Next Game\tAlt+PgDn" === "" "Load &Previous Game\tAlt+PgUp" === "" "&Reload Same Game" === "" "Load N&ext Position\tAlt+Shift+PgDn" === "" "Load Pre&vious Position\tAlt+Shift+PgUp" === "" "Reload Sa&me Position" === "" "&Copy Game To Clipboard\tCtrl+C" === "" "C&opy Position To Clipboard\tCtrl+Shift+C" === "" "Copy Game List to Clipboard" === "" "&Paste Game From Clipboard\tCtrl+V" === "" "P&aste Position From Clipboard\tCtrl+Shift+V" === "" "&Edit Game\tCtrl+E" === "" "E&dit Position\tCtrl+Shift+E" === "" "Edit Ta&gs..." === "" "Edit Co&mment..." === "" "Enter &Username..." === "" "&Revert\tHome" === "" "&Annotate" === "" "&Truncate Game\tEnd" === "" "&Backward\tAlt+Left" === "" "&Forward\tAlt+Right" === "" "Back to &Start\tAlt+Home" === "" "For&ward to End\tAlt+End" === "" "Flip &View\tF2" === "" "&Swap Clocks" === "" "Engine &Output\tAlt+Shift+O" === "" "Move &History\tAlt+Shift+H" === "" "Evaluation &Graph\tAlt+Shift+E" === "" "Game &List\tAlt+Shift+G" === "" "Open &New Chat Window" === "" "Type In &Move...\tAlt+I" === "" "&Tags" === "" "&Comments" === "" "&Game List Tags..." === "" "&Board..." === "" "&Fonts..." === "" "Machine &White\tCtrl+W" === "" "Machine &Black\tCtrl+B" === "" "&Two Machines\tCtrl+T" === "" "Machine Both" === "" "&Analysis Mode\tCtrl+A" === "" "Analyze &File\tCtrl+F" === "" "&Edit Game\tCtrl+E" === "" "E&dit Position\tCtrl+Shift+E" === "" "Trai&ning" === "" "&ICS Client" === "" "&Machine Match" === "" "&Pause\tPause" === "" "&Accept\tF3" === "" "D&ecline\tF4" === "" "Re&match\tF12" === "" "Call &Flag\tF5" === "" "&Draw\tF6" === "" "Ad&journ\tF7" === "" "A&bort\tF8" === "" "&Resign\tF9" === "" "Stop &Observing\tF10" === "" "Stop E&xamining\tF11" === "" "&Upload to Examine" === "" "Adjudicate to &White" === "" "Adjudicate to &Black" === "" "Adjudicate &Draw" === "" "Install 1st..." === "" "Install 2nd..." === "" "Engine #&1 Settings..." === "" "Engine #&2 Settings..." === "" "&Hint..." === "" "&Book..." === "" "&Move Now\tCtrl+M" === "" "&Retract Move\tCtrl+X" === "" "&Mute all Sounds" === "" "&General..." === "" "&Time Control...\tAlt+Shift+T" === "" "Common &Engine...\tAlt+Shift+U" === "" "Ad&judications...\tAlt+Shift+J" === "" "&Load Game...\tAlt+Shift+L" === "" "&Save Game...\tAlt+Shift+S" === "" "G&ame List..." === "" "Soun&ds..." === "" "&ICS..." === "" "Add ICS..." === "" "Comm&unications..." === "" "Save Settings &Now" === "" "Save Settings on E&xit" === "" "Help &Contents\tF1" === "" "Help &Index" === "" "How to &Use Help" === "" "&About WinBoard" === "" "White" === "" "Promote" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "King" === "" ## The next 2 are pieces for Capablanca Chess. Use the names from the Wikipedia entry for this, ## rather than litteral translations of the English names! "Archbishop" === "" "Chancellor" === "" ## Next 2 Xiangqi (Chinese Chess) pieces. Google for 'Xiangqi' in the target language to get the standard translation. "Elephant" === "" "Cannon" === "" "Empty Square" === "" "Black" === "" "Demote" === "" "Clear Board " === "" ## Next 3: Shogi pieces. "Gold" === "" "Silver" === "" "Lance" === "" "Drop" === "" "Cop&y and Paste" === "" "&Copy" === "" "&Paste" === "" "&Undo" === "" "Cu&t" === "" "&Copy" === "" "&Paste" === "" "Select &All" === "" DIALOGS: ABOUTBOX ## Pehaps copyright notices best left untranslated? "About WinBoard" === "" "OK" === "" "Chessboard for Windows" === "" "Copyright 1991 Digital Equipment Corporation" === "" "Enhancements Copyright 1992-2014 Free Software Foundation" === "" "Enhancements Copyright 2005\r\nAlessandro Scotti" === "" ## What happened with H.G.Muller? [He sold his copyrights to FSF for $1] ## The following string of 6 spaces can be translated to an acknowledgement of the translator, ## like "Traduccin por scar Toledo G.". " " === "" "WinBoard 0.0.0" === "" ABOUTBOX2 ## Weird, it is needed? [Normally not. It is a built-in 'Easter Egg' joke.] "galactic" === "" TIME CONTROL DIALOG "Time Control" === "" "Conventional chess clock" === "" "Incremental clock" === "" "Cancel" === "" ## Next is there really only for the benefit of blind users of the JAWS version... "Use arrow keys to specify which clock setting type, then press tab to alter values." === "" "Fixed time per move" === "" "Number of moves:" === "" "Within number of minutes:" === "" "Initial number of minutes:" === "" "Plus number of seconds per move:" === "" "Maximum seconds per move:" === "" "Time-Odds Factors:" === "" "Engine #1:" === "" "Engine #2:" === "" LOAD OPTIONS DIALOG "Load Game Options" === "" "Load games with &automatic stepping" === "" "&seconds per move" === "" "when filtering game list on position, use thresholds:" === "" "Search Mode: " === "" "Match exact &position" === "" "Match if position is s&ubset" === "" "Match material with e&xact pawn structure" === "" "Match &material" === "" "Material &range (upper board-half is optional)" === "" "Material &difference (optional material balanced)" === "" "Also match reversed &colors" === "" "Also match &left-right mirror image" === "" "minimum Elo for &best player" === "" "minimum Elo for &weakest players" === "" "or later &year" === "" "co&nsecutive positions" === "" SAVE OPTIONS DIALOG "Save Game Options" === "" "Save As: " === "" "Save games automatically" === "" "Prompt for filename" === "" "To file:" === "" "PGN" === "" "Old" === "" "Browse..." === "" "Save out of book info in PGN" === "" 1536 ## This dialog is only used in some older Windows versions, so you might not be ableto test it. "Open" === "" "File &Name:" === "" "&Directories:" === "" "List Files of &Type:" === "" "Dri&ves:" === "" "&Help" === "" "&Index number:" === "" COMMPORT ## Always disabled if you are not actually using an ICS through a comport, so difficult to test. "Communication Port Settings" === "" "Net&work..." === "" "&Port:" === "" "Data &Rate:" === "" "Data &Bits:" === "" "P&arity:" === "" "&Stop Bits:" === "" "F&low:" === "" EDIT COMMENT "Edit Comment" === "" "&Clear" === "" "&Edit" === "" PROMOTION POPUP "Promote to:" === "" ## next used in Shogi as promotion-popup header "Promote?" === "" "Promotion" === "" "&Queen" === "" "&Rook" === "" "&Bishop" === "" "K&night" === "" "&King" === "" "&Cancel" === "" "Chance&llor" === "" "&Archbishop" === "" "YES" === "" "NO" === "" "C&entaur" === "" GAME LIST "Game List" === "" "&Load" === "" "&Prev" === "" "&Next" === "" "&Close" === "" "Filter" === "" EDIT TAGS "Edit Tags" === "" ERROR "ICS Interaction" === "" "Dialog" === "" "Error" === "" ## I don't think the next will really appear ever. "Sorry Charlie" === "" COLORIZE "I C S Interaction Colors" === "" "Interaction Colors" === "" "Premove" === "" "Alarm" === "" "Colors" === "" "&Choose Color..." === "" "&Bold" === "" "&Italic" === "" "&Underline" === "" "&Strikeout" === "" QUESTION ## next one seems only a placeholder, and never appears? [might also be just a programmer's joke...] "Enter a chess engine command or just type something stupid that will completely screw things up." === "" "Question" === "" "Enter" === "" STARTUP DIALOG "WinBoard Startup" === "" "What would you like to do?" === "" "&Play against a chess engine or match two engines" === "" "&Use an Internet Chess Server" === "" "Just &view or edit game files" === "" "Specify Chess &Engines:" === "" "Specify Chess &Server:" === "" "&Additional options" === "" INDEX (IN FILE-BROWSE DIALOG) "Inde&x number:" === "" MOVE TYPE-IN "Type in a move" === "" USER-NAME TYPE-IN "Type in your name" === "" SOUND DIALOG "Sounds" === "" "&Event:" === "" "&No sound" === "" "&Default beep" === "" "&Built-in sound:" === "" "&WAV file:" === "" "B&rowse..." === "" "&Play" === "" "&Defaults" === "" GENERAL OPTIONS DIALOG ## pleace keep the indication of the accelerator keys for the same keystroke ## Note: finely tuned spaces to align keys at right "General Options" === "" "Always on &Top" === "" "Always &Queen Ctrl+Shift+Q" === "" "Animate &Dragging" === "" "&Animate Moving Ctrl+Shift+A" === "" "Auto &Flag Ctrl+Shift+F" === "" "Auto Flip &View" === "" "Auto &Raise Board" === "" "&Blindfold" === "" "Highlight Dra&gging" === "" "Highlight Last &Move" === "" "Periodic &Updates" === "" "Ponder &Next Move Ctrl+Shift+P" === "" "&Popup Exit Message" === "" "Popup Move &Errors" === "" "Show Butt&on Bar" === "" "Show &Coordinates" === "" "&Show Thinking" === "" "Test &Legality Ctrl+Shift+L" === "" "&Hide Thinking Ctrl+Shift+H" === "" "&Info in Move History Ctrl+Shift+I" === "" "&Send Engine Think" === "" "E&xtended PGN Info Ctrl+Shift+X" === "" "Highlight with Arro&w" === "" "Displa&y Logos" === "" "One-Click Move" === "" ICS OPTIONS "ICS Options" === "" "&Auto Comment" === "" "Auto &Observe" === "" "&Get Move List" === "" "&Local Line Editing" === "" "&Quiet Play" === "" "&Premove" === "" "&White first move" === "" "&Black first move" === "" "&Sound alarm at" === "" "seconds" === "" "Choose..." === "" "Do ¬ colorize messages" === "" "&Auto Kibitz" === "" "Auto Kibit&z" === "" "See&k Graph" === "" "auto-&Refresh" === "" "Bckgnd Obser&ve" === "" "&Dual Board" === "" "One-Click &Move" === "" "Background..." === "" "&Defaults..." === "" "Startup &Chat Boxes:" === "" "General" === "" BOARD OPTIONS ## (NOTE: AllWhite uses the white (outline-style) piece bitmaps for both sides ## FlipBlack draws the black pieces upside down) "Board Options" === "" "Defaults" === "" "Light Squares" === "" "Dark Squares" === "" "White Pieces" === "" "Black Pieces" === "" "Square Highlights" === "" "Premove Highlights" === "" "Monochrome" === "" "All White" === "" "Flip Black" === "" "Use Board Textures" === "" "Use Piece Font" === "" "Suppress Grid" === "" "Size" === "" BOARD SIZES (translate as number?) ## Don't put numbers, or nobody will translate them. [True. But do we really want them translated?] ## This is a space for imagination! "&Tiny" === "" "T&eeny" === "" "&Dinky" === "" "&Petite" === "" "Sl&im" === "" "&Small" === "" "Medi&ocre" === "" "&Middling" === "" "&Average" === "" "Mode&rate" === "" "Medi&um" === "" "Bul&ky" === "" "&Large" === "" "&Big" === "" "&Huge" === "" "&Giant" === "" "&Colossal" === "" "Tita&nic" === "" FONTS "Fonts" === "" "Current Board Size" === "" "All Board Sizes" === "" "&Revert to Defaults" === "" "Clocks" === "" "Messages" === "" "Coordinates" === "" "Tags" === "" "Comments" === "" "I C S Interaction" === "" "Piece font" === "" "&Color..." === "" "Move History, Engine Output" === "" ADJUDICATIONS DIALOG "Adjudications" === "" "Ponder Next Move" === "" "Enable and Show Thinking (recommended)" === "" "Hide Thinking when Playing against Human" === "" "Periodic Updates (for Analysis Mode)" === "" "Adjudications in non-ICS games" === "" "Adjudicate draw after:" === "" "moves" === "" "Win/loss adjudication threshold:" === "" "centipawns" === "" "&Verify Engine Claims" === "" "Detect &Mates" === "" "Draw if &Insufficient Material" === "" "Adjudicate &Trivial Draws" === "" "Apply" === "" ## next 2 are suffixed to a text-edit containing a number (50 or 3) "-move rule" === "" "-fold repeats" === "" "Engine #1 Score is Absolute" === "" "Engine #2 Score is Absolute" === "" COMMON ENGINE DIALOG "Common Engine Settings" === "" "Polyglot Directory:" === "" "Hash Size (MB):" === "" "EGTB Path:" === "" "EGTB Size (MB):" === "" "Use Book:" === "" "Max nr of CPUs:" === "" "First has Own Book" === "" "Second has Own Book" === "" "Book Depth:" === "" "Book Variation:" === "" "Default Match Games:" === "" NEW-VARIANT DIALOG ## (NOTE: the 'holdings' are the pieces standing next to the board ('in hand') "Variants" === "" "Variant" === "" "Board size:" === "" "ranks" === "" "files" === "" "Holdings with room for:" === "" "pieces" === "" "('-1' means defaults for selected variant)" === "" VARIANT NAMES: "&normal" === "" "&FRC" === "" "&wildcastle" === "" "&nocastle" === "" "&losers" === "" "&giveaway" === "" "s&uicide" === "" "&3Check" === "" "&twokings" === "" "&atomic" === "" "cra&zyhouse" === "" "&bughouse" === "" "&Twilight" === "" "Sp&artan" === "" "&shogi" === "" "su&per" === "" "&knightmate" === "" "&Berolina" === "" "c&ylinder" === "" "&fairy" === "" "&makruk" === "" "&gothic" === "" "&capablanca" === "" "&Janus" === "" "&CRC" === "" "&Falcon" === "" "cou&rier" === "" "&Great" === "" "&Shatranj" === "" "&xiangqi" === "" NEW SHUFFLE GAME "New Shuffle Game" === "" "&Start Position Number:" === "" "Random" === "" GAME-LIST OPTIONS DIALOG "Game List Options" === "" "PGN &Tags:" === "" "&Up" === "" "&Down" === "" "Default" === "" "Factory" === "" "Restore to:" === "" MOVE HISTORY WINDOW "Move History" === "" EVALUATION GRAPH "Evaluation Graph" === "" ENGINE OUTPUT WINDOW "Engine Output" === "" "%s (%d reversible plies)" === "" "Engine #1" === "" "NPS" === "" "Engine #2" === "" CHAT BOXES "Chat Window" === "" "Chat partner:" === "" "Clear" === "" "Send" === "" winboard.c "&File" === "" "&Edit" === "" "&View" === "" "&Mode" === "" "&Action" === "" "&Step" === "" "E&ngine" === "" "&Options" === "" "&Help" === "" "You can only start a match from the initial position." === "" "Font name too long:" === "" "Font point size missing:" === "" "Can't parse color name %s" === "" "Unrecognized board size value" === "" "Unrecognized argument" === "" "No value provided for argument" === "" "Incomplete \\ escape in value for" === "" "Failed to open indirection file" === "" "Unrecognized boolean argument value" === "" "Unrecognized argument" === "" "Too many colors" === "" "&Minimize\tCtrl+F4" === "" "White: %s" === "" "We only care about the height here" === "" "Cannot build game list" === "" "Load Game from File" === "" "Load Position from File" === "" "Save Game to File" === "" "Save Diagram to File" === "" "Save Position to File" === "" "%s does not support analysis" === "" "Analyze Game from File" === "" "Unable to activate help" === "" "Send to chess program:" === "" "Send to second chess program:" === "" "Direct Command" === "" "Error loading sound %s" === "" "Error playing sound %s" === "" "File open failed" === "" "Internal error in file dialog box" === "" "Option Error" === "" "Choose an option, or cancel to exit" === "" "Unable to activate help" === "" "Displayed move is not current" === "" "Could not parse move" === "" "%s:\nError code %d" === "" "Error" === "" "Fatal Error" === "" "Exiting" === "" "%s:\nError code %d" === "" "Note" === "" "Error writing to chess program" === "" "User" === "" "Unknown" === "" "White" === "" "Black" === "" "Save Game to File" === "" "Not implemented" === "" "Shout Text" === "" "SShout/CShout" === "" "Channel 1 Text" === "" "Channel Text" === "" "Kibitz Text" === "" "Tell Text" === "" "Challenge Text" === "" "Request Text" === "" "Seek Text" === "" "Normal Text" === "" "None" === "" "Pawn" === "" "Knight" === "" "Bishop" === "" "Rook" === "" "Queen" === "" "Information" === "" wclipbrd.c "Unable to convert position to FEN." === "" "Unable to copy FEN to clipboard." === "" "Cannot create temporary file name." === "" "Cannot open temporary file." === "" "Cannot write to temporary file." === "" "Cannot reopen temporary file." === "" "Cannot determine size of file." === "" "Cannot allocate clipboard buffer." === "" "Cannot read from temporary file." === "" "Error reading from temporary file." === "" "Cannot copy text to clipboard" === "" "Unable to allocate memory for clipboard." === "" "Unable to lock clipboard memory." === "" "Cannot unlock clipboard memory." === "" "Cannot open clipboard." === "" "Cannot empty clipboard." === "" "Cannot copy text to clipboard." === "" "Cannot close clipboard." === "" "Unable to paste FEN from clipboard." === "" "Unable to create temporary file." === "" "Error writing to temporary file." === "" "Unable to open clipboard." === "" "No text in clipboard." === "" "Unable to lock clipboard memory." === "" "Unable to allocate memory for text string." === "" "Unable to unlock clipboard memory." === "" "Unable to close clipboard." === "" woptions.c ## For now, do NOT translate sound names, because WinBoard will no longer recognize them "Move" === "" "Bell" === "" "ICS Alarm" === "" "ICS Win" === "" "ICS Loss" === "" "ICS Draw" === "" "ICS Unfinished" === "" "Shout" === "" "SShout/CShout" === "" "Channel 1" === "" "Channel" === "" "Kibitz" === "" "Tell" === "" "Challenge" === "" "Request" === "" "Seek" === "" ## end of sound names "Browse for Sound File" === "" "Can't parse com port settings" === "" "Option Error" === "" "Invalid data rate" === "" "Option Error" === "" "Failed to set comm port state;\r\ninvalid options?" === "" "Failed to set comm port state" === "" "Invalid load game step rate" === "" "Invalid save game file name" === "" "Browse for Auto Save File" === "" "Invalid moves per time control" === "" "Invalid minutes per time control" === "" "Invalid increment" === "" "Invalid initial time" === "" "Changing time control during a game is not implemented" === "" "Variant %s not supported by %s" === "" "Warning: second engine (%s) does not support this!" === "" "Invalid ICS Alarm Time" === "" "Invalid max time per move" === "" "Invalid time-odds factor" === "" "Choose Folder" === "" "Choose Book" === "" "Choose Polyglot Directory" === "" "Choose EGTB Directory:" === "" "Polyglot was not found in the specified folder!" === "" wgamelist.c "No game selected" === "" "Can't go forward any further" === "" "Can't back up any further" === "" "No game list" === "" "Game List" === "" "Game list not loaded or empty" === "" "%s - %d/%d games" === "" wedittags.c "Edit Tags" === "" "Tags" === "" "Error replacing tags." === "" wsettings.c "%s Engine Settings (%s)" === "" "OK" === "" "Cancel" === "" wchat.c "Chat Window %s" === "" backend.c "bad timeControl option %s" === "" "bad searchTime option %s" === "" ## following to will appear in combinationslike "first engine" "first" === "" "second" === "" "protocol version %d not supported" === "" "Variant %s supported only in ICS mode" === "" "Unknown variant name %s" === "" "Starting chess program" === "" "Could not open comm port %s" === "" "Could not connect to host %s, port %s" === "" "Unknown initialMode %s" === "" "Can't have a match with no chess programs" === "" "Bad game file" === "" "Bad position file" === "" "AnalyzeFile mode requires a game file" === "" "Analysis mode requires a chess engine" === "" "Analysis mode does not work with ICS mode" === "" "MachineWhite mode requires a chess engine" === "" "MachineWhite mode does not work with ICS mode" === "" "MachineBlack mode requires a chess engine" === "" "MachineBlack mode does not work with ICS mode" === "" "TwoMachines mode does not work with ICS mode" === "" "TwoMachines mode requires a chess engine" === "" "Training mode requires a game file" === "" "Error writing to ICS" === "" "Error reading from keyboard" === "" "Got end of file from keyboard" === "" "Error writing to ICS" === "" "Error writing to display" === "" "Error gathering move list: two headers" === "" "Error gathering move list: nested" === "" "Connection closed by ICS" === "" "Error reading from ICS" === "" "Failed to parse board string:\n\"%s\"" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Error gathering move list: extra board" === "" "Illegal move \"%s\" from ICS" === "" "Couldn't parse move \"%s\" from ICS" === "" ## The leading 'say' is used as ICS command here, and should NOT be translated. Only the message behind it. "say Internal error; bad moveType %d (%d,%d-%d,%d)" === "" "You are playing Black" === "" "You are playing White" === "" "It is White's turn" === "" "It is Black's turn" === "" "Displayed position is not current" === "" "Illegal move" === "" "End of game" === "" "Incorrect move" === "" ## next 6: Second (first 3) or first (other) '%s' will be substituted for 'first' or 'second'. "Illegal move \"%s\" from %s machine" === "" "Illegal move \"%s\" (rejected by %s chess program)" === "" "Failed to start %s chess program %s on %s: %s\n" === "" "Error writing to %s chess program" === "" "Error: %s chess program (%s) exited unexpectedly" === "" "Error reading from %s chess program (%s)" === "" "Forfeit due to illegal move" === "" "%s does not support analysis" === "" "Hint: %s" === "" "Machine accepts your draw offer" === "" "Machine offers a draw\nSelect Action / Draw to agree" === "" "%s (only move)" === "" "Ambiguous move in ICS output: \"%s\"" === "" "Illegal move in ICS output: \"%s\"" === "" "Gap in move list" === "" "Game too long; increase MAX_MOVES and recompile" === "" "Variant %s not supported by %s" === "" "Startup failure on '%s'" === "" "Waiting for first chess program" === "" "Waiting for second chess program" === "" "Match %s vs. %s: final score %d-%d-%d" === "" "Stalemate" === "" "Illegal move: %d.%s%s" === "" "Ambiguous move: %d.%s%s" === "" "Can't open \"%s\"" === "" "Cannot build game list" === "" "No more games in this message" === "" "No game has been loaded yet" === "" "Can't back up any further" === "" "Game number out of range" === "" "Can't seek on game file" === "" "Game not found in file" === "" "Bad FEN position in file" === "" "No moves in game" === "" "No position has been loaded yet" === "" "Can't back up any further" === "" "Can't open \"%s\"" === "" "Can't seek on position file" === "" "Position not found in file" === "" "Bad FEN position in file" === "" "Black to play" === "" "White to play" === "" "Can't open \"%s\"" === "" "You have edited the game history.\nUse Reload Same Game and make your move again." === "" "You have entered too many moves.\nBack up to the correct position and try again." === "" "Displayed position is not current.\nStep forward to the correct position and try again." === "" "You have not made a move yet" === "" "The cmail message is not loaded.\nUse Reload CMail Message and make your move again." === "" "No unfinished games" === "" "You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line." === "" "Failed to invoke cmail" === "" "Waiting for reply from opponent\n" === "" "Still need to make move for game\n" === "" "Still need to make moves for both games\n" === "" "Still need to make moves for all %d games\n" === "" "Still need to make a move for game %s\n" === "" "No unfinished games\n" === "" "Ready to send mail\n" === "" "Still need to make moves for games %s\n" === "" "Edit comment" === "" "Edit comment on %d.%s%s" === "" "Starting analysis mode...\nIf this message stays up, your chess program does not support analysis." === "" "It is not White's turn" === "" "It is not Black's turn" === "" "Wait until your turn,\nor select Move Now" === "" "Starting second chess program" === "" "Training mode off" === "" "Training mode on" === "" "Already at end of game" === "" "Warning: You are still playing a game" === "" "Warning: You are still observing a game" === "" "Warning: You are still examining a game" === "" "It is Black's turn" === "" "It is White's turn" === "" "That square is occupied" === "" "There is no pending offer on this move" === "" "Your opponent is not out of time" === "" "Black offers a draw" === "" "White offers a draw" === "" "You must make your move before offering a draw" === "" "You are not examining a game" === "" "You can't revert while pausing" === "" "Wait until your turn,\nor select Move Now" === "" "It is your turn" === "" "Wait until your turn" === "" "No hint available" === "" "Analysis (%s)" === "" "Comment" === "" "Comment on %d.%s%s" === "" "Both flags fell" === "" "White's flag fell" === "" "Black's flag fell" === "" "Bad FEN position in clipboard" === "" "No response from ICS" === "" "You cannot do this while you are playing or observing" === "" "Click in holdings to choose piece" === "" "failed writing PV" === "" "Bad Seek" === "" "vs." === "" "%s (%d reversible plies)" === "" "Reading game file (%d)" === "" "Click clock to clear board" === "" "Pull pawn backwards to under-promote" === "" END-OF-GAME MESSAGES (should they be translated?) ## I think that only for visualization and not for PGN, as PGN files are shared all around the world ## [OK, I adapted the source that way. So please translate.] "Game aborted" === "" "White wins on time" === "" "Black wins on time" === "" "Both players ran out of time" === "" "White resigns" === "" "Black resigns" === "" "White mates" === "" "Black mates" === "" "Draw" === "" "Draw agreed" === "" "Xboard adjudication: King destroyed" === "" "Xboard adjudication: Bare king" === "" "Xboard adjudication: 3rd check" === "" "Xboard adjudication: Stalemate" === "" "Xboard adjudication: Checkmate" === "" "Xboard adjudication: Insufficient mating material" === "" "Xboard adjudication: Trivial draw" === "" "XBoard adjudication: repetition draw" === "" "Xboard adjudication: perpetual checking" === "" "Xboard adjudication: perpetual chasing" === "" "%Xboard adjudication: perpetual chasing of" === "" "Xboard adjudication: 50-move rule" === "" "Draw claim: 50-move rule" === "" "Draw claim: 3-fold repetition" === "" "Draw claim: insufficient mating material" === "" "Xboard adjudication: long game" === "" "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d" === "" "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c" === "" "Xboard adjudication" === "" "User adjudication" === "" "False win claim: '%s'" === "" "False draw claim: '%s'" === "" "xboard exit" === "" # NEW STRINGS FOR EXPERIMENTAL TM VERSION: # MENU "Edit Boo&k..." === "" "Edit Engine List..." === "" "Load Engine..." === "" "Tournament..." === "" # LOAD ENGINE DIALOG "First" === "" "Second" === "" "Choose File" === "" "Choose Folder:" === "" "Select engine from list:" === "" "or specify one below:" === "" "Nickname (optional):" === "" "Use nickname in PGN tag" === "" "Engine (*.exe):" === "" "command-line parameters:" === "" "directory:" === "" "(Directory will be derived from engine path when left empty)" === "" "Add this engine to the list" === "" "Must not use GUI book" === "" "UCI" === "" "WB protocol v1 (skip waiting for features)" === "" "UCCI / USI (uses specified /uxiAdapter)" === "" "Force current variant with this engine" === "" "Load mentioned engine as" === "" "Load Engine" === "" "You did not specify the engine executable" === "" "Select single engine from the group" === "" # TOURNAMENT OPTIONS DIALOG "Tournament file:" === "" "If you specify an existing file, the rest of this dialog will be ignored." === "" "Otherwise, the file will be created, with the settings you specify below:" === "" "Select Engine:" === "" "Use Swiss pairing engine (cycles = rounds)" === "" "Tourney type (0=RR, 1=gauntlet):" === "" "Sync after cycle" === "" "Number of tourney cycles:" === "" "Sync after round" === "" "Games per Match / Pairing:" === "" "File for saving tourney games:" === "" "Game File with Opening Lines:" === "" "Game Number:" === "" "File with Start Positions:" === "" "Position Number:" === "" "Step through lines/positions in file" === "" "Rewind after (0 = never):" === "" "Use each line/position twice" === "" "Pause between Games (ms):" === "" "Tournament and Match Options" === "" "Tourney participants:" === "" "Replace Engine" === "" "Upgrade Engine" === "" "Time Control..." === "" "Common Engine..." === "" "Clone Tourney" === "" "Make all use GUI book by default" === "" "You must supply a tournament file,\nfor storing the tourney progress" === "" "Not enough participants" === "" "Continue Later" === "" "First you must specify an existing tourney file to clone" === "" "No engine %s is installed" === "" # THEMES DIALOG "Board themes" === "" "Select theme from list:" === "" "or specify new theme below:" === "" "Theme name:" === "" "Use board textures" === "" "Light-square texture:" === "" "Dark-square texture:" === "" "Dark reorientation mode:" === "" "Light reorientation mode:" === "" "Draw border around board" === "" "Optional border bitmap:" === "" " Beware: a specified piece font will prevail over piece bitmaps" === "" "Directory with piece bitmaps:" === "" "Use piece font" === "" "Font size (%):" === "" "Font name:" === "" "Font piece to char:" === "" "Delete Theme" === "" "Select single theme from the group" === "" # book.c "Could not create book" === "" "Polyglot book not valid" === "" "Hash keys are different" === "" "Book Fault" === "" "Book file exists! Try again for overwrite." === "" # NEW MENU ITEMS IN 4.7 "Save Games to &Book" === "" "Colo&rs..." === "" "Load &First Engine..." === "" "Load &Second Engine..." === "" "&Board Themes..." === "" "Auto &Create Logon" === "" xboard-4.7.3/winboard/metascript.txt0000644000175000001440000000025312262415351014443 000000000000001,$g/""/d 1,$g/^[^"]*$/d 1,$g/\\/s//&&/g 1,$g/\//s//\\&/g 1,$g/&[^"]*"$/s//\\&/ 1,$s/===/\/s\/\// 1,$s/$/\/gp/ 1,$s/^/1,$g\// $a w tmp.rc q . w script.txt q xboard-4.7.3/winboard/whistory.c0000644000175000001440000002215412262415351013567 00000000000000/* * Move history for WinBoard * * Author: Alessandro Scotti (Dec 2005) * front-end code split off by HGM * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include /* required for all Windows applications */ #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "wsnap.h" // templates for calls into back-end void RefreshMemoContent P((void)); void MemoContentUpdated P((void)); void FindMoveByCharIndex P(( int char_index )); #define DEFAULT_COLOR 0xFFFFFFFF #define H_MARGIN 2 #define V_MARGIN 2 static BOOLEAN moveHistoryDialogUp = FALSE; // ------------- low-level front-end actions called by MoveHistory back-end ----------------- // low-level front-end, after calculating from & to is left to caller // it task is to highlight the indicated characters. (In WinBoard it makes them bold and blue.) void HighlightMove( int from, int to, Boolean highlight ) { CHARFORMAT cf; HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); SendMessage( hMemo, EM_SETSEL, from, to); /* Set style */ ZeroMemory( &cf, sizeof(cf) ); cf.cbSize = sizeof(cf); cf.dwMask = CFM_BOLD | CFM_COLOR; if( highlight ) { cf.dwEffects |= CFE_BOLD; cf.crTextColor = RGB( 0x00, 0x00, 0xFF ); } else { cf.dwEffects |= CFE_AUTOCOLOR; } SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); } // low-level front-end, but replace Windows data types to make it callable from back-end // its task is to clear the contents of the move-history text edit void ClearHistoryMemo() { SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETTEXT, 0, (LPARAM) "" ); } // low-level front-end, made callable from back-end by passing flags and color numbers // its task is to append the given text to the text edit // the bold argument says 0 = normal, 1 = bold typeface // the colorNr argument says 0 = font-default, 1 = gray int AppendToHistoryMemo( char * text, int bold, int colorNr ) { CHARFORMAT cf; DWORD flags = bold ? CFE_BOLD :0; DWORD color = colorNr ? GetSysColor(COLOR_GRAYTEXT) : DEFAULT_COLOR; HWND hMemo = GetDlgItem( moveHistoryDialog, IDC_MoveHistory ); /* Select end of text */ int cbTextLen = (int) SendMessage( hMemo, WM_GETTEXTLENGTH, 0, 0 ); SendMessage( hMemo, EM_SETSEL, cbTextLen, cbTextLen ); /* Set style */ ZeroMemory( &cf, sizeof(cf) ); cf.cbSize = sizeof(cf); cf.dwMask = CFM_BOLD | CFM_ITALIC | CFM_COLOR | CFM_UNDERLINE; cf.dwEffects = flags; if( color != DEFAULT_COLOR ) { cf.crTextColor = color; } else { cf.dwEffects |= CFE_AUTOCOLOR; } SendMessage( hMemo, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf ); /* Append text */ SendMessage( hMemo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text ); /* Return offset of appended text */ return cbTextLen; } // low-level front-end; wrapper for the code to scroll the mentioned character in view (-1 = end) void ScrollToCurrent(int caretPos) { if(caretPos < 0) caretPos = (int) SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_GETTEXTLENGTH, 0, 0 ); SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETSEL, caretPos, caretPos ); SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SCROLLCARET, 0, 0 ); } // ------------------------------ call backs -------------------------- // front-end. Universal call-back for any event. Recognized vents are dialog creation, OK and cancel button-press // (dead code, as these buttons do not exist?), mouse clicks on the text edit, and moving / sizing LRESULT CALLBACK HistoryDialogProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { static SnapData sd; switch (message) { case WM_INITDIALOG: if( moveHistoryDialog == NULL ) { moveHistoryDialog = hDlg; Translate(hDlg, DLG_MoveHistory); /* Enable word wrapping and notifications */ SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETTARGETDEVICE, 0, 0 ); SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS ); /* Set font */ SendDlgItemMessage( moveHistoryDialog, IDC_MoveHistory, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 )); /* Restore window placement */ RestoreWindowPlacement( hDlg, &wpMoveHistory ); } /* Update memo */ RefreshMemoContent(); MemoContentUpdated(); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; case WM_NOTIFY: if( wParam == IDC_MoveHistory ) { MSGFILTER * lpMF = (MSGFILTER *) lParam; if( lpMF->msg == WM_LBUTTONDBLCLK && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) { POINTL pt; LRESULT index; pt.x = LOWORD( lpMF->lParam ); pt.y = HIWORD( lpMF->lParam ); index = SendDlgItemMessage( hDlg, IDC_MoveHistory, EM_CHARFROMPOS, 0, (LPARAM) &pt ); FindMoveByCharIndex( index ); // [HGM] also does the actual moving to it, now /* Zap the message for good: apparently, returning non-zero is not enough */ lpMF->msg = WM_USER; return TRUE; } } break; case WM_SIZE: SetWindowPos( GetDlgItem( moveHistoryDialog, IDC_MoveHistory ), HWND_TOP, H_MARGIN, V_MARGIN, LOWORD(lParam) - 2*H_MARGIN, HIWORD(lParam) - 2*V_MARGIN, SWP_NOZORDER ); break; case WM_GETMINMAXINFO: { MINMAXINFO * mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; } break; case WM_CLOSE: MoveHistoryPopDown(); break; case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } return FALSE; } // ------------ standard entry points into MoveHistory code ----------- // front-end VOID MoveHistoryPopUp() { FARPROC lpProc; CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_CHECKED); if( moveHistoryDialog ) { SendMessage( moveHistoryDialog, WM_INITDIALOG, 0, 0 ); if( ! moveHistoryDialogUp ) { ShowWindow(moveHistoryDialog, SW_SHOW); } } else { lpProc = MakeProcInstance( (FARPROC) HistoryDialogProc, hInst ); /* Note to self: dialog must have the WS_VISIBLE style set, otherwise it's not shown! */ CreateDialog( hInst, MAKEINTRESOURCE(DLG_MoveHistory), hwndMain, (DLGPROC)lpProc ); FreeProcInstance(lpProc); } moveHistoryDialogUp = TRUE; // Note that in WIndows creating the dialog causes its call-back to perform // RefreshMemoContent() and MemoContentUpdated() immediately after it is realized. // To port this to X we might have to do that from here. } // front-end VOID MoveHistoryPopDown() { CheckMenuItem(GetMenu(hwndMain), IDM_ShowMoveHistory, MF_UNCHECKED); if( moveHistoryDialog ) { ShowWindow(moveHistoryDialog, SW_HIDE); } moveHistoryDialogUp = FALSE; } // front-end Boolean MoveHistoryIsUp() { return moveHistoryDialogUp; } // front-end Boolean MoveHistoryDialogExists() { return moveHistoryDialog != NULL; } xboard-4.7.3/winboard/WB4Jaws.dev0000644000175000001440000001000112262415351013440 00000000000000[Project] FileName=WB4Jaws.dev Name=Winboard UnitCount=27 Type=0 Ver=1 ObjFiles= Includes= Libs= PrivateResource=Winboard_private.rc ResourceIncludes=.. MakeIncludes= Compiler=-I.._@@_-I._@@_-DNDEBUG_@@_-DJAWS_@@_ CppCompiler= Linker=-fpic_@@_-s_@@_-mwindows_@@_-lwsock32_@@_-lwinmm_@@_-lcomctl32_@@_ IsCpp=0 Icon= ExeOutput= ObjectOutput=.\objs OverrideOutput=1 OverrideOutputName=Winboard.exe HostApplication= Folders= CommandLine= UseCustomMakefile=0 CustomMakefile=makefile.gcc IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000000001000000100 [Unit1] FileName=wsockerr.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit2] FileName=..\parser.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=wclipbrd.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=wedittags.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit5] FileName=wevalgraph.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=wgamelist.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=whistory.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit8] FileName=winboard.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit9] FileName=wlayout.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit10] FileName=woptions.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit11] FileName=wsnap.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit12] FileName=..\uci.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit13] FileName=..\backend.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit14] FileName=..\book.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit15] FileName=..\gamelist.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit16] FileName=..\lists.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit17] FileName=..\moves.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit18] FileName=..\pgntags.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit19] FileName=winboard.rc CompileCpp=0 Folder=Winboard Compile=1 Link=0 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit20] FileName=..\zippy.c Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= CompileCpp=0 [Unit21] FileName=help.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit22] FileName=wsettings.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit23] FileName=wchat.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit24] FileName=..\engineoutput.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit25] FileName=..\evalgraph.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit26] FileName=wengineoutput.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit27] FileName=..\history.c CompileCpp=0 Folder=Winboard Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= xboard-4.7.3/winboard/winboard.c0000644000175000001440000115753612262562252013525 00000000000000/* * WinBoard.c -- Windows NT front end to XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * XBoard borrows its colors and the bitmaps.xchess bitmap set from XChess, * which was written and is copyrighted by Wayne Christopher. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __GNUC__ #include #include #endif #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "moves.h" #include "wclipbrd.h" #include "woptions.h" #include "wsockerr.h" #include "defaults.h" #include "help.h" #include "wsnap.h" #define SLASH '/' #define DATADIR "~~" //void InitEngineUCI( const char * iniDir, ChessProgramState * cps ); int myrandom(void); void mysrandom(unsigned int seed); extern int whiteFlag, blackFlag; Boolean flipClock = FALSE; extern HANDLE chatHandle[]; extern enum ICS_TYPE ics_type; int MySearchPath P((char *installDir, char *name, char *fullname)); int MyGetFullPathName P((char *name, char *fullname)); void DisplayHoldingsCount(HDC hdc, int x, int y, int align, int copyNumber); VOID NewVariantPopup(HWND hwnd); int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY, /*char*/int promoChar)); void DisplayMove P((int moveNumber)); Boolean ParseFEN P((Board board, int *blackPlaysFirst, char *fen)); void ChatPopUp P((char *s)); typedef struct { ChessSquare piece; POINT pos; /* window coordinates of current pos */ POINT lastpos; /* window coordinates of last pos - used for clipping */ POINT from; /* board coordinates of the piece's orig pos */ POINT to; /* board coordinates of the piece's new pos */ } AnimInfo; static AnimInfo animInfo = { EmptySquare, {-1,-1}, {-1,-1}, {-1,-1} }; typedef struct { POINT start; /* window coordinates of start pos */ POINT pos; /* window coordinates of current pos */ POINT lastpos; /* window coordinates of last pos - used for clipping */ POINT from; /* board coordinates of the piece's orig pos */ ChessSquare piece; } DragInfo; static DragInfo dragInfo = { {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1}, EmptySquare }; typedef struct { POINT sq[2]; /* board coordinates of from, to squares */ } HighlightInfo; static HighlightInfo highlightInfo = { {{-1, -1}, {-1, -1}} }; static HighlightInfo premoveHighlightInfo = { {{-1, -1}, {-1, -1}} }; static HighlightInfo partnerHighlightInfo = { {{-1, -1}, {-1, -1}} }; static HighlightInfo oldPartnerHighlight = { {{-1, -1}, {-1, -1}} }; typedef struct { // [HGM] atomic int fromX, fromY, toX, toY, radius; } ExplodeInfo; static ExplodeInfo explodeInfo; /* Window class names */ char szAppName[] = "WinBoard"; char szConsoleName[] = "WBConsole"; /* Title bar text */ char szTitle[] = "WinBoard"; char szConsoleTitle[] = "I C S Interaction"; char *programName; char *settingsFileName; Boolean saveSettingsOnExit; char installDir[MSG_SIZ]; int errorExitStatus; BoardSize boardSize; Boolean chessProgram; //static int boardX, boardY; int minX, minY; // [HGM] placement: volatile limits on upper-left corner int squareSize, lineGap, minorSize, border; static int winW, winH; static RECT messageRect, whiteRect, blackRect, leftLogoRect, rightLogoRect; // [HGM] logo static int logoHeight = 0; static char messageText[MESSAGE_TEXT_MAX]; static int clockTimerEvent = 0; static int loadGameTimerEvent = 0; static int analysisTimerEvent = 0; static DelayedEventCallback delayedTimerCallback; static int delayedTimerEvent = 0; static int buttonCount = 2; char *icsTextMenuString; char *icsNames; char *firstChessProgramNames; char *secondChessProgramNames; #define PALETTESIZE 256 HINSTANCE hInst; /* current instance */ Boolean alwaysOnTop = FALSE; RECT boardRect; COLORREF lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor, highlightSquareColor, premoveHighlightColor; HPALETTE hPal; ColorClass currentColorClass; static HWND savedHwnd; HWND hCommPort = NULL; /* currently open comm port */ static HWND hwndPause; /* pause button */ static HBITMAP pieceBitmap[3][(int) BlackPawn]; /* [HGM] nr of bitmaps referred to bP in stead of wK */ static HBRUSH lightSquareBrush, darkSquareBrush, blackSquareBrush, /* [HGM] for band between board and holdings */ explodeBrush, /* [HGM] atomic */ markerBrush, /* [HGM] markers */ whitePieceBrush, blackPieceBrush, iconBkgndBrush /*, outlineBrush*/; static POINT gridEndpoints[(BOARD_RANKS + BOARD_FILES + 2) * 2]; static DWORD gridVertexCounts[BOARD_RANKS + BOARD_FILES + 2]; static HPEN gridPen = NULL; static HPEN highlightPen = NULL; static HPEN premovePen = NULL; static NPLOGPALETTE pLogPal; static BOOL paletteChanged = FALSE; static HICON iconWhite, iconBlack, iconCurrent; static int doingSizing = FALSE; static int lastSizing = 0; static int prevStderrPort; static HBITMAP userLogo; static HBITMAP liteBackTexture = NULL; static HBITMAP darkBackTexture = NULL; static int liteBackTextureMode = BACK_TEXTURE_MODE_PLAIN; static int darkBackTextureMode = BACK_TEXTURE_MODE_PLAIN; static int backTextureSquareSize = 0; static struct { int x; int y; int mode; } backTextureSquareInfo[BOARD_RANKS][BOARD_FILES]; #if __GNUC__ && !defined(_winmajor) #define oldDialog 0 /* cygwin doesn't define _winmajor; mingw does */ #else #if defined(_winmajor) #define oldDialog (_winmajor < 4) #else #define oldDialog 0 #endif #endif #define INTERNATIONAL #ifdef INTERNATIONAL # define _(s) T_(s) # define N_(s) s #else # define _(s) s # define N_(s) s # define T_(s) s # define Translate(x, y) # define LoadLanguageFile(s) #endif #ifdef INTERNATIONAL Boolean barbaric; // flag indicating if translation is needed // list of item numbers used in each dialog (used to alter language at run time) #define ABOUTBOX -1 /* not sure why these are needed */ #define ABOUTBOX2 -1 int dialogItems[][42] = { { ABOUTBOX, IDOK, OPT_MESS, 400 }, { DLG_TimeControl, IDC_Babble, OPT_TCUseMoves, OPT_TCUseInc, OPT_TCUseFixed, OPT_TCtext1, OPT_TCtext2, OPT_TCitext1, OPT_TCitext2, OPT_TCftext, GPB_Factors, IDC_Factor1, IDC_Factor2, IDOK, IDCANCEL }, { DLG_LoadOptions, OPT_Autostep, OPT_AStext1, OPT_Exact, OPT_Subset, OPT_Struct, OPT_Material, OPT_Range, OPT_Difference, OPT_elo1t, OPT_elo2t, OPT_datet, OPT_Stretch, OPT_Stretcht, OPT_Reversed, OPT_SearchMode, OPT_Mirror, OPT_thresholds, IDOK, IDCANCEL }, { DLG_SaveOptions, OPT_Autosave, OPT_AVPrompt, OPT_AVToFile, OPT_AVBrowse, 801, OPT_PGN, OPT_Old, OPT_OutOfBookInfo, IDOK, IDCANCEL }, { 1536, 1090, IDC_Directories, 1089, 1091, IDOK, IDCANCEL, 1038, IDC_IndexNr, 1037 }, { DLG_CommPort, IDOK, IDCANCEL, IDC_Port, IDC_Rate, IDC_Bits, IDC_Parity, IDC_Stop, IDC_Flow, OPT_SerialHelp }, { DLG_EditComment, IDOK, OPT_CancelComment, OPT_ClearComment, OPT_EditComment }, { DLG_PromotionKing, PB_Chancellor, PB_Archbishop, PB_Queen, PB_Rook, PB_Bishop, PB_Knight, PB_King, IDCANCEL, IDC_Yes, IDC_No, IDC_Centaur }, { ABOUTBOX2, IDC_ChessBoard }, { DLG_GameList, OPT_GameListLoad, OPT_GameListPrev, OPT_GameListNext, OPT_GameListClose, IDC_GameListDoFilter }, { DLG_EditTags, IDOK, OPT_TagsCancel, OPT_EditTags }, { DLG_Error, IDOK }, { DLG_Colorize, IDOK, IDCANCEL, OPT_ChooseColor, OPT_Bold, OPT_Italic, OPT_Underline, OPT_Strikeout, OPT_Sample }, { DLG_Question, IDOK, IDCANCEL, OPT_QuestionText }, { DLG_Startup, IDC_Welcome, OPT_ChessEngine, OPT_ChessServer, OPT_View, IDC_SPECIFY_ENG_STATIC, IDC_SPECIFY_SERVER_STATIC, OPT_AnyAdditional, IDOK, IDCANCEL, IDM_HELPCONTENTS }, { DLG_IndexNumber, IDC_Index }, { DLG_TypeInMove, IDOK, IDCANCEL }, { DLG_TypeInName, IDOK, IDCANCEL }, { DLG_Sound, IDC_Event, OPT_NoSound, OPT_DefaultBeep, OPT_BuiltInSound, OPT_WavFile, OPT_BrowseSound, OPT_DefaultSounds, IDOK, IDCANCEL, OPT_PlaySound }, { DLG_GeneralOptions, IDOK, IDCANCEL, OPT_AlwaysOnTop, OPT_HighlightLastMove, OPT_AlwaysQueen, OPT_PeriodicUpdates, OPT_AnimateDragging, OPT_PonderNextMove, OPT_AnimateMoving, OPT_PopupExitMessage, OPT_AutoFlag, OPT_PopupMoveErrors, OPT_AutoFlipView, OPT_ShowButtonBar, OPT_AutoRaiseBoard, OPT_ShowCoordinates, OPT_Blindfold, OPT_ShowThinking, OPT_HighlightDragging, OPT_TestLegality, OPT_SaveExtPGN, OPT_HideThinkFromHuman, OPT_ExtraInfoInMoveHistory, OPT_HighlightMoveArrow, OPT_AutoLogo ,OPT_SmartMove }, { DLG_IcsOptions, IDOK, IDCANCEL, OPT_AutoComment, OPT_AutoKibitz, OPT_AutoObserve, OPT_GetMoveList, OPT_LocalLineEditing, OPT_QuietPlay, OPT_SeekGraph, OPT_AutoRefresh, OPT_BgObserve, OPT_DualBoard, OPT_Premove, OPT_PremoveWhite, OPT_PremoveBlack, OPT_SmartMove, OPT_IcsAlarm, IDC_Sec, OPT_ChooseShoutColor, OPT_ChooseSShoutColor, OPT_ChooseChannel1Color, OPT_ChooseChannelColor, OPT_ChooseKibitzColor, OPT_ChooseTellColor, OPT_ChooseChallengeColor, OPT_ChooseRequestColor, OPT_ChooseSeekColor, OPT_ChooseNormalColor, OPT_ChooseBackgroundColor, OPT_DefaultColors, OPT_DontColorize, IDC_Boxes, GPB_Colors, GPB_Premove, GPB_General, GPB_Alarm, OPT_AutoCreate }, { DLG_BoardOptions, IDOK, IDCANCEL, OPT_SizeTiny, OPT_SizeTeeny, OPT_SizeDinky, OPT_SizePetite, OPT_SizeSlim, OPT_SizeSmall, OPT_SizeMediocre, OPT_SizeMiddling, OPT_SizeAverage, OPT_SizeModerate, OPT_SizeMedium, OPT_SizeBulky, OPT_SizeLarge, OPT_SizeBig, OPT_SizeHuge, OPT_SizeGiant, OPT_SizeColossal, OPT_SizeTitanic, OPT_ChooseLightSquareColor, OPT_ChooseDarkSquareColor, OPT_ChooseWhitePieceColor, OPT_ChooseBlackPieceColor, OPT_ChooseHighlightSquareColor, OPT_ChoosePremoveHighlightColor, OPT_Monochrome, OPT_AllWhite, OPT_UpsideDown, OPT_DefaultBoardColors, GPB_Colors, IDC_Light, IDC_Dark, IDC_White, IDC_Black, IDC_High, IDC_PreHigh, GPB_Size, OPT_Bitmaps, OPT_PieceFont, OPT_Grid }, { DLG_NewVariant, IDOK, IDCANCEL, OPT_VariantNormal, OPT_VariantFRC, OPT_VariantWildcastle, OPT_VariantNocastle, OPT_VariantLosers, OPT_VariantGiveaway, OPT_VariantSuicide, OPT_Variant3Check, OPT_VariantTwoKings, OPT_VariantAtomic, OPT_VariantCrazyhouse, OPT_VariantBughouse, OPT_VariantTwilight, OPT_VariantShogi, OPT_VariantSuper, OPT_VariantKnightmate, OPT_VariantBerolina, OPT_VariantCylinder, OPT_VariantFairy, OPT_VariantMakruk, OPT_VariantGothic, OPT_VariantCapablanca, OPT_VariantJanus, OPT_VariantCRC, OPT_VariantFalcon, OPT_VariantCourier, OPT_VariantGreat, OPT_VariantSChess, OPT_VariantShatranj, OPT_VariantXiangqi, GPB_Variant, GPB_Board, IDC_Height, IDC_Width, IDC_Hand, IDC_Pieces, IDC_Def }, { DLG_Fonts, IDOK, IDCANCEL, OPT_ChooseClockFont, OPT_ChooseMessageFont, OPT_ChooseCoordFont, OPT_ChooseTagFont, OPT_ChooseCommentsFont, OPT_ChooseConsoleFont, OPT_ChooseMoveHistoryFont, OPT_DefaultFonts, OPT_ClockFont, OPT_MessageFont, OPT_CoordFont, OPT_EditTagsFont, OPT_ChoosePieceFont, OPT_MessageFont8, OPT_SampleGameListFont, OPT_ChooseGameListFont, OPT_MessageFont7, OPT_CommentsFont, OPT_MessageFont5, GPB_Current, GPB_All, OPT_MessageFont6 }, { DLG_NewGameFRC, IDC_NFG_Label, IDC_NFG_Random, IDOK, IDCANCEL }, { DLG_GameListOptions, IDC_GLT, IDC_GLT_Up, IDC_GLT_Down, IDC_GLT_Restore, IDC_GLT_Default, IDOK, IDCANCEL, IDC_GLT_RestoreTo }, { DLG_MoveHistory }, { DLG_EvalGraph }, { DLG_EngineOutput, IDC_EngineLabel1, IDC_Engine1_NPS, IDC_EngineLabel2, IDC_Engine2_NPS }, { DLG_Chat, IDC_Partner, IDC_Clear, IDC_Send, }, { DLG_EnginePlayOptions, IDC_EpPonder, IDC_EpShowThinking, IDC_EpHideThinkingHuman, IDC_EpPeriodicUpdates, GPB_Adjudications, IDC_Draw, IDC_Moves, IDC_Threshold, IDC_Centi, IDC_TestClaims, IDC_DetectMates, IDC_MaterialDraws, IDC_TrivialDraws, GPB_Apply, IDC_Rule, IDC_Repeats, IDC_ScoreAbs1, IDC_ScoreAbs2, IDOK, IDCANCEL }, { DLG_OptionsUCI, IDC_PolyDir, IDC_BrowseForPolyglotDir, IDC_Hash, IDC_Path, IDC_BrowseForEGTB, IDC_Cache, IDC_UseBook, IDC_BrowseForBook, IDC_CPU, IDC_OwnBook1, IDC_OwnBook2, IDC_Depth, IDC_Variation, IDC_DefGames, IDOK, IDCANCEL }, { 0 } }; static char languageBuf[70000], *foreign[1000], *english[1000], *languageFile[MSG_SIZ]; static int lastChecked; static char oldLanguage[MSG_SIZ], *menuText[10][30]; extern int tinyLayout; extern char * menuBarText[][10]; void LoadLanguageFile(char *name) { //load the file with translations, and make a list of the strings to be translated, and their translations FILE *f; int i=0, j=0, n=0, k; char buf[MSG_SIZ]; if(!name || name[0] == NULLCHAR) return; snprintf(buf, MSG_SIZ, "%s%s", name, strchr(name, '.') ? "" : ".lng"); // auto-append lng extension appData.language = oldLanguage; if(!strcmp(buf, oldLanguage)) { barbaric = 1; return; } // this language already loaded; just switch on if((f = fopen(buf, "r")) == NULL) return; while((k = fgetc(f)) != EOF) { if(i >= sizeof(languageBuf)) { DisplayError("Language file too big", 0); return; } languageBuf[i] = k; if(k == '\n') { if(languageBuf[n] == '"' && languageBuf[i-1] == '"') { char *p; if(p = strstr(languageBuf + n + 1, "\" === \"")) { if(p > languageBuf+n+2 && p+8 < languageBuf+i) { if(j >= sizeof(english)) { DisplayError("Too many translated strings", 0); return; } english[j] = languageBuf + n + 1; *p = 0; foreign[j++] = p + 7; languageBuf[i-1] = 0; //if(appData.debugMode) fprintf(debugFP, "translation: replace '%s' by '%s'\n", english[j-1], foreign[j-1]); } } } n = i + 1; } else if(i > 0 && languageBuf[i-1] == '\\') { switch(k) { case 'n': k = '\n'; break; case 'r': k = '\r'; break; case 't': k = '\t'; break; } languageBuf[--i] = k; } i++; } fclose(f); barbaric = (j != 0); safeStrCpy(oldLanguage, buf, sizeof(oldLanguage)/sizeof(oldLanguage[0]) ); } char * T_(char *s) { // return the translation of the given string // efficiency can be improved a lot... int i=0; static char buf[MSG_SIZ]; //if(appData.debugMode) fprintf(debugFP, "T_(%s)\n", s); if(!barbaric) return s; if(!s) return ""; // sanity while(english[i]) { if(!strcmp(s, english[i])) return foreign[i]; if(english[i][0] == '%' && strstr(s, english[i]+1) == s) { // allow translation of strings with variable ending snprintf(buf, MSG_SIZ, "%s%s", foreign[i], s + strlen(english[i]+1)); // keep unmatched portion return buf; } i++; } return s; } void Translate(HWND hDlg, int dialogID) { // translate all text items in the given dialog int i=0, j, k; char buf[MSG_SIZ], *s; if(!barbaric) return; while(dialogItems[i][0] && dialogItems[i][0] != dialogID) i++; // find the dialog description if(dialogItems[i][0] != dialogID) return; // unknown dialog, should not happen GetWindowText( hDlg, buf, MSG_SIZ ); s = T_(buf); if(strcmp(buf, s)) SetWindowText(hDlg, s); // replace by translated string (if different) for(j=1; k=dialogItems[i][j]; j++) { // translate all listed dialog items GetDlgItemText(hDlg, k, buf, MSG_SIZ); if(strlen(buf) == 0) continue; s = T_(buf); if(strcmp(buf, s)) SetDlgItemText(hDlg, k, s); // replace by translated string (if different) } } HMENU TranslateOneMenu(int i, HMENU subMenu) { int j; static MENUITEMINFO info; info.cbSize = sizeof(MENUITEMINFO); info.fMask = MIIM_STATE | MIIM_TYPE; for(j=GetMenuItemCount(subMenu)-1; j>=0; j--){ char buf[MSG_SIZ]; info.dwTypeData = buf; info.cch = sizeof(buf); GetMenuItemInfo(subMenu, j, TRUE, &info); if(i < 10) { if(menuText[i][j]) safeStrCpy(buf, menuText[i][j], sizeof(buf)/sizeof(buf[0]) ); else menuText[i][j] = strdup(buf); // remember original on first change } if(buf[0] == NULLCHAR) continue; info.dwTypeData = T_(buf); info.cch = strlen(buf)+1; SetMenuItemInfo(subMenu, j, TRUE, &info); } return subMenu; } void TranslateMenus(int addLanguage) { int i; WIN32_FIND_DATA fileData; HANDLE hFind; #define IDM_English 1970 if(1) { HMENU mainMenu = GetMenu(hwndMain); for (i=GetMenuItemCount(mainMenu)-1; i>=0; i--) { HMENU subMenu = GetSubMenu(mainMenu, i); ModifyMenu(mainMenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP|EnableMenuItem(mainMenu, i, MF_BYPOSITION), (UINT) subMenu, T_(menuBarText[tinyLayout][i])); TranslateOneMenu(i, subMenu); } DrawMenuBar(hwndMain); } if(!addLanguage) return; if((hFind = FindFirstFile("*.LNG", &fileData)) != INVALID_HANDLE_VALUE) { HMENU mainMenu = GetMenu(hwndMain); HMENU subMenu = GetSubMenu(mainMenu, GetMenuItemCount(mainMenu)-1); AppendMenu(subMenu, MF_SEPARATOR, (UINT_PTR) 0, NULL); AppendMenu(subMenu, MF_ENABLED|MF_STRING|(barbaric?MF_UNCHECKED:MF_CHECKED), (UINT_PTR) IDM_English, (LPCTSTR) "English"); i = 0; lastChecked = IDM_English; do { char *p, *q = fileData.cFileName; int checkFlag = MF_UNCHECKED; languageFile[i] = strdup(q); if(barbaric && !strcmp(oldLanguage, q)) { checkFlag = MF_CHECKED; lastChecked = IDM_English + i + 1; CheckMenuItem(mainMenu, IDM_English, MF_BYCOMMAND|MF_UNCHECKED); } *q = ToUpper(*q); while(*++q) *q = ToLower(*q); p = strstr(fileData.cFileName, ".lng"); if(p) *p = 0; AppendMenu(subMenu, MF_ENABLED|MF_STRING|checkFlag, (UINT_PTR) IDM_English + ++i, (LPCTSTR) fileData.cFileName); } while(FindNextFile(hFind, &fileData)); FindClose(hFind); } } #endif #define IDM_RecentEngines 3000 void RecentEngineMenu (char *s) { if(appData.icsActive) return; if(appData.recentEngines > 0 && *s) { // feature is on, and list non-empty HMENU mainMenu = GetMenu(hwndMain); HMENU subMenu = GetSubMenu(mainMenu, 5); // Engine menu int i=IDM_RecentEngines; recentEngines = strdup(appData.recentEngineList); // remember them as they are in menu AppendMenu(subMenu, MF_SEPARATOR, (UINT_PTR) 0, NULL); while(*s) { char *p = strchr(s, '\n'); if(p == NULL) return; // malformed! *p = NULLCHAR; AppendMenu(subMenu, MF_ENABLED|MF_STRING|MF_UNCHECKED, (UINT_PTR) i++, (LPCTSTR) s); *p = '\n'; s = p+1; } } } typedef struct { char *name; int squareSize; int lineGap; int smallLayout; int tinyLayout; int cliWidth, cliHeight; } SizeInfo; SizeInfo sizeInfo[] = { { "tiny", 21, 0, 1, 1, 0, 0 }, { "teeny", 25, 1, 1, 1, 0, 0 }, { "dinky", 29, 1, 1, 1, 0, 0 }, { "petite", 33, 1, 1, 1, 0, 0 }, { "slim", 37, 2, 1, 0, 0, 0 }, { "small", 40, 2, 1, 0, 0, 0 }, { "mediocre", 45, 2, 1, 0, 0, 0 }, { "middling", 49, 2, 0, 0, 0, 0 }, { "average", 54, 2, 0, 0, 0, 0 }, { "moderate", 58, 3, 0, 0, 0, 0 }, { "medium", 64, 3, 0, 0, 0, 0 }, { "bulky", 72, 3, 0, 0, 0, 0 }, { "large", 80, 3, 0, 0, 0, 0 }, { "big", 87, 3, 0, 0, 0, 0 }, { "huge", 95, 3, 0, 0, 0, 0 }, { "giant", 108, 3, 0, 0, 0, 0 }, { "colossal", 116, 4, 0, 0, 0, 0 }, { "titanic", 129, 4, 0, 0, 0, 0 }, { NULL, 0, 0, 0, 0, 0, 0 } }; #define MF(x) {x, {{0,}, 0. }, {0, }, 0} MyFont fontRec[NUM_SIZES][NUM_FONTS] = { { MF(CLOCK_FONT_TINY), MF(MESSAGE_FONT_TINY), MF(COORD_FONT_TINY), MF(CONSOLE_FONT_TINY), MF(COMMENT_FONT_TINY), MF(EDITTAGS_FONT_TINY), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_TEENY), MF(MESSAGE_FONT_TEENY), MF(COORD_FONT_TEENY), MF(CONSOLE_FONT_TEENY), MF(COMMENT_FONT_TEENY), MF(EDITTAGS_FONT_TEENY), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_DINKY), MF(MESSAGE_FONT_DINKY), MF(COORD_FONT_DINKY), MF(CONSOLE_FONT_DINKY), MF(COMMENT_FONT_DINKY), MF(EDITTAGS_FONT_DINKY), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_PETITE), MF(MESSAGE_FONT_PETITE), MF(COORD_FONT_PETITE), MF(CONSOLE_FONT_PETITE), MF(COMMENT_FONT_PETITE), MF(EDITTAGS_FONT_PETITE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_SLIM), MF(MESSAGE_FONT_SLIM), MF(COORD_FONT_SLIM), MF(CONSOLE_FONT_SLIM), MF(COMMENT_FONT_SLIM), MF(EDITTAGS_FONT_SLIM), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_SMALL), MF(MESSAGE_FONT_SMALL), MF(COORD_FONT_SMALL), MF(CONSOLE_FONT_SMALL), MF(COMMENT_FONT_SMALL), MF(EDITTAGS_FONT_SMALL), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_MEDIOCRE), MF(MESSAGE_FONT_MEDIOCRE), MF(COORD_FONT_MEDIOCRE), MF(CONSOLE_FONT_MEDIOCRE), MF(COMMENT_FONT_MEDIOCRE), MF(EDITTAGS_FONT_MEDIOCRE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_MIDDLING), MF(MESSAGE_FONT_MIDDLING), MF(COORD_FONT_MIDDLING), MF(CONSOLE_FONT_MIDDLING), MF(COMMENT_FONT_MIDDLING), MF(EDITTAGS_FONT_MIDDLING), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_AVERAGE), MF(MESSAGE_FONT_AVERAGE), MF(COORD_FONT_AVERAGE), MF(CONSOLE_FONT_AVERAGE), MF(COMMENT_FONT_AVERAGE), MF(EDITTAGS_FONT_AVERAGE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_MODERATE), MF(MESSAGE_FONT_MODERATE), MF(COORD_FONT_MODERATE), MF(CONSOLE_FONT_MODERATE), MF(COMMENT_FONT_MODERATE), MF(EDITTAGS_FONT_MODERATE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_MEDIUM), MF(MESSAGE_FONT_MEDIUM), MF(COORD_FONT_MEDIUM), MF(CONSOLE_FONT_MEDIUM), MF(COMMENT_FONT_MEDIUM), MF(EDITTAGS_FONT_MEDIUM), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_BULKY), MF(MESSAGE_FONT_BULKY), MF(COORD_FONT_BULKY), MF(CONSOLE_FONT_BULKY), MF(COMMENT_FONT_BULKY), MF(EDITTAGS_FONT_BULKY), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_LARGE), MF(MESSAGE_FONT_LARGE), MF(COORD_FONT_LARGE), MF(CONSOLE_FONT_LARGE), MF(COMMENT_FONT_LARGE), MF(EDITTAGS_FONT_LARGE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_BIG), MF(MESSAGE_FONT_BIG), MF(COORD_FONT_BIG), MF(CONSOLE_FONT_BIG), MF(COMMENT_FONT_BIG), MF(EDITTAGS_FONT_BIG), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_HUGE), MF(MESSAGE_FONT_HUGE), MF(COORD_FONT_HUGE), MF(CONSOLE_FONT_HUGE), MF(COMMENT_FONT_HUGE), MF(EDITTAGS_FONT_HUGE), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_GIANT), MF(MESSAGE_FONT_GIANT), MF(COORD_FONT_GIANT), MF(CONSOLE_FONT_GIANT), MF(COMMENT_FONT_GIANT), MF(EDITTAGS_FONT_GIANT), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_COLOSSAL), MF(MESSAGE_FONT_COLOSSAL), MF(COORD_FONT_COLOSSAL), MF(CONSOLE_FONT_COLOSSAL), MF(COMMENT_FONT_COLOSSAL), MF(EDITTAGS_FONT_COLOSSAL), MF(MOVEHISTORY_FONT_ALL), MF (GAMELIST_FONT_ALL) }, { MF(CLOCK_FONT_TITANIC), MF(MESSAGE_FONT_TITANIC), MF(COORD_FONT_TITANIC), MF(CONSOLE_FONT_TITANIC), MF(COMMENT_FONT_TITANIC), MF(EDITTAGS_FONT_TITANIC), MF(MOVEHISTORY_FONT_ALL), MF(GAMELIST_FONT_ALL) }, }; MyFont *font[NUM_SIZES][NUM_FONTS]; typedef struct { char *label; int id; HWND hwnd; WNDPROC wndproc; } MyButtonDesc; #define BUTTON_WIDTH (tinyLayout ? 16 : 32) #define N_BUTTONS 5 MyButtonDesc buttonDesc[N_BUTTONS] = { {"<<", IDM_ToStart, NULL, NULL}, {"<", IDM_Backward, NULL, NULL}, {"P", IDM_Pause, NULL, NULL}, {">", IDM_Forward, NULL, NULL}, {">>", IDM_ToEnd, NULL, NULL}, }; int tinyLayout = 0, smallLayout = 0; #define MENU_BAR_ITEMS 9 char *menuBarText[2][MENU_BAR_ITEMS+1] = { { N_("&File"), N_("&Edit"), N_("&View"), N_("&Mode"), N_("&Action"), N_("E&ngine"), N_("&Options"), N_("&Help"), NULL }, { N_("&F"), N_("&E"), N_("&V"), N_("&M"), N_("&A"), N_("&N"), N_("&O"), N_("&H"), NULL }, }; MySound sounds[(int)NSoundClasses]; MyTextAttribs textAttribs[(int)NColorClasses]; MyColorizeAttribs colorizeAttribs[] = { { (COLORREF)0, 0, N_("Shout Text") }, { (COLORREF)0, 0, N_("SShout/CShout") }, { (COLORREF)0, 0, N_("Channel 1 Text") }, { (COLORREF)0, 0, N_("Channel Text") }, { (COLORREF)0, 0, N_("Kibitz Text") }, { (COLORREF)0, 0, N_("Tell Text") }, { (COLORREF)0, 0, N_("Challenge Text") }, { (COLORREF)0, 0, N_("Request Text") }, { (COLORREF)0, 0, N_("Seek Text") }, { (COLORREF)0, 0, N_("Normal Text") }, { (COLORREF)0, 0, N_("None") } }; static char *commentTitle; static char *commentText; static int commentIndex; static Boolean editComment = FALSE; char errorTitle[MSG_SIZ]; char errorMessage[2*MSG_SIZ]; HWND errorDialog = NULL; BOOLEAN moveErrorMessageUp = FALSE; BOOLEAN consoleEcho = TRUE; CHARFORMAT consoleCF; COLORREF consoleBackgroundColor; char *programVersion; #define CPReal 1 #define CPComm 2 #define CPSock 3 #define CPRcmd 4 typedef int CPKind; typedef struct { CPKind kind; HANDLE hProcess; DWORD pid; HANDLE hTo; HANDLE hFrom; SOCKET sock; SOCKET sock2; /* stderr socket for OpenRcmd */ } ChildProc; #define INPUT_SOURCE_BUF_SIZE 4096 typedef struct _InputSource { CPKind kind; HANDLE hFile; SOCKET sock; int lineByLine; HANDLE hThread; DWORD id; char buf[INPUT_SOURCE_BUF_SIZE]; char *next; DWORD count; int error; InputCallback func; struct _InputSource *second; /* for stderr thread on CPRcmd */ VOIDSTAR closure; } InputSource; InputSource *consoleInputSource; DCB dcb; /* forward */ VOID ConsoleOutput(char* data, int length, int forceVisible); VOID ConsoleCreate(); LRESULT CALLBACK ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); VOID ColorizeTextPopup(HWND hwnd, ColorClass cc); VOID PrintCommSettings(FILE *f, char *name, DCB *dcb); VOID ParseCommSettings(char *arg, DCB *dcb); LRESULT CALLBACK StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); VOID APIENTRY MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def); void ParseIcsTextMenu(char *icsTextMenuString); VOID PopUpNameDialog(char firstchar); VOID UpdateSampleText(HWND hDlg, int id, MyColorizeAttribs *mca); /* [AS] */ int NewGameFRC(); int GameListOptions(); int dummy; // [HGM] for obsolete args HWND hwndMain = NULL; /* root window*/ HWND hwndConsole = NULL; HWND commentDialog = NULL; HWND moveHistoryDialog = NULL; HWND evalGraphDialog = NULL; HWND engineOutputDialog = NULL; HWND gameListDialog = NULL; HWND editTagsDialog = NULL; int commentUp = FALSE; WindowPlacement wpMain; WindowPlacement wpConsole; WindowPlacement wpComment; WindowPlacement wpMoveHistory; WindowPlacement wpEvalGraph; WindowPlacement wpEngineOutput; WindowPlacement wpGameList; WindowPlacement wpTags; VOID EngineOptionsPopup(); // [HGM] settings VOID GothicPopUp(char *title, VariantClass variant); /* * Setting "frozen" should disable all user input other than deleting * the window. We do this while engines are initializing themselves. */ static int frozen = 0; static int oldMenuItemState[MENU_BAR_ITEMS]; void FreezeUI() { HMENU hmenu; int i; if (frozen) return; frozen = 1; hmenu = GetMenu(hwndMain); for (i=0; i 4 && IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); if(currentElement < 5 && IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); // all open together SetFocus(h); continue; // this message now has been processed } } if (!(commentDialog && IsDialogMessage(commentDialog, &msg)) && !(moveHistoryDialog && IsDialogMessage(moveHistoryDialog, &msg)) && !(evalGraphDialog && IsDialogMessage(evalGraphDialog, &msg)) && !(engineOutputDialog && IsDialogMessage(engineOutputDialog, &msg)) && !(editTagsDialog && IsDialogMessage(editTagsDialog, &msg)) && !(gameListDialog && IsDialogMessage(gameListDialog, &msg)) && !(errorDialog && IsDialogMessage(errorDialog, &msg)) && !(!frozen && TranslateAccelerator(hwndMain, hAccelMain, &msg)) && JAWS_ACCEL !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoICS, &msg)) && !(!hwndConsole && TranslateAccelerator(hwndMain, hAccelNoAlt, &msg))) { int done = 0, i; // [HGM] chat: dispatch cat-box messages for(i=0; i screenGeometry.right - 32) *x = screenGeometry.left; if (*y > screenGeometry.bottom - 32) *y = screenGeometry.top; if (*x < screenGeometry.left + minX) *x = screenGeometry.left + minX; if (*y < screenGeometry.top + minY) *y = screenGeometry.top + minY; } VOID LoadLogo(ChessProgramState *cps, int n, Boolean ics) { char buf[MSG_SIZ], dir[MSG_SIZ]; GetCurrentDirectory(MSG_SIZ, dir); SetCurrentDirectory(installDir); if( appData.logo[n] && appData.logo[n][0] != NULLCHAR) { cps->programLogo = LoadImage( 0, appData.logo[n], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); if (cps->programLogo == NULL && appData.debugMode) { fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.logo[n] ); } } else if(appData.autoLogo) { if(ics) { // [HGM] logo: in ICS mode second can be used for ICS char *opponent = ""; if(gameMode == IcsPlayingWhite) opponent = gameInfo.black; if(gameMode == IcsPlayingBlack) opponent = gameInfo.white; sprintf(buf, "logos\\%s\\%s.bmp", appData.icsHost, opponent); if(!*opponent || !(cps->programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ))) { sprintf(buf, "logos\\%s.bmp", appData.icsHost); cps->programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); } } else if(appData.directory[n] && appData.directory[n][0]) { SetCurrentDirectory(appData.directory[n]); cps->programLogo = LoadImage( 0, "logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); } } SetCurrentDirectory(dir); /* return to prev directory */ } VOID InitTextures() { ZeroMemory( &backTextureSquareInfo, sizeof(backTextureSquareInfo) ); backTextureSquareSize = 0; // kludge to force recalculation of texturemode if( appData.liteBackTextureFile && appData.liteBackTextureFile[0] != NULLCHAR && appData.liteBackTextureFile[0] != '*' ) { if(liteBackTexture) DeleteObject(liteBackTexture); liteBackTexture = LoadImage( 0, appData.liteBackTextureFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); liteBackTextureMode = appData.liteBackTextureMode; if (liteBackTexture == NULL && appData.debugMode) { fprintf( debugFP, "Unable to load lite texture bitmap '%s'\n", appData.liteBackTextureFile ); } } if( appData.darkBackTextureFile && appData.darkBackTextureFile[0] != NULLCHAR && appData.darkBackTextureFile[0] != '*' ) { if(darkBackTexture) DeleteObject(darkBackTexture); darkBackTexture = LoadImage( 0, appData.darkBackTextureFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); darkBackTextureMode = appData.darkBackTextureMode; if (darkBackTexture == NULL && appData.debugMode) { fprintf( debugFP, "Unable to load dark texture bitmap '%s'\n", appData.darkBackTextureFile ); } } } #ifndef SM_CXVIRTUALSCREEN #define SM_CXVIRTUALSCREEN 78 #endif #ifndef SM_CYVIRTUALSCREEN #define SM_CYVIRTUALSCREEN 79 #endif #ifndef SM_XVIRTUALSCREEN #define SM_XVIRTUALSCREEN 76 #endif #ifndef SM_YVIRTUALSCREEN #define SM_YVIRTUALSCREEN 77 #endif VOID InitGeometry() { screenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); if( !screenHeight ) screenHeight = GetSystemMetrics(SM_CYSCREEN); screenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); if( !screenWidth ) screenWidth = GetSystemMetrics(SM_CXSCREEN); screenGeometry.left = GetSystemMetrics(SM_XVIRTUALSCREEN); screenGeometry.top = GetSystemMetrics(SM_YVIRTUALSCREEN); screenGeometry.right = screenGeometry.left + screenWidth; screenGeometry.bottom = screenGeometry.top + screenHeight; } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine) { HWND hwnd; /* Main window handle. */ int ibs; WINDOWPLACEMENT wp; char *filepart; hInst = hInstance; /* Store instance handle in our global variable */ programName = szAppName; if (SearchPath(NULL, "WinBoard.exe", NULL, MSG_SIZ, installDir, &filepart)) { *filepart = NULLCHAR; SetCurrentDirectory(installDir); } else { GetCurrentDirectory(MSG_SIZ, installDir); } gameInfo.boardWidth = gameInfo.boardHeight = 8; // [HGM] won't have open window otherwise InitGeometry(); InitAppData(lpCmdLine); /* Get run-time parameters */ /* xboard, and older WinBoards, controlled the move sound with the appData.ringBellAfterMoves option. In the current WinBoard, we always turn the option on (so that the backend will call us), then let the user turn the sound off by setting it to silence if desired. To accommodate old winboard.ini files saved by old versions of WinBoard, we also turn off the sound if the option was initially set to false. [HGM] taken out of InitAppData */ if (!appData.ringBellAfterMoves) { sounds[(int)SoundMove].name = strdup(""); appData.ringBellAfterMoves = TRUE; } if (appData.debugMode) { debugFP = fopen(appData.nameOfDebugFile, "w"); setbuf(debugFP, NULL); } LoadLanguageFile(appData.language); InitBackEnd1(); // InitEngineUCI( installDir, &first ); // [HGM] incorporated in InitBackEnd1() // InitEngineUCI( installDir, &second ); /* Create a main window for this application instance. */ hwnd = CreateWindow(szAppName, szTitle, (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX), CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); hwndMain = hwnd; /* If window could not be created, return "failure" */ if (!hwnd) { return (FALSE); } /* [HGM] logo: Load logos if specified (must be done before InitDrawingSizes) */ LoadLogo(&first, 0, FALSE); LoadLogo(&second, 1, appData.icsActive); SetUserLogo(); iconWhite = LoadIcon(hInstance, "icon_white"); iconBlack = LoadIcon(hInstance, "icon_black"); iconCurrent = iconWhite; InitDrawingColors(); InitPosition(0); // to set nr of ranks and files, which might be non-default through command-line args for (ibs = (int) NUM_SIZES - 1; ibs >= 0; ibs--) { /* Compute window size for each board size, and use the largest size that fits on this screen as the default. */ InitDrawingSizes((BoardSize)(ibs+1000), 0); if (boardSize == (BoardSize)-1 && winH <= screenHeight - GetSystemMetrics(SM_CYFRAME) - GetSystemMetrics(SM_CYCAPTION) - 10 && winW <= screenWidth) { boardSize = (BoardSize)ibs; } } InitDrawingSizes(boardSize, 0); RecentEngineMenu(appData.recentEngineList); InitMenuChecks(); buttonCount = GetSystemMetrics(SM_CMOUSEBUTTONS); /* [AS] Load textures if specified */ InitTextures(); mysrandom( (unsigned) time(NULL) ); /* [AS] Restore layout */ if( wpMoveHistory.visible ) { MoveHistoryPopUp(); } if( wpEvalGraph.visible ) { EvalGraphPopUp(); } if( wpEngineOutput.visible ) { EngineOutputPopUp(); } /* Make the window visible; update its client area; and return "success" */ EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = nCmdShow; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpMain.x; wp.rcNormalPosition.right = wpMain.x + wpMain.width; wp.rcNormalPosition.top = wpMain.y; wp.rcNormalPosition.bottom = wpMain.y + wpMain.height; SetWindowPlacement(hwndMain, &wp); InitBackEnd2(); // [HGM] moved until after all windows placed, to save correct position if fatal error on engine start if(!appData.noGUI) SetWindowPos(hwndMain, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); if (hwndConsole) { #if AOT_CONSOLE SetWindowPos(hwndConsole, alwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); #endif ShowWindow(hwndConsole, nCmdShow); SetActiveWindow(hwndConsole); } if(!appData.noGUI) UpdateWindow(hwnd); else ShowWindow(hwnd, SW_MINIMIZE); if(gameListDialog) SetFocus(gameListDialog); // [HGM] jaws: for if we clicked multi-game game file return TRUE; } VOID InitMenuChecks() { HMENU hmenu = GetMenu(hwndMain); (void) EnableMenuItem(hmenu, IDM_CommPort, MF_BYCOMMAND|((appData.icsActive && *appData.icsCommPort != NULLCHAR) ? MF_ENABLED : MF_GRAYED)); (void) CheckMenuItem(hmenu, IDM_SaveSettingsOnExit, MF_BYCOMMAND|(saveSettingsOnExit ? MF_CHECKED : MF_UNCHECKED)); } //--------------------------------------------------------------------------------------------------------- #define ICS_TEXT_MENU_SIZE (IDM_CommandXLast - IDM_CommandX + 1) #define XBOARD FALSE #define OPTCHAR "/" #define SEPCHAR "=" #define TOPLEVEL 0 #include "args.h" // front-end part of option handling VOID LFfromMFP(LOGFONT* lf, MyFontParams *mfp) { HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL); lf->lfHeight = -(int)(mfp->pointSize * GetDeviceCaps(hdc, LOGPIXELSY) / 72.0 + 0.5); DeleteDC(hdc); lf->lfWidth = 0; lf->lfEscapement = 0; lf->lfOrientation = 0; lf->lfWeight = mfp->bold ? FW_BOLD : FW_NORMAL; lf->lfItalic = mfp->italic; lf->lfUnderline = mfp->underline; lf->lfStrikeOut = mfp->strikeout; lf->lfCharSet = mfp->charset; lf->lfOutPrecision = OUT_DEFAULT_PRECIS; lf->lfClipPrecision = CLIP_DEFAULT_PRECIS; lf->lfQuality = DEFAULT_QUALITY; lf->lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; safeStrCpy(lf->lfFaceName, mfp->faceName, sizeof(lf->lfFaceName)/sizeof(lf->lfFaceName[0]) ); } void CreateFontInMF(MyFont *mf) { LFfromMFP(&mf->lf, &mf->mfp); if (mf->hf) DeleteObject(mf->hf); mf->hf = CreateFontIndirect(&mf->lf); } // [HGM] This platform-dependent table provides the location for storing the color info void * colorVariable[] = { &whitePieceColor, &blackPieceColor, &lightSquareColor, &darkSquareColor, &highlightSquareColor, &premoveHighlightColor, NULL, &consoleBackgroundColor, &appData.fontForeColorWhite, &appData.fontBackColorWhite, &appData.fontForeColorBlack, &appData.fontBackColorBlack, &appData.evalHistColorWhite, &appData.evalHistColorBlack, &appData.highlightArrowColor, }; /* Command line font name parser. NULL name means do nothing. Syntax like "Courier New:10.0 bi" or "Arial:10" or "Arial:10b" For backward compatibility, syntax without the colon is also accepted, but font names with digits in them won't work in that case. */ VOID ParseFontName(char *name, MyFontParams *mfp) { char *p, *q; if (name == NULL) return; p = name; q = strchr(p, ':'); if (q) { if (q - p >= sizeof(mfp->faceName)) ExitArgError(_("Font name too long:"), name, TRUE); memcpy(mfp->faceName, p, q - p); mfp->faceName[q - p] = NULLCHAR; p = q + 1; } else { q = mfp->faceName; while (*p && !isdigit(*p)) { *q++ = *p++; if (q - mfp->faceName >= sizeof(mfp->faceName)) ExitArgError(_("Font name too long:"), name, TRUE); } while (q > mfp->faceName && q[-1] == ' ') q--; *q = NULLCHAR; } if (!*p) ExitArgError(_("Font point size missing:"), name, TRUE); mfp->pointSize = (float) atof(p); mfp->bold = (strchr(p, 'b') != NULL); mfp->italic = (strchr(p, 'i') != NULL); mfp->underline = (strchr(p, 'u') != NULL); mfp->strikeout = (strchr(p, 's') != NULL); mfp->charset = DEFAULT_CHARSET; q = strchr(p, 'c'); if (q) mfp->charset = (BYTE) atoi(q+1); } void ParseFont(char *name, int number) { // wrapper to shield back-end from 'font' ParseFontName(name, &font[boardSize][number]->mfp); } void SetFontDefaults() { // in WB we have a 2D array of fonts; this initializes their description int i, j; /* Point font array elements to structures and parse default font names */ for (i=0; idef, &font[j][i]->mfp); } } } void CreateFonts() { // here we create the actual fonts from the selected descriptions int i, j; for (i=0; iargLoc]->mfp; fprintf(f, "/size=%s ", sizeInfo[bs].name); fprintf(f, "/%s=\"%s:%g%s%s%s%s%sc%d\"\n", ad->argName, mfp->faceName, mfp->pointSize, mfp->bold || mfp->italic || mfp->underline || mfp->strikeout ? " " : "", mfp->bold ? "b" : "", mfp->italic ? "i" : "", mfp->underline ? "u" : "", mfp->strikeout ? "s" : "", (int)mfp->charset); } } void ExportSounds() { // [HGM] copy the names from the internal WB variables to appData ColorClass cc; SoundClass sc; for (cc = (ColorClass)0; cc < ColorNormal; cc++) (&appData.soundShout)[cc] = textAttribs[cc].sound.name; for (sc = (SoundClass)0; sc < NSoundClasses; sc++) (&appData.soundMove)[sc] = sounds[sc].name; } void SaveAttribsArg(FILE *f, ArgDescriptor *ad) { // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though MyTextAttribs* ta = &textAttribs[(ColorClass)ad->argLoc]; fprintf(f, "/%s=\"%s%s%s%s%s#%02lx%02lx%02lx\"\n", ad->argName, (ta->effects & CFE_BOLD) ? "b" : "", (ta->effects & CFE_ITALIC) ? "i" : "", (ta->effects & CFE_UNDERLINE) ? "u" : "", (ta->effects & CFE_STRIKEOUT) ? "s" : "", (ta->effects) ? " " : "", ta->color&0xff, (ta->color >> 8)&0xff, (ta->color >> 16)&0xff); } void SaveColor(FILE *f, ArgDescriptor *ad) { // in WinBoard the color is an int and has to be converted to text. In X it would be a string already? COLORREF color = *(COLORREF *)colorVariable[(int)ad->argLoc]; fprintf(f, "/%s=#%02lx%02lx%02lx\n", ad->argName, color&0xff, (color>>8)&0xff, (color>>16)&0xff); } void SaveBoardSize(FILE *f, char *name, void *addr) { // wrapper to shield back-end from BoardSize & sizeInfo fprintf(f, "/%s=%s\n", name, sizeInfo[*(BoardSize *)addr].name); } void ParseCommPortSettings(char *s) { // wrapper to keep dcb from back-end ParseCommSettings(s, &dcb); } void GetWindowCoords() { // wrapper to shield use of window handles from back-end (make addressible by number?) GetActualPlacement(hwndMain, &wpMain); GetActualPlacement(hwndConsole, &wpConsole); GetActualPlacement(commentDialog, &wpComment); GetActualPlacement(editTagsDialog, &wpTags); GetActualPlacement(gameListDialog, &wpGameList); GetActualPlacement(moveHistoryDialog, &wpMoveHistory); GetActualPlacement(evalGraphDialog, &wpEvalGraph); GetActualPlacement(engineOutputDialog, &wpEngineOutput); } void PrintCommPortSettings(FILE *f, char *name) { // wrapper to shield back-end from DCB PrintCommSettings(f, name, &dcb); } int MySearchPath(char *installDir, char *name, char *fullname) { char *dummy, buf[MSG_SIZ], *p = name, *q; if(name[0]== '%') { fullname[0] = 0; // [HGM] first expand any environment variables in the given name while(*p == '%' && (q = strchr(p+1, '%'))) { // [HGM] recognize %*% as environment variable safeStrCpy(buf, p+1, sizeof(buf)/sizeof(buf[0]) ); *strchr(buf, '%') = 0; strcat(fullname, getenv(buf)); p = q+1; while(*p == '\\') { strcat(fullname, "\\"); p++; } } strcat(fullname, p); // after environment variables (if any), take the remainder of the given name if(appData.debugMode) fprintf(debugFP, "name = '%s', expanded name = '%s'\n", name, fullname); return (int) strlen(fullname); } return (int) SearchPath(installDir, name, NULL, MSG_SIZ, fullname, &dummy); } int MyGetFullPathName(char *name, char *fullname) { char *dummy; return (int) GetFullPathName(name, MSG_SIZ, fullname, &dummy); } int MainWindowUp() { // [HGM] args: allows testing if main window is realized from back-end return hwndMain != NULL; } void PopUpStartupDialog() { FARPROC lpProc; LoadLanguageFile(appData.language); lpProc = MakeProcInstance((FARPROC)StartupDialog, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_Startup), NULL, (DLGPROC)lpProc); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * GDI board drawing routines * \*---------------------------------------------------------------------------*/ /* [AS] Draw square using background texture */ static void DrawTile( int dx, int dy, int dw, int dh, HDC dst, HDC src, int mode, int sx, int sy ) { XFORM x; if( mode == 0 ) { return; /* Should never happen! */ } SetGraphicsMode( dst, GM_ADVANCED ); switch( mode ) { case 1: /* Identity */ break; case 2: /* X reflection */ x.eM11 = -1.0; x.eM12 = 0; x.eM21 = 0; x.eM22 = 1.0; x.eDx = (FLOAT) dw + dx - 1; x.eDy = 0; dx = 0; SetWorldTransform( dst, &x ); break; case 3: /* Y reflection */ x.eM11 = 1.0; x.eM12 = 0; x.eM21 = 0; x.eM22 = -1.0; x.eDx = 0; x.eDy = (FLOAT) dh + dy - 1; dy = 0; SetWorldTransform( dst, &x ); break; case 4: /* X/Y flip */ x.eM11 = 0; x.eM12 = 1.0; x.eM21 = 1.0; x.eM22 = 0; x.eDx = (FLOAT) dx; x.eDy = (FLOAT) dy; dx = 0; dy = 0; SetWorldTransform( dst, &x ); break; } BitBlt( dst, dx, dy, dw, dh, src, sx, sy, SRCCOPY ); x.eM11 = 1.0; x.eM12 = 0; x.eM21 = 0; x.eM22 = 1.0; x.eDx = 0; x.eDy = 0; SetWorldTransform( dst, &x ); ModifyWorldTransform( dst, 0, MWT_IDENTITY ); } /* [AS] [HGM] Make room for more piece types, so all pieces can be different */ enum { PM_WP = (int) WhitePawn, PM_WN = (int) WhiteKnight, PM_WB = (int) WhiteBishop, PM_WR = (int) WhiteRook, PM_WQ = (int) WhiteQueen, PM_WF = (int) WhiteFerz, PM_WW = (int) WhiteWazir, PM_WE = (int) WhiteAlfil, PM_WM = (int) WhiteMan, PM_WO = (int) WhiteCannon, PM_WU = (int) WhiteUnicorn, PM_WH = (int) WhiteNightrider, PM_WA = (int) WhiteAngel, PM_WC = (int) WhiteMarshall, PM_WAB = (int) WhiteCardinal, PM_WD = (int) WhiteDragon, PM_WL = (int) WhiteLance, PM_WS = (int) WhiteCobra, PM_WV = (int) WhiteFalcon, PM_WSG = (int) WhiteSilver, PM_WG = (int) WhiteGrasshopper, PM_WK = (int) WhiteKing, PM_BP = (int) BlackPawn, PM_BN = (int) BlackKnight, PM_BB = (int) BlackBishop, PM_BR = (int) BlackRook, PM_BQ = (int) BlackQueen, PM_BF = (int) BlackFerz, PM_BW = (int) BlackWazir, PM_BE = (int) BlackAlfil, PM_BM = (int) BlackMan, PM_BO = (int) BlackCannon, PM_BU = (int) BlackUnicorn, PM_BH = (int) BlackNightrider, PM_BA = (int) BlackAngel, PM_BC = (int) BlackMarshall, PM_BG = (int) BlackGrasshopper, PM_BAB = (int) BlackCardinal, PM_BD = (int) BlackDragon, PM_BL = (int) BlackLance, PM_BS = (int) BlackCobra, PM_BV = (int) BlackFalcon, PM_BSG = (int) BlackSilver, PM_BK = (int) BlackKing }; static HFONT hPieceFont = NULL; static HBITMAP hPieceMask[(int) EmptySquare]; static HBITMAP hPieceFace[(int) EmptySquare]; static int fontBitmapSquareSize = 0; static char pieceToFontChar[(int) EmptySquare] = { 'p', 'n', 'b', 'r', 'q', 'n', 'b', 'p', 'n', 'b', 'r', 'b', 'r', 'q', 'k', 'k', 'o', 'm', 'v', 't', 'w', 'v', 't', 'o', 'm', 'v', 't', 'v', 't', 'w', 'l', 'l' }; extern BOOL SetCharTable( char *table, const char * map ); /* [HGM] moved to backend.c */ static void SetPieceBackground( HDC hdc, COLORREF color, int mode ) { HBRUSH hbrush; BYTE r1 = GetRValue( color ); BYTE g1 = GetGValue( color ); BYTE b1 = GetBValue( color ); BYTE r2 = r1 / 2; BYTE g2 = g1 / 2; BYTE b2 = b1 / 2; RECT rc; /* Create a uniform background first */ hbrush = CreateSolidBrush( color ); SetRect( &rc, 0, 0, squareSize, squareSize ); FillRect( hdc, &rc, hbrush ); DeleteObject( hbrush ); if( mode == 1 ) { /* Vertical gradient, good for pawn, knight and rook, less for queen and king */ int steps = squareSize / 2; int i; for( i=0; i= (int)BlackPawn && appData.fontBackColorBlack != appData.fontForeColorBlack ) { backColor = appData.fontBackColorBlack; foreColor = appData.fontForeColorBlack; } /* Mask */ hbm = CreateCompatibleBitmap( hdc_window, squareSize, squareSize ); hbm_old = SelectObject( hdc, hbm ); rc.left = 0; rc.top = 0; rc.right = squareSize; rc.bottom = squareSize; /* Step 1: background is now black */ FillRect( hdc, &rc, GetStockObject(BLACK_BRUSH) ); GetTextExtentPoint32( hdc, &pieceToFontChar[index], 1, &sz ); pt.x = (squareSize - sz.cx) / 2; pt.y = (squareSize - sz.cy) / 2; SetBkMode( hdc, TRANSPARENT ); SetTextColor( hdc, chroma ); /* Step 2: the piece has been drawn in purple, there are now black and purple in this bitmap */ TextOut( hdc, pt.x, pt.y, &pieceToFontChar[appData.allWhite && index >= (int)BlackPawn ? index - (int)BlackPawn : index], 1 ); SelectObject( hdc, GetStockObject(WHITE_BRUSH) ); /* Step 3: the area outside the piece is filled with white */ // FloodFill( hdc, 0, 0, chroma ); ExtFloodFill( hdc, 0, 0, 0, FLOODFILLSURFACE ); ExtFloodFill( hdc, 0, squareSize-1, 0, FLOODFILLSURFACE ); // [HGM] fill from all 4 corners, for if piece too big ExtFloodFill( hdc, squareSize-1, 0, 0, FLOODFILLSURFACE ); ExtFloodFill( hdc, squareSize-1, squareSize-1, 0, FLOODFILLSURFACE ); SelectObject( hdc, GetStockObject(BLACK_BRUSH) ); /* Step 4: this is the tricky part, the area inside the piece is filled with black, but if the start point is not inside the piece we're lost! There should be a better way to do this... if we could create a region or path from the fill operation we would be fine for example. */ // FloodFill( hdc, squareSize / 2, squareSize / 2, RGB(0xFF,0xFF,0xFF) ); ExtFloodFill( hdc, squareSize / 2, squareSize / 2, RGB(0xFF,0xFF,0xFF), FLOODFILLBORDER ); { /* [HGM] shave off edges of mask, in an attempt to correct for the fact that FloodFill does not work correctly under Win XP */ HDC dc2 = CreateCompatibleDC( hdc_window ); HBITMAP bm2 = CreateCompatibleBitmap( hdc_window, squareSize, squareSize ); SelectObject( dc2, bm2 ); BitBlt( dc2, 0, 0, squareSize, squareSize, hdc, 0, 0, SRCCOPY ); // make copy BitBlt( hdc, 0, 1, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT ); BitBlt( hdc, 2, 1, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT ); BitBlt( hdc, 1, 0, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT ); BitBlt( hdc, 1, 2, squareSize-2, squareSize-2, dc2, 1, 1, SRCPAINT ); DeleteDC( dc2 ); DeleteObject( bm2 ); } SetTextColor( hdc, 0 ); /* Step 5: some fonts have "disconnected" areas that are skipped by the fill: draw the piece again in black for safety. */ TextOut( hdc, pt.x, pt.y, &pieceToFontChar[appData.allWhite && index >= (int)BlackPawn ? index - (int)BlackPawn : index], 1 ); SelectObject( hdc, hbm_old ); if( hPieceMask[index] != NULL ) { DeleteObject( hPieceMask[index] ); } hPieceMask[index] = hbm; /* Face */ hbm = CreateCompatibleBitmap( hdc_window, squareSize, squareSize ); SelectObject( hdc, hbm ); { HDC dc1 = CreateCompatibleDC( hdc_window ); HDC dc2 = CreateCompatibleDC( hdc_window ); HBITMAP bm2 = CreateCompatibleBitmap( hdc_window, squareSize, squareSize ); SelectObject( dc1, hPieceMask[index] ); SelectObject( dc2, bm2 ); FillRect( dc2, &rc, GetStockObject(WHITE_BRUSH) ); BitBlt( dc2, 0, 0, squareSize, squareSize, dc1, 0, 0, SRCINVERT ); /* Now dc2 contains the inverse of the piece mask, i.e. a mask that preserves the piece background and deletes (makes transparent) the rest. Thanks to that mask, we are free to paint the background with the greates freedom, as we'll be able to mask off the unwanted parts when finished. We use this, to make gradients and give the pieces a "roundish" look. */ SetPieceBackground( hdc, backColor, 2 ); BitBlt( hdc, 0, 0, squareSize, squareSize, dc2, 0, 0, SRCAND ); DeleteDC( dc2 ); DeleteDC( dc1 ); DeleteObject( bm2 ); } SetTextColor( hdc, foreColor ); TextOut( hdc, pt.x, pt.y, &pieceToFontChar[appData.allWhite && index >= (int)BlackPawn ? index - (int)BlackPawn : index], 1 ); SelectObject( hdc, hbm_old ); if( hPieceFace[index] != NULL ) { DeleteObject( hPieceFace[index] ); } hPieceFace[index] = hbm; } static int TranslatePieceToFontPiece( int piece ) { switch( piece ) { case BlackPawn: return PM_BP; case BlackKnight: return PM_BN; case BlackBishop: return PM_BB; case BlackRook: return PM_BR; case BlackQueen: return PM_BQ; case BlackKing: return PM_BK; case WhitePawn: return PM_WP; case WhiteKnight: return PM_WN; case WhiteBishop: return PM_WB; case WhiteRook: return PM_WR; case WhiteQueen: return PM_WQ; case WhiteKing: return PM_WK; case BlackAngel: return PM_BA; case BlackMarshall: return PM_BC; case BlackFerz: return PM_BF; case BlackNightrider: return PM_BH; case BlackAlfil: return PM_BE; case BlackWazir: return PM_BW; case BlackUnicorn: return PM_BU; case BlackCannon: return PM_BO; case BlackGrasshopper: return PM_BG; case BlackMan: return PM_BM; case BlackSilver: return PM_BSG; case BlackLance: return PM_BL; case BlackFalcon: return PM_BV; case BlackCobra: return PM_BS; case BlackCardinal: return PM_BAB; case BlackDragon: return PM_BD; case WhiteAngel: return PM_WA; case WhiteMarshall: return PM_WC; case WhiteFerz: return PM_WF; case WhiteNightrider: return PM_WH; case WhiteAlfil: return PM_WE; case WhiteWazir: return PM_WW; case WhiteUnicorn: return PM_WU; case WhiteCannon: return PM_WO; case WhiteGrasshopper: return PM_WG; case WhiteMan: return PM_WM; case WhiteSilver: return PM_WSG; case WhiteLance: return PM_WL; case WhiteFalcon: return PM_WV; case WhiteCobra: return PM_WS; case WhiteCardinal: return PM_WAB; case WhiteDragon: return PM_WD; } return 0; } void CreatePiecesFromFont() { LOGFONT lf; HDC hdc_window = NULL; HDC hdc = NULL; HFONT hfont_old; int fontHeight; int i; if( fontBitmapSquareSize < 0 ) { /* Something went seriously wrong in the past: do not try to recreate fonts! */ return; } if( !appData.useFont || appData.renderPiecesWithFont == NULL || appData.renderPiecesWithFont[0] == NULLCHAR || appData.renderPiecesWithFont[0] == '*' ) { fontBitmapSquareSize = -1; return; } if( fontBitmapSquareSize != squareSize ) { hdc_window = GetDC( hwndMain ); hdc = CreateCompatibleDC( hdc_window ); if( hPieceFont != NULL ) { DeleteObject( hPieceFont ); } else { for( i=0; i<=(int)BlackKing; i++ ) { hPieceMask[i] = NULL; hPieceFace[i] = NULL; } } fontHeight = 75; if( appData.fontPieceSize >= 50 && appData.fontPieceSize <= 150 ) { fontHeight = appData.fontPieceSize; } fontHeight = (fontHeight * squareSize) / 100; lf.lfHeight = -MulDiv( fontHeight, GetDeviceCaps(hdc, LOGPIXELSY), 72 ); lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; lf.lfItalic = 0; lf.lfUnderline = 0; lf.lfStrikeOut = 0; lf.lfCharSet = DEFAULT_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = PROOF_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; strncpy( lf.lfFaceName, appData.renderPiecesWithFont, sizeof(lf.lfFaceName) ); lf.lfFaceName[ sizeof(lf.lfFaceName) - 1 ] = '\0'; hPieceFont = CreateFontIndirect( &lf ); if( hPieceFont == NULL ) { fontBitmapSquareSize = -2; } else { /* Setup font-to-piece character table */ if( ! SetCharTable(pieceToFontChar, appData.fontToPieceTable) ) { /* No (or wrong) global settings, try to detect the font */ if( strstr(lf.lfFaceName,"Alpha") != NULL ) { /* Alpha */ SetCharTable(pieceToFontChar, "phbrqkojntwl"); } else if( strstr(lf.lfFaceName,"DiagramTT") != NULL ) { /* DiagramTT* family */ SetCharTable(pieceToFontChar, "PNLRQKpnlrqk"); } else if( strstr(lf.lfFaceName,"WinboardF") != NULL ) { /* Fairy symbols */ SetCharTable(pieceToFontChar, "PNBRQFEACWMOHIJGDVSLUKpnbrqfeacwmohijgdvsluk"); } else if( strstr(lf.lfFaceName,"GC2004D") != NULL ) { /* Good Companion (Some characters get warped as literal :-( */ char s[] = "1cmWG0??S??oYI23wgQU"; s[0]=0xB9; s[1]=0xA9; s[6]=0xB1; s[11]=0xBB; s[12]=0xAB; s[17]=0xB3; SetCharTable(pieceToFontChar, s); } else { /* Cases, Condal, Leipzig, Lucena, Marroquin, Merida, Usual */ SetCharTable(pieceToFontChar, "pnbrqkomvtwl"); } } /* Create bitmaps */ hfont_old = SelectObject( hdc, hPieceFont ); for(i=(int)WhitePawn; i<(int)EmptySquare; i++) /* [HGM] made a loop for this */ if(PieceToChar((ChessSquare)i) != '.') /* skip unused pieces */ CreatePieceMaskFromFont( hdc_window, hdc, i ); SelectObject( hdc, hfont_old ); fontBitmapSquareSize = squareSize; } } if( hdc != NULL ) { DeleteDC( hdc ); } if( hdc_window != NULL ) { ReleaseDC( hwndMain, hdc_window ); } } HBITMAP DoLoadBitmap(HINSTANCE hinst, char *piece, int squareSize, char *suffix) { char name[128], buf[MSG_SIZ]; snprintf(name, sizeof(name)/sizeof(name[0]), "%s%d%s", piece, squareSize, suffix); if(appData.pieceDirectory[0]) { HBITMAP res; snprintf(buf, MSG_SIZ, "%s\\%s.bmp", appData.pieceDirectory, name); res = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); if(res) return res; } if (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0 && strcmp(name, "k80s") == 0) { safeStrCpy(name, "tim", sizeof(name)/sizeof(name[0]) ); } return LoadBitmap(hinst, name); } /* Insert a color into the program's logical palette structure. This code assumes the given color is the result of the RGB or PALETTERGB macro, and it knows how those macros work (which is documented). */ VOID InsertInPalette(COLORREF color) { LPPALETTEENTRY pe = &(pLogPal->palPalEntry[pLogPal->palNumEntries]); if (pLogPal->palNumEntries++ >= PALETTESIZE) { DisplayFatalError(_("Too many colors"), 0, 1); pLogPal->palNumEntries--; return; } pe->peFlags = (char) 0; pe->peRed = (char) (0xFF & color); pe->peGreen = (char) (0xFF & (color >> 8)); pe->peBlue = (char) (0xFF & (color >> 16)); return; } VOID InitDrawingColors() { if (pLogPal == NULL) { /* Allocate enough memory for a logical palette with * PALETTESIZE entries and set the size and version fields * of the logical palette structure. */ pLogPal = (NPLOGPALETTE) LocalAlloc(LMEM_FIXED, (sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * (PALETTESIZE)))); pLogPal->palVersion = 0x300; } pLogPal->palNumEntries = 0; InsertInPalette(lightSquareColor); InsertInPalette(darkSquareColor); InsertInPalette(whitePieceColor); InsertInPalette(blackPieceColor); InsertInPalette(highlightSquareColor); InsertInPalette(premoveHighlightColor); /* create a logical color palette according the information * in the LOGPALETTE structure. */ hPal = CreatePalette((LPLOGPALETTE) pLogPal); lightSquareBrush = CreateSolidBrush(lightSquareColor); blackSquareBrush = CreateSolidBrush(blackPieceColor); darkSquareBrush = CreateSolidBrush(darkSquareColor); whitePieceBrush = CreateSolidBrush(whitePieceColor); blackPieceBrush = CreateSolidBrush(blackPieceColor); iconBkgndBrush = CreateSolidBrush(GetSysColor(COLOR_BACKGROUND)); explodeBrush = CreateSolidBrush(highlightSquareColor); // [HGM] atomic markerBrush = CreateSolidBrush(premoveHighlightColor); // [HGM] markers /* [AS] Force rendering of the font-based pieces */ if( fontBitmapSquareSize > 0 ) { fontBitmapSquareSize = 0; } } int BoardWidth(int boardSize, int n) { /* [HGM] argument n added to allow different width and height */ int lineGap = sizeInfo[boardSize].lineGap; if( appData.overrideLineGap >= 0 && appData.overrideLineGap <= 5 ) { lineGap = appData.overrideLineGap; } return (n + 1) * lineGap + n * sizeInfo[boardSize].squareSize; } /* Respond to board resize by dragging edge */ VOID ResizeBoard(int newSizeX, int newSizeY, int flags) { BoardSize newSize = NUM_SIZES - 1; static int recurse = 0; if (IsIconic(hwndMain)) return; if (recurse > 0) return; recurse++; while (newSize > 0) { InitDrawingSizes(newSize+1000, 0); // [HGM] kludge to update sizeInfo without visible effects if(newSizeX >= sizeInfo[newSize].cliWidth && newSizeY >= sizeInfo[newSize].cliHeight) break; newSize--; } boardSize = newSize; InitDrawingSizes(boardSize, flags); recurse--; } extern Boolean twoBoards, partnerUp; // [HGM] dual VOID InitDrawingSizes(BoardSize boardSize, int flags) { int i, boardWidth, boardHeight; /* [HGM] height treated separately */ ChessSquare piece; static int oldBoardSize = -1, oldTinyLayout = 0; HDC hdc; SIZE clockSize, messageSize; HFONT oldFont; char buf[MSG_SIZ]; char *str; HMENU hmenu = GetMenu(hwndMain); RECT crect, wrect, oldRect; int offby; LOGBRUSH logbrush; VariantClass v = gameInfo.variant; int suppressVisibleEffects = 0; // [HGM] kludge to request updating sizeInfo only if((int)boardSize >= 1000 ) { boardSize -= 1000; suppressVisibleEffects = 1; } /* [HGM] call with -2 uses old size (for if nr of files, ranks changes) */ if(boardSize == (BoardSize)(-2) ) boardSize = oldBoardSize; if(boardSize == -1) return; // no size defined yet; abort (to allow early call of InitPosition) oldBoardSize = boardSize; if(boardSize != SizeMiddling && boardSize != SizePetite && boardSize != SizeBulky && !appData.useFont) { // correct board size to one where built-in pieces exist if((v == VariantCapablanca || v == VariantGothic || v == VariantGrand || v == VariantCapaRandom || v == VariantJanus || v == VariantSuper) && (boardSize < SizePetite || boardSize > SizeBulky) // Archbishop and Chancellor available in entire middle range || (v == VariantShogi && boardSize != SizeModerate) // Japanese-style Shogi || v == VariantKnightmate || v == VariantSChess || v == VariantXiangqi || v == VariantSpartan || v == VariantShatranj || v == VariantMakruk || v == VariantGreat || v == VariantFairy ) { if(boardSize < SizeMediocre) boardSize = SizePetite; else if(boardSize > SizeModerate) boardSize = SizeBulky; else boardSize = SizeMiddling; } } if(!appData.useFont && boardSize == SizePetite && (v == VariantKnightmate)) boardSize = SizeMiddling; // no Unicorn in Petite oldRect.left = wpMain.x; //[HGM] placement: remember previous window params oldRect.top = wpMain.y; oldRect.right = wpMain.x + wpMain.width; oldRect.bottom = wpMain.y + wpMain.height; tinyLayout = sizeInfo[boardSize].tinyLayout; smallLayout = sizeInfo[boardSize].smallLayout; squareSize = sizeInfo[boardSize].squareSize; lineGap = sizeInfo[boardSize].lineGap; minorSize = 0; /* [HGM] Kludge to see if demagnified pieces need to be shifted */ border = appData.useBorder && appData.border[0] ? squareSize/2 : 0; if( appData.overrideLineGap >= 0 && appData.overrideLineGap <= 5 ) { lineGap = appData.overrideLineGap; } if (tinyLayout != oldTinyLayout) { long style = GetWindowLongPtr(hwndMain, GWL_STYLE); if (tinyLayout) { style &= ~WS_SYSMENU; InsertMenu(hmenu, IDM_Exit, MF_BYCOMMAND, IDM_Minimize, "&Minimize\tCtrl+F4"); } else { style |= WS_SYSMENU; RemoveMenu(hmenu, IDM_Minimize, MF_BYCOMMAND); } SetWindowLongPtr(hwndMain, GWL_STYLE, style); for (i=0; menuBarText[tinyLayout][i]; i++) { ModifyMenu(hmenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP, (UINT)GetSubMenu(hmenu, i), T_(menuBarText[tinyLayout][i])); } DrawMenuBar(hwndMain); } boardWidth = BoardWidth(boardSize, BOARD_WIDTH) + 2*border; boardHeight = BoardWidth(boardSize, BOARD_HEIGHT) + 2*border; /* Get text area sizes */ hdc = GetDC(hwndMain); if (appData.clockMode) { snprintf(buf, MSG_SIZ, _("White: %s"), TimeString(23*60*60*1000L)); } else { snprintf(buf, MSG_SIZ, _("White")); } oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf); GetTextExtentPoint(hdc, buf, strlen(buf), &clockSize); SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf); str = _("We only care about the height here"); GetTextExtentPoint(hdc, str, strlen(str), &messageSize); SelectObject(hdc, oldFont); ReleaseDC(hwndMain, hdc); /* Compute where everything goes */ if((first.programLogo || second.programLogo) && !tinyLayout) { /* [HGM] logo: if either logo is on, reserve space for it */ logoHeight = 2*clockSize.cy; leftLogoRect.left = OUTER_MARGIN; leftLogoRect.right = leftLogoRect.left + 4*clockSize.cy; leftLogoRect.top = OUTER_MARGIN; leftLogoRect.bottom = OUTER_MARGIN + logoHeight; rightLogoRect.right = OUTER_MARGIN + boardWidth; rightLogoRect.left = rightLogoRect.right - 4*clockSize.cy; rightLogoRect.top = OUTER_MARGIN; rightLogoRect.bottom = OUTER_MARGIN + logoHeight; whiteRect.left = leftLogoRect.right; whiteRect.right = OUTER_MARGIN + boardWidth/2 - INNER_MARGIN/2; whiteRect.top = OUTER_MARGIN; whiteRect.bottom = whiteRect.top + logoHeight; blackRect.right = rightLogoRect.left; blackRect.left = whiteRect.right + INNER_MARGIN; blackRect.top = whiteRect.top; blackRect.bottom = whiteRect.bottom; } else { whiteRect.left = OUTER_MARGIN; whiteRect.right = whiteRect.left + boardWidth/2 - INNER_MARGIN/2; whiteRect.top = OUTER_MARGIN; whiteRect.bottom = whiteRect.top + clockSize.cy; blackRect.left = whiteRect.right + INNER_MARGIN; blackRect.right = blackRect.left + boardWidth/2 - 1; blackRect.top = whiteRect.top; blackRect.bottom = whiteRect.bottom; logoHeight = 0; // [HGM] logo: suppress logo after change to tiny layout! } messageRect.left = OUTER_MARGIN + MESSAGE_LINE_LEFTMARGIN; if (appData.showButtonBar) { messageRect.right = OUTER_MARGIN + boardWidth // [HGM] logo: expressed independent of clock placement - N_BUTTONS*BUTTON_WIDTH - MESSAGE_LINE_LEFTMARGIN; } else { messageRect.right = OUTER_MARGIN + boardWidth; } messageRect.top = whiteRect.bottom + INNER_MARGIN; messageRect.bottom = messageRect.top + messageSize.cy; boardRect.left = OUTER_MARGIN; boardRect.right = boardRect.left + boardWidth; boardRect.top = messageRect.bottom + INNER_MARGIN; boardRect.bottom = boardRect.top + boardHeight; sizeInfo[boardSize].cliWidth = boardRect.right + OUTER_MARGIN; sizeInfo[boardSize].cliHeight = boardRect.bottom + OUTER_MARGIN; oldTinyLayout = tinyLayout; winW = 2 * GetSystemMetrics(SM_CXFRAME) + boardRect.right + OUTER_MARGIN; winH = 2 * GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + boardRect.bottom + OUTER_MARGIN; winW *= 1 + twoBoards; if(suppressVisibleEffects) return; // [HGM] when called for filling sizeInfo only wpMain.width = winW; // [HGM] placement: set through temporary which can used by initial sizing choice wpMain.height = winH; // without disturbing window attachments GetWindowRect(hwndMain, &wrect); SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE); // [HGM] placement: let attached windows follow size change. ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, moveHistoryDialog, &wpMoveHistory ); ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, evalGraphDialog, &wpEvalGraph ); ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, engineOutputDialog, &wpEngineOutput ); ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, gameListDialog, &wpGameList ); ReattachAfterSize( &oldRect, wpMain.width, wpMain.height, hwndConsole, &wpConsole ); /* compensate if menu bar wrapped */ GetClientRect(hwndMain, &crect); offby = boardRect.bottom + OUTER_MARGIN - crect.bottom; wpMain.height += offby; switch (flags) { case WMSZ_TOPLEFT: SetWindowPos(hwndMain, NULL, wrect.right - wpMain.width, wrect.bottom - wpMain.height, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_TOPRIGHT: case WMSZ_TOP: SetWindowPos(hwndMain, NULL, wrect.left, wrect.bottom - wpMain.height, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_BOTTOMLEFT: case WMSZ_LEFT: SetWindowPos(hwndMain, NULL, wrect.right - wpMain.width, wrect.top, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER); break; case WMSZ_BOTTOMRIGHT: case WMSZ_BOTTOM: case WMSZ_RIGHT: default: SetWindowPos(hwndMain, NULL, 0, 0, wpMain.width, wpMain.height, SWP_NOCOPYBITS|SWP_NOZORDER|SWP_NOMOVE); break; } hwndPause = NULL; for (i = 0; i < N_BUTTONS; i++) { if (buttonDesc[i].hwnd != NULL) { DestroyWindow(buttonDesc[i].hwnd); buttonDesc[i].hwnd = NULL; } if (appData.showButtonBar) { buttonDesc[i].hwnd = CreateWindow("BUTTON", buttonDesc[i].label, WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, boardRect.right - BUTTON_WIDTH*(N_BUTTONS-i), messageRect.top, BUTTON_WIDTH, messageSize.cy, hwndMain, (HMENU) buttonDesc[i].id, (HINSTANCE) GetWindowLongPtr(hwndMain, GWLP_HINSTANCE), NULL); if (tinyLayout) { SendMessage(buttonDesc[i].hwnd, WM_SETFONT, (WPARAM)font[boardSize][MESSAGE_FONT]->hf, MAKELPARAM(FALSE, 0)); } if (buttonDesc[i].id == IDM_Pause) hwndPause = buttonDesc[i].hwnd; buttonDesc[i].wndproc = (WNDPROC) SetWindowLongPtr(buttonDesc[i].hwnd, GWLP_WNDPROC, (LONG_PTR) ButtonProc); } } if (gridPen != NULL) DeleteObject(gridPen); if (highlightPen != NULL) DeleteObject(highlightPen); if (premovePen != NULL) DeleteObject(premovePen); if (lineGap != 0) { logbrush.lbStyle = BS_SOLID; logbrush.lbColor = RGB(0, 0, 0); /* grid pen color = black */ gridPen = ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER, lineGap, &logbrush, 0, NULL); logbrush.lbColor = highlightSquareColor; highlightPen = ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER, lineGap, &logbrush, 0, NULL); logbrush.lbColor = premoveHighlightColor; premovePen = ExtCreatePen(PS_GEOMETRIC|PS_SOLID|PS_ENDCAP_FLAT|PS_JOIN_MITER, lineGap, &logbrush, 0, NULL); /* [HGM] Loop had to be split in part for vert. and hor. lines */ for (i = 0; i < BOARD_HEIGHT + 1; i++) { gridEndpoints[i*2].x = boardRect.left + lineGap / 2 + border; gridEndpoints[i*2].y = gridEndpoints[i*2 + 1].y = boardRect.top + lineGap / 2 + (i * (squareSize + lineGap)) + border; gridEndpoints[i*2 + 1].x = boardRect.left + lineGap / 2 + BOARD_WIDTH * (squareSize + lineGap) + border; gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2; } for (i = 0; i < BOARD_WIDTH + 1; i++) { gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].y = boardRect.top + lineGap / 2 + border; gridEndpoints[i*2 + BOARD_HEIGHT*2 + 2].x = gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].x = boardRect.left + lineGap / 2 + (i * (squareSize + lineGap)) + border; gridEndpoints[i*2 + 1 + BOARD_HEIGHT*2 + 2].y = boardRect.top + BOARD_HEIGHT * (squareSize + lineGap) + border; gridVertexCounts[i*2] = gridVertexCounts[i*2 + 1] = 2; } } /* [HGM] Licensing requirement */ #ifdef GOTHIC if(gameInfo.variant == VariantGothic) GothicPopUp( GOTHIC, VariantGothic); else #endif #ifdef FALCON if(gameInfo.variant == VariantFalcon) GothicPopUp( FALCON, VariantFalcon); else #endif GothicPopUp( "", VariantNormal); /* if (boardSize == oldBoardSize) return; [HGM] variant might have changed */ /* Load piece bitmaps for this board size */ for (i=0; i<=2; i++) { for (piece = WhitePawn; (int) piece < (int) BlackPawn; piece = (ChessSquare) ((int) piece + 1)) { if (pieceBitmap[i][piece] != NULL) DeleteObject(pieceBitmap[i][piece]); } } fontBitmapSquareSize = 0; /* [HGM] render: make sure pieces will be recreated, as we might need others now */ // Orthodox Chess pieces pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "s"); pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "s"); pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "s"); pieceBitmap[0][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "s"); pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "s"); pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "o"); pieceBitmap[1][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "o"); pieceBitmap[1][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "o"); pieceBitmap[1][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "o"); pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "o"); pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "p", squareSize, "w"); pieceBitmap[2][WhiteKnight] = DoLoadBitmap(hInst, "n", squareSize, "w"); pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "b", squareSize, "w"); pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "r", squareSize, "w"); pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "k", squareSize, "w"); if( gameInfo.variant == VariantShogi && squareSize <= 72 && squareSize >= 33) { // in Shogi, Hijack the unused Queen for Lance pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "s"); pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "o"); pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "l", squareSize, "w"); } else { pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "s"); pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "o"); pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "q", squareSize, "w"); } if(squareSize <= 72 && squareSize >= 33) { /* A & C are available in most sizes now */ if(squareSize != 49 && squareSize != 72 && squareSize != 33) { // Vortex-like pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "s"); pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "o"); pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "a", squareSize, "w"); pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s"); pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o"); pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w"); pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "s"); pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "o"); pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "cv", squareSize, "w"); pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s"); pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o"); pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w"); } else { // Smirf-like if(gameInfo.variant == VariantSChess) { pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "s"); pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "o"); pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "v", squareSize, "w"); } else { pieceBitmap[0][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "s"); pieceBitmap[1][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "o"); pieceBitmap[2][WhiteAngel] = DoLoadBitmap(hInst, "aa", squareSize, "w"); } } if(gameInfo.variant == VariantGothic) { // Vortex-like pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "s"); pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "o"); pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "cv", squareSize, "w"); } else if(gameInfo.variant == VariantSChess && (squareSize == 49 || squareSize == 72)) { pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "s"); pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "o"); pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "e", squareSize, "w"); } else { // WinBoard standard pieceBitmap[0][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "s"); pieceBitmap[1][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "o"); pieceBitmap[2][WhiteMarshall] = DoLoadBitmap(hInst, "c", squareSize, "w"); } } if(squareSize==72 || squareSize==49 || squareSize==33) { /* experiment with some home-made bitmaps */ pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "s"); pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "o"); pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "f", squareSize, "w"); pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "s"); pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "o"); pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "w", squareSize, "w"); pieceBitmap[0][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "s"); pieceBitmap[1][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "o"); pieceBitmap[2][WhiteAlfil] = DoLoadBitmap(hInst, "e", squareSize, "w"); pieceBitmap[0][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "s"); pieceBitmap[1][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "o"); pieceBitmap[2][WhiteMan] = DoLoadBitmap(hInst, "m", squareSize, "w"); pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "s"); pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "o"); pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "a", squareSize, "w"); pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "s"); pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "o"); pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "dk", squareSize, "w"); pieceBitmap[0][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "s"); pieceBitmap[1][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "o"); pieceBitmap[2][WhiteFalcon] = DoLoadBitmap(hInst, "v", squareSize, "w"); pieceBitmap[0][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "s"); pieceBitmap[1][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "o"); pieceBitmap[2][WhiteCobra] = DoLoadBitmap(hInst, "s", squareSize, "w"); pieceBitmap[0][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "s"); pieceBitmap[1][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "o"); pieceBitmap[2][WhiteLance] = DoLoadBitmap(hInst, "l", squareSize, "w"); pieceBitmap[0][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "s"); pieceBitmap[1][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "o"); pieceBitmap[2][WhiteUnicorn] = DoLoadBitmap(hInst, "u", squareSize, "w"); if(gameInfo.variant == VariantShogi) { /* promoted Gold represemtations */ pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "s"); pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "wp", squareSize, "o"); pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "w", squareSize, "w"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "s"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "wn", squareSize, "o"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "w", squareSize, "w"); pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "s"); pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ws", squareSize, "o"); pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "w", squareSize, "w"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "s"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "wl", squareSize, "o"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "w", squareSize, "w"); } else { pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "s"); pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "o"); pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "o", squareSize, "w"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "s"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "o"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "h", squareSize, "w"); pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "s"); pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "o"); pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "cv", squareSize, "w"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "s"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "o"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "g", squareSize, "w"); } } else { /* other size, no special bitmaps available. Use smaller symbols */ if((int)boardSize < 2) minorSize = sizeInfo[0].squareSize; else minorSize = sizeInfo[(int)boardSize - 2].squareSize; pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "s"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "o"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "n", minorSize, "w"); pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "s"); pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "o"); pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "b", minorSize, "w"); pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "s"); pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "o"); pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "r", minorSize, "w"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "s"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "o"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "q", minorSize, "w"); } if(gameInfo.variant == VariantShogi && squareSize == 58) /* special Shogi support in this size */ { for (i=0; i<=2; i++) { /* replace all bitmaps */ for (piece = WhitePawn; (int) piece < (int) BlackPawn; piece = (ChessSquare) ((int) piece + 1)) { if (pieceBitmap[i][piece] != NULL) DeleteObject(pieceBitmap[i][piece]); } } pieceBitmap[0][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "o"); pieceBitmap[0][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "o"); pieceBitmap[0][WhiteBishop] = DoLoadBitmap(hInst, "sb", squareSize, "o"); pieceBitmap[0][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "o"); pieceBitmap[0][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "o"); pieceBitmap[0][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o"); pieceBitmap[0][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o"); pieceBitmap[0][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o"); pieceBitmap[0][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o"); pieceBitmap[0][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o"); pieceBitmap[0][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o"); pieceBitmap[0][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o"); pieceBitmap[0][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o"); pieceBitmap[0][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o"); pieceBitmap[1][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "o"); pieceBitmap[1][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "o"); pieceBitmap[1][WhiteBishop] = DoLoadBitmap(hInst, "sb", squareSize, "o"); pieceBitmap[1][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "o"); pieceBitmap[1][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "o"); pieceBitmap[1][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "o"); pieceBitmap[1][WhiteFerz] = DoLoadBitmap(hInst, "sf", squareSize, "o"); pieceBitmap[1][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "o"); pieceBitmap[1][WhiteCannon] = DoLoadBitmap(hInst, "su", squareSize, "o"); pieceBitmap[1][WhiteNightrider] = DoLoadBitmap(hInst, "sh", squareSize, "o"); pieceBitmap[1][WhiteCardinal] = DoLoadBitmap(hInst, "sa", squareSize, "o"); pieceBitmap[1][WhiteDragon] = DoLoadBitmap(hInst, "sc", squareSize, "o"); pieceBitmap[1][WhiteGrasshopper] = DoLoadBitmap(hInst, "sg", squareSize, "o"); pieceBitmap[1][WhiteSilver] = DoLoadBitmap(hInst, "ss", squareSize, "o"); pieceBitmap[2][WhitePawn] = DoLoadBitmap(hInst, "sp", squareSize, "w"); pieceBitmap[2][WhiteKnight] = DoLoadBitmap(hInst, "sn", squareSize, "w"); pieceBitmap[2][WhiteBishop] = DoLoadBitmap(hInst, "sr", squareSize, "w"); pieceBitmap[2][WhiteRook] = DoLoadBitmap(hInst, "sr", squareSize, "w"); pieceBitmap[2][WhiteQueen] = DoLoadBitmap(hInst, "sl", squareSize, "w"); pieceBitmap[2][WhiteKing] = DoLoadBitmap(hInst, "sk", squareSize, "w"); pieceBitmap[2][WhiteFerz] = DoLoadBitmap(hInst, "sw", squareSize, "w"); pieceBitmap[2][WhiteWazir] = DoLoadBitmap(hInst, "sw", squareSize, "w"); pieceBitmap[2][WhiteCannon] = DoLoadBitmap(hInst, "sp", squareSize, "w"); pieceBitmap[2][WhiteNightrider] = DoLoadBitmap(hInst, "sn", squareSize, "w"); pieceBitmap[2][WhiteCardinal] = DoLoadBitmap(hInst, "sr", squareSize, "w"); pieceBitmap[2][WhiteDragon] = DoLoadBitmap(hInst, "sr", squareSize, "w"); pieceBitmap[2][WhiteGrasshopper] = DoLoadBitmap(hInst, "sl", squareSize, "w"); pieceBitmap[2][WhiteSilver] = DoLoadBitmap(hInst, "sw", squareSize, "w"); minorSize = 0; } } HBITMAP PieceBitmap(ChessSquare p, int kind) { if ((int) p >= (int) BlackPawn) p = (ChessSquare) ((int) p - (int) BlackPawn + (int) WhitePawn); return pieceBitmap[kind][(int) p]; } /***************************************************************/ #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) /* #define MIN3(a,b,c) (((a) < (b) && (a) < (c)) ? (a) : (((b) < (a) && (b) < (c)) ? (b) : (c))) #define MAX3(a,b,c) (((a) > (b) && (a) > (c)) ? (a) : (((b) > (a) && (b) > (c)) ? (b) : (c))) */ VOID SquareToPos(int row, int column, int * x, int * y) { if (flipView) { *x = boardRect.left + lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap) + border; *y = boardRect.top + lineGap + row * (squareSize + lineGap) + border; } else { *x = boardRect.left + lineGap + column * (squareSize + lineGap) + border; *y = boardRect.top + lineGap + ((BOARD_HEIGHT-1)-row) * (squareSize + lineGap) + border; } } VOID DrawCoordsOnDC(HDC hdc) { static char files[] = "0123456789012345678901221098765432109876543210"; static char ranks[] = "wvutsrqponmlkjihgfedcbaabcdefghijklmnopqrstuvw"; char str[2] = { NULLCHAR, NULLCHAR }; int oldMode, oldAlign, x, y, start, i; HFONT oldFont; HBRUSH oldBrush; if (!appData.showCoords) return; start = flipView ? 1-(ONE!='1') : 45+(ONE!='1')-BOARD_HEIGHT; oldBrush = SelectObject(hdc, GetStockObject(BLACK_BRUSH)); oldMode = SetBkMode(hdc, (appData.monoMode ? OPAQUE : TRANSPARENT)); oldAlign = GetTextAlign(hdc); oldFont = SelectObject(hdc, font[boardSize][COORD_FONT]->hf); y = boardRect.top + lineGap; x = boardRect.left + lineGap + gameInfo.holdingsWidth*(squareSize + lineGap); if(border) { SetTextAlign(hdc, TA_RIGHT|TA_TOP); x += border - lineGap - 4; y += squareSize - 6; } else SetTextAlign(hdc, TA_LEFT|TA_TOP); for (i = 0; i < BOARD_HEIGHT; i++) { str[0] = files[start + i]; ExtTextOut(hdc, x + 2 - (border ? gameInfo.holdingsWidth * (squareSize + lineGap) : 0), y + 1, 0, NULL, str, 1, NULL); y += squareSize + lineGap; } start = flipView ? 23-(BOARD_RGHT-BOARD_LEFT) : 23; if(border) { SetTextAlign(hdc, TA_LEFT|TA_TOP); x += -border + 4; y += border - squareSize + 6; } else SetTextAlign(hdc, TA_RIGHT|TA_BOTTOM); for (i = 0; i < BOARD_RGHT - BOARD_LEFT; i++) { str[0] = ranks[start + i]; ExtTextOut(hdc, x + squareSize - 2, y - 1, 0, NULL, str, 1, NULL); x += squareSize + lineGap; } SelectObject(hdc, oldBrush); SetBkMode(hdc, oldMode); SetTextAlign(hdc, oldAlign); SelectObject(hdc, oldFont); } VOID DrawGridOnDC(HDC hdc) { HPEN oldPen; if (lineGap != 0) { oldPen = SelectObject(hdc, gridPen); PolyPolyline(hdc, gridEndpoints, gridVertexCounts, BOARD_WIDTH+BOARD_HEIGHT + 2); SelectObject(hdc, oldPen); } } #define HIGHLIGHT_PEN 0 #define PREMOVE_PEN 1 VOID DrawHighlightOnDC(HDC hdc, BOOLEAN on, int x, int y, int pen) { int x1, y1; HPEN oldPen, hPen; if (lineGap == 0) return; if (flipView) { x1 = boardRect.left + lineGap/2 + ((BOARD_WIDTH-1)-x) * (squareSize + lineGap) + border; y1 = boardRect.top + lineGap/2 + y * (squareSize + lineGap) + border; } else { x1 = boardRect.left + lineGap/2 + x * (squareSize + lineGap) + border; y1 = boardRect.top + lineGap/2 + ((BOARD_HEIGHT-1)-y) * (squareSize + lineGap) + border; } hPen = pen ? premovePen : highlightPen; oldPen = SelectObject(hdc, on ? hPen : gridPen); MoveToEx(hdc, x1, y1, NULL); LineTo(hdc, x1 + squareSize + lineGap, y1); LineTo(hdc, x1 + squareSize + lineGap, y1 + squareSize + lineGap); LineTo(hdc, x1, y1 + squareSize + lineGap); LineTo(hdc, x1, y1); SelectObject(hdc, oldPen); } VOID DrawHighlightsOnDC(HDC hdc, HighlightInfo *h, int pen) { int i; for (i=0; i<2; i++) { if (h->sq[i].x >= 0 && h->sq[i].y >= 0) DrawHighlightOnDC(hdc, TRUE, h->sq[i].x, h->sq[i].y, pen); } } /* Note: sqcolor is used only in monoMode */ /* Note that this code is largely duplicated in woptions.c, function DrawSampleSquare, so that needs to be updated too */ VOID DrawPieceOnDC(HDC hdc, ChessSquare piece, int color, int sqcolor, int x, int y, HDC tmphdc) { HBITMAP oldBitmap; HBRUSH oldBrush; int tmpSize; if (appData.blindfold) return; /* [AS] Use font-based pieces if needed */ if( fontBitmapSquareSize >= 0 && (squareSize > 32 || gameInfo.variant >= VariantShogi)) { /* Create piece bitmaps, or do nothing if piece set is up to date */ CreatePiecesFromFont(); if( fontBitmapSquareSize == squareSize ) { int index = TranslatePieceToFontPiece(piece); SelectObject( tmphdc, hPieceMask[ index ] ); if(appData.upsideDown ? color==flipView : (flipView && gameInfo.variant == VariantShogi)) StretchBlt(hdc, x+squareSize, y+squareSize, -squareSize, -squareSize, tmphdc, 0, 0, squareSize, squareSize, SRCAND); else BitBlt( hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, SRCAND ); SelectObject( tmphdc, hPieceFace[ index ] ); if(appData.upsideDown ? color==flipView : (flipView && gameInfo.variant == VariantShogi)) StretchBlt(hdc, x+squareSize, y+squareSize, -squareSize, -squareSize, tmphdc, 0, 0, squareSize, squareSize, SRCPAINT); else BitBlt( hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, SRCPAINT ); return; } } if (appData.monoMode) { SelectObject(tmphdc, PieceBitmap(piece, color == sqcolor ? OUTLINE_PIECE : SOLID_PIECE)); BitBlt(hdc, x, y, squareSize, squareSize, tmphdc, 0, 0, sqcolor ? SRCCOPY : NOTSRCCOPY); } else { HBRUSH xBrush = whitePieceBrush; tmpSize = squareSize; if(appData.pieceDirectory[0]) xBrush = GetStockObject(WHITE_BRUSH); if(minorSize && ((piece >= (int)WhiteNightrider && piece <= WhiteGrasshopper) || (piece >= (int)BlackNightrider && piece <= BlackGrasshopper)) ) { /* [HGM] no bitmap available for promoted pieces in Crazyhouse */ /* Bitmaps of smaller size are substituted, but we have to align them */ x += (squareSize - minorSize)>>1; y += squareSize - minorSize - 2; tmpSize = minorSize; } if (color || appData.allWhite ) { oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, WHITE_PIECE)); if( color ) oldBrush = SelectObject(hdc, xBrush); else oldBrush = SelectObject(hdc, blackPieceBrush); if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); /* Use black for outline of white pieces */ SelectObject(tmphdc, PieceBitmap(piece, OUTLINE_PIECE)); if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND); } else if(appData.pieceDirectory[0]) { oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, WHITE_PIECE)); oldBrush = SelectObject(hdc, xBrush); if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE)); if(appData.upsideDown && color==flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, SRCAND); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, SRCAND); } else { /* Use square color for details of black pieces */ oldBitmap = SelectObject(tmphdc, PieceBitmap(piece, SOLID_PIECE)); oldBrush = SelectObject(hdc, blackPieceBrush); if(appData.upsideDown && !flipView) StretchBlt(hdc, x+tmpSize, y+tmpSize, -tmpSize, -tmpSize, tmphdc, 0, 0, tmpSize, tmpSize, 0x00B8074A); else BitBlt(hdc, x, y, tmpSize, tmpSize, tmphdc, 0, 0, 0x00B8074A); } SelectObject(hdc, oldBrush); SelectObject(tmphdc, oldBitmap); } } /* [AS] Compute a drawing mode for a square, based on specified settings (see DrawTile) */ int GetBackTextureMode( int algo ) { int result = BACK_TEXTURE_MODE_DISABLED; switch( algo ) { case BACK_TEXTURE_MODE_PLAIN: result = 1; /* Always use identity map */ break; case BACK_TEXTURE_MODE_FULL_RANDOM: result = 1 + (myrandom() % 3); /* Pick a transformation at random */ break; } return result; } /* [AS] Compute and save texture drawing info, otherwise we may not be able to handle redraws cleanly (as random numbers would always be different). */ VOID RebuildTextureSquareInfo() { BITMAP bi; int lite_w = 0; int lite_h = 0; int dark_w = 0; int dark_h = 0; int row; int col; ZeroMemory( &backTextureSquareInfo, sizeof(backTextureSquareInfo) ); if( liteBackTexture != NULL ) { if( GetObject( liteBackTexture, sizeof(bi), &bi ) > 0 ) { lite_w = bi.bmWidth; lite_h = bi.bmHeight; } } if( darkBackTexture != NULL ) { if( GetObject( darkBackTexture, sizeof(bi), &bi ) > 0 ) { dark_w = bi.bmWidth; dark_h = bi.bmHeight; } } for( row=0; row= squareSize && lite_h >= squareSize ) { if( lite_w >= squareSize*BOARD_WIDTH ) backTextureSquareInfo[row][col].x = (2*col+1)*lite_w/(2*BOARD_WIDTH) - squareSize/2; /* [HGM] cut out of center of virtual square */ else backTextureSquareInfo[row][col].x = col * (lite_w - squareSize) / (BOARD_WIDTH-1); /* [HGM] divide by size-1 in stead of size! */ if( lite_h >= squareSize*BOARD_HEIGHT ) backTextureSquareInfo[row][col].y = (2*(BOARD_HEIGHT-row)-1)*lite_h/(2*BOARD_HEIGHT) - squareSize/2; else backTextureSquareInfo[row][col].y = (BOARD_HEIGHT-1-row) * (lite_h - squareSize) / (BOARD_HEIGHT-1); backTextureSquareInfo[row][col].mode = GetBackTextureMode(liteBackTextureMode); } } else { /* Dark square */ if( dark_w >= squareSize && dark_h >= squareSize ) { if( dark_w >= squareSize*BOARD_WIDTH ) backTextureSquareInfo[row][col].x = (2*col+1) * dark_w / (2*BOARD_WIDTH) - squareSize/2; else backTextureSquareInfo[row][col].x = col * (dark_w - squareSize) / (BOARD_WIDTH-1); if( dark_h >= squareSize*BOARD_HEIGHT ) backTextureSquareInfo[row][col].y = (2*(BOARD_HEIGHT-row)-1) * dark_h / (2*BOARD_HEIGHT) - squareSize/2; else backTextureSquareInfo[row][col].y = (BOARD_HEIGHT-1-row) * (dark_h - squareSize) / (BOARD_HEIGHT-1); backTextureSquareInfo[row][col].mode = GetBackTextureMode(darkBackTextureMode); } } } } } /* [AS] Arrow highlighting support */ static double A_WIDTH = 5; /* Width of arrow body */ #define A_HEIGHT_FACTOR 6 /* Length of arrow "point", relative to body width */ #define A_WIDTH_FACTOR 3 /* Width of arrow "point", relative to body width */ static double Sqr( double x ) { return x*x; } static int Round( double x ) { return (int) (x + 0.5); } /* Draw an arrow between two points using current settings */ VOID DrawArrowBetweenPoints( HDC hdc, int s_x, int s_y, int d_x, int d_y ) { POINT arrow[7]; double dx, dy, j, k, x, y; if( d_x == s_x ) { int h = (d_y > s_y) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; arrow[0].x = s_x + A_WIDTH + 0.5; arrow[0].y = s_y; arrow[1].x = s_x + A_WIDTH + 0.5; arrow[1].y = d_y - h; arrow[2].x = arrow[1].x + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[2].y = d_y - h; arrow[3].x = d_x; arrow[3].y = d_y; arrow[5].x = arrow[1].x - 2*A_WIDTH + 0.5; arrow[5].y = d_y - h; arrow[4].x = arrow[5].x - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[4].y = d_y - h; arrow[6].x = arrow[1].x - 2*A_WIDTH + 0.5; arrow[6].y = s_y; } else if( d_y == s_y ) { int w = (d_x > s_x) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; arrow[0].x = s_x; arrow[0].y = s_y + A_WIDTH + 0.5; arrow[1].x = d_x - w; arrow[1].y = s_y + A_WIDTH + 0.5; arrow[2].x = d_x - w; arrow[2].y = arrow[1].y + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[3].x = d_x; arrow[3].y = d_y; arrow[5].x = d_x - w; arrow[5].y = arrow[1].y - 2*A_WIDTH + 0.5; arrow[4].x = d_x - w; arrow[4].y = arrow[5].y - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[6].x = s_x; arrow[6].y = arrow[1].y - 2*A_WIDTH + 0.5; } else { /* [AS] Needed a lot of paper for this! :-) */ dy = (double) (d_y - s_y) / (double) (d_x - s_x); dx = (double) (s_x - d_x) / (double) (s_y - d_y); j = sqrt( Sqr(A_WIDTH) / (1.0 + Sqr(dx)) ); k = sqrt( Sqr(A_WIDTH*A_HEIGHT_FACTOR) / (1.0 + Sqr(dy)) ); x = s_x; y = s_y; arrow[0].x = Round(x - j); arrow[0].y = Round(y + j*dx); arrow[1].x = Round(arrow[0].x + 2*j); // [HGM] prevent width to be affected by rounding twice arrow[1].y = Round(arrow[0].y - 2*j*dx); if( d_x > s_x ) { x = (double) d_x - k; y = (double) d_y - k*dy; } else { x = (double) d_x + k; y = (double) d_y + k*dy; } x = Round(x); y = Round(y); // [HGM] make sure width of shaft is rounded the same way on both ends arrow[6].x = Round(x - j); arrow[6].y = Round(y + j*dx); arrow[2].x = Round(arrow[6].x + 2*j); arrow[2].y = Round(arrow[6].y - 2*j*dx); arrow[3].x = Round(arrow[2].x + j*(A_WIDTH_FACTOR-1)); arrow[3].y = Round(arrow[2].y - j*(A_WIDTH_FACTOR-1)*dx); arrow[4].x = d_x; arrow[4].y = d_y; arrow[5].x = Round(arrow[6].x - j*(A_WIDTH_FACTOR-1)); arrow[5].y = Round(arrow[6].y + j*(A_WIDTH_FACTOR-1)*dx); } Polygon( hdc, arrow, 7 ); } /* [AS] Draw an arrow between two squares */ VOID DrawArrowBetweenSquares( HDC hdc, int s_col, int s_row, int d_col, int d_row ) { int s_x, s_y, d_x, d_y; HPEN hpen; HPEN holdpen; HBRUSH hbrush; HBRUSH holdbrush; LOGBRUSH stLB; if( s_col == d_col && s_row == d_row ) { return; } /* Get source and destination points */ SquareToPos( s_row, s_col, &s_x, &s_y); SquareToPos( d_row, d_col, &d_x, &d_y); if( d_y > s_y ) { d_y += squareSize / 2 - squareSize / 4; // [HGM] round towards same centers on all sides! } else if( d_y < s_y ) { d_y += squareSize / 2 + squareSize / 4; } else { d_y += squareSize / 2; } if( d_x > s_x ) { d_x += squareSize / 2 - squareSize / 4; } else if( d_x < s_x ) { d_x += squareSize / 2 + squareSize / 4; } else { d_x += squareSize / 2; } s_x += squareSize / 2; s_y += squareSize / 2; /* Adjust width */ A_WIDTH = squareSize / 14.; //[HGM] make float /* Draw */ stLB.lbStyle = BS_SOLID; stLB.lbColor = appData.highlightArrowColor; stLB.lbHatch = 0; hpen = CreatePen( PS_SOLID, 2, RGB(0x00,0x00,0x00) ); holdpen = SelectObject( hdc, hpen ); hbrush = CreateBrushIndirect( &stLB ); holdbrush = SelectObject( hdc, hbrush ); DrawArrowBetweenPoints( hdc, s_x, s_y, d_x, d_y ); SelectObject( hdc, holdpen ); SelectObject( hdc, holdbrush ); DeleteObject( hpen ); DeleteObject( hbrush ); } BOOL HasHighlightInfo() { BOOL result = FALSE; if( highlightInfo.sq[0].x >= 0 && highlightInfo.sq[0].y >= 0 && highlightInfo.sq[1].x >= 0 && highlightInfo.sq[1].y >= 0 ) { result = TRUE; } return result; } BOOL IsDrawArrowEnabled() { BOOL result = FALSE; if( appData.highlightMoveWithArrow && squareSize >= 32 ) { result = TRUE; } return result; } VOID DrawArrowHighlight( HDC hdc ) { if( IsDrawArrowEnabled() && HasHighlightInfo() ) { DrawArrowBetweenSquares( hdc, highlightInfo.sq[0].x, highlightInfo.sq[0].y, highlightInfo.sq[1].x, highlightInfo.sq[1].y ); } } HRGN GetArrowHighlightClipRegion( HDC hdc ) { HRGN result = NULL; if( HasHighlightInfo() ) { int x1, y1, x2, y2; int sx, sy, dx, dy; SquareToPos(highlightInfo.sq[0].y, highlightInfo.sq[0].x, &x1, &y1 ); SquareToPos(highlightInfo.sq[1].y, highlightInfo.sq[1].x, &x2, &y2 ); sx = MIN( x1, x2 ); sy = MIN( y1, y2 ); dx = MAX( x1, x2 ) + squareSize; dy = MAX( y1, y2 ) + squareSize; result = CreateRectRgn( sx, sy, dx, dy ); } return result; } /* Warning: this function modifies the behavior of several other functions. Basically, Winboard is optimized to avoid drawing the whole board if not strictly needed. Unfortunately, the decision whether or not to perform a full or partial repaint is scattered all over the place, which is not good for features such as "arrow highlighting" that require a full repaint of the board. So, I've tried to patch the code where I thought it made sense (e.g. after or during user interaction, when speed is not so important) but especially to avoid errors in the displayed graphics. In such patched places, I always try refer to this function so there is a single place to maintain knowledge. To restore the original behavior, just return FALSE unconditionally. */ BOOL IsFullRepaintPreferrable() { BOOL result = FALSE; if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() ) { /* Arrow may appear on the board */ result = TRUE; } return result; } /* This function is called by DrawPosition to know whether a full repaint must be forced or not. Only DrawPosition may directly call this function, which makes use of some state information. Other function should call DrawPosition specifying the repaint flag, and can use IsFullRepaintPreferrable if needed. */ BOOL DrawPositionNeedsFullRepaint() { BOOL result = FALSE; /* Probably a slightly better policy would be to trigger a full repaint when animInfo.piece changes state (i.e. empty -> non-empty and viceversa), but animation is fast enough that it's difficult to notice. */ if( animInfo.piece == EmptySquare ) { if( (appData.highlightLastMove || appData.highlightDragging) && IsDrawArrowEnabled() /*&& HasHighlightInfo()*/ ) { result = TRUE; } } return result; } static HBITMAP borderBitmap; VOID DrawBackgroundOnDC(HDC hdc) { BITMAP bi; HDC tmphdc; HBITMAP hbm; static char oldBorder[MSG_SIZ]; int w = 600, h = 600, mode; if(strcmp(appData.border, oldBorder)) { // load new one when old one no longer valid strncpy(oldBorder, appData.border, MSG_SIZ-1); borderBitmap = LoadImage( 0, appData.border, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); } if(borderBitmap == NULL) { // loading failed, use white FillRect( hdc, &boardRect, whitePieceBrush ); return; } tmphdc = CreateCompatibleDC(hdc); hbm = SelectObject(tmphdc, borderBitmap); if( GetObject( borderBitmap, sizeof(bi), &bi ) > 0 ) { w = bi.bmWidth; h = bi.bmHeight; } mode = SetStretchBltMode(hdc, COLORONCOLOR); StretchBlt(hdc, boardRect.left, boardRect.top, boardRect.right - boardRect.left, boardRect.bottom - boardRect.top, tmphdc, 0, 0, w, h, SRCCOPY); SetStretchBltMode(hdc, mode); SelectObject(tmphdc, hbm); DeleteDC(tmphdc); } VOID DrawBoardOnDC(HDC hdc, Board board, HDC tmphdc) { int row, column, x, y, square_color, piece_color; ChessSquare piece; HBRUSH oldBrush; HDC texture_hdc = NULL; /* [AS] Initialize background textures if needed */ if( liteBackTexture != NULL || darkBackTexture != NULL ) { static int backTextureBoardSize; /* [HGM] boardsize: also new texture if board format changed */ if( backTextureSquareSize != squareSize || backTextureBoardSize != BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT) { backTextureBoardSize = BOARD_WIDTH+BOARD_FILES*BOARD_HEIGHT; backTextureSquareSize = squareSize; RebuildTextureSquareInfo(); } texture_hdc = CreateCompatibleDC( hdc ); } for (row = 0; row < BOARD_HEIGHT; row++) { for (column = 0; column < BOARD_WIDTH; column++) { SquareToPos(row, column, &x, &y); piece = board[row][column]; square_color = ((column + row) % 2) == 1; if( gameInfo.variant == VariantXiangqi ) { square_color = !InPalace(row, column); if(BOARD_HEIGHT&1) { if(row==BOARD_HEIGHT/2) square_color ^= 1; } else if(row < BOARD_HEIGHT/2) square_color ^= 1; } piece_color = (int) piece < (int) BlackPawn; /* [HGM] holdings file: light square or black */ if(column == BOARD_LEFT-2) { if( row > BOARD_HEIGHT - gameInfo.holdingsSize - 1 ) square_color = 1; else { DisplayHoldingsCount(hdc, x, y, 0, 0); /* black out */ continue; } } else if(column == BOARD_RGHT + 1 ) { if( row < gameInfo.holdingsSize ) square_color = 1; else { DisplayHoldingsCount(hdc, x, y, 0, 0); continue; } } if(column == BOARD_LEFT-1 ) /* left align */ DisplayHoldingsCount(hdc, x, y, flipView, (int) board[row][column]); else if( column == BOARD_RGHT) /* right align */ DisplayHoldingsCount(hdc, x, y, !flipView, (int) board[row][column]); else if (appData.monoMode) { if (piece == EmptySquare) { BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0, square_color ? WHITENESS : BLACKNESS); } else { DrawPieceOnDC(hdc, piece, piece_color, square_color, x, y, tmphdc); } } else if( appData.useBitmaps && backTextureSquareInfo[row][column].mode > 0 ) { /* [AS] Draw the square using a texture bitmap */ HBITMAP hbm = SelectObject( texture_hdc, square_color ? liteBackTexture : darkBackTexture ); int r = row, c = column; // [HGM] do not flip board in flipView if(flipView) { r = BOARD_HEIGHT-1 - r; c = BOARD_WIDTH-1 - c; } DrawTile( x, y, squareSize, squareSize, hdc, texture_hdc, backTextureSquareInfo[r][c].mode, backTextureSquareInfo[r][c].x, backTextureSquareInfo[r][c].y ); SelectObject( texture_hdc, hbm ); if (piece != EmptySquare) { DrawPieceOnDC(hdc, piece, piece_color, -1, x, y, tmphdc); } } else { HBRUSH brush = square_color ? lightSquareBrush : darkSquareBrush; oldBrush = SelectObject(hdc, brush ); BitBlt(hdc, x, y, squareSize, squareSize, 0, 0, 0, PATCOPY); SelectObject(hdc, oldBrush); if (piece != EmptySquare) DrawPieceOnDC(hdc, piece, piece_color, -1, x, y, tmphdc); } } } if( texture_hdc != NULL ) { DeleteDC( texture_hdc ); } } int saveDiagFlag = 0; FILE *diagFile; // [HGM] diag void fputDW(FILE *f, int x) { fputc(x & 255, f); fputc(x>>8 & 255, f); fputc(x>>16 & 255, f); fputc(x>>24 & 255, f); } #define MAX_CLIPS 200 /* more than enough */ VOID DrawLogoOnDC(HDC hdc, RECT logoRect, HBITMAP logo) { // HBITMAP bufferBitmap; BITMAP bi; // RECT Rect; HDC tmphdc; HBITMAP hbm; int w = 100, h = 50; if(logo == NULL) { if(!logoHeight) return; FillRect( hdc, &logoRect, whitePieceBrush ); } // GetClientRect(hwndMain, &Rect); // bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1, // Rect.bottom-Rect.top+1); tmphdc = CreateCompatibleDC(hdc); hbm = SelectObject(tmphdc, logo); if( GetObject( logo, sizeof(bi), &bi ) > 0 ) { w = bi.bmWidth; h = bi.bmHeight; } StretchBlt(hdc, logoRect.left, logoRect.top, logoRect.right - logoRect.left, logoRect.bottom - logoRect.top, tmphdc, 0, 0, w, h, SRCCOPY); SelectObject(tmphdc, hbm); DeleteDC(tmphdc); } VOID DisplayLogos() { if(logoHeight) { HDC hdc = GetDC(hwndMain); HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo; if(appData.autoLogo) { switch(gameMode) { // pick logos based on game mode case IcsObserving: whiteLogo = second.programLogo; // ICS logo blackLogo = second.programLogo; default: break; case IcsPlayingWhite: if(!appData.zippyPlay) whiteLogo = userLogo; blackLogo = second.programLogo; // ICS logo break; case IcsPlayingBlack: whiteLogo = second.programLogo; // ICS logo blackLogo = appData.zippyPlay ? first.programLogo : userLogo; break; case TwoMachinesPlay: if(first.twoMachinesColor[0] == 'b') { whiteLogo = second.programLogo; blackLogo = first.programLogo; } break; case MachinePlaysWhite: blackLogo = userLogo; break; case MachinePlaysBlack: whiteLogo = userLogo; blackLogo = first.programLogo; } } DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo); DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo); ReleaseDC(hwndMain, hdc); } } void UpdateLogos(int display) { // called after loading new engine(s), in tourney or from menu LoadLogo(&first, 0, FALSE); LoadLogo(&second, 1, appData.icsActive); InitDrawingSizes(-2, 0); // adapt layout of board window to presence/absence of logos if(display) DisplayLogos(); } static HDC hdcSeek; // [HGM] seekgraph void DrawSeekAxis( int x, int y, int xTo, int yTo ) { POINT stPt; HPEN hp = SelectObject( hdcSeek, gridPen ); MoveToEx( hdcSeek, boardRect.left+x, boardRect.top+y, &stPt ); LineTo( hdcSeek, boardRect.left+xTo, boardRect.top+yTo ); SelectObject( hdcSeek, hp ); } // front-end wrapper for drawing functions to do rectangles void DrawSeekBackground( int left, int top, int right, int bottom ) { HPEN hp; RECT rc; if (hdcSeek == NULL) { hdcSeek = GetDC(hwndMain); if (!appData.monoMode) { SelectPalette(hdcSeek, hPal, FALSE); RealizePalette(hdcSeek); } } hp = SelectObject( hdcSeek, gridPen ); rc.top = boardRect.top+top; rc.left = boardRect.left+left; rc.bottom = boardRect.top+bottom; rc.right = boardRect.left+right; FillRect( hdcSeek, &rc, lightSquareBrush ); SelectObject( hdcSeek, hp ); } // front-end wrapper for putting text in graph void DrawSeekText(char *buf, int x, int y) { SIZE stSize; SetBkMode( hdcSeek, TRANSPARENT ); GetTextExtentPoint32( hdcSeek, buf, strlen(buf), &stSize ); TextOut( hdcSeek, boardRect.left+x-3, boardRect.top+y-stSize.cy/2, buf, strlen(buf) ); } void DrawSeekDot(int x, int y, int color) { int square = color & 0x80; HBRUSH oldBrush = SelectObject(hdcSeek, color == 0 ? markerBrush : color == 1 ? darkSquareBrush : explodeBrush); color &= 0x7F; if(square) Rectangle(hdcSeek, boardRect.left+x - squareSize/9, boardRect.top+y - squareSize/9, boardRect.left+x + squareSize/9, boardRect.top+y + squareSize/9); else Ellipse(hdcSeek, boardRect.left+x - squareSize/8, boardRect.top+y - squareSize/8, boardRect.left+x + squareSize/8, boardRect.top+y + squareSize/8); SelectObject(hdcSeek, oldBrush); } void DrawSeekOpen() { } void DrawSeekClose() { } VOID HDCDrawPosition(HDC hdc, BOOLEAN repaint, Board board) { static Board lastReq[2], lastDrawn[2]; static HighlightInfo lastDrawnHighlight, lastDrawnPremove; static int lastDrawnFlipView = 0; static int lastReqValid[2] = {0, 0}, lastDrawnValid[2] = {0, 0}; int releaseDC, x, y, x2, y2, row, column, num_clips = 0, i; HDC tmphdc; HDC hdcmem; HBITMAP bufferBitmap; HBITMAP oldBitmap; RECT Rect; HRGN clips[MAX_CLIPS]; ChessSquare dragged_piece = EmptySquare; int nr = twoBoards*partnerUp; /* I'm undecided on this - this function figures out whether a full * repaint is necessary on its own, so there's no real reason to have the * caller tell it that. I think this can safely be set to FALSE - but * if we trust the callers not to request full repaints unnessesarily, then * we could skip some clipping work. In other words, only request a full * redraw when the majority of pieces have changed positions (ie. flip, * gamestart and similar) --Hawk */ Boolean fullrepaint = repaint; if(DrawSeekGraph()) return; // [HG} seekgraph: suppress printing board if seek graph up if( DrawPositionNeedsFullRepaint() ) { fullrepaint = TRUE; } if (board == NULL) { if (!lastReqValid[nr]) { return; } board = lastReq[nr]; } else { CopyBoard(lastReq[nr], board); lastReqValid[nr] = 1; } if (doingSizing) { return; } if (IsIconic(hwndMain)) { return; } if (hdc == NULL) { hdc = GetDC(hwndMain); if (!appData.monoMode) { SelectPalette(hdc, hPal, FALSE); RealizePalette(hdc); } releaseDC = TRUE; } else { releaseDC = FALSE; } /* Create some work-DCs */ hdcmem = CreateCompatibleDC(hdc); tmphdc = CreateCompatibleDC(hdc); /* If dragging is in progress, we temporarely remove the piece */ /* [HGM] or temporarily decrease count if stacked */ /* !! Moved to before board compare !! */ if (dragInfo.from.x >= 0 && dragInfo.pos.x >= 0) { dragged_piece = board[dragInfo.from.y][dragInfo.from.x]; if(dragInfo.from.x == BOARD_LEFT-2 ) { if(--board[dragInfo.from.y][dragInfo.from.x+1] == 0 ) board[dragInfo.from.y][dragInfo.from.x] = EmptySquare; } else if(dragInfo.from.x == BOARD_RGHT+1) { if(--board[dragInfo.from.y][dragInfo.from.x-1] == 0 ) board[dragInfo.from.y][dragInfo.from.x] = EmptySquare; } else board[dragInfo.from.y][dragInfo.from.x] = gatingPiece; } /* Figure out which squares need updating by comparing the * newest board with the last drawn board and checking if * flipping has changed. */ if (!fullrepaint && lastDrawnValid[nr] && (nr == 1 || lastDrawnFlipView == flipView)) { for (row = 0; row < BOARD_HEIGHT; row++) { /* [HGM] true size, not 8 */ for (column = 0; column < BOARD_WIDTH; column++) { if (lastDrawn[nr][row][column] != board[row][column]) { SquareToPos(row, column, &x, &y); clips[num_clips++] = CreateRectRgn(x, y, x + squareSize, y + squareSize); } } } if(nr == 0) { // [HGM] dual: no highlights on second board for (i=0; i<2; i++) { if (lastDrawnHighlight.sq[i].x != highlightInfo.sq[i].x || lastDrawnHighlight.sq[i].y != highlightInfo.sq[i].y) { if (lastDrawnHighlight.sq[i].x >= 0 && lastDrawnHighlight.sq[i].y >= 0) { SquareToPos(lastDrawnHighlight.sq[i].y, lastDrawnHighlight.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } if (highlightInfo.sq[i].x >= 0 && highlightInfo.sq[i].y >= 0) { SquareToPos(highlightInfo.sq[i].y, highlightInfo.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } } } for (i=0; i<2; i++) { if (lastDrawnPremove.sq[i].x != premoveHighlightInfo.sq[i].x || lastDrawnPremove.sq[i].y != premoveHighlightInfo.sq[i].y) { if (lastDrawnPremove.sq[i].x >= 0 && lastDrawnPremove.sq[i].y >= 0) { SquareToPos(lastDrawnPremove.sq[i].y, lastDrawnPremove.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } if (premoveHighlightInfo.sq[i].x >= 0 && premoveHighlightInfo.sq[i].y >= 0) { SquareToPos(premoveHighlightInfo.sq[i].y, premoveHighlightInfo.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } } } } else { // nr == 1 partnerHighlightInfo.sq[0].y = board[EP_STATUS-4]; partnerHighlightInfo.sq[0].x = board[EP_STATUS-3]; partnerHighlightInfo.sq[1].y = board[EP_STATUS-2]; partnerHighlightInfo.sq[1].x = board[EP_STATUS-1]; for (i=0; i<2; i++) { if (partnerHighlightInfo.sq[i].x >= 0 && partnerHighlightInfo.sq[i].y >= 0) { SquareToPos(partnerHighlightInfo.sq[i].y, partnerHighlightInfo.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } if (oldPartnerHighlight.sq[i].x >= 0 && oldPartnerHighlight.sq[i].y >= 0) { SquareToPos(oldPartnerHighlight.sq[i].y, oldPartnerHighlight.sq[i].x, &x, &y); clips[num_clips++] = CreateRectRgn(x - lineGap, y - lineGap, x + squareSize + lineGap, y + squareSize + lineGap); } } } } else { fullrepaint = TRUE; } /* Create a buffer bitmap - this is the actual bitmap * being written to. When all the work is done, we can * copy it to the real DC (the screen). This avoids * the problems with flickering. */ GetClientRect(hwndMain, &Rect); bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1, Rect.bottom-Rect.top+1); oldBitmap = SelectObject(hdcmem, bufferBitmap); if (!appData.monoMode) { SelectPalette(hdcmem, hPal, FALSE); } /* Create clips for dragging */ if (!fullrepaint) { if (dragInfo.from.x >= 0) { SquareToPos(dragInfo.from.y, dragInfo.from.x, &x, &y); clips[num_clips++] = CreateRectRgn(x, y, x+squareSize, y+squareSize); } if (dragInfo.start.x >= 0) { SquareToPos(dragInfo.start.y, dragInfo.start.x, &x, &y); clips[num_clips++] = CreateRectRgn(x, y, x+squareSize, y+squareSize); } if (dragInfo.pos.x >= 0) { x = dragInfo.pos.x - squareSize / 2; y = dragInfo.pos.y - squareSize / 2; clips[num_clips++] = CreateRectRgn(x, y, x+squareSize, y+squareSize); } if (dragInfo.lastpos.x >= 0) { x = dragInfo.lastpos.x - squareSize / 2; y = dragInfo.lastpos.y - squareSize / 2; clips[num_clips++] = CreateRectRgn(x, y, x+squareSize, y+squareSize); } } /* Are we animating a move? * If so, * - remove the piece from the board (temporarely) * - calculate the clipping region */ if (!fullrepaint) { if (animInfo.piece != EmptySquare) { board[animInfo.from.y][animInfo.from.x] = EmptySquare; x = boardRect.left + animInfo.lastpos.x; y = boardRect.top + animInfo.lastpos.y; x2 = boardRect.left + animInfo.pos.x; y2 = boardRect.top + animInfo.pos.y; clips[num_clips++] = CreateRectRgn(MIN(x,x2), MIN(y,y2), MAX(x,x2)+squareSize, MAX(y,y2)+squareSize); /* Slight kludge. The real problem is that after AnimateMove is done, the position on the screen does not match lastDrawn. This currently causes trouble only on e.p. captures in atomic, where the piece moves to an empty square and then explodes. The old and new positions both had an empty square at the destination, but animation has drawn a piece there and we have to remember to erase it. [HGM] moved until after setting lastDrawn */ lastDrawn[0][animInfo.to.y][animInfo.to.x] = animInfo.piece; } } /* No clips? Make sure we have fullrepaint set to TRUE */ if (num_clips == 0) fullrepaint = TRUE; /* Set clipping on the memory DC */ if (!fullrepaint) { SelectClipRgn(hdcmem, clips[0]); for (x = 1; x < num_clips; x++) { if (ExtSelectClipRgn(hdcmem, clips[x], RGN_OR) == ERROR) abort(); // this should never ever happen! } } /* Do all the drawing to the memory DC */ if(explodeInfo.radius) { // [HGM] atomic HBRUSH oldBrush; int x, y, r=(explodeInfo.radius * squareSize)/100; ChessSquare piece = board[explodeInfo.fromY][explodeInfo.fromX]; board[explodeInfo.fromY][explodeInfo.fromX] = EmptySquare; // suppress display of capturer SquareToPos(explodeInfo.toY, explodeInfo.toX, &x, &y); x += squareSize/2; y += squareSize/2; if(!fullrepaint) { clips[num_clips] = CreateRectRgn(x-r, y-r, x+r, y+r); ExtSelectClipRgn(hdcmem, clips[num_clips++], RGN_OR); } DrawGridOnDC(hdcmem); DrawHighlightsOnDC(hdcmem, &highlightInfo, HIGHLIGHT_PEN); DrawHighlightsOnDC(hdcmem, &premoveHighlightInfo, PREMOVE_PEN); DrawBoardOnDC(hdcmem, board, tmphdc); board[explodeInfo.fromY][explodeInfo.fromX] = piece; oldBrush = SelectObject(hdcmem, explodeBrush); Ellipse(hdcmem, x-r, y-r, x+r, y+r); SelectObject(hdcmem, oldBrush); } else { if(border) DrawBackgroundOnDC(hdcmem); DrawGridOnDC(hdcmem); if(nr == 0) { // [HGM] dual: decide which highlights to draw DrawHighlightsOnDC(hdcmem, &highlightInfo, HIGHLIGHT_PEN); DrawHighlightsOnDC(hdcmem, &premoveHighlightInfo, PREMOVE_PEN); } else { DrawHighlightsOnDC(hdcmem, &partnerHighlightInfo, HIGHLIGHT_PEN); oldPartnerHighlight = partnerHighlightInfo; } DrawBoardOnDC(hdcmem, board, tmphdc); } if(nr == 0) // [HGM] dual: markers only on left board for (row = 0; row < BOARD_HEIGHT; row++) { for (column = 0; column < BOARD_WIDTH; column++) { if (marker[row][column]) { // marker changes only occur with full repaint! HBRUSH oldBrush = SelectObject(hdcmem, marker[row][column] == 2 ? markerBrush : explodeBrush); SquareToPos(row, column, &x, &y); Ellipse(hdcmem, x + squareSize/4, y + squareSize/4, x + 3*squareSize/4, y + 3*squareSize/4); SelectObject(hdcmem, oldBrush); } } } if( appData.highlightMoveWithArrow ) { DrawArrowHighlight(hdcmem); } DrawCoordsOnDC(hdcmem); CopyBoard(lastDrawn[nr], board); /* [HGM] Moved to here from end of routine, */ /* to make sure lastDrawn contains what is actually drawn */ /* Put the dragged piece back into place and draw it (out of place!) */ if (dragged_piece != EmptySquare) { /* [HGM] or restack */ if(dragInfo.from.x == BOARD_LEFT-2 ) board[dragInfo.from.y][dragInfo.from.x+1]++; else if(dragInfo.from.x == BOARD_RGHT+1 ) board[dragInfo.from.y][dragInfo.from.x-1]++; board[dragInfo.from.y][dragInfo.from.x] = dragged_piece; x = dragInfo.pos.x - squareSize / 2; y = dragInfo.pos.y - squareSize / 2; DrawPieceOnDC(hdcmem, dragInfo.piece, ((int) dragInfo.piece < (int) BlackPawn), (dragInfo.from.y + dragInfo.from.x) % 2, x, y, tmphdc); } /* Put the animated piece back into place and draw it */ if (animInfo.piece != EmptySquare) { board[animInfo.from.y][animInfo.from.x] = animInfo.piece; x = boardRect.left + animInfo.pos.x; y = boardRect.top + animInfo.pos.y; DrawPieceOnDC(hdcmem, animInfo.piece, ((int) animInfo.piece < (int) BlackPawn), (animInfo.from.y + animInfo.from.x) % 2, x, y, tmphdc); } /* Release the bufferBitmap by selecting in the old bitmap * and delete the memory DC */ SelectObject(hdcmem, oldBitmap); DeleteDC(hdcmem); /* Set clipping on the target DC */ if (!fullrepaint) { if(nr == 1) for (x = 0; x < num_clips; x++) { // [HGM] dual: translate clips RECT rect; GetRgnBox(clips[x], &rect); DeleteObject(clips[x]); clips[x] = CreateRectRgn(rect.left + wpMain.width/2, rect.top, rect.right + wpMain.width/2, rect.bottom); } SelectClipRgn(hdc, clips[0]); for (x = 1; x < num_clips; x++) { if (ExtSelectClipRgn(hdc, clips[x], RGN_OR) == ERROR) abort(); // this should never ever happen! } } /* Copy the new bitmap onto the screen in one go. * This way we avoid any flickering */ oldBitmap = SelectObject(tmphdc, bufferBitmap); BitBlt(hdc, boardRect.left + twoBoards*partnerUp*wpMain.width/2, boardRect.top, // [HGM] dual boardRect.right - boardRect.left, boardRect.bottom - boardRect.top, tmphdc, boardRect.left, boardRect.top, SRCCOPY); if(saveDiagFlag) { BITMAP b; int i, j=0, m, w, wb, fac=0; char *pData; BITMAPINFOHEADER bih; int color[16], nrColors=0; GetObject(bufferBitmap, sizeof(b), &b); if(pData = malloc(b.bmWidthBytes*b.bmHeight + 10000)) { bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = b.bmWidth; bih.biHeight = b.bmHeight; bih.biPlanes = 1; bih.biBitCount = b.bmBitsPixel; bih.biCompression = 0; bih.biSizeImage = b.bmWidthBytes*b.bmHeight; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; // fprintf(diagFile, "t=%d\nw=%d\nh=%d\nB=%d\nP=%d\nX=%d\n", // b.bmType, b.bmWidth, b.bmHeight, b.bmWidthBytes, b.bmPlanes, b.bmBitsPixel); GetDIBits(tmphdc,bufferBitmap,0,b.bmHeight,pData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); // fprintf(diagFile, "%8x\n", (int) pData); wb = b.bmWidthBytes; // count colors for(i=0; i>2; i++) { int k = ((int*) pData)[i]; for(j=0; j= 16) break; color[j] = k; if(j >= nrColors) nrColors = j+1; } if(j<16) { // 16 colors is enough. Compress to 4 bits per pixel INT p = 0; for(i=0; i>2); w+=2) { int k = ((int*) pData)[(wb*i>>2) + w]; for(j=0; j>2) + w + 1]; for(m=0; m>5)<<2; } // write BITMAPFILEHEADER fprintf(diagFile, "BM"); fputDW(diagFile, wb*(b.bmHeight - boardRect.top + OUTER_MARGIN)+0x36 + (fac?64:0)); fputDW(diagFile, 0); fputDW(diagFile, 0x36 + (fac?64:0)); // write BITMAPINFOHEADER fputDW(diagFile, 40); fputDW(diagFile, b.bmWidth); fputDW(diagFile, b.bmHeight - boardRect.top + OUTER_MARGIN); if(fac) fputDW(diagFile, 0x040001); // planes and bits/pixel else fputDW(diagFile, 0x200001); // planes and bits/pixel fputDW(diagFile, 0); fputDW(diagFile, 0); fputDW(diagFile, 0); fputDW(diagFile, 0); fputDW(diagFile, 0); fputDW(diagFile, 0); // write color table if(fac) for(i=0; i<16; i++) fputDW(diagFile, color[i]); // write bitmap data for(i=0; ihf); ExtTextOut(hdc, messageRect.left, messageRect.top, ETO_CLIPPED|ETO_OPAQUE, &messageRect, messageText, strlen(messageText), NULL); SelectObject(hdc, oldFont); DisplayBothClocks(); DisplayLogos(); } EndPaint(hwnd,&ps); } return; } /* * If the user selects on a border boundary, return -1; if off the board, * return -2. Otherwise map the event coordinate to the square. * The offset boardRect.left or boardRect.top must already have been * subtracted from x. */ int EventToSquare(x, limit) int x, limit; { if (x <= border) return -2; if (x < lineGap + border) return -1; x -= lineGap + border; if ((x % (squareSize + lineGap)) >= squareSize) return -1; x /= (squareSize + lineGap); if (x >= limit) return -2; return x; } typedef struct { char piece; int command; char* name; } DropEnable; DropEnable dropEnables[] = { { 'P', DP_Pawn, N_("Pawn") }, { 'N', DP_Knight, N_("Knight") }, { 'B', DP_Bishop, N_("Bishop") }, { 'R', DP_Rook, N_("Rook") }, { 'Q', DP_Queen, N_("Queen") }, }; VOID SetupDropMenu(HMENU hmenu) { int i, count, enable; char *p; extern char white_holding[], black_holding[]; char item[MSG_SIZ]; for (i=0; i 0 || !appData.testLegality /*!!temp:*/ || (gameInfo.variant == VariantCrazyhouse && !appData.icsActive); ModifyMenu(hmenu, dropEnables[i].command, MF_BYCOMMAND | (enable ? MF_ENABLED : MF_GRAYED) | MF_STRING, dropEnables[i].command, item); } } void DragPieceBegin(int x, int y, Boolean instantly) { dragInfo.lastpos.x = boardRect.left + x; dragInfo.lastpos.y = boardRect.top + y; if(instantly) dragInfo.pos = dragInfo.lastpos; dragInfo.from.x = fromX; dragInfo.from.y = fromY; dragInfo.piece = boards[currentMove][fromY][fromX]; dragInfo.start = dragInfo.from; SetCapture(hwndMain); } void DragPieceEnd(int x, int y) { ReleaseCapture(); dragInfo.start.x = dragInfo.start.y = -1; dragInfo.from = dragInfo.start; dragInfo.pos = dragInfo.lastpos = dragInfo.start; } void ChangeDragPiece(ChessSquare piece) { dragInfo.piece = piece; } /* Event handler for mouse messages */ VOID MouseEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int x, y, menuNr; POINT pt; static int recursive = 0; HMENU hmenu; BOOLEAN forceFullRepaint = IsFullRepaintPreferrable(); /* [AS] */ if (recursive) { if (message == WM_MBUTTONUP) { /* Hideous kludge to fool TrackPopupMenu into paying attention to the middle button: we simulate pressing the left button too! */ PostMessage(hwnd, WM_LBUTTONDOWN, wParam, lParam); PostMessage(hwnd, WM_LBUTTONUP, wParam, lParam); } return; } recursive++; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); x = EventToSquare(pt.x - boardRect.left, BOARD_WIDTH); y = EventToSquare(pt.y - boardRect.top, BOARD_HEIGHT); if (!flipView && y >= 0) { y = BOARD_HEIGHT - 1 - y; } if (flipView && x >= 0) { x = BOARD_WIDTH - 1 - x; } shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status controlKey = GetKeyState(VK_CONTROL) < 0; // [HGM] remember last shift status switch (message) { case WM_LBUTTONDOWN: if (PtInRect((LPRECT) &whiteRect, pt)) { ClockClick(flipClock); break; } else if (PtInRect((LPRECT) &blackRect, pt)) { ClockClick(!flipClock); break; } dragInfo.start.x = dragInfo.start.y = -1; dragInfo.from = dragInfo.start; if(fromX == -1 && frozen) { // not sure where this is for fromX = fromY = -1; DrawPosition(forceFullRepaint || FALSE, NULL); /* [AS] */ break; } LeftClick(Press, pt.x - boardRect.left, pt.y - boardRect.top); DrawPosition(TRUE, NULL); break; case WM_LBUTTONUP: LeftClick(Release, pt.x - boardRect.left, pt.y - boardRect.top); DrawPosition(TRUE, NULL); break; case WM_MOUSEMOVE: if(SeekGraphClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, 1)) break; if(PromoScroll(pt.x - boardRect.left, pt.y - boardRect.top)) break; MovePV(pt.x - boardRect.left, pt.y - boardRect.top, boardRect.bottom - boardRect.top); if ((appData.animateDragging || appData.highlightDragging) && (wParam & MK_LBUTTON) && dragInfo.from.x >= 0) { BOOL full_repaint = FALSE; if (appData.animateDragging) { dragInfo.pos = pt; } if (appData.highlightDragging) { SetHighlights(fromX, fromY, x, y); if( IsDrawArrowEnabled() && (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) ) { full_repaint = TRUE; } } DrawPosition( full_repaint, NULL); dragInfo.lastpos = dragInfo.pos; } break; case WM_MOUSEWHEEL: // [DM] { static int lastDir = 0; // [HGM] build in some hysteresis to avoid spurious events /* Mouse Wheel is being rolled forward * Play moves forward */ if((short)HIWORD(wParam) < 0 && currentMove < forwardMostMove) { if(lastDir == 1) ForwardEvent(); else lastDir = 1; } // [HGM] suppress first event in direction /* Mouse Wheel is being rolled backward * Play moves backward */ if((short)HIWORD(wParam) > 0 && currentMove > backwardMostMove) { if(lastDir == -1) BackwardEvent(); else lastDir = -1; } } break; case WM_MBUTTONUP: case WM_RBUTTONUP: ReleaseCapture(); RightClick(Release, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY); break; case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: ErrorPopDown(); ReleaseCapture(); fromX = fromY = -1; dragInfo.pos.x = dragInfo.pos.y = -1; dragInfo.start.x = dragInfo.start.y = -1; dragInfo.from = dragInfo.start; dragInfo.lastpos = dragInfo.pos; if (appData.highlightDragging) { ClearHighlights(); } if(y == -2) { /* [HGM] right mouse button in clock area edit-game mode ups clock */ if (PtInRect((LPRECT) &whiteRect, pt)) { if (GetKeyState(VK_SHIFT) < 0) AdjustClock(flipClock, 1); } else if (PtInRect((LPRECT) &blackRect, pt)) { if (GetKeyState(VK_SHIFT) < 0) AdjustClock(!flipClock, 1); } break; } DrawPosition(TRUE, NULL); menuNr = RightClick(Press, pt.x - boardRect.left, pt.y - boardRect.top, &fromX, &fromY); switch (menuNr) { case 0: if (message == WM_MBUTTONDOWN) { buttonCount = 3; /* even if system didn't think so */ if (wParam & MK_SHIFT) MenuPopup(hwnd, pt, LoadMenu(hInst, "BlackPieceMenu"), -1); else MenuPopup(hwnd, pt, LoadMenu(hInst, "WhitePieceMenu"), -1); } else { /* message == WM_RBUTTONDOWN */ /* Just have one menu, on the right button. Windows users don't think to try the middle one, and sometimes other software steals it, or it doesn't really exist. */ if(gameInfo.variant != VariantShogi) MenuPopup(hwnd, pt, LoadMenu(hInst, "PieceMenu"), -1); else MenuPopup(hwnd, pt, LoadMenu(hInst, "ShogiPieceMenu"), -1); } break; case 2: SetCapture(hwndMain); break; case 1: hmenu = LoadMenu(hInst, "DropPieceMenu"); SetupDropMenu(hmenu); MenuPopup(hwnd, pt, hmenu, -1); default: break; } break; } recursive--; } /* Preprocess messages for buttons in main window */ LRESULT CALLBACK ButtonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int id = GetWindowLongPtr(hwnd, GWLP_ID); int i, dir; for (i=0; i= 'A' && WhiteOnMove(currentMove) && PieceToChar(WhiteAngel) != '~') || (PieceToChar(BlackAngel) >= 'A' && !WhiteOnMove(currentMove) && PieceToChar(BlackAngel) != '~') ) ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hDlg, PB_Chancellor), ((PieceToChar(WhiteMarshall) >= 'A' && WhiteOnMove(currentMove) && PieceToChar(WhiteMarshall) != '~') || (PieceToChar(BlackMarshall) >= 'A' && !WhiteOnMove(currentMove) && PieceToChar(BlackMarshall) != '~') ) ? SW_SHOW : SW_HIDE); /* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */ ShowWindow(GetDlgItem(hDlg, PB_Rook), gameInfo.variant != VariantShogi ? SW_SHOW : SW_HIDE); ShowWindow(GetDlgItem(hDlg, PB_Bishop), gameInfo.variant != VariantShogi ? SW_SHOW : SW_HIDE); if(gameInfo.variant == VariantShogi) { SetDlgItemText(hDlg, PB_Queen, "YES"); SetDlgItemText(hDlg, PB_Knight, "NO"); SetWindowText(hDlg, "Promote?"); } ShowWindow(GetDlgItem(hDlg, IDC_Centaur), gameInfo.variant == VariantSuper ? SW_SHOW : SW_HIDE); return TRUE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hDlg, TRUE); /* Exit the dialog */ ClearHighlights(); DrawPosition(FALSE, NULL); return TRUE; case PB_King: promoChar = gameInfo.variant == VariantSuper ? PieceToChar(BlackSilver) : PieceToChar(BlackKing); break; case PB_Queen: promoChar = gameInfo.variant == VariantShogi ? '+' : ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen)); break; case PB_Rook: promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteRook : BlackRook)); if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackDragon); break; case PB_Bishop: promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteBishop : BlackBishop)); if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackAlfil); break; case PB_Chancellor: promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteMarshall : BlackMarshall)); break; case PB_Archbishop: promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteAngel : BlackAngel)); break; case PB_Knight: promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(WhiteOnMove(currentMove) ? WhiteKnight : BlackKnight); break; default: return FALSE; } if(promoChar == '.') return FALSE; // invalid piece chosen EndDialog(hDlg, TRUE); /* Exit the dialog */ UserMoveEvent(fromX, fromY, toX, toY, promoChar); fromX = fromY = -1; if (!appData.highlightLastMove) { ClearHighlights(); DrawPosition(FALSE, NULL); } return TRUE; } return FALSE; } /* Pop up promotion dialog */ VOID PromotionPopup(HWND hwnd) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)Promotion, hInst); DialogBox(hInst, MAKEINTRESOURCE(DLG_PromotionKing), hwnd, (DLGPROC)lpProc); FreeProcInstance(lpProc); } void PromotionPopUp() { DrawPosition(TRUE, NULL); PromotionPopup(hwndMain); } VOID LoadGameDialog(HWND hwnd, char* title) { UINT number = 0; FILE *f; char fileTitle[MSG_SIZ]; f = OpenFileDialog(hwnd, "rb", "", appData.oldSaveStyle ? "gam" : "pgn", GAME_FILT, title, &number, fileTitle, NULL); if (f != NULL) { cmailMsgLoaded = FALSE; if (number == 0) { int error = GameListBuild(f); if (error) { DisplayError(_("Cannot build game list"), error); } else if (!ListEmpty(&gameList) && ((ListGame *) gameList.tailPred)->number > 1) { GameListPopUp(f, fileTitle); return; } GameListDestroy(); number = 1; } LoadGame(f, number, fileTitle, FALSE); } } int get_term_width() { HDC hdc; TEXTMETRIC tm; RECT rc; HFONT hfont, hold_font; LOGFONT lf; HWND hText; if (hwndConsole) hText = GetDlgItem(hwndConsole, OPT_ConsoleText); else return 79; // get the text metrics hdc = GetDC(hText); lf = font[boardSize][CONSOLE_FONT]->lf; if (consoleCF.dwEffects & CFE_BOLD) lf.lfWeight = FW_BOLD; if (consoleCF.dwEffects & CFE_ITALIC) lf.lfItalic = TRUE; if (consoleCF.dwEffects & CFE_STRIKEOUT) lf.lfStrikeOut = TRUE; if (consoleCF.dwEffects & CFE_UNDERLINE) lf.lfUnderline = TRUE; hfont = CreateFontIndirect(&lf); hold_font = SelectObject(hdc, hfont); GetTextMetrics(hdc, &tm); SelectObject(hdc, hold_font); DeleteObject(hfont); ReleaseDC(hText, hdc); // get the rectangle SendMessage(hText, EM_GETRECT, 0, (LPARAM)&rc); return (rc.right-rc.left) / tm.tmAveCharWidth; } void UpdateICSWidth(HWND hText) { LONG old_width, new_width; new_width = get_term_width(hText, FALSE); old_width = GetWindowLongPtr(hText, GWLP_USERDATA); if (new_width != old_width) { ics_update_width(new_width); SetWindowLongPtr(hText, GWLP_USERDATA, new_width); } } VOID ChangedConsoleFont() { CHARFORMAT cfmt; CHARRANGE tmpsel, sel; MyFont *f = font[boardSize][CONSOLE_FONT]; HWND hText = GetDlgItem(hwndConsole, OPT_ConsoleText); HWND hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); PARAFORMAT paraf; cfmt.cbSize = sizeof(CHARFORMAT); cfmt.dwMask = CFM_FACE|CFM_SIZE|CFM_CHARSET; safeStrCpy(cfmt.szFaceName, font[boardSize][CONSOLE_FONT]->mfp.faceName, sizeof(cfmt.szFaceName)/sizeof(cfmt.szFaceName[0]) ); /* yHeight is expressed in twips. A twip is 1/20 of a font's point * size. This was undocumented in the version of MSVC++ that I had * when I wrote the code, but is apparently documented now. */ cfmt.yHeight = (int)(f->mfp.pointSize * 20.0 + 0.5); cfmt.bCharSet = f->lf.lfCharSet; cfmt.bPitchAndFamily = f->lf.lfPitchAndFamily; SendMessage(hText, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &cfmt); /* Why are the following seemingly needed too? */ SendMessage(hText, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); SendMessage(hInput, EM_SETCHARFORMAT, SCF_DEFAULT, (LPARAM) &cfmt); SendMessage(hText, EM_EXGETSEL, 0, (LPARAM)&sel); tmpsel.cpMin = 0; tmpsel.cpMax = -1; /*999999?*/ SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&tmpsel); SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cfmt); /* Trying putting this here too. It still seems to tickle a RichEdit * bug: sometimes RichEdit indents the first line of a paragraph too. */ paraf.cbSize = sizeof(paraf); paraf.dwMask = PFM_OFFSET | PFM_STARTINDENT; paraf.dxStartIndent = 0; paraf.dxOffset = WRAP_INDENT; SendMessage(hText, EM_SETPARAFORMAT, 0, (LPARAM) ¶f); SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); UpdateICSWidth(hText); } /*---------------------------------------------------------------------------*\ * * Window Proc for main window * \*---------------------------------------------------------------------------*/ /* Process messages for main window, etc. */ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { FARPROC lpProc; int wmId, wmEvent; char *defName; FILE *f; UINT number; char fileTitle[MSG_SIZ]; static SnapData sd; static int peek=0; switch (message) { case WM_PAINT: /* message: repaint portion of window */ PaintProc(hwnd); break; case WM_ERASEBKGND: if (IsIconic(hwnd)) { /* Cheat; change the message */ return (DefWindowProc(hwnd, WM_ICONERASEBKGND, wParam, lParam)); } else { return (DefWindowProc(hwnd, message, wParam, lParam)); } break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: case WM_MOUSEMOVE: case WM_MOUSEWHEEL: MouseEvent(hwnd, message, wParam, lParam); break; case WM_KEYUP: if((char)wParam == '\b') { ForwardEvent(); peek = 0; } JAWS_KBUP_NAVIGATION break; case WM_KEYDOWN: if((char)wParam == '\b') { if(!peek) BackwardEvent(), peek = 1; } JAWS_KBDOWN_NAVIGATION break; case WM_CHAR: JAWS_ALT_INTERCEPT if (appData.icsActive && ((char)wParam == '\r' || (char)wParam > ' ' && !((char)wParam >= '1' && (char)wParam <= '9'))) { // [HGM] movenum: for non-zero digits we always do type-in dialog HWND h = GetDlgItem(hwndConsole, OPT_ConsoleInput); if (IsIconic(hwndConsole)) ShowWindow(hwndConsole, SW_RESTORE); SetFocus(h); SendMessage(h, message, wParam, lParam); } else if(lParam != KF_REPEAT) { if (isalpha((char)wParam) || isdigit((char)wParam)) { TypeInEvent((char)wParam); } else if((char)wParam == 003) CopyGameToClipboard(); else if((char)wParam == 026) PasteGameOrFENFromClipboard(); } break; case WM_PALETTECHANGED: if (hwnd != (HWND)wParam && !appData.monoMode) { int nnew; HDC hdc = GetDC(hwndMain); SelectPalette(hdc, hPal, TRUE); nnew = RealizePalette(hdc); if (nnew > 0) { paletteChanged = TRUE; InvalidateRect(hwnd, &boardRect, FALSE); } ReleaseDC(hwnd, hdc); } break; case WM_QUERYNEWPALETTE: if (!appData.monoMode /*&& paletteChanged*/) { int nnew; HDC hdc = GetDC(hwndMain); paletteChanged = FALSE; SelectPalette(hdc, hPal, FALSE); nnew = RealizePalette(hdc); if (nnew > 0) { InvalidateRect(hwnd, &boardRect, FALSE); } ReleaseDC(hwnd, hdc); return TRUE; } return FALSE; case WM_COMMAND: /* message: command from application menu */ wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_NewGame: ResetGameEvent(); SAY("new game enter a move to play against the computer with white"); break; case IDM_NewGameFRC: if( NewGameFRC() == 0 ) { ResetGameEvent(); } break; case IDM_NewVariant: NewVariantPopup(hwnd); break; case IDM_LoadGame: LoadGameDialog(hwnd, _("Load Game from File")); break; case IDM_LoadNextGame: ReloadGame(1); break; case IDM_LoadPrevGame: ReloadGame(-1); break; case IDM_ReloadGame: ReloadGame(0); break; case IDM_LoadPosition: if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); } number = 1; f = OpenFileDialog(hwnd, "rb", "", appData.oldSaveStyle ? "pos" : "fen", POSITION_FILT, _("Load Position from File"), &number, fileTitle, NULL); if (f != NULL) { LoadPosition(f, number, fileTitle); } break; case IDM_LoadNextPosition: ReloadPosition(1); break; case IDM_LoadPrevPosition: ReloadPosition(-1); break; case IDM_ReloadPosition: ReloadPosition(0); break; case IDM_SaveGame: defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn"); f = OpenFileDialog(hwnd, "a", defName, appData.oldSaveStyle ? "gam" : "pgn", GAME_FILT, _("Save Game to File"), NULL, fileTitle, NULL); if (f != NULL) { SaveGame(f, 0, ""); } break; case IDM_SavePosition: defName = DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"); f = OpenFileDialog(hwnd, "a", defName, appData.oldSaveStyle ? "pos" : "fen", POSITION_FILT, _("Save Position to File"), NULL, fileTitle, NULL); if (f != NULL) { SavePosition(f, 0, ""); } break; case IDM_SaveDiagram: defName = "diagram"; f = OpenFileDialog(hwnd, "wb", defName, "bmp", DIAGRAM_FILT, _("Save Diagram to File"), NULL, fileTitle, NULL); if (f != NULL) { SaveDiagram(f); } break; case IDM_CreateBook: CreateBookEvent(); break; case IDM_CopyGame: CopyGameToClipboard(); break; case IDM_PasteGame: PasteGameFromClipboard(); break; case IDM_CopyGameListToClipboard: CopyGameListToClipboard(); break; /* [AS] Autodetect FEN or PGN data */ case IDM_PasteAny: PasteGameOrFENFromClipboard(); break; /* [AS] Move history */ case IDM_ShowMoveHistory: if( MoveHistoryIsUp() ) { MoveHistoryPopDown(); } else { MoveHistoryPopUp(); } break; /* [AS] Eval graph */ case IDM_ShowEvalGraph: if( EvalGraphIsUp() ) { EvalGraphPopDown(); } else { EvalGraphPopUp(); SetFocus(hwndMain); } break; /* [AS] Engine output */ case IDM_ShowEngineOutput: if( EngineOutputIsUp() ) { EngineOutputPopDown(); } else { EngineOutputPopUp(); } break; /* [AS] User adjudication */ case IDM_UserAdjudication_White: UserAdjudicationEvent( +1 ); break; case IDM_UserAdjudication_Black: UserAdjudicationEvent( -1 ); break; case IDM_UserAdjudication_Draw: UserAdjudicationEvent( 0 ); break; /* [AS] Game list options dialog */ case IDM_GameListOptions: GameListOptions(); break; case IDM_NewChat: ChatPopUp(NULL); break; case IDM_CopyPosition: CopyFENToClipboard(); break; case IDM_PastePosition: PasteFENFromClipboard(); break; case IDM_MailMove: MailMoveEvent(); break; case IDM_ReloadCMailMsg: Reset(TRUE, TRUE); ReloadCmailMsgEvent(FALSE); break; case IDM_Minimize: ShowWindow(hwnd, SW_MINIMIZE); break; case IDM_Exit: ExitEvent(0); break; case IDM_MachineWhite: MachineWhiteEvent(); /* * refresh the tags dialog only if it's visible */ if (gameMode == MachinePlaysWhite && IsWindowVisible(editTagsDialog)) { char *tags; tags = PGNTags(&gameInfo); TagsPopUp(tags, CmailMsg()); free(tags); } SAY("computer starts playing white"); break; case IDM_MachineBlack: MachineBlackEvent(); /* * refresh the tags dialog only if it's visible */ if (gameMode == MachinePlaysBlack && IsWindowVisible(editTagsDialog)) { char *tags; tags = PGNTags(&gameInfo); TagsPopUp(tags, CmailMsg()); free(tags); } SAY("computer starts playing black"); break; case IDM_Match: // [HGM] match: flows into next case, after setting Match Mode and nr of Games MatchEvent(2); // distinguish from command-line-triggered case (matchMode=1) break; case IDM_TwoMachines: TwoMachinesEvent(); /* * refresh the tags dialog only if it's visible */ if (gameMode == TwoMachinesPlay && IsWindowVisible(editTagsDialog)) { char *tags; tags = PGNTags(&gameInfo); TagsPopUp(tags, CmailMsg()); free(tags); } SAY("computer starts playing both sides"); break; case IDM_AnalysisMode: if(AnalyzeModeEvent()) { SAY("analyzing current position"); } break; case IDM_AnalyzeFile: AnalyzeFileEvent(); break; case IDM_IcsClient: IcsClientEvent(); break; case IDM_EditGame: case IDM_EditGame2: EditGameEvent(); SAY("edit game"); break; case IDM_EditPosition: case IDM_EditPosition2: EditPositionEvent(); SAY("enter a FEN string or setup a position on the board using the control R pop up menu"); break; case IDM_Training: TrainingEvent(); break; case IDM_ShowGameList: ShowGameListProc(); break; case IDM_EditProgs1: EditTagsPopUp(firstChessProgramNames, &firstChessProgramNames); break; case IDM_LoadProg1: LoadEnginePopUp(hwndMain, 0); break; case IDM_LoadProg2: LoadEnginePopUp(hwndMain, 1); break; case IDM_EditServers: EditTagsPopUp(icsNames, &icsNames); break; case IDM_EditTags: case IDM_Tags: EditTagsProc(); break; case IDM_EditBook: EditBookEvent(); break; case IDM_EditComment: case IDM_Comment: if (commentUp && editComment) { CommentPopDown(); } else { EditCommentEvent(); } break; case IDM_Pause: PauseEvent(); break; case IDM_Accept: AcceptEvent(); break; case IDM_Decline: DeclineEvent(); break; case IDM_Rematch: RematchEvent(); break; case IDM_CallFlag: CallFlagEvent(); break; case IDM_Draw: DrawEvent(); break; case IDM_Adjourn: AdjournEvent(); break; case IDM_Abort: AbortEvent(); break; case IDM_Resign: ResignEvent(); break; case IDM_StopObserving: StopObservingEvent(); break; case IDM_StopExamining: StopExaminingEvent(); break; case IDM_Upload: UploadGameEvent(); break; case IDM_TypeInMove: TypeInEvent('\000'); break; case IDM_TypeInName: PopUpNameDialog('\000'); break; case IDM_Backward: BackwardEvent(); SetFocus(hwndMain); break; JAWS_MENU_ITEMS case IDM_Forward: ForwardEvent(); SetFocus(hwndMain); break; case IDM_ToStart: ToStartEvent(); SetFocus(hwndMain); break; case IDM_ToEnd: ToEndEvent(); SetFocus(hwndMain); break; case OPT_GameListNext: // [HGM] forward these two accelerators to Game List case OPT_GameListPrev: if(gameListDialog) SendMessage(gameListDialog, WM_COMMAND, wmId, 0); break; case IDM_Revert: RevertEvent(FALSE); break; case IDM_Annotate: // [HGM] vari: revert with annotation RevertEvent(TRUE); break; case IDM_TruncateGame: TruncateGameEvent(); break; case IDM_MoveNow: MoveNowEvent(); break; case IDM_RetractMove: RetractMoveEvent(); break; case IDM_FlipView: flipView = !flipView; DrawPosition(FALSE, NULL); break; case IDM_FlipClock: flipClock = !flipClock; DisplayBothClocks(); DisplayLogos(); break; case IDM_MuteSounds: mute = !mute; // [HGM] mute: keep track of global muting variable CheckMenuItem(GetMenu(hwndMain),IDM_MuteSounds, MF_BYCOMMAND|(mute?MF_CHECKED:MF_UNCHECKED)); break; case IDM_GeneralOptions: GeneralOptionsPopup(hwnd); DrawPosition(TRUE, NULL); break; case IDM_BoardOptions: BoardOptionsPopup(hwnd); break; case IDM_ThemeOptions: ThemeOptionsPopup(hwnd); break; case IDM_EnginePlayOptions: EnginePlayOptionsPopup(hwnd); break; case IDM_Engine1Options: EngineOptionsPopup(hwnd, &first); break; case IDM_Engine2Options: savedHwnd = hwnd; if(WaitForEngine(&second, SettingsMenuIfReady)) break; EngineOptionsPopup(hwnd, &second); break; case IDM_OptionsUCI: UciOptionsPopup(hwnd); break; case IDM_Tourney: TourneyPopup(hwnd); break; case IDM_IcsOptions: IcsOptionsPopup(hwnd); break; case IDM_Fonts: FontsOptionsPopup(hwnd); break; case IDM_Sounds: SoundOptionsPopup(hwnd); break; case IDM_CommPort: CommPortOptionsPopup(hwnd); break; case IDM_LoadOptions: LoadOptionsPopup(hwnd); break; case IDM_SaveOptions: SaveOptionsPopup(hwnd); break; case IDM_TimeControl: TimeControlOptionsPopup(hwnd); break; case IDM_SaveSettings: SaveSettings(settingsFileName); break; case IDM_SaveSettingsOnExit: saveSettingsOnExit = !saveSettingsOnExit; (void) CheckMenuItem(GetMenu(hwndMain), IDM_SaveSettingsOnExit, MF_BYCOMMAND|(saveSettingsOnExit ? MF_CHECKED : MF_UNCHECKED)); break; case IDM_Hint: HintEvent(); break; case IDM_Book: BookEvent(); break; case IDM_AboutGame: AboutGameEvent(); break; case IDM_Debug: appData.debugMode = !appData.debugMode; if (appData.debugMode) { char dir[MSG_SIZ]; GetCurrentDirectory(MSG_SIZ, dir); SetCurrentDirectory(installDir); debugFP = fopen(appData.nameOfDebugFile, "w"); SetCurrentDirectory(dir); setbuf(debugFP, NULL); } else { fclose(debugFP); debugFP = NULL; } break; case IDM_HELPCONTENTS: if (!MyHelp (hwnd, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS") && !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { MessageBox (GetFocus(), _("Unable to activate help"), szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPSEARCH: if (!MyHelp (hwnd, "winboard.hlp", HELP_PARTIALKEY, (DWORD)(LPSTR)"") && !HtmlHelp(hwnd, "winboard.chm", 0, 0) ) { MessageBox (GetFocus(), _("Unable to activate help"), szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_HELPHELP: if(!WinHelp(hwnd, (LPSTR)NULL, HELP_HELPONHELP, 0)) { MessageBox (GetFocus(), _("Unable to activate help"), szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; case IDM_ABOUT: lpProc = MakeProcInstance((FARPROC)About, hInst); DialogBox(hInst, (gameInfo.event && strcmp(gameInfo.event, "Easter Egg Hunt") == 0) ? "AboutBox2" : "AboutBox", hwnd, (DLGPROC)lpProc); FreeProcInstance(lpProc); break; case IDM_DirectCommand1: AskQuestionEvent(_("Direct Command"), _("Send to chess program:"), "", "1"); break; case IDM_DirectCommand2: AskQuestionEvent(_("Direct Command"), _("Send to second chess program:"), "", "2"); break; case EP_WhitePawn: EditPositionMenuEvent(WhitePawn, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteKnight: EditPositionMenuEvent(WhiteKnight, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteBishop: EditPositionMenuEvent(WhiteBishop, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteRook: EditPositionMenuEvent(WhiteRook, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteQueen: EditPositionMenuEvent(WhiteQueen, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteFerz: EditPositionMenuEvent(WhiteFerz, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteWazir: EditPositionMenuEvent(WhiteWazir, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteAlfil: EditPositionMenuEvent(WhiteAlfil, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteCannon: EditPositionMenuEvent(WhiteCannon, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteCardinal: EditPositionMenuEvent(WhiteAngel, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteMarshall: EditPositionMenuEvent(WhiteMarshall, fromX, fromY); fromX = fromY = -1; break; case EP_WhiteKing: EditPositionMenuEvent(WhiteKing, fromX, fromY); fromX = fromY = -1; break; case EP_BlackPawn: EditPositionMenuEvent(BlackPawn, fromX, fromY); fromX = fromY = -1; break; case EP_BlackKnight: EditPositionMenuEvent(BlackKnight, fromX, fromY); fromX = fromY = -1; break; case EP_BlackBishop: EditPositionMenuEvent(BlackBishop, fromX, fromY); fromX = fromY = -1; break; case EP_BlackRook: EditPositionMenuEvent(BlackRook, fromX, fromY); fromX = fromY = -1; break; case EP_BlackQueen: EditPositionMenuEvent(BlackQueen, fromX, fromY); fromX = fromY = -1; break; case EP_BlackFerz: EditPositionMenuEvent(BlackFerz, fromX, fromY); fromX = fromY = -1; break; case EP_BlackWazir: EditPositionMenuEvent(BlackWazir, fromX, fromY); fromX = fromY = -1; break; case EP_BlackAlfil: EditPositionMenuEvent(BlackAlfil, fromX, fromY); fromX = fromY = -1; break; case EP_BlackCannon: EditPositionMenuEvent(BlackCannon, fromX, fromY); fromX = fromY = -1; break; case EP_BlackCardinal: EditPositionMenuEvent(BlackAngel, fromX, fromY); fromX = fromY = -1; break; case EP_BlackMarshall: EditPositionMenuEvent(BlackMarshall, fromX, fromY); fromX = fromY = -1; break; case EP_BlackKing: EditPositionMenuEvent(BlackKing, fromX, fromY); fromX = fromY = -1; break; case EP_EmptySquare: EditPositionMenuEvent(EmptySquare, fromX, fromY); fromX = fromY = -1; break; case EP_ClearBoard: EditPositionMenuEvent(ClearBoard, fromX, fromY); fromX = fromY = -1; break; case EP_White: EditPositionMenuEvent(WhitePlay, fromX, fromY); fromX = fromY = -1; break; case EP_Black: EditPositionMenuEvent(BlackPlay, fromX, fromY); fromX = fromY = -1; break; case EP_Promote: EditPositionMenuEvent(PromotePiece, fromX, fromY); fromX = fromY = -1; break; case EP_Demote: EditPositionMenuEvent(DemotePiece, fromX, fromY); fromX = fromY = -1; break; case DP_Pawn: DropMenuEvent(WhitePawn, fromX, fromY); fromX = fromY = -1; break; case DP_Knight: DropMenuEvent(WhiteKnight, fromX, fromY); fromX = fromY = -1; break; case DP_Bishop: DropMenuEvent(WhiteBishop, fromX, fromY); fromX = fromY = -1; break; case DP_Rook: DropMenuEvent(WhiteRook, fromX, fromY); fromX = fromY = -1; break; case DP_Queen: DropMenuEvent(WhiteQueen, fromX, fromY); fromX = fromY = -1; break; case IDM_English: barbaric = 0; appData.language = ""; TranslateMenus(0); CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(GetMenu(hwndMain), IDM_English, MF_BYCOMMAND|MF_CHECKED); lastChecked = wmId; break; default: if(wmId >= IDM_RecentEngines && wmId < IDM_RecentEngines + appData.recentEngines) RecentEngineEvent(wmId - IDM_RecentEngines); else if(wmId > IDM_English && wmId < IDM_English+20) { LoadLanguageFile(languageFile[wmId - IDM_English - 1]); TranslateMenus(0); CheckMenuItem(GetMenu(hwndMain), lastChecked, MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(GetMenu(hwndMain), wmId, MF_BYCOMMAND|MF_CHECKED); lastChecked = wmId; break; } return (DefWindowProc(hwnd, message, wParam, lParam)); } break; case WM_TIMER: switch (wParam) { case CLOCK_TIMER_ID: KillTimer(hwnd, clockTimerEvent); /* Simulate one-shot timer as in X */ clockTimerEvent = 0; DecrementClocks(); /* call into back end */ break; case LOAD_GAME_TIMER_ID: KillTimer(hwnd, loadGameTimerEvent); /* Simulate one-shot timer as in X*/ loadGameTimerEvent = 0; AutoPlayGameLoop(); /* call into back end */ break; case ANALYSIS_TIMER_ID: if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) && appData.periodicUpdates) { AnalysisPeriodicEvent(0); } else { KillTimer(hwnd, analysisTimerEvent); analysisTimerEvent = 0; } break; case DELAYED_TIMER_ID: KillTimer(hwnd, delayedTimerEvent); delayedTimerEvent = 0; delayedTimerCallback(); break; } break; case WM_USER_Input: InputEvent(hwnd, message, wParam, lParam); break; /* [AS] Also move "attached" child windows */ case WM_WINDOWPOSCHANGING: if( hwnd == hwndMain && appData.useStickyWindows ) { LPWINDOWPOS lpwp = (LPWINDOWPOS) lParam; if( ((lpwp->flags & SWP_NOMOVE) == 0) && ((lpwp->flags & SWP_NOSIZE) != 0) ) { /* Window is moving */ RECT rcMain; // GetWindowRect( hwnd, &rcMain ); //[HGM] sticky: in XP this returned new position, not old rcMain.left = wpMain.x; // replace by these 4 lines to reconstruct old rect rcMain.right = wpMain.x + wpMain.width; rcMain.top = wpMain.y; rcMain.bottom = wpMain.y + wpMain.height; ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, moveHistoryDialog, &wpMoveHistory ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, evalGraphDialog, &wpEvalGraph ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, engineOutputDialog, &wpEngineOutput ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, gameListDialog, &wpGameList ); ReattachAfterMove( &rcMain, lpwp->x, lpwp->y, hwndConsole, &wpConsole ); wpMain.x = lpwp->x; wpMain.y = lpwp->y; } } break; /* [AS] Snapping */ case WM_ENTERSIZEMOVE: if(appData.debugMode) { fprintf(debugFP, "size-move\n"); } if (hwnd == hwndMain) { doingSizing = TRUE; lastSizing = 0; } return OnEnterSizeMove( &sd, hwnd, wParam, lParam ); break; case WM_SIZING: if(appData.debugMode) { fprintf(debugFP, "sizing\n"); } if (hwnd == hwndMain) { lastSizing = wParam; } break; case WM_MOVING: if(appData.debugMode) { fprintf(debugFP, "moving\n"); } return OnMoving( &sd, hwnd, wParam, lParam ); case WM_EXITSIZEMOVE: if(appData.debugMode) { fprintf(debugFP, "exit size-move, size = %d\n", squareSize); } if (hwnd == hwndMain) { RECT client; doingSizing = FALSE; InvalidateRect(hwnd, &boardRect, FALSE); GetClientRect(hwnd, &client); ResizeBoard(client.right, client.bottom, lastSizing); lastSizing = 0; if(appData.debugMode) { fprintf(debugFP, "square size = %d\n", squareSize); } } return OnExitSizeMove( &sd, hwnd, wParam, lParam ); break; case WM_DESTROY: /* message: window being destroyed */ PostQuitMessage(0); break; case WM_CLOSE: if (hwnd == hwndMain) { ExitEvent(0); } break; default: /* Passes it on if unprocessed */ return (DefWindowProc(hwnd, message, wParam, lParam)); } return 0; } /*---------------------------------------------------------------------------*\ * * Misc utility routines * \*---------------------------------------------------------------------------*/ /* * Decent random number generator, at least not as bad as Windows * standard rand, which returns a value in the range 0 to 0x7fff. */ unsigned int randstate; int myrandom(void) { randstate = randstate * 1664525 + 1013904223; return (int) randstate & 0x7fffffff; } void mysrandom(unsigned int seed) { randstate = seed; } /* * returns TRUE if user selects a different color, FALSE otherwise */ BOOL ChangeColor(HWND hwnd, COLORREF *which) { static BOOL firstTime = TRUE; static DWORD customColors[16]; CHOOSECOLOR cc; COLORREF newcolor; int i; ColorClass ccl; if (firstTime) { /* Make initial colors in use available as custom colors */ /* Should we put the compiled-in defaults here instead? */ i = 0; customColors[i++] = lightSquareColor & 0xffffff; customColors[i++] = darkSquareColor & 0xffffff; customColors[i++] = whitePieceColor & 0xffffff; customColors[i++] = blackPieceColor & 0xffffff; customColors[i++] = highlightSquareColor & 0xffffff; customColors[i++] = premoveHighlightColor & 0xffffff; for (ccl = (ColorClass) 0; ccl < NColorClasses && i < 16; ccl++) { customColors[i++] = textAttribs[ccl].color; } while (i < 16) customColors[i++] = RGB(255, 255, 255); firstTime = FALSE; } cc.lStructSize = sizeof(cc); cc.hwndOwner = hwnd; cc.hInstance = NULL; cc.rgbResult = (DWORD) (*which & 0xffffff); cc.lpCustColors = (LPDWORD) customColors; cc.Flags = CC_RGBINIT|CC_FULLOPEN; if (!ChooseColor(&cc)) return FALSE; newcolor = (COLORREF) (0x2000000 | cc.rgbResult); if (newcolor == *which) return FALSE; *which = newcolor; return TRUE; /* InitDrawingColors(); InvalidateRect(hwnd, &boardRect, FALSE); */ } BOOLEAN MyLoadSound(MySound *ms) { BOOL ok = FALSE; struct stat st; FILE *f; if (ms->data && ms->flag) free(ms->data); ms->data = NULL; switch (ms->name[0]) { case NULLCHAR: /* Silence */ ok = TRUE; break; case '$': /* System sound from Control Panel. Don't preload here. */ ok = TRUE; break; case '!': if (ms->name[1] == NULLCHAR) { /* "!" alone = silence */ ok = TRUE; } else { /* Builtin wave resource. Error if not found. */ HANDLE h = FindResource(hInst, ms->name + 1, "WAVE"); if (h == NULL) break; ms->data = (void *)LoadResource(hInst, h); ms->flag = 0; // not maloced, so cannot be freed! if (h == NULL) break; ok = TRUE; } break; default: /* .wav file. Error if not found. */ f = fopen(ms->name, "rb"); if (f == NULL) break; if (fstat(fileno(f), &st) < 0) break; ms->data = malloc(st.st_size); ms->flag = 1; if (fread(ms->data, st.st_size, 1, f) < 1) break; fclose(f); ok = TRUE; break; } if (!ok) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, _("Error loading sound %s"), ms->name); DisplayError(buf, GetLastError()); } return ok; } BOOLEAN MyPlaySound(MySound *ms) { BOOLEAN ok = FALSE; if(mute) return TRUE; // [HGM] mute: suppress all sound play when muted switch (ms->name[0]) { case NULLCHAR: if(appData.debugMode) fprintf(debugFP, "silence\n"); /* Silence */ ok = TRUE; break; case '$': /* System sound from Control Panel (deprecated feature). "$" alone or an unset sound name gets default beep (still in use). */ if (ms->name[1]) { ok = PlaySound(ms->name + 1, NULL, SND_ALIAS|SND_ASYNC); } if (!ok) ok = MessageBeep(MB_OK); break; case '!': /* Builtin wave resource, or "!" alone for silence */ if (ms->name[1]) { if (ms->data == NULL) return FALSE; ok = PlaySound(ms->data, NULL, SND_MEMORY|SND_ASYNC); } else { ok = TRUE; } break; default: /* .wav file. Error if not found. */ if (ms->data == NULL) return FALSE; ok = PlaySound(ms->data, NULL, SND_MEMORY|SND_ASYNC); break; } /* Don't print an error: this can happen innocently if the sound driver is busy; for instance, if another instance of WinBoard is playing a sound at about the same time. */ return ok; } LRESULT CALLBACK OldOpenFileHook(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { BOOL ok; OPENFILENAME *ofn; static UINT *number; /* gross that this is static */ switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ ofn = (OPENFILENAME *) lParam; if (ofn->Flags & OFN_ENABLETEMPLATE) { number = (UINT *) ofn->lCustData; SendMessage(GetDlgItem(hDlg, edt2), WM_SETTEXT, 0, (LPARAM) ""); } else { number = NULL; } CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); Translate(hDlg, 1536); return FALSE; /* Allow for further processing */ case WM_COMMAND: if ((LOWORD(wParam) == IDOK) && (number != NULL)) { *number = GetDlgItemInt(hDlg, OPT_IndexNumberOld, &ok, FALSE); } return FALSE; /* Allow for further processing */ } return FALSE; } UINT APIENTRY OpenFileHook(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { static UINT *number; OPENFILENAME *ofname; OFNOTIFY *ofnot; switch (uiMsg) { case WM_INITDIALOG: Translate(hdlg, DLG_IndexNumber); ofname = (OPENFILENAME *)lParam; number = (UINT *)(ofname->lCustData); break; case WM_NOTIFY: ofnot = (OFNOTIFY *)lParam; if (ofnot->hdr.code == CDN_FILEOK) { *number = GetDlgItemInt(hdlg, OPT_IndexNumber, NULL, FALSE); } break; } return 0; } FILE * OpenFileDialog(HWND hwnd, char *write, char *defName, char *defExt, // [HGM] diag: type of 'write' now string char *nameFilt, char *dlgTitle, UINT *number, char fileTitle[MSG_SIZ], char fileName[MSG_SIZ]) { OPENFILENAME openFileName; char buf1[MSG_SIZ]; FILE *f; if (fileName == NULL) fileName = buf1; if (defName == NULL) { safeStrCpy(fileName, "*.", 3 ); strcat(fileName, defExt); } else { safeStrCpy(fileName, defName, MSG_SIZ ); } if (fileTitle) safeStrCpy(fileTitle, "", MSG_SIZ ); if (number) *number = 0; openFileName.lStructSize = sizeof(OPENFILENAME); openFileName.hwndOwner = hwnd; openFileName.hInstance = (HANDLE) hInst; openFileName.lpstrFilter = nameFilt; openFileName.lpstrCustomFilter = (LPSTR) NULL; openFileName.nMaxCustFilter = 0L; openFileName.nFilterIndex = 1L; openFileName.lpstrFile = fileName; openFileName.nMaxFile = MSG_SIZ; openFileName.lpstrFileTitle = fileTitle; openFileName.nMaxFileTitle = fileTitle ? MSG_SIZ : 0; openFileName.lpstrInitialDir = NULL; openFileName.lpstrTitle = dlgTitle; openFileName.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | (write[0] != 'r' ? 0 : OFN_FILEMUSTEXIST) | (number ? OFN_ENABLETEMPLATE | OFN_ENABLEHOOK: 0) | (oldDialog ? 0 : OFN_EXPLORER); openFileName.nFileOffset = 0; openFileName.nFileExtension = 0; openFileName.lpstrDefExt = defExt; openFileName.lCustData = (LONG) number; openFileName.lpfnHook = oldDialog ? (LPOFNHOOKPROC) OldOpenFileHook : (LPOFNHOOKPROC) OpenFileHook; openFileName.lpTemplateName = (LPSTR)(oldDialog ? 1536 : DLG_IndexNumber); if (write[0] != 'r' ? GetSaveFileName(&openFileName) : GetOpenFileName(&openFileName)) { /* open the file */ f = fopen(openFileName.lpstrFile, write); if (f == NULL) { MessageBox(hwnd, _("File open failed"), NULL, MB_OK|MB_ICONEXCLAMATION); return NULL; } } else { int err = CommDlgExtendedError(); if (err != 0) DisplayError(_("Internal error in file dialog box"), err); return FALSE; } return f; } VOID APIENTRY MenuPopup(HWND hwnd, POINT pt, HMENU hmenu, UINT def) { HMENU hmenuTrackPopup; /* floating pop-up menu */ /* * Get the first pop-up menu in the menu template. This is the * menu that TrackPopupMenu displays. */ hmenuTrackPopup = GetSubMenu(hmenu, 0); TranslateOneMenu(10, hmenuTrackPopup); SetMenuDefaultItem(hmenuTrackPopup, def, FALSE); /* * TrackPopup uses screen coordinates, so convert the * coordinates of the mouse click to screen coordinates. */ ClientToScreen(hwnd, (LPPOINT) &pt); /* Draw and track the floating pop-up menu. */ TrackPopupMenu(hmenuTrackPopup, TPM_CENTERALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL); /* Destroy the menu.*/ DestroyMenu(hmenu); } typedef struct { HWND hDlg, hText; int sizeX, sizeY, newSizeX, newSizeY; HDWP hdwp; } ResizeEditPlusButtonsClosure; BOOL CALLBACK ResizeEditPlusButtonsCallback(HWND hChild, LPARAM lparam) { ResizeEditPlusButtonsClosure *cl = (ResizeEditPlusButtonsClosure *)lparam; RECT rect; POINT pt; if (hChild == cl->hText) return TRUE; GetWindowRect(hChild, &rect); /* gives screen coords */ pt.x = rect.left + (cl->newSizeX - cl->sizeX)/2; pt.y = rect.top + cl->newSizeY - cl->sizeY; ScreenToClient(cl->hDlg, &pt); cl->hdwp = DeferWindowPos(cl->hdwp, hChild, NULL, pt.x, pt.y, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); return TRUE; } /* Resize a dialog that has a (rich) edit field filling most of the top, with a row of buttons below */ VOID ResizeEditPlusButtons(HWND hDlg, HWND hText, int sizeX, int sizeY, int newSizeX, int newSizeY) { RECT rectText; int newTextHeight, newTextWidth; ResizeEditPlusButtonsClosure cl; /*if (IsIconic(hDlg)) return;*/ if (newSizeX == sizeX && newSizeY == sizeY) return; cl.hdwp = BeginDeferWindowPos(8); GetWindowRect(hText, &rectText); /* gives screen coords */ newTextWidth = rectText.right - rectText.left + newSizeX - sizeX; newTextHeight = rectText.bottom - rectText.top + newSizeY - sizeY; if (newTextHeight < 0) { newSizeY += -newTextHeight; newTextHeight = 0; } cl.hdwp = DeferWindowPos(cl.hdwp, hText, NULL, 0, 0, newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE); cl.hDlg = hDlg; cl.hText = hText; cl.sizeX = sizeX; cl.sizeY = sizeY; cl.newSizeX = newSizeX; cl.newSizeY = newSizeY; EnumChildWindows(hDlg, ResizeEditPlusButtonsCallback, (LPARAM)&cl); EndDeferWindowPos(cl.hdwp); } BOOL CenterWindowEx(HWND hwndChild, HWND hwndParent, int mode) { RECT rChild, rParent; int wChild, hChild, wParent, hParent; int wScreen, hScreen, xNew, yNew; HDC hdc; /* Get the Height and Width of the child window */ GetWindowRect (hwndChild, &rChild); wChild = rChild.right - rChild.left; hChild = rChild.bottom - rChild.top; /* Get the Height and Width of the parent window */ GetWindowRect (hwndParent, &rParent); wParent = rParent.right - rParent.left; hParent = rParent.bottom - rParent.top; /* Get the display limits */ hdc = GetDC (hwndChild); wScreen = GetDeviceCaps (hdc, HORZRES); hScreen = GetDeviceCaps (hdc, VERTRES); ReleaseDC(hwndChild, hdc); /* Calculate new X position, then adjust for screen */ xNew = rParent.left + ((wParent - wChild) /2); if (xNew < 0) { xNew = 0; } else if ((xNew+wChild) > wScreen) { xNew = wScreen - wChild; } /* Calculate new Y position, then adjust for screen */ if( mode == 0 ) { yNew = rParent.top + ((hParent - hChild) /2); } else { yNew = rParent.top + GetSystemMetrics( SM_CYCAPTION ) * 2 / 3; } if (yNew < 0) { yNew = 0; } else if ((yNew+hChild) > hScreen) { yNew = hScreen - hChild; } /* Set it, and return */ return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } /* Center one window over another */ BOOL CenterWindow (HWND hwndChild, HWND hwndParent) { return CenterWindowEx( hwndChild, hwndParent, 0 ); } /*---------------------------------------------------------------------------*\ * * Startup Dialog functions * \*---------------------------------------------------------------------------*/ void InitComboStrings(HANDLE hwndCombo, char **cd) { SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); while (*cd != NULL) { SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) T_(*cd)); cd++; } } void InitComboStringsFromOption(HANDLE hwndCombo, char *str) { char buf1[MAX_ARG_LEN]; int len; if (str[0] == '@') { FILE* f = fopen(str + 1, "r"); if (f == NULL) { DisplayFatalError(str + 1, errno, 2); return; } len = fread(buf1, 1, sizeof(buf1)-1, f); fclose(f); buf1[len] = NULLCHAR; str = buf1; } SendMessage(hwndCombo, CB_RESETCONTENT, 0, 0); for (;;) { char buf[MSG_SIZ]; char *end = strchr(str, '\n'); if (end == NULL) return; memcpy(buf, str, end - str); buf[end - str] = NULLCHAR; SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) buf); str = end + 1; } } void SetStartupDialogEnables(HWND hDlg) { EnableWindow(GetDlgItem(hDlg, OPT_ChessEngineName), IsDlgButtonChecked(hDlg, OPT_ChessEngine) || (appData.zippyPlay && IsDlgButtonChecked(hDlg, OPT_ChessServer))); EnableWindow(GetDlgItem(hDlg, OPT_SecondChessEngineName), IsDlgButtonChecked(hDlg, OPT_ChessEngine)); EnableWindow(GetDlgItem(hDlg, OPT_ChessServerName), IsDlgButtonChecked(hDlg, OPT_ChessServer)); EnableWindow(GetDlgItem(hDlg, OPT_AdditionalOptions), IsDlgButtonChecked(hDlg, OPT_AnyAdditional)); EnableWindow(GetDlgItem(hDlg, IDOK), IsDlgButtonChecked(hDlg, OPT_ChessEngine) || IsDlgButtonChecked(hDlg, OPT_ChessServer) || IsDlgButtonChecked(hDlg, OPT_View)); } char * QuoteForFilename(char *filename) { int dquote, space; dquote = strchr(filename, '"') != NULL; space = strchr(filename, ' ') != NULL; if (dquote || space) { if (dquote) { return "'"; } else { return "\""; } } else { return ""; } } VOID InitEngineBox(HWND hDlg, HWND hwndCombo, char* nthcp, char* nthd, char* nthdir, char *nthnames) { char buf[MSG_SIZ]; char *q; InitComboStringsFromOption(hwndCombo, nthnames); q = QuoteForFilename(nthcp); snprintf(buf, MSG_SIZ, "%s%s%s", q, nthcp, q); if (*nthdir != NULLCHAR) { q = QuoteForFilename(nthdir); snprintf(buf + strlen(buf), MSG_SIZ, " /%s=%s%s%s", nthd, q, nthdir, q); } if (*nthcp == NULLCHAR) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0); } else if (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) buf) == CB_ERR) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); SendMessage(hwndCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) buf); } } LRESULT CALLBACK StartupDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; HANDLE hwndCombo; char *p; switch (message) { case WM_INITDIALOG: /* Center the dialog */ CenterWindow (hDlg, GetDesktopWindow()); Translate(hDlg, DLG_Startup); /* Initialize the dialog items */ InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_ChessEngineName), appData.firstChessProgram, "fd", appData.firstDirectory, firstChessProgramNames); InitEngineBox(hDlg, GetDlgItem(hDlg, OPT_SecondChessEngineName), appData.secondChessProgram, singleList ? "fd" : "sd", appData.secondDirectory, singleList ? firstChessProgramNames : secondChessProgramNames); //[HGM] single: use first list in second combo hwndCombo = GetDlgItem(hDlg, OPT_ChessServerName); InitComboStringsFromOption(hwndCombo, icsNames); snprintf(buf, MSG_SIZ, "%s /icsport=%s", appData.icsHost, appData.icsPort); if (*appData.icsHelper != NULLCHAR) { char *q = QuoteForFilename(appData.icsHelper); sprintf(buf + strlen(buf), " /icshelper=%s%s%s", q, appData.icsHelper, q); } if (*appData.icsHost == NULLCHAR) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) 0, (LPARAM) 0); /*SendMessage(hwndCombo, CB_SHOWDROPDOWN, (WPARAM) TRUE, (LPARAM) 0); !!too soon */ } else if (SendMessage(hwndCombo, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) buf) == CB_ERR) { SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM) -1, (LPARAM) 0); SendMessage(hwndCombo, WM_SETTEXT, (WPARAM) 0, (LPARAM) buf); } if (appData.icsActive) { CheckDlgButton(hDlg, OPT_ChessServer, BST_CHECKED); } else if (appData.noChessProgram) { CheckDlgButton(hDlg, OPT_View, BST_CHECKED); } else { CheckDlgButton(hDlg, OPT_ChessEngine, BST_CHECKED); } SetStartupDialogEnables(hDlg); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (IsDlgButtonChecked(hDlg, OPT_ChessEngine)) { safeStrCpy(buf, "/fcp=", sizeof(buf)/sizeof(buf[0]) ); GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; comboLine = strdup(p+5); // [HGM] recent: remember complete line of first combobox ParseArgs(StringGet, &p); safeStrCpy(buf, singleList ? "/fcp=" : "/scp=", sizeof(buf)/sizeof(buf[0]) ); GetDlgItemText(hDlg, OPT_SecondChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; SwapEngines(singleList); // temporarily swap first and second, to load a second 'first', ... ParseArgs(StringGet, &p); SwapEngines(singleList); // ... and then make it 'second' appData.noChessProgram = FALSE; appData.icsActive = FALSE; } else if (IsDlgButtonChecked(hDlg, OPT_ChessServer)) { safeStrCpy(buf, "/ics /icshost=", sizeof(buf)/sizeof(buf[0]) ); GetDlgItemText(hDlg, OPT_ChessServerName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; ParseArgs(StringGet, &p); if (appData.zippyPlay) { safeStrCpy(buf, "/fcp=", sizeof(buf)/sizeof(buf[0]) ); GetDlgItemText(hDlg, OPT_ChessEngineName, buf + strlen(buf), sizeof(buf) - strlen(buf)); p = buf; ParseArgs(StringGet, &p); } } else if (IsDlgButtonChecked(hDlg, OPT_View)) { appData.noChessProgram = TRUE; appData.icsActive = FALSE; } else { MessageBox(hDlg, _("Choose an option, or cancel to exit"), _("Option Error"), MB_OK|MB_ICONEXCLAMATION); return TRUE; } if (IsDlgButtonChecked(hDlg, OPT_AnyAdditional)) { GetDlgItemText(hDlg, OPT_AdditionalOptions, buf, sizeof(buf)); p = buf; ParseArgs(StringGet, &p); } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: ExitEvent(0); return TRUE; case IDM_HELPCONTENTS: if (!WinHelp (hDlg, "winboard.hlp", HELP_KEY,(DWORD)(LPSTR)"CONTENTS")) { MessageBox (GetFocus(), _("Unable to activate help"), szAppName, MB_SYSTEMMODAL|MB_OK|MB_ICONHAND); } break; default: SetStartupDialogEnables(hDlg); break; } break; } return FALSE; } /*---------------------------------------------------------------------------*\ * * About box dialog functions * \*---------------------------------------------------------------------------*/ /* Process messages for "About" dialog box */ LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Center the dialog over the application window */ CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); SetDlgItemText(hDlg, ABOUTBOX_Version, programVersion); Translate(hDlg, ABOUTBOX); JAWS_COPYRIGHT return (TRUE); case WM_COMMAND: /* message: received a command */ if (LOWORD(wParam) == IDOK /* "OK" box selected? */ || LOWORD(wParam) == IDCANCEL) { /* System menu close command? */ EndDialog(hDlg, TRUE); /* Exit the dialog */ return (TRUE); } break; } return (FALSE); } /*---------------------------------------------------------------------------*\ * * Comment Dialog functions * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK CommentDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HANDLE hwndText = NULL; int len, newSizeX, newSizeY, flags; static int sizeX, sizeY; char *str; RECT rect; MINMAXINFO *mmi; switch (message) { case WM_INITDIALOG: /* message: initialize dialog box */ /* Initialize the dialog items */ Translate(hDlg, DLG_EditComment); hwndText = GetDlgItem(hDlg, OPT_CommentText); SetDlgItemText(hDlg, OPT_CommentText, commentText); EnableWindow(GetDlgItem(hDlg, OPT_CancelComment), editComment); EnableWindow(GetDlgItem(hDlg, OPT_ClearComment), editComment); EnableWindow(GetDlgItem(hDlg, OPT_EditComment), !editComment); SendMessage(hwndText, EM_SETREADONLY, !editComment, 0); SetWindowText(hDlg, commentTitle); if (editComment) { SetFocus(hwndText); } else { SetFocus(GetDlgItem(hDlg, IDOK)); } SendMessage(GetDlgItem(hDlg, OPT_CommentText), WM_SETFONT, (WPARAM)font[boardSize][COMMENT_FONT]->hf, MAKELPARAM(FALSE, 0)); /* Size and position the dialog */ if (!commentDialog) { commentDialog = hDlg; flags = SWP_NOZORDER; GetClientRect(hDlg, &rect); sizeX = rect.right; sizeY = rect.bottom; if (wpComment.x != CW_USEDEFAULT && wpComment.y != CW_USEDEFAULT && wpComment.width != CW_USEDEFAULT && wpComment.height != CW_USEDEFAULT) { WINDOWPLACEMENT wp; EnsureOnScreen(&wpComment.x, &wpComment.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = SW_SHOW; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpComment.x; wp.rcNormalPosition.right = wpComment.x + wpComment.width; wp.rcNormalPosition.top = wpComment.y; wp.rcNormalPosition.bottom = wpComment.y + wpComment.height; SetWindowPlacement(hDlg, &wp); GetClientRect(hDlg, &rect); newSizeX = rect.right; newSizeY = rect.bottom; ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; } } SendDlgItemMessage( hDlg, OPT_CommentText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_KEYEVENTS ); return FALSE; case WM_COMMAND: /* message: received a command */ switch (LOWORD(wParam)) { case IDOK: if (editComment) { char *p, *q; /* Read changed options from the dialog box */ hwndText = GetDlgItem(hDlg, OPT_CommentText); len = GetWindowTextLength(hwndText); str = (char *) malloc(len + 1); GetWindowText(hwndText, str, len + 1); p = q = str; while (*q) { if (*q == '\r') q++; else *p++ = *q++; } *p = NULLCHAR; ReplaceComment(commentIndex, str); free(str); } CommentPopDown(); return TRUE; case IDCANCEL: case OPT_CancelComment: CommentPopDown(); return TRUE; case OPT_ClearComment: SetDlgItemText(hDlg, OPT_CommentText, ""); break; case OPT_EditComment: EditCommentEvent(); return TRUE; default: break; } break; case WM_NOTIFY: // [HGM] vari: cloned from whistory.c if( wParam == OPT_CommentText ) { MSGFILTER * lpMF = (MSGFILTER *) lParam; if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 || lpMF->msg == WM_CHAR && lpMF->wParam == '\022' ) { POINTL pt; LRESULT index; pt.x = LOWORD( lpMF->lParam ); pt.y = HIWORD( lpMF->lParam ); if(lpMF->msg == WM_CHAR) { CHARRANGE sel; SendDlgItemMessage( hDlg, OPT_CommentText, EM_EXGETSEL, 0, (LPARAM) &sel ); index = sel.cpMin; } else index = SendDlgItemMessage( hDlg, OPT_CommentText, EM_CHARFROMPOS, 0, (LPARAM) &pt ); hwndText = GetDlgItem(hDlg, OPT_CommentText); // cloned from above len = GetWindowTextLength(hwndText); str = (char *) malloc(len + 1); GetWindowText(hwndText, str, len + 1); ReplaceComment(commentIndex, str); if(commentIndex != currentMove) ToNrEvent(commentIndex); LoadVariation( index, str ); // [HGM] also does the actual moving to it, now free(str); /* Zap the message for good: apparently, returning non-zero is not enough */ lpMF->msg = WM_USER; return TRUE; } } break; case WM_SIZE: newSizeX = LOWORD(lParam); newSizeY = HIWORD(lParam); ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY); sizeX = newSizeX; sizeY = newSizeY; break; case WM_GETMINMAXINFO: /* Prevent resizing window too small */ mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; break; } return FALSE; } VOID EitherCommentPopUp(int index, char *title, char *str, BOOLEAN edit) { FARPROC lpProc; char *p, *q; CheckMenuItem(GetMenu(hwndMain), IDM_Comment, edit ? MF_CHECKED : MF_UNCHECKED); if (str == NULL) str = ""; p = (char *) malloc(2 * strlen(str) + 2); q = p; while (*str) { if (*str == '\n') *q++ = '\r'; *q++ = *str++; } *q = NULLCHAR; if (commentText != NULL) free(commentText); commentIndex = index; commentTitle = title; commentText = p; editComment = edit; if (commentDialog) { SendMessage(commentDialog, WM_INITDIALOG, 0, 0); if (!commentUp) ShowWindow(commentDialog, SW_SHOW); } else { lpProc = MakeProcInstance((FARPROC)CommentDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditComment), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } commentUp = TRUE; } /*---------------------------------------------------------------------------*\ * * Type-in move dialog functions * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK TypeInMoveDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char move[MSG_SIZ]; HWND hInput; switch (message) { case WM_INITDIALOG: move[0] = (char) lParam; move[1] = NULLCHAR; CenterWindowEx(hDlg, GetWindow(hDlg, GW_OWNER), 1 ); Translate(hDlg, DLG_TypeInMove); hInput = GetDlgItem(hDlg, OPT_Move); SetWindowText(hInput, move); SetFocus(hInput); SendMessage(hInput, EM_SETSEL, (WPARAM)9999, (LPARAM)9999); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status GetDlgItemText(hDlg, OPT_Move, move, sizeof(move)); TypeInDoneEvent(move); EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; } return FALSE; } VOID PopUpMoveDialog(char firstchar) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)TypeInMoveDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInMove), hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Type-in name dialog functions * \*---------------------------------------------------------------------------*/ LRESULT CALLBACK TypeInNameDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char move[MSG_SIZ]; HWND hInput; switch (message) { case WM_INITDIALOG: move[0] = (char) lParam; move[1] = NULLCHAR; CenterWindowEx(hDlg, GetWindow(hDlg, GW_OWNER), 1 ); Translate(hDlg, DLG_TypeInName); hInput = GetDlgItem(hDlg, OPT_Name); SetWindowText(hInput, move); SetFocus(hInput); SendMessage(hInput, EM_SETSEL, (WPARAM)9999, (LPARAM)9999); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: GetDlgItemText(hDlg, OPT_Name, move, sizeof(move)); appData.userName = strdup(move); SetUserLogo(); SetGameInfo(); if(gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack) { snprintf(move, MSG_SIZ, "%s vs. %s", gameInfo.white, gameInfo.black); DisplayTitle(move); } EndDialog(hDlg, TRUE); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; } return FALSE; } VOID PopUpNameDialog(char firstchar) { FARPROC lpProc; lpProc = MakeProcInstance((FARPROC)TypeInNameDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_TypeInName), hwndMain, (DLGPROC)lpProc, (LPARAM)firstchar); FreeProcInstance(lpProc); } /*---------------------------------------------------------------------------*\ * * Error dialogs * \*---------------------------------------------------------------------------*/ /* Nonmodal error box */ LRESULT CALLBACK ErrorDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); VOID ErrorPopUp(char *title, char *content) { FARPROC lpProc; char *p, *q; BOOLEAN modal = hwndMain == NULL; p = content; q = errorMessage; while (*p) { if (*p == '\n') { if (modal) { *q++ = ' '; p++; } else { *q++ = '\r'; *q++ = *p++; } } else { *q++ = *p++; } } *q = NULLCHAR; strncpy(errorTitle, title, sizeof(errorTitle)); errorTitle[sizeof(errorTitle) - 1] = '\0'; if (modal) { MessageBox(NULL, errorMessage, errorTitle, MB_OK|MB_ICONEXCLAMATION); } else { lpProc = MakeProcInstance((FARPROC)ErrorDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } } VOID ErrorPopDown() { if (!appData.popupMoveErrors && moveErrorMessageUp) DisplayMessage("", ""); if (errorDialog == NULL) return; DestroyWindow(errorDialog); errorDialog = NULL; if(errorExitStatus) ExitEvent(errorExitStatus); } LRESULT CALLBACK ErrorDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE hwndText; RECT rChild; switch (message) { case WM_INITDIALOG: GetWindowRect(hDlg, &rChild); /* SetWindowPos(hDlg, NULL, rChild.left, rChild.top + boardRect.top - (rChild.bottom - rChild.top), 0, 0, SWP_NOZORDER|SWP_NOSIZE); */ /* [AS] It seems that the above code wants to move the dialog up in the "caption area" of the main window, but it uses the dialog height as an hard-coded constant, and it doesn't work when you resize the dialog. For now, just give it a default position. */ SetWindowPos(hDlg, NULL, boardRect.left+8, boardRect.top+8, 0, 0, SWP_NOZORDER|SWP_NOSIZE); Translate(hDlg, DLG_Error); errorDialog = hDlg; SetWindowText(hDlg, errorTitle); hwndText = GetDlgItem(hDlg, OPT_ErrorText); SetDlgItemText(hDlg, OPT_ErrorText, errorMessage); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: if (errorDialog == hDlg) errorDialog = NULL; DestroyWindow(hDlg); return TRUE; default: break; } break; } return FALSE; } #ifdef GOTHIC HWND gothicDialog = NULL; LRESULT CALLBACK GothicDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HANDLE hwndText; RECT rChild; int height = GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYFRAME); switch (message) { case WM_INITDIALOG: GetWindowRect(hDlg, &rChild); SetWindowPos(hDlg, NULL, wpMain.x, wpMain.y-height, wpMain.width, height, SWP_NOZORDER); /* [AS] It seems that the above code wants to move the dialog up in the "caption area" of the main window, but it uses the dialog height as an hard-coded constant, and it doesn't work when you resize the dialog. For now, just give it a default position. */ gothicDialog = hDlg; SetWindowText(hDlg, errorTitle); hwndText = GetDlgItem(hDlg, OPT_ErrorText); SetDlgItemText(hDlg, OPT_ErrorText, errorMessage); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: if (errorDialog == hDlg) errorDialog = NULL; DestroyWindow(hDlg); return TRUE; default: break; } break; } return FALSE; } VOID GothicPopUp(char *title, VariantClass variant) { FARPROC lpProc; static char *lastTitle; strncpy(errorTitle, title, sizeof(errorTitle)); errorTitle[sizeof(errorTitle) - 1] = '\0'; if(lastTitle != title && gothicDialog != NULL) { DestroyWindow(gothicDialog); gothicDialog = NULL; } if(variant != VariantNormal && gothicDialog == NULL) { title = lastTitle; lpProc = MakeProcInstance((FARPROC)GothicDialog, hInst); CreateDialog(hInst, MAKEINTRESOURCE(DLG_Error), hwndMain, (DLGPROC)lpProc); FreeProcInstance(lpProc); } } #endif /*---------------------------------------------------------------------------*\ * * Ics Interaction console functions * \*---------------------------------------------------------------------------*/ #define HISTORY_SIZE 64 static char *history[HISTORY_SIZE]; int histIn = 0, histP = 0; VOID SaveInHistory(char *cmd) { if (history[histIn] != NULL) { free(history[histIn]); history[histIn] = NULL; } if (*cmd == NULLCHAR) return; history[histIn] = StrSave(cmd); histIn = (histIn + 1) % HISTORY_SIZE; if (history[histIn] != NULL) { free(history[histIn]); history[histIn] = NULL; } histP = histIn; } char * PrevInHistory(char *cmd) { int newhp; if (histP == histIn) { if (history[histIn] != NULL) free(history[histIn]); history[histIn] = StrSave(cmd); } newhp = (histP - 1 + HISTORY_SIZE) % HISTORY_SIZE; if (newhp == histIn || history[newhp] == NULL) return NULL; histP = newhp; return history[histP]; } char * NextInHistory() { if (histP == histIn) return NULL; histP = (histP + 1) % HISTORY_SIZE; return history[histP]; } HMENU LoadIcsTextMenu(IcsTextMenuEntry *e) { HMENU hmenu, h; int i = 0; hmenu = LoadMenu(hInst, "TextMenu"); h = GetSubMenu(hmenu, 0); while (e->item) { if (strcmp(e->item, "-") == 0) { AppendMenu(h, MF_SEPARATOR, 0, 0); } else { // [HGM] re-written a bit to use only one AppendMenu call for both cases (| or no |) int flags = MF_STRING, j = 0; if (e->item[0] == '|') { flags |= MF_MENUBARBREAK; j++; } if(!strcmp(e->command, "none")) flags |= MF_GRAYED; // [HGM] chatclick: provide inactive dummy AppendMenu(h, flags, IDM_CommandX + i, e->item + j); } e++; i++; } return hmenu; } WNDPROC consoleTextWindowProc; void CommandX(HWND hwnd, char *command, BOOLEAN getname, BOOLEAN immediate) { char buf[MSG_SIZ], name[MSG_SIZ]; HWND hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); CHARRANGE sel; if (!getname) { SetWindowText(hInput, command); if (immediate) { SendMessage(hInput, WM_CHAR, '\r', 0); } else { sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hInput, EM_EXSETSEL, 0, (LPARAM)&sel); SetFocus(hInput); } return; } SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { /* Expand to surrounding word */ TEXTRANGE tr; do { tr.chrg.cpMax = sel.cpMin; tr.chrg.cpMin = --sel.cpMin; if (sel.cpMin < 0) break; tr.lpstrText = name; SendMessage(hwnd, EM_GETTEXTRANGE, 0, (LPARAM) &tr); } while (isalpha(name[0]) || isdigit(name[0]) || name[0] == '-'); sel.cpMin++; do { tr.chrg.cpMin = sel.cpMax; tr.chrg.cpMax = ++sel.cpMax; tr.lpstrText = name; if (SendMessage(hwnd, EM_GETTEXTRANGE, 0, (LPARAM) &tr) < 1) break; } while (isalpha(name[0]) || isdigit(name[0]) || name[0] == '-'); sel.cpMax--; if (sel.cpMax == sel.cpMin || sel.cpMax - sel.cpMin > MSG_SIZ/2) { MessageBeep(MB_ICONEXCLAMATION); return; } tr.chrg = sel; tr.lpstrText = name; SendMessage(hwnd, EM_GETTEXTRANGE, 0, (LPARAM) &tr); } else { if (sel.cpMax - sel.cpMin > MSG_SIZ/2) { MessageBeep(MB_ICONEXCLAMATION); return; } SendMessage(hwnd, EM_GETSELTEXT, 0, (LPARAM) name); } if (immediate) { if(strstr(command, "%s")) snprintf(buf, MSG_SIZ, command, name); else snprintf(buf, MSG_SIZ, "%s %s", command, name); SetWindowText(hInput, buf); SendMessage(hInput, WM_CHAR, '\r', 0); } else { if(!strcmp(command, "chat")) { ChatPopUp(name); return; } snprintf(buf, MSG_SIZ, "%s %s ", command, name); /* trailing space */ SetWindowText(hInput, buf); sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hInput, EM_EXSETSEL, 0, (LPARAM)&sel); SetFocus(hInput); } } LRESULT CALLBACK ConsoleTextSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hInput; CHARRANGE sel; switch (message) { case WM_KEYDOWN: if (!(GetKeyState(VK_CONTROL) & ~1)) break; if(wParam=='R') return 0; switch (wParam) { case VK_PRIOR: SendMessage(hwnd, EM_LINESCROLL, 0, -999999); return 0; case VK_NEXT: sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); SendMessage(hwnd, EM_SCROLLCARET, 0, 0); return 0; } break; case WM_CHAR: if(wParam != '\022') { if (wParam == '\t') { if (GetKeyState(VK_SHIFT) < 0) { /* shifted */ if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); if (buttonDesc[0].hwnd) { SetFocus(buttonDesc[0].hwnd); } else { SetFocus(hwndMain); } } else { /* unshifted */ SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleInput)); } } else { hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); JAWS_DELETE( SetFocus(hInput); ) SendMessage(hInput, message, wParam, lParam); } return 0; } // [HGM] navigate: for Ctrl+R, flow into next case (moved up here) to summon up menu lParam = -1; case WM_RBUTTONDOWN: if (!(GetKeyState(VK_SHIFT) & ~1)) { /* Move selection here if it was empty */ POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { if(lParam != -1) sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/ sel.cpMax = sel.cpMin; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); } SendMessage(hwnd, EM_HIDESELECTION, FALSE, FALSE); { // [HGM] chatclick: code moved here from WM_RBUTTONUP case, to have menu appear on down-click POINT pt; HMENU hmenu = LoadIcsTextMenu(icsTextMenuEntry); SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { EnableMenuItem(hmenu, IDM_Copy, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenu, IDM_QuickPaste, MF_BYCOMMAND|MF_GRAYED); } if (!IsClipboardFormatAvailable(CF_TEXT)) { EnableMenuItem(hmenu, IDM_Paste, MF_BYCOMMAND|MF_GRAYED); } pt.x = LOWORD(lParam)-30; // [HGM] chatclick: make menu pop up with pointer above upper-right item pt.y = HIWORD(lParam)-10; // make it appear as if mouse moved there, so it will be selected on up-click PostMessage(hwnd, WM_MOUSEMOVE, wParam, lParam+5); MenuPopup(hwnd, pt, hmenu, -1); } } return 0; case WM_RBUTTONUP: if (GetKeyState(VK_SHIFT) & ~1) { SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); } return 0; case WM_PASTE: hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); SetFocus(hInput); return SendMessage(hInput, message, wParam, lParam); case WM_MBUTTONDOWN: return SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_QuickPaste: { SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { MessageBeep(MB_ICONEXCLAMATION); return 0; } SendMessage(hwnd, WM_COPY, 0, 0); hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); SendMessage(hInput, WM_PASTE, 0, 0); SetFocus(hInput); return 0; } case IDM_Cut: SendMessage(hwnd, WM_CUT, 0, 0); return 0; case IDM_Paste: SendMessage(hwnd, WM_PASTE, 0, 0); return 0; case IDM_Copy: SendMessage(hwnd, WM_COPY, 0, 0); return 0; default: { int i = LOWORD(wParam) - IDM_CommandX; if (i >= 0 && i < ICS_TEXT_MENU_SIZE && icsTextMenuEntry[i].command != NULL) { CommandX(hwnd, icsTextMenuEntry[i].command, icsTextMenuEntry[i].getname, icsTextMenuEntry[i].immediate); return 0; } } break; } break; } return (*consoleTextWindowProc)(hwnd, message, wParam, lParam); } WNDPROC consoleInputWindowProc; LRESULT CALLBACK ConsoleInputSubclass(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char buf[MSG_SIZ]; char *p; static BOOL sendNextChar = FALSE; static BOOL quoteNextChar = FALSE; InputSource *is = consoleInputSource; CHARFORMAT cf; CHARRANGE sel; switch (message) { case WM_CHAR: if (!appData.localLineEditing || sendNextChar) { is->buf[0] = (CHAR) wParam; is->count = 1; SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); sendNextChar = FALSE; return 0; } if (quoteNextChar) { buf[0] = (char) wParam; buf[1] = NULLCHAR; SendMessage(hwnd, EM_REPLACESEL, TRUE, (LPARAM) buf); quoteNextChar = FALSE; return 0; } switch (wParam) { case '\r': /* Enter key */ is->count = GetWindowText(hwnd, is->buf, INPUT_SOURCE_BUF_SIZE-1); if (consoleEcho) SaveInHistory(is->buf); is->buf[is->count++] = '\n'; is->buf[is->count] = NULLCHAR; SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); if (consoleEcho) { ConsoleOutput(is->buf, is->count, TRUE); } else if (appData.localLineEditing) { ConsoleOutput("\n", 1, TRUE); } /* fall thru */ case '\033': /* Escape key */ SetWindowText(hwnd, ""); cf.cbSize = sizeof(CHARFORMAT); cf.dwMask = CFM_COLOR|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT; if (consoleEcho) { cf.crTextColor = textAttribs[ColorNormal].color; } else { cf.crTextColor = COLOR_ECHOOFF; } cf.dwEffects = textAttribs[ColorNormal].effects; SendMessage(hwnd, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); return 0; case '\t': /* Tab key */ if (GetKeyState(VK_SHIFT) < 0) { /* shifted */ SetFocus(GetDlgItem(hwndConsole, OPT_ConsoleText)); } else { /* unshifted */ if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); if (buttonDesc[0].hwnd) { SetFocus(buttonDesc[0].hwnd); } else { SetFocus(hwndMain); } } return 0; case '\023': /* Ctrl+S */ sendNextChar = TRUE; return 0; case '\021': /* Ctrl+Q */ quoteNextChar = TRUE; return 0; JAWS_REPLAY default: break; } break; case WM_KEYDOWN: switch (wParam) { case VK_UP: GetWindowText(hwnd, buf, MSG_SIZ); p = PrevInHistory(buf); if (p != NULL) { SetWindowText(hwnd, p); sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; case VK_DOWN: p = NextInHistory(); if (p != NULL) { SetWindowText(hwnd, p); sel.cpMin = 999999; sel.cpMax = 999999; SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; } break; case VK_HOME: case VK_END: if (!(GetKeyState(VK_CONTROL) & ~1)) break; /* fall thru */ case VK_PRIOR: case VK_NEXT: SendDlgItemMessage(hwndConsole, OPT_ConsoleText, message, wParam, lParam); return 0; } break; case WM_MBUTTONDOWN: SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); break; case WM_RBUTTONUP: if (GetKeyState(VK_SHIFT) & ~1) { SendDlgItemMessage(hwndConsole, OPT_ConsoleText, WM_COMMAND, MAKEWPARAM(IDM_QuickPaste, 0), 0); } else { POINT pt; HMENU hmenu; hmenu = LoadMenu(hInst, "InputMenu"); SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel); if (sel.cpMin == sel.cpMax) { EnableMenuItem(hmenu, IDM_Copy, MF_BYCOMMAND|MF_GRAYED); EnableMenuItem(hmenu, IDM_Cut, MF_BYCOMMAND|MF_GRAYED); } if (!IsClipboardFormatAvailable(CF_TEXT)) { EnableMenuItem(hmenu, IDM_Paste, MF_BYCOMMAND|MF_GRAYED); } pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); MenuPopup(hwnd, pt, hmenu, -1); } return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_Undo: SendMessage(hwnd, EM_UNDO, 0, 0); return 0; case IDM_SelectAll: sel.cpMin = 0; sel.cpMax = -1; /*999999?*/ SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel); return 0; case IDM_Cut: SendMessage(hwnd, WM_CUT, 0, 0); return 0; case IDM_Paste: SendMessage(hwnd, WM_PASTE, 0, 0); return 0; case IDM_Copy: SendMessage(hwnd, WM_COPY, 0, 0); return 0; } break; } return (*consoleInputWindowProc)(hwnd, message, wParam, lParam); } #define CO_MAX 100000 #define CO_TRIM 1000 LRESULT CALLBACK ConsoleWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static SnapData sd; HWND hText, hInput; RECT rect; static int sizeX, sizeY; int newSizeX, newSizeY; MINMAXINFO *mmi; WORD wMask; hText = GetDlgItem(hDlg, OPT_ConsoleText); hInput = GetDlgItem(hDlg, OPT_ConsoleInput); switch (message) { case WM_NOTIFY: if (((NMHDR*)lParam)->code == EN_LINK) { ENLINK *pLink = (ENLINK*)lParam; if (pLink->msg == WM_LBUTTONUP) { TEXTRANGE tr; tr.chrg = pLink->chrg; tr.lpstrText = malloc(1+tr.chrg.cpMax-tr.chrg.cpMin); SendMessage(hText, EM_GETTEXTRANGE, 0, (LPARAM)&tr); ShellExecute(NULL, "open", tr.lpstrText, NULL, NULL, SW_SHOW); free(tr.lpstrText); } } break; case WM_INITDIALOG: /* message: initialize dialog box */ hwndConsole = hDlg; SetFocus(hInput); consoleTextWindowProc = (WNDPROC) SetWindowLongPtr(hText, GWLP_WNDPROC, (LONG_PTR) ConsoleTextSubclass); SendMessage(hText, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor); consoleInputWindowProc = (WNDPROC) SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR) ConsoleInputSubclass); SendMessage(hInput, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor); Colorize(ColorNormal, TRUE); SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &consoleCF); ChangedConsoleFont(); GetClientRect(hDlg, &rect); sizeX = rect.right; sizeY = rect.bottom; if (wpConsole.x != CW_USEDEFAULT && wpConsole.y != CW_USEDEFAULT && wpConsole.width != CW_USEDEFAULT && wpConsole.height != CW_USEDEFAULT) { WINDOWPLACEMENT wp; EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = SW_SHOW; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpConsole.x; wp.rcNormalPosition.right = wpConsole.x + wpConsole.width; wp.rcNormalPosition.top = wpConsole.y; wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height; SetWindowPlacement(hDlg, &wp); } // [HGM] Chessknight's change 2004-07-13 else { /* Determine Defaults */ WINDOWPLACEMENT wp; wpConsole.x = wpMain.width + 1; wpConsole.y = wpMain.y; wpConsole.width = screenWidth - wpMain.width; wpConsole.height = wpMain.height; EnsureOnScreen(&wpConsole.x, &wpConsole.y, 0, 0); wp.length = sizeof(WINDOWPLACEMENT); wp.flags = 0; wp.showCmd = SW_SHOW; wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0; wp.rcNormalPosition.left = wpConsole.x; wp.rcNormalPosition.right = wpConsole.x + wpConsole.width; wp.rcNormalPosition.top = wpConsole.y; wp.rcNormalPosition.bottom = wpConsole.y + wpConsole.height; SetWindowPlacement(hDlg, &wp); } // Allow hText to highlight URLs and send notifications on them wMask = (WORD) SendMessage(hText, EM_GETEVENTMASK, 0, 0L); SendMessage(hText, EM_SETEVENTMASK, 0, wMask | ENM_LINK); SendMessage(hText, EM_AUTOURLDETECT, TRUE, 0L); SetWindowLongPtr(hText, GWLP_USERDATA, 79); // initialize the text window's width return FALSE; case WM_SETFOCUS: SetFocus(hInput); return 0; case WM_CLOSE: ExitEvent(0); /* not reached */ break; case WM_SIZE: if (IsIconic(hDlg)) break; newSizeX = LOWORD(lParam); newSizeY = HIWORD(lParam); if (sizeX != newSizeX || sizeY != newSizeY) { RECT rectText, rectInput; POINT pt; int newTextHeight, newTextWidth; GetWindowRect(hText, &rectText); newTextWidth = rectText.right - rectText.left + newSizeX - sizeX; newTextHeight = rectText.bottom - rectText.top + newSizeY - sizeY; if (newTextHeight < 0) { newSizeY += -newTextHeight; newTextHeight = 0; } SetWindowPos(hText, NULL, 0, 0, newTextWidth, newTextHeight, SWP_NOZORDER|SWP_NOMOVE); GetWindowRect(hInput, &rectInput); /* gives screen coords */ pt.x = rectInput.left; pt.y = rectInput.top + newSizeY - sizeY; ScreenToClient(hDlg, &pt); SetWindowPos(hInput, NULL, pt.x, pt.y, /* needs client coords */ rectInput.right - rectInput.left + newSizeX - sizeX, rectInput.bottom - rectInput.top, SWP_NOZORDER); } sizeX = newSizeX; sizeY = newSizeY; break; case WM_GETMINMAXINFO: /* Prevent resizing window too small */ mmi = (MINMAXINFO *) lParam; mmi->ptMinTrackSize.x = 100; mmi->ptMinTrackSize.y = 100; break; /* [AS] Snapping */ case WM_ENTERSIZEMOVE: return OnEnterSizeMove( &sd, hDlg, wParam, lParam ); case WM_SIZING: return OnSizing( &sd, hDlg, wParam, lParam ); case WM_MOVING: return OnMoving( &sd, hDlg, wParam, lParam ); case WM_EXITSIZEMOVE: UpdateICSWidth(hText); return OnExitSizeMove( &sd, hDlg, wParam, lParam ); } return DefWindowProc(hDlg, message, wParam, lParam); } VOID ConsoleCreate() { HWND hCons; if (hwndConsole) return; hCons = CreateDialog(hInst, szConsoleName, 0, NULL); SendMessage(hCons, WM_INITDIALOG, 0, 0); } VOID ConsoleOutput(char* data, int length, int forceVisible) { HWND hText; int trim, exlen; char *p, *q; char buf[CO_MAX+1]; POINT pEnd; RECT rect; static int delayLF = 0; CHARRANGE savesel, sel; if (hwndConsole == NULL || length > CO_MAX-100 || length == 0) return; p = data; q = buf; if (delayLF) { *q++ = '\r'; *q++ = '\n'; delayLF = 0; } while (length--) { if (*p == '\n') { if (*++p) { *q++ = '\r'; *q++ = '\n'; } else { delayLF = 1; } } else if (*p == '\007') { MyPlaySound(&sounds[(int)SoundBell]); p++; } else { *q++ = *p++; } } *q = NULLCHAR; hText = GetDlgItem(hwndConsole, OPT_ConsoleText); SendMessage(hText, EM_HIDESELECTION, TRUE, FALSE); /* Save current selection */ SendMessage(hText, EM_EXGETSEL, 0, (LPARAM)&savesel); exlen = GetWindowTextLength(hText); /* Find out whether current end of text is visible */ SendMessage(hText, EM_GETRECT, 0, (LPARAM) &rect); SendMessage(hText, EM_POSFROMCHAR, (WPARAM) &pEnd, exlen); /* Trim existing text if it's too long */ if (exlen + (q - buf) > CO_MAX) { trim = (CO_TRIM > (q - buf)) ? CO_TRIM : (q - buf); sel.cpMin = 0; sel.cpMax = trim; SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); SendMessage(hText, EM_REPLACESEL, 0, (LPARAM)""); exlen -= trim; savesel.cpMin -= trim; savesel.cpMax -= trim; if (exlen < 0) exlen = 0; if (savesel.cpMin < 0) savesel.cpMin = 0; if (savesel.cpMax < savesel.cpMin) savesel.cpMax = savesel.cpMin; } /* Append the new text */ sel.cpMin = exlen; sel.cpMax = exlen; SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); SendMessage(hText, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&consoleCF); SendMessage(hText, EM_REPLACESEL, 0, (LPARAM) buf); if (forceVisible || exlen == 0 || (rect.left <= pEnd.x && pEnd.x < rect.right && rect.top <= pEnd.y && pEnd.y < rect.bottom)) { /* Scroll to make new end of text visible if old end of text was visible or new text is an echo of user typein */ sel.cpMin = 9999999; sel.cpMax = 9999999; SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); SendMessage(hText, EM_HIDESELECTION, FALSE, FALSE); SendMessage(hText, EM_SCROLLCARET, 0, 0); SendMessage(hText, EM_HIDESELECTION, TRUE, FALSE); } if (savesel.cpMax == exlen || forceVisible) { /* Move insert point to new end of text if it was at the old end of text or if the new text is an echo of user typein */ sel.cpMin = 9999999; sel.cpMax = 9999999; SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&sel); } else { /* Restore previous selection */ SendMessage(hText, EM_EXSETSEL, 0, (LPARAM)&savesel); } SendMessage(hText, EM_HIDESELECTION, FALSE, FALSE); } /*---------*/ void DisplayHoldingsCount(HDC hdc, int x, int y, int rightAlign, int copyNumber) { char buf[100]; char *str; COLORREF oldFg, oldBg; HFONT oldFont; RECT rect; if(copyNumber > 1) snprintf(buf, sizeof(buf)/sizeof(buf[0]),"%d", copyNumber); else buf[0] = 0; oldFg = SetTextColor(hdc, RGB(255, 255, 255)); /* white */ oldBg = SetBkColor(hdc, RGB(0, 0, 0)); /* black */ oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf); rect.left = x; rect.right = x + squareSize; rect.top = y; rect.bottom = y + squareSize; str = buf; ExtTextOut(hdc, x + MESSAGE_LINE_LEFTMARGIN + (rightAlign ? (squareSize*2)/3 : 0), y, ETO_CLIPPED|ETO_OPAQUE, &rect, str, strlen(str), NULL); (void) SetTextColor(hdc, oldFg); (void) SetBkColor(hdc, oldBg); (void) SelectObject(hdc, oldFont); } void DisplayAClock(HDC hdc, int timeRemaining, int highlight, RECT *rect, char *color, char *flagFell) { char buf[100]; char *str; COLORREF oldFg, oldBg; HFONT oldFont; if (twoBoards && partnerUp) return; if (appData.clockMode) { if (tinyLayout) snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%c %s %s", color[0], TimeString(timeRemaining), flagFell); else snprintf(buf, sizeof(buf)/sizeof(buf[0]), "%s:%c%s %s", color, (logoHeight>0 ? 0 : ' '), TimeString(timeRemaining), flagFell); str = buf; } else { str = color; } if (highlight) { oldFg = SetTextColor(hdc, RGB(255, 255, 255)); /* white */ oldBg = SetBkColor(hdc, RGB(0, 0, 0)); /* black */ } else { oldFg = SetTextColor(hdc, RGB(0, 0, 0)); /* black */ oldBg = SetBkColor(hdc, RGB(255, 255, 255)); /* white */ } oldFont = SelectObject(hdc, font[boardSize][CLOCK_FONT]->hf); JAWS_SILENCE ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN, rect->top, ETO_CLIPPED|ETO_OPAQUE, rect, str, strlen(str), NULL); if(logoHeight > 0 && appData.clockMode) { RECT r; str += strlen(color)+2; r.top = rect->top + logoHeight/2; r.left = rect->left; r.right = rect->right; r.bottom = rect->bottom; ExtTextOut(hdc, rect->left + MESSAGE_LINE_LEFTMARGIN, r.top, ETO_CLIPPED|ETO_OPAQUE, &r, str, strlen(str), NULL); } (void) SetTextColor(hdc, oldFg); (void) SetBkColor(hdc, oldBg); (void) SelectObject(hdc, oldFont); } int DoReadFile(HANDLE hFile, char *buf, int count, DWORD *outCount, OVERLAPPED *ovl) { int ok, err; /* [AS] */ if( count <= 0 ) { if (appData.debugMode) { fprintf( debugFP, "DoReadFile: trying to read past end of buffer, overflow = %d\n", count ); } return ERROR_INVALID_USER_BUFFER; } ResetEvent(ovl->hEvent); ovl->Offset = ovl->OffsetHigh = 0; ok = ReadFile(hFile, buf, count, outCount, ovl); if (ok) { err = NO_ERROR; } else { err = GetLastError(); if (err == ERROR_IO_PENDING) { ok = GetOverlappedResult(hFile, ovl, outCount, TRUE); if (ok) err = NO_ERROR; else err = GetLastError(); } } return err; } int DoWriteFile(HANDLE hFile, char *buf, int count, DWORD *outCount, OVERLAPPED *ovl) { int ok, err; ResetEvent(ovl->hEvent); ovl->Offset = ovl->OffsetHigh = 0; ok = WriteFile(hFile, buf, count, outCount, ovl); if (ok) { err = NO_ERROR; } else { err = GetLastError(); if (err == ERROR_IO_PENDING) { ok = GetOverlappedResult(hFile, ovl, outCount, TRUE); if (ok) err = NO_ERROR; else err = GetLastError(); } } return err; } /* [AS] If input is line by line and a line exceed the buffer size, force an error */ void CheckForInputBufferFull( InputSource * is ) { if( is->lineByLine && (is->next - is->buf) >= INPUT_SOURCE_BUF_SIZE ) { /* Look for end of line */ char * p = is->buf; while( p < is->next && *p != '\n' ) { p++; } if( p >= is->next ) { if (appData.debugMode) { fprintf( debugFP, "Input line exceeded buffer size (source id=%lu)\n", is->id ); } is->error = ERROR_BROKEN_PIPE; /* [AS] Just any non-successful code! */ is->count = (DWORD) -1; is->next = is->buf; } } } DWORD InputThread(LPVOID arg) { InputSource *is; OVERLAPPED ovl; is = (InputSource *) arg; ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); ovl.Internal = ovl.InternalHigh = ovl.Offset = ovl.OffsetHigh = 0; while (is->hThread != NULL) { is->error = DoReadFile(is->hFile, is->next, INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), &is->count, &ovl); if (is->error == NO_ERROR) { is->next += is->count; } else { if (is->error == ERROR_BROKEN_PIPE) { /* Correct for MS brain damage. EOF reading a pipe is not an error. */ is->count = 0; } else { is->count = (DWORD) -1; /* [AS] The (is->count <= 0) check below is not useful for unsigned values! */ break; } } CheckForInputBufferFull( is ); SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); if( is->count == ((DWORD) -1) ) break; /* [AS] */ if (is->count <= 0) break; /* Quit on EOF or error */ } CloseHandle(ovl.hEvent); CloseHandle(is->hFile); if (appData.debugMode) { fprintf( debugFP, "Input thread terminated (id=%lu, error=%d, count=%ld)\n", is->id, is->error, is->count ); } return 0; } /* Windows 95 beta 2 won't let you do overlapped i/o on a console or pipe */ DWORD NonOvlInputThread(LPVOID arg) { InputSource *is; char *p, *q; int i; char prev; is = (InputSource *) arg; while (is->hThread != NULL) { is->error = ReadFile(is->hFile, is->next, INPUT_SOURCE_BUF_SIZE - (is->next - is->buf), &is->count, NULL) ? NO_ERROR : GetLastError(); if (is->error == NO_ERROR) { /* Change CRLF to LF */ if (is->next > is->buf) { p = is->next - 1; i = is->count + 1; } else { p = is->next; i = is->count; } q = p; prev = NULLCHAR; while (i > 0) { if (prev == '\r' && *p == '\n') { *(q-1) = '\n'; is->count--; } else { *q++ = *p; } prev = *p++; i--; } *q = NULLCHAR; is->next = q; } else { if (is->error == ERROR_BROKEN_PIPE) { /* Correct for MS brain damage. EOF reading a pipe is not an error. */ is->count = 0; } else { is->count = (DWORD) -1; } } CheckForInputBufferFull( is ); SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); if( is->count == ((DWORD) -1) ) break; /* [AS] */ if (is->count < 0) break; /* Quit on error */ } CloseHandle(is->hFile); return 0; } DWORD SocketInputThread(LPVOID arg) { InputSource *is; is = (InputSource *) arg; while (is->hThread != NULL) { is->count = recv(is->sock, is->buf, INPUT_SOURCE_BUF_SIZE, 0); if ((int)is->count == SOCKET_ERROR) { is->count = (DWORD) -1; is->error = WSAGetLastError(); } else { is->error = NO_ERROR; is->next += is->count; if (is->count == 0 && is->second == is) { /* End of file on stderr; quit with no message */ break; } } SendMessage(hwndMain, WM_USER_Input, 0, (LPARAM) is); if( is->count == ((DWORD) -1) ) break; /* [AS] */ if (is->count <= 0) break; /* Quit on EOF or error */ } return 0; } VOID InputEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { InputSource *is; is = (InputSource *) lParam; if (is->lineByLine) { /* Feed in lines one by one */ char *p = is->buf; char *q = p; while (q < is->next) { if (*q++ == '\n') { (is->func)(is, is->closure, p, q - p, NO_ERROR); p = q; } } /* Move any partial line to the start of the buffer */ q = is->buf; while (p < is->next) { *q++ = *p++; } is->next = q; if (is->error != NO_ERROR || is->count == 0) { /* Notify backend of the error. Note: If there was a partial line at the end, it is not flushed through. */ (is->func)(is, is->closure, is->buf, is->count, is->error); } } else { /* Feed in the whole chunk of input at once */ (is->func)(is, is->closure, is->buf, is->count, is->error); is->next = is->buf; } } /*---------------------------------------------------------------------------*\ * * Menu enables. Used when setting various modes. * \*---------------------------------------------------------------------------*/ typedef struct { int item; int flags; } Enables; VOID GreyRevert(Boolean grey) { // [HGM] vari: for retracting variations in local mode HMENU hmenu = GetMenu(hwndMain); EnableMenuItem(hmenu, IDM_Revert, MF_BYCOMMAND|(grey ? MF_GRAYED : MF_ENABLED)); EnableMenuItem(hmenu, IDM_Annotate, MF_BYCOMMAND|(grey ? MF_GRAYED : MF_ENABLED)); } VOID SetMenuEnables(HMENU hmenu, Enables *enab) { while (enab->item > 0) { (void) EnableMenuItem(hmenu, enab->item, enab->flags); enab++; } } Enables gnuEnables[] = { { IDM_MailMove, MF_BYCOMMAND|MF_GRAYED }, { IDM_ReloadCMailMsg, MF_BYCOMMAND|MF_GRAYED }, { IDM_IcsClient, MF_BYCOMMAND|MF_GRAYED }, { IDM_Accept, MF_BYCOMMAND|MF_GRAYED }, { IDM_Decline, MF_BYCOMMAND|MF_GRAYED }, { IDM_Rematch, MF_BYCOMMAND|MF_GRAYED }, { IDM_Adjourn, MF_BYCOMMAND|MF_GRAYED }, { IDM_StopExamining, MF_BYCOMMAND|MF_GRAYED }, { IDM_StopObserving, MF_BYCOMMAND|MF_GRAYED }, { IDM_Upload, MF_BYCOMMAND|MF_GRAYED }, { IDM_Revert, MF_BYCOMMAND|MF_GRAYED }, { IDM_Annotate, MF_BYCOMMAND|MF_GRAYED }, { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED }, // Needed to switch from ncp to GNU mode on Engine Load { ACTION_POS, MF_BYPOSITION|MF_ENABLED }, { IDM_MachineWhite, MF_BYCOMMAND|MF_ENABLED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_ENABLED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_ENABLED }, { IDM_Match, MF_BYCOMMAND|MF_ENABLED }, { IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED }, { IDM_AnalyzeFile, MF_BYCOMMAND|MF_ENABLED }, { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED }, { IDM_Engine2Options, MF_BYCOMMAND|MF_ENABLED }, { IDM_TimeControl, MF_BYCOMMAND|MF_ENABLED }, { IDM_RetractMove, MF_BYCOMMAND|MF_ENABLED }, { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED }, { IDM_Hint, MF_BYCOMMAND|MF_ENABLED }, { IDM_Book, MF_BYCOMMAND|MF_ENABLED }, { -1, -1 } }; Enables icsEnables[] = { { IDM_MailMove, MF_BYCOMMAND|MF_GRAYED }, { IDM_ReloadCMailMsg, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED }, { IDM_Match, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED }, { IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED }, { IDM_AnalyzeFile, MF_BYCOMMAND|MF_GRAYED }, { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED }, { IDM_MoveNow, MF_BYCOMMAND|MF_GRAYED }, { IDM_Hint, MF_BYCOMMAND|MF_GRAYED }, { IDM_Book, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadProg1, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadProg2, MF_BYCOMMAND|MF_GRAYED }, { IDM_IcsOptions, MF_BYCOMMAND|MF_ENABLED }, { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED }, { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED }, { IDM_Annotate, MF_BYCOMMAND|MF_GRAYED }, { IDM_Tourney, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; #if ZIPPY Enables zippyEnables[] = { { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED }, { IDM_Hint, MF_BYCOMMAND|MF_ENABLED }, { IDM_Book, MF_BYCOMMAND|MF_ENABLED }, { IDM_Engine1Options, MF_BYCOMMAND|MF_ENABLED }, { -1, -1 } }; #endif Enables ncpEnables[] = { { IDM_MailMove, MF_BYCOMMAND|MF_GRAYED }, { IDM_ReloadCMailMsg, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED }, { IDM_Match, MF_BYCOMMAND|MF_GRAYED }, { IDM_AnalysisMode, MF_BYCOMMAND|MF_GRAYED }, { IDM_AnalyzeFile, MF_BYCOMMAND|MF_GRAYED }, { IDM_IcsClient, MF_BYCOMMAND|MF_GRAYED }, { ACTION_POS, MF_BYPOSITION|MF_GRAYED }, { IDM_Revert, MF_BYCOMMAND|MF_GRAYED }, { IDM_Annotate, MF_BYCOMMAND|MF_GRAYED }, { IDM_MoveNow, MF_BYCOMMAND|MF_GRAYED }, { IDM_RetractMove, MF_BYCOMMAND|MF_GRAYED }, { IDM_TimeControl, MF_BYCOMMAND|MF_GRAYED }, { IDM_Hint, MF_BYCOMMAND|MF_GRAYED }, { IDM_Book, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBoth, MF_BYCOMMAND|MF_GRAYED }, { IDM_NewChat, MF_BYCOMMAND|MF_GRAYED }, { IDM_Engine1Options, MF_BYCOMMAND|MF_GRAYED }, { IDM_Engine2Options, MF_BYCOMMAND|MF_GRAYED }, { IDM_Sounds, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; Enables trainingOnEnables[] = { { IDM_EditComment, MF_BYCOMMAND|MF_GRAYED }, { IDM_Comment, MF_BYCOMMAND|MF_GRAYED }, { IDM_Pause, MF_BYCOMMAND|MF_GRAYED }, { IDM_Forward, MF_BYCOMMAND|MF_GRAYED }, { IDM_Backward, MF_BYCOMMAND|MF_GRAYED }, { IDM_ToEnd, MF_BYCOMMAND|MF_GRAYED }, { IDM_ToStart, MF_BYCOMMAND|MF_GRAYED }, { IDM_MoveNow, MF_BYCOMMAND|MF_GRAYED }, { IDM_TruncateGame, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; Enables trainingOffEnables[] = { { IDM_EditComment, MF_BYCOMMAND|MF_ENABLED }, { IDM_Comment, MF_BYCOMMAND|MF_ENABLED }, { IDM_Pause, MF_BYCOMMAND|MF_ENABLED }, { IDM_Forward, MF_BYCOMMAND|MF_ENABLED }, { IDM_Backward, MF_BYCOMMAND|MF_ENABLED }, { IDM_ToEnd, MF_BYCOMMAND|MF_ENABLED }, { IDM_ToStart, MF_BYCOMMAND|MF_ENABLED }, { IDM_MoveNow, MF_BYCOMMAND|MF_ENABLED }, { IDM_TruncateGame, MF_BYCOMMAND|MF_ENABLED }, { -1, -1 } }; /* These modify either ncpEnables or gnuEnables */ Enables cmailEnables[] = { { IDM_MailMove, MF_BYCOMMAND|MF_ENABLED }, { IDM_ReloadCMailMsg, MF_BYCOMMAND|MF_ENABLED }, { ACTION_POS, MF_BYPOSITION|MF_ENABLED }, { IDM_CallFlag, MF_BYCOMMAND|MF_GRAYED }, { IDM_Draw, MF_BYCOMMAND|MF_ENABLED }, { IDM_Adjourn, MF_BYCOMMAND|MF_GRAYED }, { IDM_Abort, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; Enables machineThinkingEnables[] = { { IDM_LoadGame, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadNextGame, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadPrevGame, MF_BYCOMMAND|MF_GRAYED }, { IDM_ReloadGame, MF_BYCOMMAND|MF_GRAYED }, { IDM_PasteGame, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadPosition, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadNextPosition, MF_BYCOMMAND|MF_GRAYED }, { IDM_LoadPrevPosition, MF_BYCOMMAND|MF_GRAYED }, { IDM_ReloadPosition, MF_BYCOMMAND|MF_GRAYED }, { IDM_PastePosition, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineWhite, MF_BYCOMMAND|MF_GRAYED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_GRAYED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_GRAYED }, // { IDM_Match, MF_BYCOMMAND|MF_GRAYED }, { IDM_TypeInMove, MF_BYCOMMAND|MF_GRAYED }, { IDM_RetractMove, MF_BYCOMMAND|MF_GRAYED }, { -1, -1 } }; Enables userThinkingEnables[] = { { IDM_LoadGame, MF_BYCOMMAND|MF_ENABLED }, { IDM_LoadNextGame, MF_BYCOMMAND|MF_ENABLED }, { IDM_LoadPrevGame, MF_BYCOMMAND|MF_ENABLED }, { IDM_ReloadGame, MF_BYCOMMAND|MF_ENABLED }, { IDM_PasteGame, MF_BYCOMMAND|MF_ENABLED }, { IDM_LoadPosition, MF_BYCOMMAND|MF_ENABLED }, { IDM_LoadNextPosition, MF_BYCOMMAND|MF_ENABLED }, { IDM_LoadPrevPosition, MF_BYCOMMAND|MF_ENABLED }, { IDM_ReloadPosition, MF_BYCOMMAND|MF_ENABLED }, { IDM_PastePosition, MF_BYCOMMAND|MF_ENABLED }, { IDM_MachineWhite, MF_BYCOMMAND|MF_ENABLED }, { IDM_MachineBlack, MF_BYCOMMAND|MF_ENABLED }, { IDM_TwoMachines, MF_BYCOMMAND|MF_ENABLED }, // { IDM_Match, MF_BYCOMMAND|MF_ENABLED }, { IDM_TypeInMove, MF_BYCOMMAND|MF_ENABLED }, { IDM_RetractMove, MF_BYCOMMAND|MF_ENABLED }, { -1, -1 } }; /*---------------------------------------------------------------------------*\ * * Front-end interface functions exported by XBoard. * Functions appear in same order as prototypes in frontend.h. * \*---------------------------------------------------------------------------*/ VOID CheckMark(UINT item, int state) { if(item) CheckMenuItem(GetMenu(hwndMain), item, MF_BYCOMMAND|state); } VOID ModeHighlight() { static UINT prevChecked = 0; static int prevPausing = 0; UINT nowChecked; if (pausing != prevPausing) { prevPausing = pausing; (void) CheckMenuItem(GetMenu(hwndMain), IDM_Pause, MF_BYCOMMAND|(pausing ? MF_CHECKED : MF_UNCHECKED)); if (hwndPause) SetWindowText(hwndPause, pausing ? "C" : "P"); } switch (gameMode) { case BeginningOfGame: if (appData.icsActive) nowChecked = IDM_IcsClient; else if (appData.noChessProgram) nowChecked = IDM_EditGame; else nowChecked = IDM_MachineBlack; break; case MachinePlaysBlack: nowChecked = IDM_MachineBlack; break; case MachinePlaysWhite: nowChecked = IDM_MachineWhite; break; case TwoMachinesPlay: nowChecked = IDM_TwoMachines; break; case AnalyzeMode: nowChecked = IDM_AnalysisMode; break; case AnalyzeFile: nowChecked = IDM_AnalyzeFile; break; case EditGame: nowChecked = IDM_EditGame; break; case PlayFromGameFile: nowChecked = IDM_LoadGame; break; case EditPosition: nowChecked = IDM_EditPosition; break; case Training: nowChecked = IDM_Training; break; case IcsPlayingWhite: case IcsPlayingBlack: case IcsObserving: case IcsIdle: nowChecked = IDM_IcsClient; break; default: case EndOfGame: nowChecked = 0; break; } CheckMark(prevChecked, MF_UNCHECKED); CheckMark(nowChecked, MF_CHECKED); CheckMark(IDM_Match, matchMode && matchGame < appData.matchGames ? MF_CHECKED : MF_UNCHECKED); if (nowChecked == IDM_LoadGame || nowChecked == IDM_Training) { (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, MF_BYCOMMAND|MF_ENABLED); } else { (void) EnableMenuItem(GetMenu(hwndMain), IDM_Training, MF_BYCOMMAND|MF_GRAYED); } prevChecked = nowChecked; /* [DM] icsEngineAnalyze - Do a sceure check too */ if (appData.icsActive) { if (appData.icsEngineAnalyze) { CheckMark(IDM_AnalysisMode, MF_CHECKED); } else { CheckMark(IDM_AnalysisMode, MF_UNCHECKED); } } DisplayLogos(); // [HGM] logos: mode change could have altered logos } VOID SetICSMode() { HMENU hmenu = GetMenu(hwndMain); SetMenuEnables(hmenu, icsEnables); EnableMenuItem(GetSubMenu(hmenu, OPTIONS_POS), IDM_IcsOptions, MF_BYCOMMAND|MF_ENABLED); #if ZIPPY if (appData.zippyPlay) { SetMenuEnables(hmenu, zippyEnables); if (!appData.noChessProgram) /* [DM] icsEngineAnalyze */ (void) EnableMenuItem(GetMenu(hwndMain), IDM_AnalysisMode, MF_BYCOMMAND|MF_ENABLED); } #endif } VOID SetGNUMode() { SetMenuEnables(GetMenu(hwndMain), gnuEnables); } VOID SetNCPMode() { HMENU hmenu = GetMenu(hwndMain); SetMenuEnables(hmenu, ncpEnables); DrawMenuBar(hwndMain); } VOID SetCmailMode() { SetMenuEnables(GetMenu(hwndMain), cmailEnables); } VOID SetTrainingModeOn() { int i; SetMenuEnables(GetMenu(hwndMain), trainingOnEnables); for (i = 0; i < N_BUTTONS; i++) { if (buttonDesc[i].hwnd != NULL) EnableWindow(buttonDesc[i].hwnd, FALSE); } CommentPopDown(); } VOID SetTrainingModeOff() { int i; SetMenuEnables(GetMenu(hwndMain), trainingOffEnables); for (i = 0; i < N_BUTTONS; i++) { if (buttonDesc[i].hwnd != NULL) EnableWindow(buttonDesc[i].hwnd, TRUE); } } VOID SetUserThinkingEnables() { SetMenuEnables(GetMenu(hwndMain), userThinkingEnables); } VOID SetMachineThinkingEnables() { HMENU hMenu = GetMenu(hwndMain); int flags = MF_BYCOMMAND|MF_ENABLED; SetMenuEnables(hMenu, machineThinkingEnables); if (gameMode == MachinePlaysBlack) { (void)EnableMenuItem(hMenu, IDM_MachineBlack, flags); } else if (gameMode == MachinePlaysWhite) { (void)EnableMenuItem(hMenu, IDM_MachineWhite, flags); } else if (gameMode == TwoMachinesPlay) { (void)EnableMenuItem(hMenu, matchMode ? IDM_Match : IDM_TwoMachines, flags); // [HGM] match } } VOID DisplayTitle(char *str) { char title[MSG_SIZ], *host; if (str[0] != NULLCHAR) { safeStrCpy(title, str, sizeof(title)/sizeof(title[0]) ); } else if (appData.icsActive) { if (appData.icsCommPort[0] != NULLCHAR) host = "ICS"; else host = appData.icsHost; snprintf(title, MSG_SIZ, "%s: %s", szTitle, host); } else if (appData.noChessProgram) { safeStrCpy(title, szTitle, sizeof(title)/sizeof(title[0]) ); } else { safeStrCpy(title, szTitle, sizeof(title)/sizeof(title[0]) ); strcat(title, ": "); strcat(title, first.tidy); } SetWindowText(hwndMain, title); } VOID DisplayMessage(char *str1, char *str2) { HDC hdc; HFONT oldFont; int remain = MESSAGE_TEXT_MAX - 1; int len; moveErrorMessageUp = FALSE; /* turned on later by caller if needed */ messageText[0] = NULLCHAR; if (*str1) { len = strlen(str1); if (len > remain) len = remain; strncpy(messageText, str1, len); messageText[len] = NULLCHAR; remain -= len; } if (*str2 && remain >= 2) { if (*str1) { strcat(messageText, " "); remain -= 2; } len = strlen(str2); if (len > remain) len = remain; strncat(messageText, str2, len); } messageText[MESSAGE_TEXT_MAX - 1] = NULLCHAR; safeStrCpy(lastMsg, messageText, MSG_SIZ); if (hwndMain == NULL || IsIconic(hwndMain)) return; SAYMACHINEMOVE(); hdc = GetDC(hwndMain); oldFont = SelectObject(hdc, font[boardSize][MESSAGE_FONT]->hf); ExtTextOut(hdc, messageRect.left, messageRect.top, ETO_CLIPPED|ETO_OPAQUE, &messageRect, messageText, strlen(messageText), NULL); (void) SelectObject(hdc, oldFont); (void) ReleaseDC(hwndMain, hdc); } VOID DisplayError(char *str, int error) { char buf[MSG_SIZ*2], buf2[MSG_SIZ]; int len; if (error == 0) { safeStrCpy(buf, str, sizeof(buf)/sizeof(buf[0]) ); } else { len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, LANG_NEUTRAL, (LPSTR) buf2, MSG_SIZ, NULL); if (len > 0) { snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, buf2); } else { ErrorMap *em = errmap; while (em->err != 0 && em->err != error) em++; if (em->err != 0) { snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, em->msg); } else { snprintf(buf, 2*MSG_SIZ, "%s:\nError code %d", str, error); } } } ErrorPopUp(_("Error"), buf); } VOID DisplayMoveError(char *str) { fromX = fromY = -1; ClearHighlights(); DrawPosition(FALSE, NULL); if (appData.popupMoveErrors) { ErrorPopUp(_("Error"), str); } else { DisplayMessage(str, ""); moveErrorMessageUp = TRUE; } } VOID DisplayFatalError(char *str, int error, int exitStatus) { char buf[2*MSG_SIZ], buf2[MSG_SIZ]; int len; char *label = exitStatus ? _("Fatal Error") : _("Exiting"); if (error != 0) { len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, LANG_NEUTRAL, (LPSTR) buf2, MSG_SIZ, NULL); if (len > 0) { snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, buf2); } else { ErrorMap *em = errmap; while (em->err != 0 && em->err != error) em++; if (em->err != 0) { snprintf(buf, 2*MSG_SIZ, "%s:\n%s", str, em->msg); } else { snprintf(buf, 2*MSG_SIZ, "%s:\nError code %d", str, error); } } str = buf; } if (appData.debugMode) { fprintf(debugFP, "%s: %s\n", label, str); } if (appData.popupExitMessage) { (void) MessageBox(hwndMain, str, label, MB_OK| (exitStatus ? MB_ICONSTOP : MB_ICONINFORMATION)); } ExitEvent(exitStatus); } VOID DisplayInformation(char *str) { (void) MessageBox(hwndMain, str, _("Information"), MB_OK|MB_ICONINFORMATION); } VOID DisplayNote(char *str) { ErrorPopUp(_("Note"), str); } typedef struct { char *title, *question, *replyPrefix; ProcRef pr; } QuestionParams; LRESULT CALLBACK QuestionDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static QuestionParams *qp; char reply[MSG_SIZ]; int len, err; switch (message) { case WM_INITDIALOG: qp = (QuestionParams *) lParam; CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); Translate(hDlg, DLG_Question); SetWindowText(hDlg, qp->title); SetDlgItemText(hDlg, OPT_QuestionText, qp->question); SetFocus(GetDlgItem(hDlg, OPT_QuestionInput)); return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: safeStrCpy(reply, qp->replyPrefix, sizeof(reply)/sizeof(reply[0]) ); if (*reply) strcat(reply, " "); len = strlen(reply); GetDlgItemText(hDlg, OPT_QuestionInput, reply + len, sizeof(reply) - len); strcat(reply, "\n"); OutputToProcess(qp->pr, reply, strlen(reply), &err); EndDialog(hDlg, TRUE); if (err) DisplayFatalError(_("Error writing to chess program"), err, 1); return TRUE; case IDCANCEL: EndDialog(hDlg, FALSE); return TRUE; default: break; } break; } return FALSE; } VOID AskQuestion(char* title, char *question, char *replyPrefix, ProcRef pr) { QuestionParams qp; FARPROC lpProc; qp.title = title; qp.question = question; qp.replyPrefix = replyPrefix; qp.pr = pr; lpProc = MakeProcInstance((FARPROC)QuestionDialog, hInst); DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_Question), hwndMain, (DLGPROC)lpProc, (LPARAM)&qp); FreeProcInstance(lpProc); } /* [AS] Pick FRC position */ LRESULT CALLBACK NewGameFRC_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static int * lpIndexFRC; BOOL index_is_ok; char buf[16]; switch( message ) { case WM_INITDIALOG: lpIndexFRC = (int *) lParam; CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); Translate(hDlg, DLG_NewGameFRC); SendDlgItemMessage( hDlg, IDC_NFG_Edit, EM_SETLIMITTEXT, sizeof(buf)-1, 0 ); SetDlgItemInt( hDlg, IDC_NFG_Edit, *lpIndexFRC, TRUE ); SendDlgItemMessage( hDlg, IDC_NFG_Edit, EM_SETSEL, 0, -1 ); SetFocus(GetDlgItem(hDlg, IDC_NFG_Edit)); break; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: *lpIndexFRC = GetDlgItemInt(hDlg, IDC_NFG_Edit, &index_is_ok, TRUE ); EndDialog( hDlg, 0 ); shuffleOpenings = TRUE; /* [HGM] shuffle: switch shuffling on for as long as we stay in current variant */ return TRUE; case IDCANCEL: EndDialog( hDlg, 1 ); return TRUE; case IDC_NFG_Edit: if( HIWORD(wParam) == EN_CHANGE ) { GetDlgItemInt(hDlg, IDC_NFG_Edit, &index_is_ok, TRUE ); EnableWindow( GetDlgItem(hDlg, IDOK), index_is_ok ); } return TRUE; case IDC_NFG_Random: snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%d", myrandom() ); /* [HGM] shuffle: no longer limit to 960 */ SetDlgItemText(hDlg, IDC_NFG_Edit, buf ); return TRUE; } break; } return FALSE; } int NewGameFRC() { int result; int index = appData.defaultFrcPosition; FARPROC lpProc = MakeProcInstance( (FARPROC) NewGameFRC_Proc, hInst ); result = DialogBoxParam( hInst, MAKEINTRESOURCE(DLG_NewGameFRC), hwndMain, (DLGPROC)lpProc, (LPARAM)&index ); if( result == 0 ) { appData.defaultFrcPosition = index; } return result; } /* [AS] Game list options. Refactored by HGM */ HWND gameListOptionsDialog; // low-level front-end: clear text edit / list widget void GLT_ClearList() { SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_RESETCONTENT, 0, 0 ); } // low-level front-end: clear text edit / list widget void GLT_DeSelectList() { SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_SETCURSEL, 0, 0 ); } // low-level front-end: append line to text edit / list widget void GLT_AddToList( char *name ) { if( name != 0 ) { SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_ADDSTRING, 0, (LPARAM) name ); } } // low-level front-end: get line from text edit / list widget Boolean GLT_GetFromList( int index, char *name ) { if( name != 0 ) { if( SendDlgItemMessage( gameListOptionsDialog, IDC_GameListTags, LB_GETTEXT, index, (LPARAM) name ) != LB_ERR ) return TRUE; } return FALSE; } void GLT_MoveSelection( HWND hDlg, int delta ) { int idx1 = (int) SendDlgItemMessage( hDlg, IDC_GameListTags, LB_GETCURSEL, 0, 0 ); int idx2 = idx1 + delta; int count = (int) SendDlgItemMessage( hDlg, IDC_GameListTags, LB_GETCOUNT, 0, 0 ); if( idx1 >=0 && idx1 < count && idx2 >= 0 && idx2 < count ) { char buf[128]; SendDlgItemMessage( hDlg, IDC_GameListTags, LB_GETTEXT, idx1, (LPARAM) buf ); SendDlgItemMessage( hDlg, IDC_GameListTags, LB_DELETESTRING, idx1, 0 ); SendDlgItemMessage( hDlg, IDC_GameListTags, LB_INSERTSTRING, idx2, (LPARAM) buf ); SendDlgItemMessage( hDlg, IDC_GameListTags, LB_SETCURSEL, idx2, 0 ); } } LRESULT CALLBACK GameListOptions_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch( message ) { case WM_INITDIALOG: gameListOptionsDialog = hDlg; // [HGM] pass through global to keep out off back-end CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); Translate(hDlg, DLG_GameListOptions); /* Initialize list */ GLT_TagsToList( lpUserGLT ); SetFocus( GetDlgItem(hDlg, IDC_GameListTags) ); break; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: GLT_ParseList(); EndDialog( hDlg, 0 ); return TRUE; case IDCANCEL: EndDialog( hDlg, 1 ); return TRUE; case IDC_GLT_Default: GLT_TagsToList( GLT_DEFAULT_TAGS ); return TRUE; case IDC_GLT_Restore: GLT_TagsToList( appData.gameListTags ); return TRUE; case IDC_GLT_Up: GLT_MoveSelection( hDlg, -1 ); return TRUE; case IDC_GLT_Down: GLT_MoveSelection( hDlg, +1 ); return TRUE; } break; } return FALSE; } int GameListOptions() { int result; FARPROC lpProc = MakeProcInstance( (FARPROC) GameListOptions_Proc, hInst ); safeStrCpy( lpUserGLT, appData.gameListTags ,LPUSERGLT_SIZE ); result = DialogBoxParam( hInst, MAKEINTRESOURCE(DLG_GameListOptions), hwndMain, (DLGPROC)lpProc, (LPARAM)lpUserGLT ); if( result == 0 ) { /* [AS] Memory leak here! */ appData.gameListTags = strdup( lpUserGLT ); } return result; } VOID DisplayIcsInteractionTitle(char *str) { char consoleTitle[MSG_SIZ]; snprintf(consoleTitle, MSG_SIZ, "%s: %s", szConsoleTitle, str); SetWindowText(hwndConsole, consoleTitle); if(appData.chatBoxes) { // [HGM] chat: open chat boxes char buf[MSG_SIZ], *p = buf, *q; safeStrCpy(buf, appData.chatBoxes, sizeof(buf)/sizeof(buf[0]) ); do { q = strchr(p, ';'); if(q) *q++ = 0; if(*p) ChatPopUp(p); } while(p=q); } SetActiveWindow(hwndMain); } void DrawPosition(int fullRedraw, Board board) { HDCDrawPosition(NULL, (BOOLEAN) fullRedraw, board); } void NotifyFrontendLogin() { if (hwndConsole) UpdateICSWidth(GetDlgItem(hwndConsole, OPT_ConsoleText)); } VOID ResetFrontEnd() { fromX = fromY = -1; if (dragInfo.pos.x != -1 || dragInfo.pos.y != -1) { dragInfo.pos.x = dragInfo.pos.y = -1; dragInfo.pos.x = dragInfo.pos.y = -1; dragInfo.lastpos = dragInfo.pos; dragInfo.start.x = dragInfo.start.y = -1; dragInfo.from = dragInfo.start; ReleaseCapture(); DrawPosition(TRUE, NULL); } TagsPopDown(); } VOID CommentPopUp(char *title, char *str) { HWND hwnd = GetActiveWindow(); EitherCommentPopUp(currentMove, title, str, FALSE); // [HGM] vari: fake move index, rather than 0 SAY(str); SetActiveWindow(hwnd); } VOID CommentPopDown(void) { CheckMenuItem(GetMenu(hwndMain), IDM_Comment, MF_UNCHECKED); if (commentDialog) { ShowWindow(commentDialog, SW_HIDE); } commentUp = FALSE; } VOID EditCommentPopUp(int index, char *title, char *str) { EitherCommentPopUp(index, title, str, TRUE); } VOID RingBell() { MyPlaySound(&sounds[(int)SoundMove]); } VOID PlayIcsWinSound() { MyPlaySound(&sounds[(int)SoundIcsWin]); } VOID PlayIcsLossSound() { MyPlaySound(&sounds[(int)SoundIcsLoss]); } VOID PlayIcsDrawSound() { MyPlaySound(&sounds[(int)SoundIcsDraw]); } VOID PlayIcsUnfinishedSound() { MyPlaySound(&sounds[(int)SoundIcsUnfinished]); } VOID PlayAlarmSound() { MyPlaySound(&sounds[(int)SoundAlarm]); } VOID PlayTellSound() { MyPlaySound(&textAttribs[ColorTell].sound); } VOID EchoOn() { HWND hInput; consoleEcho = TRUE; hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&consoleCF); SendMessage(hInput, EM_SETBKGNDCOLOR, FALSE, consoleBackgroundColor); } VOID EchoOff() { CHARFORMAT cf; HWND hInput; consoleEcho = FALSE; hInput = GetDlgItem(hwndConsole, OPT_ConsoleInput); /* This works OK: set text and background both to the same color */ cf = consoleCF; cf.crTextColor = COLOR_ECHOOFF; SendMessage(hInput, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf); SendMessage(hInput, EM_SETBKGNDCOLOR, FALSE, cf.crTextColor); } /* No Raw()...? */ void Colorize(ColorClass cc, int continuation) { currentColorClass = cc; consoleCF.dwMask = CFM_COLOR|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT; consoleCF.crTextColor = textAttribs[cc].color; consoleCF.dwEffects = textAttribs[cc].effects; if (!continuation) MyPlaySound(&textAttribs[cc].sound); } char * UserName() { static char buf[MSG_SIZ]; DWORD bufsiz = MSG_SIZ; if(appData.userName != NULL && appData.userName[0] != 0) { return appData.userName; /* [HGM] username: prefer name selected by user over his system login */ } if (!GetUserName(buf, &bufsiz)) { /*DisplayError("Error getting user name", GetLastError());*/ safeStrCpy(buf, _("User"), sizeof(buf)/sizeof(buf[0]) ); } return buf; } char * HostName() { static char buf[MSG_SIZ]; DWORD bufsiz = MSG_SIZ; if (!GetComputerName(buf, &bufsiz)) { /*DisplayError("Error getting host name", GetLastError());*/ safeStrCpy(buf, _("Unknown"), sizeof(buf)/sizeof(buf[0]) ); } return buf; } int ClockTimerRunning() { return clockTimerEvent != 0; } int StopClockTimer() { if (clockTimerEvent == 0) return FALSE; KillTimer(hwndMain, clockTimerEvent); clockTimerEvent = 0; return TRUE; } void StartClockTimer(long millisec) { clockTimerEvent = SetTimer(hwndMain, (UINT) CLOCK_TIMER_ID, (UINT) millisec, NULL); } void DisplayWhiteClock(long timeRemaining, int highlight) { HDC hdc; char *flag = whiteFlag && gameMode == TwoMachinesPlay ? "(!)" : ""; if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &blackRect : &whiteRect, _("White"), flag); } if (highlight && iconCurrent == iconBlack) { iconCurrent = iconWhite; PostMessage(hwndMain, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent); if (IsIconic(hwndMain)) { DrawIcon(hdc, 2, 2, iconCurrent); } } (void) ReleaseDC(hwndMain, hdc); if (hwndConsole) PostMessage(hwndConsole, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent); } void DisplayBlackClock(long timeRemaining, int highlight) { HDC hdc; char *flag = blackFlag && gameMode == TwoMachinesPlay ? "(!)" : ""; if(appData.noGUI) return; hdc = GetDC(hwndMain); if (!IsIconic(hwndMain)) { DisplayAClock(hdc, timeRemaining, highlight, flipClock ? &whiteRect : &blackRect, _("Black"), flag); } if (highlight && iconCurrent == iconWhite) { iconCurrent = iconBlack; PostMessage(hwndMain, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent); if (IsIconic(hwndMain)) { DrawIcon(hdc, 2, 2, iconCurrent); } } (void) ReleaseDC(hwndMain, hdc); if (hwndConsole) PostMessage(hwndConsole, WM_SETICON, (WPARAM) TRUE, (LPARAM) iconCurrent); } int LoadGameTimerRunning() { return loadGameTimerEvent != 0; } int StopLoadGameTimer() { if (loadGameTimerEvent == 0) return FALSE; KillTimer(hwndMain, loadGameTimerEvent); loadGameTimerEvent = 0; return TRUE; } void StartLoadGameTimer(long millisec) { loadGameTimerEvent = SetTimer(hwndMain, (UINT) LOAD_GAME_TIMER_ID, (UINT) millisec, NULL); } void AutoSaveGame() { char *defName; FILE *f; char fileTitle[MSG_SIZ]; defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn"); f = OpenFileDialog(hwndMain, "a", defName, appData.oldSaveStyle ? "gam" : "pgn", GAME_FILT, _("Save Game to File"), NULL, fileTitle, NULL); if (f != NULL) { SaveGame(f, 0, ""); fclose(f); } } void ScheduleDelayedEvent(DelayedEventCallback cb, long millisec) { if (delayedTimerEvent != 0) { if (appData.debugMode && cb != delayedTimerCallback) { // [HGM] alive: not too much debug fprintf(debugFP, "ScheduleDelayedEvent: event already scheduled\n"); } KillTimer(hwndMain, delayedTimerEvent); delayedTimerEvent = 0; if(delayedTimerCallback != cb) // [HGM] alive: do not "flush" same event, just postpone it delayedTimerCallback(); } delayedTimerCallback = cb; delayedTimerEvent = SetTimer(hwndMain, (UINT) DELAYED_TIMER_ID, (UINT) millisec, NULL); } DelayedEventCallback GetDelayedEvent() { if (delayedTimerEvent) { return delayedTimerCallback; } else { return NULL; } } void CancelDelayedEvent() { if (delayedTimerEvent) { KillTimer(hwndMain, delayedTimerEvent); delayedTimerEvent = 0; } } DWORD GetWin32Priority(int nice) { // [HGM] nice: translate Unix nice() value to indows priority class. (Code stolen from Polyglot 1.4w11) /* REALTIME_PRIORITY_CLASS 0x00000100 HIGH_PRIORITY_CLASS 0x00000080 ABOVE_NORMAL_PRIORITY_CLASS 0x00008000 NORMAL_PRIORITY_CLASS 0x00000020 BELOW_NORMAL_PRIORITY_CLASS 0x00004000 IDLE_PRIORITY_CLASS 0x00000040 */ if (nice < -15) return 0x00000080; if (nice < 0) return 0x00008000; if (nice == 0) return 0x00000020; if (nice < 15) return 0x00004000; return 0x00000040; } void RunCommand(char *cmdLine) { /* Now create the child process. */ STARTUPINFO siStartInfo; PROCESS_INFORMATION piProcInfo; siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.lpReserved = NULL; siStartInfo.lpDesktop = NULL; siStartInfo.lpTitle = NULL; siStartInfo.dwFlags = STARTF_USESTDHANDLES; siStartInfo.cbReserved2 = 0; siStartInfo.lpReserved2 = NULL; siStartInfo.hStdInput = NULL; siStartInfo.hStdOutput = NULL; siStartInfo.hStdError = NULL; CreateProcess(NULL, cmdLine, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attrs */ TRUE, /* handles are inherited */ DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP, NULL, /* use parent's environment */ NULL, &siStartInfo, /* STARTUPINFO pointer */ &piProcInfo); /* receives PROCESS_INFORMATION */ CloseHandle(piProcInfo.hThread); } /* Start a child process running the given program. The process's standard output can be read from "from", and its standard input can be written to "to". Exit with fatal error if anything goes wrong. Returns an opaque pointer that can be used to destroy the process later. */ int StartChildProcess(char *cmdLine, char *dir, ProcRef *pr) { #define BUFSIZE 4096 HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr; HANDLE hChildStdinWrDup, hChildStdoutRdDup; SECURITY_ATTRIBUTES saAttr; BOOL fSuccess; PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; ChildProc *cp; char buf[MSG_SIZ]; DWORD err; if (appData.debugMode) { fprintf(debugFP, "StartChildProcess (dir=\"%s\") %s\n", dir, cmdLine); } *pr = NoProc; /* Set the bInheritHandle flag so pipe handles are inherited. */ saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; /* * The steps for redirecting child's STDOUT: * 1. Create anonymous pipe to be STDOUT for child. * 2. Create a noninheritable duplicate of read handle, * and close the inheritable read handle. */ /* Create a pipe for the child's STDOUT. */ if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) { return GetLastError(); } /* Duplicate the read handle to the pipe, so it is not inherited. */ fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd, GetCurrentProcess(), &hChildStdoutRdDup, 0, FALSE, /* not inherited */ DUPLICATE_SAME_ACCESS); if (! fSuccess) { return GetLastError(); } CloseHandle(hChildStdoutRd); /* * The steps for redirecting child's STDIN: * 1. Create anonymous pipe to be STDIN for child. * 2. Create a noninheritable duplicate of write handle, * and close the inheritable write handle. */ /* Create a pipe for the child's STDIN. */ if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) { return GetLastError(); } /* Duplicate the write handle to the pipe, so it is not inherited. */ fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, GetCurrentProcess(), &hChildStdinWrDup, 0, FALSE, /* not inherited */ DUPLICATE_SAME_ACCESS); if (! fSuccess) { return GetLastError(); } CloseHandle(hChildStdinWr); /* Arrange to (1) look in dir for the child .exe file, and * (2) have dir be the child's working directory. Interpret * dir relative to the directory WinBoard loaded from. */ GetCurrentDirectory(MSG_SIZ, buf); SetCurrentDirectory(installDir); SetCurrentDirectory(dir); /* Now create the child process. */ siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.lpReserved = NULL; siStartInfo.lpDesktop = NULL; siStartInfo.lpTitle = NULL; siStartInfo.dwFlags = STARTF_USESTDHANDLES; siStartInfo.cbReserved2 = 0; siStartInfo.lpReserved2 = NULL; siStartInfo.hStdInput = hChildStdinRd; siStartInfo.hStdOutput = hChildStdoutWr; siStartInfo.hStdError = hChildStdoutWr; fSuccess = CreateProcess(NULL, cmdLine, /* command line */ NULL, /* process security attributes */ NULL, /* primary thread security attrs */ TRUE, /* handles are inherited */ DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP, NULL, /* use parent's environment */ NULL, &siStartInfo, /* STARTUPINFO pointer */ &piProcInfo); /* receives PROCESS_INFORMATION */ err = GetLastError(); SetCurrentDirectory(buf); /* return to prev directory */ if (! fSuccess) { return err; } if (appData.niceEngines){ // [HGM] nice: adjust engine proc priority if(appData.debugMode) fprintf(debugFP, "nice engine proc to %d\n", appData.niceEngines); SetPriorityClass(piProcInfo.hProcess, GetWin32Priority(appData.niceEngines)); } /* Close the handles we don't need in the parent */ CloseHandle(piProcInfo.hThread); CloseHandle(hChildStdinRd); CloseHandle(hChildStdoutWr); /* Prepare return value */ cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPReal; cp->hProcess = piProcInfo.hProcess; cp->pid = piProcInfo.dwProcessId; cp->hFrom = hChildStdoutRdDup; cp->hTo = hChildStdinWrDup; *pr = (void *) cp; /* Klaus Friedel says that this Sleep solves a problem under Windows 2000 where engines sometimes don't see the initial command(s) from WinBoard and hang. I don't understand how that can happen, but the Sleep is harmless, so I've put it in. Others have also reported what may be the same problem, so hopefully this will fix it for them too. */ Sleep(500); return NO_ERROR; } void DestroyChildProcess(ProcRef pr, int/*boolean*/ signal) { ChildProc *cp; int result; cp = (ChildProc *) pr; if (cp == NULL) return; switch (cp->kind) { case CPReal: /* TerminateProcess is considered harmful, so... */ CloseHandle(cp->hTo); /* Closing this will give the child an EOF and hopefully kill it */ if (cp->hFrom) CloseHandle(cp->hFrom); /* if NULL, InputThread will close it */ /* The following doesn't work because the chess program doesn't "have the same console" as WinBoard. Maybe we could arrange for this even though neither WinBoard nor the chess program uses a console for stdio? */ /*!!if (signal) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, cp->pid);*/ /* [AS] Special termination modes for misbehaving programs... */ if( signal == 9 ) { result = TerminateProcess( cp->hProcess, 0 ); if ( appData.debugMode) { fprintf( debugFP, "Terminating process %lu, result=%d\n", cp->pid, result ); } } else if( signal == 10 ) { DWORD dw = WaitForSingleObject( cp->hProcess, 3*1000 ); // Wait 3 seconds at most if( dw != WAIT_OBJECT_0 ) { result = TerminateProcess( cp->hProcess, 0 ); if ( appData.debugMode) { fprintf( debugFP, "Process %lu still alive after timeout, killing... result=%d\n", cp->pid, result ); } } } CloseHandle(cp->hProcess); break; case CPComm: if (cp->hFrom) CloseHandle(cp->hFrom); break; case CPSock: closesocket(cp->sock); WSACleanup(); break; case CPRcmd: if (signal) send(cp->sock2, "\017", 1, 0); /* 017 = 15 = SIGTERM */ closesocket(cp->sock); closesocket(cp->sock2); WSACleanup(); break; } free(cp); } void InterruptChildProcess(ProcRef pr) { ChildProc *cp; cp = (ChildProc *) pr; if (cp == NULL) return; switch (cp->kind) { case CPReal: /* The following doesn't work because the chess program doesn't "have the same console" as WinBoard. Maybe we could arrange for this even though neither WinBoard nor the chess program uses a console for stdio */ /*!!GenerateConsoleCtrlEvent(CTRL_C_EVENT, cp->pid);*/ break; case CPComm: case CPSock: /* Can't interrupt */ break; case CPRcmd: send(cp->sock2, "\002", 1, 0); /* 2 = SIGINT */ break; } } int OpenTelnet(char *host, char *port, ProcRef *pr) { char cmdLine[MSG_SIZ]; if (port[0] == NULLCHAR) { snprintf(cmdLine, MSG_SIZ, "%s %s", appData.telnetProgram, host); } else { snprintf(cmdLine, MSG_SIZ, "%s %s %s", appData.telnetProgram, host, port); } return StartChildProcess(cmdLine, "", pr); } /* Code to open TCP sockets */ int OpenTCP(char *host, char *port, ProcRef *pr) { ChildProc *cp; int err; SOCKET s; struct sockaddr_in sa, mysa; struct hostent FAR *hp; unsigned short uport; WORD wVersionRequested; WSADATA wsaData; /* Initialize socket DLL */ wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) return err; /* Make socket */ if ((s = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { err = WSAGetLastError(); WSACleanup(); return err; } /* Bind local address using (mostly) don't-care values. */ memset((char *) &mysa, 0, sizeof(struct sockaddr_in)); mysa.sin_family = AF_INET; mysa.sin_addr.s_addr = INADDR_ANY; uport = (unsigned short) 0; mysa.sin_port = htons(uport); if (bind(s, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); WSACleanup(); return err; } /* Resolve remote host name */ memset((char *) &sa, 0, sizeof(struct sockaddr_in)); if (!(hp = gethostbyname(host))) { unsigned int b0, b1, b2, b3; err = WSAGetLastError(); if (sscanf(host, "%u.%u.%u.%u", &b0, &b1, &b2, &b3) == 4) { hp = (struct hostent *) calloc(1, sizeof(struct hostent)); hp->h_addrtype = AF_INET; hp->h_length = 4; hp->h_addr_list = (char **) calloc(2, sizeof(char *)); hp->h_addr_list[0] = (char *) malloc(4); hp->h_addr_list[0][0] = (char) b0; hp->h_addr_list[0][1] = (char) b1; hp->h_addr_list[0][2] = (char) b2; hp->h_addr_list[0][3] = (char) b3; } else { WSACleanup(); return err; } } sa.sin_family = hp->h_addrtype; uport = (unsigned short) atoi(port); sa.sin_port = htons(uport); memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length); /* Make connection */ if (connect(s, (struct sockaddr *) &sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); WSACleanup(); return err; } /* Prepare return value */ cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPSock; cp->sock = s; *pr = (ProcRef *) cp; return NO_ERROR; } int OpenCommPort(char *name, ProcRef *pr) { HANDLE h; COMMTIMEOUTS ct; ChildProc *cp; char fullname[MSG_SIZ]; if (*name != '\\') snprintf(fullname, MSG_SIZ, "\\\\.\\%s", name); else safeStrCpy(fullname, name, sizeof(fullname)/sizeof(fullname[0]) ); h = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (h == (HANDLE) -1) { return GetLastError(); } hCommPort = h; if (!SetCommState(h, (LPDCB) &dcb)) return GetLastError(); /* Accumulate characters until a 100ms pause, then parse */ ct.ReadIntervalTimeout = 100; ct.ReadTotalTimeoutMultiplier = 0; ct.ReadTotalTimeoutConstant = 0; ct.WriteTotalTimeoutMultiplier = 0; ct.WriteTotalTimeoutConstant = 0; if (!SetCommTimeouts(h, (LPCOMMTIMEOUTS) &ct)) return GetLastError(); /* Prepare return value */ cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPComm; cp->hFrom = h; cp->hTo = h; *pr = (ProcRef *) cp; return NO_ERROR; } int OpenLoopback(ProcRef *pr) { DisplayFatalError(_("Not implemented"), 0, 1); return NO_ERROR; } int OpenRcmd(char* host, char* user, char* cmd, ProcRef* pr) { ChildProc *cp; int err; SOCKET s, s2, s3; struct sockaddr_in sa, mysa; struct hostent FAR *hp; unsigned short uport; WORD wVersionRequested; WSADATA wsaData; int fromPort; char stderrPortStr[MSG_SIZ]; /* Initialize socket DLL */ wVersionRequested = MAKEWORD(1, 1); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) return err; /* Resolve remote host name */ memset((char *) &sa, 0, sizeof(struct sockaddr_in)); if (!(hp = gethostbyname(host))) { unsigned int b0, b1, b2, b3; err = WSAGetLastError(); if (sscanf(host, "%u.%u.%u.%u", &b0, &b1, &b2, &b3) == 4) { hp = (struct hostent *) calloc(1, sizeof(struct hostent)); hp->h_addrtype = AF_INET; hp->h_length = 4; hp->h_addr_list = (char **) calloc(2, sizeof(char *)); hp->h_addr_list[0] = (char *) malloc(4); hp->h_addr_list[0][0] = (char) b0; hp->h_addr_list[0][1] = (char) b1; hp->h_addr_list[0][2] = (char) b2; hp->h_addr_list[0][3] = (char) b3; } else { WSACleanup(); return err; } } sa.sin_family = hp->h_addrtype; uport = (unsigned short) 514; sa.sin_port = htons(uport); memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length); /* Bind local socket to unused "privileged" port address */ s = INVALID_SOCKET; memset((char *) &mysa, 0, sizeof(struct sockaddr_in)); mysa.sin_family = AF_INET; mysa.sin_addr.s_addr = INADDR_ANY; for (fromPort = 1023;; fromPort--) { if (fromPort < 0) { WSACleanup(); return WSAEADDRINUSE; } if (s == INVALID_SOCKET) { if ((s = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { err = WSAGetLastError(); WSACleanup(); return err; } } uport = (unsigned short) fromPort; mysa.sin_port = htons(uport); if (bind(s, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) continue; WSACleanup(); return err; } if (connect(s, (struct sockaddr *) &sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { closesocket(s); s = -1; continue; } WSACleanup(); return err; } break; } /* Bind stderr local socket to unused "privileged" port address */ s2 = INVALID_SOCKET; memset((char *) &mysa, 0, sizeof(struct sockaddr_in)); mysa.sin_family = AF_INET; mysa.sin_addr.s_addr = INADDR_ANY; for (fromPort = 1023;; fromPort--) { if (fromPort == prevStderrPort) continue; // don't reuse port if (fromPort < 0) { (void) closesocket(s); WSACleanup(); return WSAEADDRINUSE; } if (s2 == INVALID_SOCKET) { if ((s2 = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { err = WSAGetLastError(); closesocket(s); WSACleanup(); return err; } } uport = (unsigned short) fromPort; mysa.sin_port = htons(uport); if (bind(s2, (struct sockaddr *) &mysa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) continue; (void) closesocket(s); WSACleanup(); return err; } if (listen(s2, 1) == SOCKET_ERROR) { err = WSAGetLastError(); if (err == WSAEADDRINUSE) { closesocket(s2); s2 = INVALID_SOCKET; continue; } (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } break; } prevStderrPort = fromPort; // remember port used snprintf(stderrPortStr, MSG_SIZ, "%d", fromPort); if (send(s, stderrPortStr, strlen(stderrPortStr) + 1, 0) == SOCKET_ERROR) { err = WSAGetLastError(); (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } if (send(s, UserName(), strlen(UserName()) + 1, 0) == SOCKET_ERROR) { err = WSAGetLastError(); (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } if (*user == NULLCHAR) user = UserName(); if (send(s, user, strlen(user) + 1, 0) == SOCKET_ERROR) { err = WSAGetLastError(); (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } if (send(s, cmd, strlen(cmd) + 1, 0) == SOCKET_ERROR) { err = WSAGetLastError(); (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } if ((s3 = accept(s2, NULL, NULL)) == INVALID_SOCKET) { err = WSAGetLastError(); (void) closesocket(s); (void) closesocket(s2); WSACleanup(); return err; } (void) closesocket(s2); /* Stop listening */ /* Prepare return value */ cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPRcmd; cp->sock = s; cp->sock2 = s3; *pr = (ProcRef *) cp; return NO_ERROR; } InputSourceRef AddInputSource(ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure) { InputSource *is, *is2 = NULL; ChildProc *cp = (ChildProc *) pr; is = (InputSource *) calloc(1, sizeof(InputSource)); is->lineByLine = lineByLine; is->func = func; is->closure = closure; is->second = NULL; is->next = is->buf; if (pr == NoProc) { is->kind = CPReal; consoleInputSource = is; } else { is->kind = cp->kind; /* [AS] Try to avoid a race condition if the thread is given control too early: we create all threads suspended so that the is->hThread variable can be safely assigned, then let the threads start with ResumeThread. */ switch (cp->kind) { case CPReal: is->hFile = cp->hFrom; cp->hFrom = NULL; /* now owned by InputThread */ is->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) NonOvlInputThread, (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPComm: is->hFile = cp->hFrom; cp->hFrom = NULL; /* now owned by InputThread */ is->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) InputThread, (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPSock: is->sock = cp->sock; is->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, (LPVOID) is, CREATE_SUSPENDED, &is->id); break; case CPRcmd: is2 = (InputSource *) calloc(1, sizeof(InputSource)); *is2 = *is; is->sock = cp->sock; is->second = is2; is2->sock = cp->sock2; is2->second = is2; is->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, (LPVOID) is, CREATE_SUSPENDED, &is->id); is2->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SocketInputThread, (LPVOID) is2, CREATE_SUSPENDED, &is2->id); break; } if( is->hThread != NULL ) { ResumeThread( is->hThread ); } if( is2 != NULL && is2->hThread != NULL ) { ResumeThread( is2->hThread ); } } return (InputSourceRef) is; } void RemoveInputSource(InputSourceRef isr) { InputSource *is; is = (InputSource *) isr; is->hThread = NULL; /* tell thread to stop */ CloseHandle(is->hThread); if (is->second != NULL) { is->second->hThread = NULL; CloseHandle(is->second->hThread); } } int no_wrap(char *message, int count) { ConsoleOutput(message, count, FALSE); return count; } int OutputToProcess(ProcRef pr, char *message, int count, int *outError) { DWORD dOutCount; int outCount = SOCKET_ERROR; ChildProc *cp = (ChildProc *) pr; static OVERLAPPED ovl; static int line = 0; if (pr == NoProc) { if (appData.noJoin || !appData.useInternalWrap) return no_wrap(message, count); else { int width = get_term_width(); int len = wrap(NULL, message, count, width, &line); char *msg = malloc(len); int dbgchk; if (!msg) return no_wrap(message, count); else { dbgchk = wrap(msg, message, count, width, &line); if (dbgchk != len && appData.debugMode) fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len); ConsoleOutput(msg, len, FALSE); free(msg); return len; } } } if (ovl.hEvent == NULL) { ovl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); } ovl.Internal = ovl.InternalHigh = ovl.Offset = ovl.OffsetHigh = 0; switch (cp->kind) { case CPSock: case CPRcmd: outCount = send(cp->sock, message, count, 0); if (outCount == SOCKET_ERROR) { *outError = WSAGetLastError(); } else { *outError = NO_ERROR; } break; case CPReal: if (WriteFile(((ChildProc *)pr)->hTo, message, count, &dOutCount, NULL)) { *outError = NO_ERROR; outCount = (int) dOutCount; } else { *outError = GetLastError(); } break; case CPComm: *outError = DoWriteFile(((ChildProc *)pr)->hTo, message, count, &dOutCount, &ovl); if (*outError == NO_ERROR) { outCount = (int) dOutCount; } break; } return outCount; } void DoSleep(int n) { if(n != 0) Sleep(n); } int OutputToProcessDelayed(ProcRef pr, char *message, int count, int *outError, long msdelay) { /* Ignore delay, not implemented for WinBoard */ return OutputToProcess(pr, message, count, outError); } void CmailSigHandlerCallBack(InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error) { DisplayFatalError(_("Not implemented"), 0, 1); } /* see wgamelist.c for Game List functions */ /* see wedittags.c for Edit Tags functions */ int ICSInitScript() { FILE *f; char buf[MSG_SIZ]; char *dummy; if (SearchPath(installDir, appData.icsLogon, NULL, MSG_SIZ, buf, &dummy)) { f = fopen(buf, "r"); if (f != NULL) { ProcessICSInitScript(f); fclose(f); return TRUE; } } return FALSE; } VOID StartAnalysisClock() { if (analysisTimerEvent) return; analysisTimerEvent = SetTimer(hwndMain, (UINT) ANALYSIS_TIMER_ID, (UINT) 2000, NULL); } VOID SetHighlights(int fromX, int fromY, int toX, int toY) { highlightInfo.sq[0].x = fromX; highlightInfo.sq[0].y = fromY; highlightInfo.sq[1].x = toX; highlightInfo.sq[1].y = toY; } VOID ClearHighlights() { highlightInfo.sq[0].x = highlightInfo.sq[0].y = highlightInfo.sq[1].x = highlightInfo.sq[1].y = -1; } VOID SetPremoveHighlights(int fromX, int fromY, int toX, int toY) { premoveHighlightInfo.sq[0].x = fromX; premoveHighlightInfo.sq[0].y = fromY; premoveHighlightInfo.sq[1].x = toX; premoveHighlightInfo.sq[1].y = toY; } VOID ClearPremoveHighlights() { premoveHighlightInfo.sq[0].x = premoveHighlightInfo.sq[0].y = premoveHighlightInfo.sq[1].x = premoveHighlightInfo.sq[1].y = -1; } VOID ShutDownFrontEnd() { if (saveSettingsOnExit) SaveSettings(settingsFileName); DeleteClipboardTempFiles(); } void BoardToTop() { if (IsIconic(hwndMain)) ShowWindow(hwndMain, SW_RESTORE); SetActiveWindow(hwndMain); } /* * Prototypes for animation support routines */ static void ScreenSquare(int column, int row, POINT * pt); static void Tween( POINT * start, POINT * mid, POINT * finish, int factor, POINT frames[], int * nFrames); #define kFactor 4 void AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY) { // [HGM] atomic: animate blast wave int i; explodeInfo.fromX = fromX; explodeInfo.fromY = fromY; explodeInfo.toX = toX; explodeInfo.toY = toY; for(i=1; i<4*kFactor; i++) { explodeInfo.radius = (i*180)/(4*kFactor-1); DrawPosition(FALSE, board); Sleep(appData.animSpeed); } explodeInfo.radius = 0; DrawPosition(TRUE, board); } void AnimateMove(board, fromX, fromY, toX, toY) Board board; int fromX; int fromY; int toX; int toY; { ChessSquare piece; POINT start, finish, mid; POINT frames[kFactor * 2 + 1]; int nFrames, n; if (!appData.animate) return; if (doingSizing) return; if (fromY < 0 || fromX < 0) return; piece = board[fromY][fromX]; if (piece >= EmptySquare) return; ScreenSquare(fromX, fromY, &start); ScreenSquare(toX, toY, &finish); /* All moves except knight jumps move in straight line */ if (!(abs(fromX-toX) == 1 && abs(fromY-toY) == 2 || abs(fromX-toX) == 2 && abs(fromY-toY) == 1)) { mid.x = start.x + (finish.x - start.x) / 2; mid.y = start.y + (finish.y - start.y) / 2; } else { /* Knight: make straight movement then diagonal */ if (abs(toY - fromY) < abs(toX - fromX)) { mid.x = start.x + (finish.x - start.x) / 2; mid.y = start.y; } else { mid.x = start.x; mid.y = start.y + (finish.y - start.y) / 2; } } /* Don't use as many frames for very short moves */ if (abs(toY - fromY) + abs(toX - fromX) <= 2) Tween(&start, &mid, &finish, kFactor - 1, frames, &nFrames); else Tween(&start, &mid, &finish, kFactor, frames, &nFrames); animInfo.from.x = fromX; animInfo.from.y = fromY; animInfo.to.x = toX; animInfo.to.y = toY; animInfo.lastpos = start; animInfo.piece = piece; for (n = 0; n < nFrames; n++) { animInfo.pos = frames[n]; DrawPosition(FALSE, NULL); animInfo.lastpos = animInfo.pos; Sleep(appData.animSpeed); } animInfo.pos = finish; DrawPosition(FALSE, NULL); animInfo.piece = EmptySquare; Explode(board, fromX, fromY, toX, toY); } /* Convert board position to corner of screen rect and color */ static void ScreenSquare(column, row, pt) int column; int row; POINT * pt; { if (flipView) { pt->x = lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap) + border; pt->y = lineGap + row * (squareSize + lineGap) + border; } else { pt->x = lineGap + column * (squareSize + lineGap) + border; pt->y = lineGap + ((BOARD_HEIGHT-1)-row) * (squareSize + lineGap) + border; } } /* Generate a series of frame coords from start->mid->finish. The movement rate doubles until the half way point is reached, then halves back down to the final destination, which gives a nice slow in/out effect. The algorithmn may seem to generate too many intermediates for short moves, but remember that the purpose is to attract the viewers attention to the piece about to be moved and then to where it ends up. Too few frames would be less noticeable. */ static void Tween(start, mid, finish, factor, frames, nFrames) POINT * start; POINT * mid; POINT * finish; int factor; POINT frames[]; int * nFrames; { int n, fraction = 1, count = 0; /* Slow in, stepping 1/16th, then 1/8th, ... */ for (n = 0; n < factor; n++) fraction *= 2; for (n = 0; n < factor; n++) { frames[count].x = start->x + (mid->x - start->x) / fraction; frames[count].y = start->y + (mid->y - start->y) / fraction; count ++; fraction = fraction / 2; } /* Midpoint */ frames[count] = *mid; count ++; /* Slow out, stepping 1/2, then 1/4, ... */ fraction = 2; for (n = 0; n < factor; n++) { frames[count].x = finish->x - (finish->x - mid->x) / fraction; frames[count].y = finish->y - (finish->y - mid->y) / fraction; count ++; fraction = fraction * 2; } *nFrames = count; } void SettingsPopUp(ChessProgramState *cps) { // [HGM] wrapper needed because handles must not be passed through back-end EngineOptionsPopup(savedHwnd, cps); } int flock(int fid, int code) { HANDLE hFile = (HANDLE) _get_osfhandle(fid); OVERLAPPED ov; ov.hEvent = NULL; ov.Offset = 0; ov.OffsetHigh = 0; switch(code) { case 1: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break; // LOCK_SH case 2: LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break; // LOCK_EX case 3: UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN default: return -1; } return 0; } char * Col2Text (int n) { static int i=0; static char col[8][20]; COLORREF color = *(COLORREF *) colorVariable[n]; i = i+1 & 7; snprintf(col[i], 20, "#%02lx%02lx%02lx", color&0xff, (color>>8)&0xff, (color>>16)&0xff); return col[i]; } void ActivateTheme (int new) { // Redo initialization of features depending on options that can occur in themes InitTextures(); if(new) InitDrawingColors(); fontBitmapSquareSize = 0; // request creation of new font pieces InitDrawingSizes(boardSize, 0); InvalidateRect(hwndMain, NULL, TRUE); } xboard-4.7.3/winboard/COMPILING0000644000175000001440000000416112262415351012775 00000000000000Compiling with an Integrated Development Envrionment Microsoft Visual C++ -- For MSVC 6.0 IDE, all you need to do is 'File|Open Workspace...' and select 'winboard.dsw'. Then to build, choose 'Build|Batch Build...' and select the targets you want to build. This method has full support for Debug and Release builds either with or without JAWS support. For later versions of Visual C++, open the same workspace and convert when prompted. Then compile as above. DevCpp -- For DevCpp, you need to 'File|Open Project or File...' and select either 'winboard.dev' or 'WB4Jaws.dev'. After parsing the project, you can 'Execute|Compile' to build. This IDE has no facility for defines in the resource compiler, so the version information resource will not indicate JAWS support even if it actually has that support. These projects are not set up for debugging, but you can do so by adjusting the 'Compiler' and 'Parameters' options in the 'Project|Project Options' dialog. Compiling from the Command Line GCC -- this includes cygwin, mingw, djgpp and others. make -f makefile.gcc You can modify certain settings in the makefile such as JAWS support, debugging support. If using cygwin, you can select whether or not to link with cygwin1.dll instead of the msvcrt runtime. CL -- this includes MSVC and recent Intel compilers. nmake -f makefile.ms Note: NMAKE, not MAKE For Visual Studio 2005 and later, set VCVER to 8, otherwise set it to 6. You can select JAWS support or debugging just like the GCC makefile. For MSVC 6.0 and earlier, you are going to need the latest SDK from Microsoft. After you install it, set the SDK_INC variable appropriately. It defaults to the standard location, but you still need to uncomment the line. Prior to compiling from the command line, it will be necessary to invoke VCVARS32.BAT if you didn't have MSVC register the command line environment variables during installation. xboard-4.7.3/winboard/defaults.h0000644000175000001440000002515012262562252013515 00000000000000/* * defaults.h -- Default settings for Windows NT front end to XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* Static */ #define POSITION_FILT "Position files (*.fen,*.epd,*.pos)\0*.fen;*.epd;*.pos\0All files (*.*)\0*.*\0" #define GAME_FILT "Game files (*.pgn,*.gam)\0*.pgn;*.gam\0All files (*.*)\0*.*\0" #define DIAGRAM_FILT "bitmap files (*.bmp)\0*.bmp\0All files (*.*)\0*.*\0" #define SOUND_FILT "Wave files (*.wav)\0*.wav\0All files (*.*)\0*.*\0" #define OUTER_MARGIN (tinyLayout ? 0 : 4) #define INNER_MARGIN (tinyLayout ? 0 : 2) #define MESSAGE_LINE_LEFTMARGIN 2 #define MESSAGE_TEXT_MAX 256 /*#define COLOR_ECHOOFF RGB(192,192,192)*/ #define COLOR_ECHOOFF consoleBackgroundColor #define WRAP_INDENT 200 /* Settable */ #define FIRST_CHESS_PROGRAM "" #define FIRST_DIRECTORY "." #define SECOND_CHESS_PROGRAM "" #define SECOND_DIRECTORY "." #define CLOCK_FONT_TINY "Arial:9.0 b" #define CLOCK_FONT_TEENY "Arial:9.0 b" #define CLOCK_FONT_DINKY "Arial:10.0 b" #define CLOCK_FONT_PETITE "Arial:10.0 b" #define CLOCK_FONT_SLIM "Arial:12.0 b" #define CLOCK_FONT_SMALL "Arial:14.0 b" #define CLOCK_FONT_MEDIOCRE "Arial:14.0 b" #define CLOCK_FONT_MIDDLING "Arial:14.0 b" #define CLOCK_FONT_AVERAGE "Arial:15.0 b" #define CLOCK_FONT_MODERATE "Arial:16.0 b" #define CLOCK_FONT_MEDIUM "Arial:16.0 b" #define CLOCK_FONT_BULKY "Arial:17.0 b" #define CLOCK_FONT_LARGE "Arial:19.0 b" #define CLOCK_FONT_BIG "Arial:20.0 b" #define CLOCK_FONT_HUGE "Arial:21.0 b" #define CLOCK_FONT_GIANT "Arial:22.0 b" #define CLOCK_FONT_COLOSSAL "Arial:23.0 b" #define CLOCK_FONT_TITANIC "Arial:24.0 b" #define MESSAGE_FONT_TINY "Small Fonts:6.0" #define MESSAGE_FONT_TEENY "Small Fonts:6.0" #define MESSAGE_FONT_DINKY "Small Fonts:7.0" #define MESSAGE_FONT_PETITE "Small Fonts:7.0" #define MESSAGE_FONT_SLIM "Arial:8.0 b" #define MESSAGE_FONT_SMALL "Arial:9.0 b" #define MESSAGE_FONT_MEDIOCRE "Arial:9.0 b" #define MESSAGE_FONT_MIDDLING "Arial:9.0 b" #define MESSAGE_FONT_AVERAGE "Arial:10.0 b" #define MESSAGE_FONT_MODERATE "Arial:10.0 b" #define MESSAGE_FONT_MEDIUM "Arial:10.0 b" #define MESSAGE_FONT_BULKY "Arial:10.0 b" #define MESSAGE_FONT_LARGE "Arial:10.0 b" #define MESSAGE_FONT_BIG "Arial:11.0 b" #define MESSAGE_FONT_HUGE "Arial:11.0 b" #define MESSAGE_FONT_GIANT "Arial:11.0 b" #define MESSAGE_FONT_COLOSSAL "Arial:12.0 b" #define MESSAGE_FONT_TITANIC "Arial:12.0 b" #define COORD_FONT_TINY "Small Fonts:4.0" #define COORD_FONT_TEENY "Small Fonts:4.0" #define COORD_FONT_DINKY "Small Fonts:5.0" #define COORD_FONT_PETITE "Small Fonts:5.0" #define COORD_FONT_SLIM "Small Fonts:6.0" #define COORD_FONT_SMALL "Small Fonts:7.0" #define COORD_FONT_MEDIOCRE "Small Fonts:7.0" #define COORD_FONT_MIDDLING "Small Fonts:7.0" #define COORD_FONT_AVERAGE "Arial:7.0 b" #define COORD_FONT_MODERATE "Arial:7.0 b" #define COORD_FONT_MEDIUM "Arial:7.0 b" #define COORD_FONT_BULKY "Arial:7.0 b" #define COORD_FONT_LARGE "Arial:7.0 b" #define COORD_FONT_BIG "Arial:8.0 b" #define COORD_FONT_HUGE "Arial:8.0 b" #define COORD_FONT_GIANT "Arial:8.0 b" #define COORD_FONT_COLOSSAL "Arial:9.0 b" #define COORD_FONT_TITANIC "Arial:9.0 b" #define CONSOLE_FONT_TINY "Courier New:8.0" #define CONSOLE_FONT_TEENY "Courier New:8.0" #define CONSOLE_FONT_DINKY "Courier New:8.0" #define CONSOLE_FONT_PETITE "Courier New:8.0" #define CONSOLE_FONT_SLIM "Courier New:8.0" #define CONSOLE_FONT_SMALL "Courier New:8.0" #define CONSOLE_FONT_MEDIOCRE "Courier New:8.0" #define CONSOLE_FONT_MIDDLING "Courier New:8.0" #define CONSOLE_FONT_AVERAGE "Courier New:8.0" #define CONSOLE_FONT_MODERATE "Courier New:8.0" #define CONSOLE_FONT_MEDIUM "Courier New:8.0" #define CONSOLE_FONT_BULKY "Courier New:8.0" #define CONSOLE_FONT_LARGE "Courier New:8.0" #define CONSOLE_FONT_BIG "Courier New:8.0" #define CONSOLE_FONT_HUGE "Courier New:8.0" #define CONSOLE_FONT_GIANT "Courier New:8.0" #define CONSOLE_FONT_COLOSSAL "Courier New:8.0" #define CONSOLE_FONT_TITANIC "Courier New:8.0" #define COMMENT_FONT_TINY "Arial:9.0" #define COMMENT_FONT_TEENY "Arial:9.0" #define COMMENT_FONT_DINKY "Arial:9.0" #define COMMENT_FONT_PETITE "Arial:9.0" #define COMMENT_FONT_SLIM "Arial:9.0" #define COMMENT_FONT_SMALL "Arial:9.0" #define COMMENT_FONT_MEDIOCRE "Arial:9.0" #define COMMENT_FONT_MIDDLING "Arial:9.0" #define COMMENT_FONT_AVERAGE "Arial:9.0" #define COMMENT_FONT_MODERATE "Arial:9.0" #define COMMENT_FONT_MEDIUM "Arial:9.0" #define COMMENT_FONT_BULKY "Arial:9.0" #define COMMENT_FONT_LARGE "Arial:9.0" #define COMMENT_FONT_BIG "Arial:9.0" #define COMMENT_FONT_HUGE "Arial:9.0" #define COMMENT_FONT_GIANT "Arial:9.0" #define COMMENT_FONT_COLOSSAL "Arial:9.0" #define COMMENT_FONT_TITANIC "Arial:9.0" #define EDITTAGS_FONT_TINY "Courier New:8.0" #define EDITTAGS_FONT_TEENY "Courier New:8.0" #define EDITTAGS_FONT_DINKY "Courier New:8.0" #define EDITTAGS_FONT_PETITE "Courier New:8.0" #define EDITTAGS_FONT_SLIM "Courier New:8.0" #define EDITTAGS_FONT_SMALL "Courier New:8.0" #define EDITTAGS_FONT_MEDIUM "Courier New:8.0" #define EDITTAGS_FONT_MEDIOCRE "Courier New:8.0" #define EDITTAGS_FONT_MIDDLING "Courier New:8.0" #define EDITTAGS_FONT_AVERAGE "Courier New:8.0" #define EDITTAGS_FONT_MODERATE "Courier New:8.0" #define EDITTAGS_FONT_BULKY "Courier New:8.0" #define EDITTAGS_FONT_LARGE "Courier New:8.0" #define EDITTAGS_FONT_BIG "Courier New:8.0" #define EDITTAGS_FONT_HUGE "Courier New:8.0" #define EDITTAGS_FONT_GIANT "Courier New:8.0" #define EDITTAGS_FONT_COLOSSAL "Courier New:8.0" #define EDITTAGS_FONT_TITANIC "Courier New:8.0" #define MOVEHISTORY_FONT_ALL "MS Sans Serif:8.0" #define GAMELIST_FONT_ALL "MS Sans Serif:8.0" #define COLOR_SHOUT "#209000" #define COLOR_SSHOUT "b #289808" #define COLOR_CHANNEL1 "#2020E0" #define COLOR_CHANNEL "b #4040FF" #define COLOR_KIBITZ "b #FF00FF" #define COLOR_TELL "b #FF0000" #define COLOR_CHALLENGE "bi #FF0000" #define COLOR_REQUEST "bi #FF0000" #define COLOR_SEEK "#980808" #define COLOR_NORMAL "#000000" #define COLOR_NONE "#000000" #define COLOR_BKGD "#FFFFFF" #define SOUND_BELL "$" #define BUILT_IN_SOUND_NAMES {\ "Beepbeep", "Ching", "Click", "Cymbal", "Ding", "Drip", \ "Gong", "Laser", "Move", "Penalty", "Phone", "Pop", "Pop2", \ "Slap", "Squeak", "Swish", "Thud", "Whipcrack", \ "Alarm", "Challenge", "Channel", "Channel1", "Draw", "Kibitz", \ "Lose", "Request", "Seek", "Shout", "SShout", "Tell", "Unfinished", \ "Win", NULL \ } #define SETTINGS_FILE "winboard.ini" #define DEBUG_FILE "winboard.debug" #define ICS_LOGON "ics.ini" #define ICS_NAMES "\ chessclub.com /icsport=5000 /icshelper=timestamp\n\ freechess.org /icsport=5000 /icshelper=timeseal\n\ global.chessparlor.com /icsport=6000 /icshelper=timeseal\n\ chessanytime.com /icsport=5000\n\ chess.net /icsport=5000\n\ chess.deepnet.com /icsport=5000 /icshelper=timeseal\n\ zics.org /icsport=5000\n\ jogo.cex.org.br /icsport=5000\n\ ajedrez.cec.uchile.cl /icsport=5000\n\ fly.cc.fer.hr /icsport=7890\n\ freechess.nl /icsport=5000 /icshelper=timeseal\n\ jeu.echecs.com /icsport=5000\n\ chess.unix-ag.uni-kl.de /icsport=5000 /icshelper=timeseal\n\ chess.mds.mdh.se /icsport=5000\n\ " #define ICS_TEXT_MENU_DEFAULT "\ -\n\ &Who,who,0,1\n\ Playe&rs,players,0,1\n\ &Games,games,0,1\n\ &Sought,sought,0,1\n\ | ,none,0,0\n\ Open Chat &Box (name),chat,1,0\n\ &Tell (name),tell,1,0\n\ M&essage (name),message,1,0\n\ -\n\ &Finger (name),finger,1,1\n\ &Vars (name),vars,1,1\n\ &Observe (name),observe,1,1\n\ &Match (name),match,1,1\n\ Pl&ay (name),play,1,1\n\ " #define FCP_NAMES "\ fmax /fd=Fairy-Max\n\ GNUChess\n\ \"GNUChes5 xboard\"\n\ " #define SCP_NAMES "\ fmax /sd=Fairy-Max\n\ GNUChess\n\ \"GNUChes5 xboard\"\n\ " xboard-4.7.3/winboard/wclipbrd.c0000644000175000001440000002414412262562252013511 00000000000000/* * wclipbrd.c -- Clipboard routines for WinBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include /* required for all Windows applications */ #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "winboard.h" #include "wclipbrd.h" #define _(s) T_(s) #define N_(s) s /* Imports from winboard.c */ extern HWND hwndMain; Boolean ParseFEN(Board b, int *stm, char *FEN); /* File globals */ static char *copyTemp; static char *pasteTemp; VOID CopyFENToClipboard() { char *fen = NULL; if(gameMode == EditPosition) EditPositionDone(TRUE); // [HGM] mak sure castling rights are set consistently fen = PositionToFEN(currentMove, NULL); if (!fen) { DisplayError(_("Unable to convert position to FEN."), 0); return; } if (!CopyTextToClipboard(fen)) DisplayError(_("Unable to copy FEN to clipboard."), 0); free(fen); } /* [AS] */ HGLOBAL ExportGameListAsText(); VOID CopyGameListToClipboard() { HGLOBAL hMem = ExportGameListAsText(); if( hMem != NULL ) { /* Assign memory block to clipboard */ BOOL ok = OpenClipboard( hwndMain ); if( ok ) { ok = EmptyClipboard(); if( ok ) { if( hMem != SetClipboardData( CF_TEXT, hMem ) ) { ok = FALSE; } } CloseClipboard(); if( ! ok ) { GlobalFree( hMem ); } } if( ! ok ) { DisplayError( "Cannot copy list to clipboard.", 0 ); } } } VOID CopyGameToClipboard() { /* A rather cheesy hack here. Write the game to a file, then read from the * file into the clipboard. */ char *buf = NULL; FILE *f; unsigned long size; size_t len; struct stat st; if (!copyTemp) { copyTemp = tempnam(NULL, "wbcp"); } if (!copyTemp) { DisplayError(_("Cannot create temporary file name."),0); return; } f = fopen(copyTemp, "w"); if (!f) { DisplayError(_("Cannot open temporary file."), 0); return; } if (!SaveGame(f,0,"")) { /* call into backend */ DisplayError(_("Cannot write to temporary file."), 0); goto copy_game_to_clipboard_cleanup; } f = fopen(copyTemp, "rb"); if (!f) { DisplayError(_("Cannot reopen temporary file."), 0); goto copy_game_to_clipboard_cleanup; } if (fstat(fileno(f), &st) < 0) { DisplayError(_(_("Cannot determine size of file.")), 0); goto copy_game_to_clipboard_cleanup; } size = st.st_size; if (size == -1) { DisplayError(_(_("Cannot determine size of file.")), 0); goto copy_game_to_clipboard_cleanup; } rewind(f); buf = (char*)malloc(size+1); if (!buf) { DisplayError(_("Cannot allocate clipboard buffer."), 0); goto copy_game_to_clipboard_cleanup; } len = fread(buf, sizeof(char), size, f); if (len == -1) { DisplayError(_("Cannot read from temporary file."), 0); goto copy_game_to_clipboard_cleanup; } if ((unsigned long)size != (unsigned long)len) { /* sigh */ DisplayError(_("Error reading from temporary file."), 0); goto copy_game_to_clipboard_cleanup; } buf[size] = 0; if (!CopyTextToClipboard(buf)) { DisplayError(_("Cannot copy text to clipboard"), 0); } copy_game_to_clipboard_cleanup: if (buf) free(buf); if (f) fclose(f); } int CopyTextToClipboard(char *text) { /* some (most?) of the error checking may be overkill, * but hey, this is Windows */ HGLOBAL hGlobalMem; LPVOID lpGlobalMem; BOOL locked; UINT lockCount; DWORD err; hGlobalMem = GlobalAlloc(GHND, (DWORD)lstrlen(text)+1); if (hGlobalMem == NULL) { DisplayError(_("Unable to allocate memory for clipboard."), 0); return FALSE; } lpGlobalMem = GlobalLock(hGlobalMem); if (lpGlobalMem == NULL) { DisplayError(_(_("Unable to lock clipboard memory.")), 0); GlobalFree(hGlobalMem); return FALSE; } safeStrCpy(lpGlobalMem, text, 1<<20); if (appData.debugMode) { lockCount = GlobalFlags(hGlobalMem) & GMEM_LOCKCOUNT; fprintf(debugFP, "CopyTextToClipboard(): lock count %d\n", lockCount); } SetLastError(NO_ERROR); locked = GlobalUnlock(hGlobalMem); err = GetLastError(); if (appData.debugMode) { lockCount = GlobalFlags(hGlobalMem) & GMEM_LOCKCOUNT; fprintf(debugFP, "CopyTextToClipboard(): lock count %d\n", lockCount); } if (!locked) { locked = !((err == NO_ERROR) || (err == ERROR_NOT_LOCKED)); if (appData.debugMode) { fprintf(debugFP, "CopyTextToClipboard(): err %d locked %d\n", (int)err, locked); } } if (locked) { DisplayError(_("Cannot unlock clipboard memory."), 0); GlobalFree(hGlobalMem); return FALSE; } if (!OpenClipboard(hwndMain)) { DisplayError(_("Cannot open clipboard."), 0); GlobalFree(hGlobalMem); return FALSE; } if (!EmptyClipboard()) { DisplayError(_("Cannot empty clipboard."), 0); return FALSE; } if (hGlobalMem != SetClipboardData(CF_TEXT, hGlobalMem)) { DisplayError(_("Cannot copy text to clipboard."), 0); CloseClipboard(); GlobalFree(hGlobalMem); return FALSE; } if (!CloseClipboard()) DisplayError(_("Cannot close clipboard."), 0); return TRUE; } /* [AS] Reworked paste functions so they can work with strings too */ VOID PasteFENFromString( char * fen ) { if (appData.debugMode) { fprintf(debugFP, "PasteFenFromString(): fen '%s'\n", fen); } EditPositionPasteFEN(fen); /* call into backend */ free(fen); } VOID PasteFENFromClipboard() { char *fen = NULL; if (!PasteTextFromClipboard(&fen)) { DisplayError(_("Unable to paste FEN from clipboard."), 0); return; } PasteFENFromString( fen ); } VOID PasteGameFromString( char * buf ) { FILE *f; size_t len; if (!pasteTemp) { pasteTemp = tempnam(NULL, "wbpt"); } f = fopen(pasteTemp, "w"); if (!f) { DisplayError(_("Unable to create temporary file."), 0); free(buf); /* [AS] */ return; } len = fwrite(buf, sizeof(char), strlen(buf), f); fclose(f); if (len != strlen(buf)) { DisplayError(_("Error writing to temporary file."), 0); free(buf); /* [AS] */ return; } LoadGameFromFile(pasteTemp, 0, "Clipboard", TRUE); free( buf ); /* [AS] */ } VOID PasteGameFromClipboard() { /* Write the clipboard to a temp file, then let LoadGameFromFile() * do all the work. */ char *buf; if (!PasteTextFromClipboard(&buf)) { return; } PasteGameFromString( buf ); } /* [AS] Try to detect whether the clipboard contains FEN or PGN data */ VOID PasteGameOrFENFromClipboard() { char *buf; // char *tmp; Board dummyBoard; int dummy; // [HGM] paste any if (!PasteTextFromClipboard(&buf)) { return; } // [HGM] paste any: make still smarter, to allow pasting of games without tags, recognize FEN in stead if(!ParseFEN(dummyBoard, &dummy, buf) ) { PasteGameFromString( buf ); } else { PasteFENFromString( buf ); } } int PasteTextFromClipboard(char **text) { /* some (most?) of the error checking may be overkill, * but hey, this is Windows */ HANDLE hClipMem; LPVOID lpClipMem; BOOL locked = FALSE; DWORD err; UINT lockCount; if (!OpenClipboard(hwndMain)) { DisplayError(_("Unable to open clipboard."), 0); return FALSE; } hClipMem = GetClipboardData(CF_TEXT); if (hClipMem == NULL) { CloseClipboard(); DisplayError(_("No text in clipboard."), 0); return FALSE; } lpClipMem = GlobalLock(hClipMem); if (lpClipMem == NULL) { CloseClipboard(); DisplayError(_(_("Unable to lock clipboard memory.")), 0); return FALSE; } *text = (char *) malloc(GlobalSize(hClipMem)+1); if (!*text) { DisplayError(_("Unable to allocate memory for text string."), 0); CloseClipboard(); return FALSE; } safeStrCpy(*text, lpClipMem, 1<<20 ); if (appData.debugMode) { lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT; fprintf(debugFP, "PasteTextFromClipboard(): lock count %d\n", lockCount); } SetLastError(NO_ERROR); /*suggested by Wilkin Ng*/ lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT; if (lockCount) { locked = GlobalUnlock(hClipMem); } err = GetLastError(); if (appData.debugMode) { lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT; fprintf(debugFP, "PasteTextFromClipboard(): lock count %d\n", lockCount); } if (!locked) { locked = !((err == NO_ERROR) || (err == ERROR_NOT_LOCKED)); if (appData.debugMode) { fprintf(debugFP, "PasteTextFromClipboard(): err %d locked %d\n", (int)err, locked); } } if (locked) DisplayError(_("Unable to unlock clipboard memory."), 0); if (!CloseClipboard()) DisplayError(_("Unable to close clipboard."), 0); return TRUE; } VOID DeleteClipboardTempFiles() { if (copyTemp) remove(copyTemp); if (pasteTemp) remove(pasteTemp); } xboard-4.7.3/winboard/config.h0000644000175000001440000001004412262562252013147 00000000000000/* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if you have that is POSIX.1 compatible. */ /*#undef HAVE_SYS_WAIT_H*/ /* Define if you need to in order for stat and other things to work. */ /*#undef _POSIX_SOURCE*/ /* Define as the return type of signal handlers (int or void). */ /*#undef RETSIGTYPE*/ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ /*#undef TIME_WITH_SYS_TIME*/ /* Define if lex declares yytext as a char * by default, not a char[]. */ /*#undef YYTEXT_POINTER*/ /*#define FIRST_PTY_LETTER 'p'*/ #define HAVE_FCNTL_H 1 #define HAVE_GETHOSTNAME 0 #define HAVE_GETTIMEOFDAY 0 /* Use our own random() defined in winboard.c. */ #define HAVE_RANDOM 0 #define HAVE_SYS_SOCKET_H 0 /*#undef IBMRTAIX*/ #define LAST_PTY_LETTER 'q' /* Name of package */ #define PACKAGE "WinBoard" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "bug-xboard@gnu.org" /* Define to the full name of this package. */ #define PACKAGE_NAME "WinBoard" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "WinBoard 4.7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "winboard" /* Define to the version of this package. */ #define PACKAGE_VERSION "4.7.3" /* Define the Windows-specific FILE version info. this *MUST* be four comma separated 16-bit integers */ #define PACKAGE_FILEVERSION 4,7,2014,105 #define PTY_ITERATION #define PTY_NAME_SPRINTF #define PTY_TTY_NAME_SPRINTF #define REMOTE_SHELL "" /*#undef RTU*/ /*#undef UNIPLUS*/ #define USE_PTYS 0 /*#undef X_WCHAR*/ #ifndef __BORLANDC__ #define WIN32 1 #else #define WIN32 #endif #define ZIPPY 1 /* Define if you have the _getpty function. */ /*#undef HAVE__GETPTY*/ /* Define if you have the ftime function. */ #define HAVE_FTIME 1 /* Define if you have the grantpt function. */ /*#undef HAVE_GRANTPT*/ /* Define if you have the rand48 function. */ /*#undef HAVE_RAND48*/ /* Define if you have the sysinfo function. */ /*#undef HAVE_SYSINFO*/ /* Define if you have the header file. */ /*#undef HAVE_LAN_SOCKET_H*/ /* Define if you have the header file. */ #define HAVE_STRING_H 1 /* Define if you have the header file. */ /*#undef HAVE_STROPTS_H*/ /* Define if you have the header file. */ #define HAVE_SYS_FCNTL_H 0 /* Define if you have the header file. */ /*#undef HAVE_SYS_SYSTEMINFO_H*/ /* Define if you have the header file. */ /*#undef HAVE_SYS_TIME_H*/ /* Define if you have the header file. */ /*#undef HAVE_UNISTD_H*/ /* Define if you have the i library (-li). */ /*#undef HAVE_LIBI*/ /* Define if you have the seq library (-lseq). */ /*#undef HAVE_LIBSEQ*/ /* Options -DEMULATE_RSH -DREMOTE_SHELL=\"\" is necessary on Windows 95, because it does not have its own rsh command. It works better this way on NT too, because the NT rsh does not propagate signals to the remote process. -DATTENTION is included even though I haven't been able to send signals to child processes on Windows, because at least I can send them over rsh to Unix programs. On Windows I send a newline instead, which wakes up the chess program if it's polling. On my GNU Chess port the newline actually works even for Move Now. */ #define EMULATE_RSH 1 #define ATTENTION 1 #ifdef __BORLANDC__ #define _strdup(x) strdup(x) #define STRICT #define _winmajor 3 /* windows 95 */ #endif /* Some definitions required by MSVC 4.1 */ #ifndef WM_MOUSEWHEEL #define WM_MOUSEWHEEL 0x020A #endif #ifndef SCF_DEFAULT #define SCF_DEFAULT 0x0000 #define SCF_ALL 0x0004 #endif #ifdef _MSC_VER #define snprintf _snprintf #if _MSC_VER < 1500 #define vsnprintf _vsnprintf #endif #endif xboard-4.7.3/winboard/help/0000755000175000001440000000000012262415351012537 500000000000000xboard-4.7.3/winboard/help/contents.hhc0000644000175000001440000000717312262415351015010 00000000000000
xboard-4.7.3/winboard/help/winboard0000644000175000001440000000133112262415351014205 00000000000000[OPTIONS] Compatibility=1.1 or later Compiled file=..\..\..\xboard-4.4.0.chm Contents file=Table of Contents.hhc Default topic=html\winb3mnn.htm Display compile progress=No Index file=winboard.hhk Language=0x413 Nederlands (Nederland) [FILES] html\winb3mnn.htm html\winb31o3.htm html\winb54vp.htm html\winb5lkl.htm html\winb9gqd.htm html\winb0nlh.htm html\winb85it.htm html\winb3j3p.htm html\winb4h6d.htm html\winb87ar.htm html\winb5qpf.htm html\winb75yr.htm html\winb3i0k.htm html\winb701f.htm html\winb1v8z.htm html\winb8ws3.htm html\winb55yr.htm html\winb8n03.htm html\winb85yr.htm html\winb2tv7.htm html\winb381f.htm html\winb1hir.htm html\winb3wmr.htm html\winb1ks4.htm [INFOTYPES] xboard-4.7.3/winboard/help/winboard.hhp0000644000175000001440000000105512262415351014766 00000000000000[OPTIONS] Compatibility=1.1 or later Compiled file=winboard.chm Contents file=contents.hhc Default topic=html\01.htm Display compile progress=No Index file=winboard.hhk Language=0x413 Nederlands (Nederland) [FILES] html\01.htm html\02.htm html\03.htm html\04.htm html\05.htm html\06.htm html\07.htm html\08.htm html\09.htm html\10.htm html\11.htm html\12.htm html\13.htm html\14.htm html\15.htm html\16.htm html\17.htm html\18.htm html\19.htm html\20.htm html\21.htm html\22.htm html\23.htm html\24.htm [INFOTYPES] xboard-4.7.3/winboard/help/winboard.hhk0000644000175000001440000030410512262415351014763 00000000000000
xboard-4.7.3/winboard/help/winboard.chm0000644000175000001440000025154312262415351014767 00000000000000ITSF`wV2|{ "|{ "`xTcSITSPT  j].!"TPMGL //#IDXHDR/#ITBITS /#STRINGS(m/#SYSTEM)/#TOPICS/#URLSTREc/#URLTBL0 /$FIftiMain /$OBJINSTj/$WWAssociativeLinks//$WWAssociativeLinks/Propertyf/$WWKeywordLinks//$WWKeywordLinks/BTree L/$WWKeywordLinks/DataX|/$WWKeywordLinks/MapTr/$WWKeywordLinks/PropertyF /contents.hhc{/html/ /html/01.htm@# /html/02.htmc+ /html/03.htmf /html/04.htmt /html/05.htm~m /html/06.htmk? /html/07.htm*T /html/08.htm~O /html/09.htmM /html/10.htmT /html/11.htmlw /html/12.htmc? /html/13.htm"u /html/14.htm /html/15.htm /html/16.htm'~ /html/17.htm% /html/18.htm.l /html/19.htmO /html/20.htmis /html/21.htm\j /html/22.htmF: /html/23.htm /html/24.htm /winboard.hhk{E::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content7`,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableb=}>3 Uncompressed MSCompressed{7FC28940-9D31-11D0LZXC (0 *<jc΃ `' KM HHA Version 4.74.8702$ html/01.htm winboard contents.hhc winboard.hhko  T#SM=Y3S03^U=H+(K۠+mk{+ko@Ff %BIkI1e# ?6!{j[]^f{/ɶiF'_شE<+:+dqi 9|pD#VDF d( VB'U<xC=nf^UfT ^#b@NaJ*I%]!ijfTYXK:+jq5VVQ٥aS7oqhmQMb %d1ʐN8" a"#5=1P$ȴƫTuj'֤@5(CC٦M4s)Q&2Cx'XNh4` )1 H;Z]9Q*/PR.x ? ylWAב@aTdDֱ֖ U4#N;sNNQA/{5nSWu,;&2D|GZhK$Hnr6mʉ_#hHT 5: d%b1p2f0xvTF=c-]h>~pF\NL^El '?6'_9:(ǐiK9M(>d+aJQO5 Cj"~\P&f*h1ڦ:: AD-4owڢI!4Q`7xCE)+ W;!90hrth>nPAEY,Z1Nihђ| ![*Pp ?cS%Q@J Ԗrq;udUf_o%b480 Y{jh'z刿 ˴N撥kk2 @u?@+*w% IW2#+\C5XUx!5%GskK [gJ~ /(<_J0'-}ה8؎bdY*ODMfzqaЧu4S;Ж֤lՐ{K"pR~x+t5m#5}]1{#:ԘRK  _ >~| OKd0! a N*a /0(P G`6GVc"-qyo5+5AFQe{\p6&n۔- \Ѫ'%ȖTk;sh;5<)wy[}U6%KC@l"V:<7( S*7ݻcwI&p%"P!fE .xҚ|D$*~ciG9J 9-A]DG,R;lp9(爪!vt8ݯpDSPoDiR+r D ׾tET ~ C @o,y?}3Pn=-A$UY 1媉Q"bv!Ԫpm[0QzUrN8 91lP.Y*%XR͚4)SSyt˃}4hRT#c̨)$ îιInlÖJR, [GX:QOyKltb%0Q h.usFoJ3 zAI) G3 BԶy(:1ʼn!2W7_RuJ~,v >6Ryȷ)7uꍼ ?)b̴XC+Mv,gVBDXxIr8%@Z>ډ7x/} }hM`dĈ%];ELvר'So_ E_yAT1]^'JO::$2k Gݑl|)=0lkqͬWũ:3j2axtb3Yk-G`[3GI+o+OC鷷5'?YC<0_:EiYb*(oA18 &;2pw^,ժOQnG&F<)`7}Ʈ4ix\wX༶.p)huF7B( Hπeqd{"gec8-NjTum:h?Y@*~)LM{9$a? DquW ȖNMr5B98m.1ܣL}fLW8~ثS%)4f{_ t eefM Cʄu/GDrW 5pbf8뚸<\C uŇF73dnAq0x)}gi0JD8[\Gza;hb-NpSR1^ 5B'LKkӻm]Waip;=f"qkYTg_L &tM9pqNWfg9ǒuS+vt (&aX@6[xtϚxkT(>61 N̐ IP:416D7k+4s!>5Dura5zi6v WHjFpzLCrԱ:؟cn1+!QJHUӸPN?|`Plpc0}GR&-O{8hQKUhØg4аj'D:CЈƮژ$n]ҾI e4U4pgvmܓe"9QA_03w]2f$|F d pӿњLkD`Q1 IaUoCiAvdօ|Rg;7v[ $\Z4m.ח=+OZ.L"B8+sH#)#Ec!b2[G@NSYs󉧚јaiӳpŨ6cX Ka$ktg2bIߚJ՚GE㧉94fNd$yXل?%w ~^DȋPմG *f)a<`jVƾfޔ?hAy:Ee;NF~H֝ m̪73R"fQܙ9VOMl p Ē|3M@B*ء棁\xwŒ-~ATWsƼ;! "MX<4eݸ^ъvgn1VP6.Cc6jdȮDž$n1yϛ$wKyS$ 4`8s=,tπ*`|G(  ^T@&6S*>8@MFY:ǀntEjyR>*9r 2Fk;LPs`Br4Ea3!>iM'cmKιqyW8&;/°yDIIsN6 2R';A">&M`f%bIA Vy^N6j3 4MIuVSrF,y `7RirTh*9m"~mv* XTcbCVjj"'T< v$Ȧ~'b'#/ϓR۫triʨ@~.qY`KlfXVL3Xwe\Ҩ%6`f;`vp?ȡCP}d|vYd׿hNB+,TL!%K! pء&{`ue?7G]HVGV:0CJ:}$78؋rτ{t!N"2pNW5s8Q1"bB4fʙ0n^ IH` (X;옾|#邂*P TQ^@CM^e H(5$/!L{,tz-Cu!v}ttPfco3 ecd(굒 <\Bnu{hQ3&k *PPT$Ntt73zu[^S,i@4.̊uDBBo5gݺi?RT]g*Pe`yTN*1niȷ1so&c:L̗*L1ĔGܒ)3ӑK+s;B͂&i<:xό"7HK;>-#13?_>q{-g6l|{]'.%;>G~<cKOܞuj938S~?썑(VMLdwӑ)'!]1dCS ;>ρ IVeK))%}&uT5KўG?ѡHJ},O?wEƞˎo)WŸf;{Ik5֞PSR( E6K $lΤuJ w5P" B>7֍_"=t:*2xH L[75&wH ZY^ҴQU]P #IrT %(}"G]dJ6N;2h 2*?0Ad#XAFށ(REhUB.yLTk(PiFgvD-(i*P7iaPPG@Q29[[D[+-TrҋJqb ХZRf7m)ժ0g+te{) ɘU} WEq$FCy%U*Fg6d 7ffԞ'KJHï^͊Xњ] 9ٓ=iz%-s-P3](#^8>b@6Um3𻂪$}EVQ{%>T(οnhNۀvTHtw[{w ,q,C6;pPl #g & ϯ^iİk5 4:,GJx'p BEKC,GBO2eBz%2H{:!nKB&,-dnV9_̋xY75 v\S7YVqms,ma0)6|~2,,- p-R|z&;1/ֺ%k$J(aT\NT̷YhF[0sd&2| Gt)L_״XTiR L!ZtY]e0czKy!Δg~t^‡Ged"oF*n.Nzݢ -\eZ^l]YCF"5J+^:pBn/ngQ/Zfd2:SFh'XiI~VXܚ]bC*wm Pd=$KM+jΨu[%PZA%۳ G2|l rg֣ĩFP=2KbwwO:"V܎.=o# އzWt=IXХEjf2nuW^UD3&s ,0N$"_||t(zUʘ`S*>gv2])hSVkt _Q0vLQ-'3jWvZn^߭$pA"sAfvH S޲㽨. i᷃BC)2@7\ <ug!( \jH ZM}WmVYkSQʭD3H_5 JqIVǿ0u?"KKVa$NWiv-Z+zRM1=o;;RힴZPEV4k6itDiQ]Rh0<bXл:Iz"[EWܭ[$_y2K&#j`7ldj3\Ô6d9 ISpm=U܇']l~x 4jHZ.q[[(SHPt&0M m'RD[,7!ڬJClVQycEаח11yvV"x .8KS/5d2B'O8@@LһǷp#6vPϮӢwsx'd3̈!qsE*OW[ )W%pXmwFNxSJ'Z"3MQh+Zط|&w"b]q'qE m ,;鏲g$ 1EqG I6Vim҆Ehל&ۓ0%JRJbo0 HC]2×?ʓ!JeXP|E&1~0ʶƕVr9Աh%2t/mCTL` 2< x@\©9[ _[F;TCR-/¹aX.l䶌PšI?R 4tsg !OjH71*s}nF `xMEln뫡"c{? )"sYWc5LpBT|\< oۉ*jtҋ}l5*r&Rb%Ẻ7}R\OȎVS|ƕP^>*oXXpΌ1YIF閘@dH̭q^)F{WU]Vkq\őW'ljn^?Kh|ՕOCyyC2˵amOxSsyi}~LJ<}kM*s*=3%/*?ďB`PZ:}S'-xEۚ0 y^\V' a) -W|! q`\_a|UMMg &]ٟT.?49[2dv r%.9 rC:6o76i&]={s=h }G-T-ƙ6eN%oh5 +fN^hIנT>G+=X.|!dY/}H/2yhh{z(%JQ} tMY-hAn]e->E oXdơtW&T׹fK$! U&%e˽:#2O&IcBŢT]wc k1%\yfǟo_luW3Hcw!#[`^ɟ 2bf3mkg *› ^Dg pP_ ^G?1y*D_{1 MB`<谊۫#deA`76 qK,iIJ 20d3^ ԁZ"n[]Ϗ mS7y[|{V@ %~sI&1-wJ;W%nd?E+/% dK7 2 M~?&G~ ifg 2p_lXl@v0OwTŪΆ0@%vҢ5tQ^ 3\n,P.iE<%V/x_| LOuT"GtrRA;X@AQӟ!@Y%Mfi ^=j2Z 'xȻ Lp1Ҵ-ZsziXMg*SOxÑ#2iZ7ח#ILI^DPiḮMrx'E#M%CJx_Xh2D-cND"$YGB)7pN7 Yfkha-lC~{AɁ0e Γv#&Z&P9u>C#鐄4G8^V*;u2sZ-/sd9>hv/9,q$///>,V XߠQIOhvis=jt b1bcD 8E.[Ŋb"0e$s3O"MTVZ'QjwA]? ΕY2$#H`.Rs햺p*^[SÇ5% u0^Ʉh řm3{X8^"$0Cΰֵ/hӲ>ӓw@ YYTj<4|ˏzpS<@bD1b @Ի#u*Iwz)0'FXRp1H=/hs|`Jqt[ikxЉj}<.sјF+0LY%}i2cx*R SUA։ABMuGZ2е< bEʓ薩" ]c Zo*hSHApEAuD91=̕[C[kq4D^c9`Hy #)v6oIfl3Fv;UX{ɲ!;k͑ܥp'6?b ~fH5at*sW6|jE ! @8pW:31NE奍π,|ukȫyEwX1*)OcvJ#dP"؍ćmB4Tm](ZUF ܌80zי\ˉ8MJޞZ-~T(Ŝ0 %ר11|ΎzAvOeR-W&s>"U"p7FɻF|#ޔm$CMX#ZA@eCGq3t3-L|^'*xPcMwgH05h'U%5?c 5Ɠ23/Æ[N>TTgn[d^+°ATH] 282j<^8a<`j@И3@*ԍDH1 iٔiMoMMw(_l!B_NRGֵ ū ;bÁ}twP"@+D'@|bRI q)R7G6Z1~jIjǪDnq](Y~@uDmn絩wxrUsd {%y!{B/o68 i鹊-̛;8u=D!(=_8i m"o g]j.+Vċ! )wGsM dDG%b߼S nxQՇǠUWU :@H!2ù0&] r d)0JaBP<`<$?" 8 N S|yQ^H!_ / 3o8X{dg]b;!esP)(wW_/fybE-6 0hj'5[hS@.0<̘`w;1d&o7Q/8H KJ@.-0Aց Jh:&XVL`LmKoM/~ޖjexZ}'U Y'HM.ظyc?ٞ1;+=W,3bV5 s2d' yޖ83vܔd6Gs >2Q)ē&SaFe VJ6َ|-?$jfK"KU?!q\'6̺K~v<Ӄb6WtS# ~3T4>$<`7=< koЇ[ί?ڴF)A$$&,yWP0pA N%еrٛ^e)% b0AEo lVV(Hy~FdW&%:6Ͻ4U7zzQ߶CF`]"KYDi>&Te+(}CQH?>gE<~I4ߟG}7B6 Z&bPJ?8ΈOL~TÕ2ʛ`: Z0Gy5 nB;UQ %N4x%SNHڟ1 Pz$\lDǨ\ V08\`u򂟐uDEi} QBW9\Ws9K4ب`S 9J=];7f t*ҴߩnaK՛^d+d8PAGuAd eNrgTŲXbjbG`*FEehZMԠ=wC9 :n3p[dB6p2?X :Wj:|ӱM|O`ʷo`r!gQHnTFzST2!rQ9v;0?Euɨ9BOQ$1Aׄ &m?TxIPM?_usY5oA4dkBP;xܱaĮ:(~gl P4a)#G!'(g1ձ.;ek"~`e%Hlo:3Ӽ!RO tPĐ6Ez$`8n\qvsTQFTC4DJhh )egdixA8uh3m7lOgƚ27$?8 6cl4u2U؞{ķ|م¹ 7R ݵ/6! RPLUK;O45!fBa,.M.z\8Ň G3NJɡѳ_\^3EM)!5[d'PLy{u*$D ӓ 0pswk;Q|`ӂ#v15P2SP4oV*ڳ;.6W?H9Koڻ {fg8!18ݧwtݽ{$w(w{3;n󡨺UUA*Pj,X<FZ|a[jZ9R=duL2sޜr3ITrոFIU"(!=@@lGzCtT%Tx|݁z\%S ̃| d¼pc !A2o e8g@sa88b1|+FJonV czzˋԠi9~|*L_|uq- zMV 2ґʣgvOFfn`l  X>Ȼ󄒽2"@tA>LZTީ.&N?NqߥbfwE WL4BJe&ϋ#LCmd2pzLZV2"sBlhjHT *# 04㇉z SA0*-`ߧ 3lҘNz˛4cFr HQ/e*7}f$R:35R;72!nӹLQA/Z,@[.p )8CuJ-Ǧ[-/U)EN ^8[3B].1iX}&A2m?ybQ=yŒEW sSn ʉH2ᄑOptp^?';Z|Q ~i?Z'Y@Qन>X2 \6bSsI}QKvC%)\#͠>"'bHfU.K!PuȾ̺bX8jxV-5ԏ*Z3.XcN !dH.Zr5LID!G932? PIN4ĥ*C 5Vand}%@b2@Y:4AvYgEx>dڦ@*/|Q 8cTV yr4Ҟ9a嘷)7]Ct}SvpGr @xc0yvD֥g(3Z(jen@ Y{RGko6yۗIm׎}{ψ]" l̮JwPԛ@>\:JjE_K\&T(=U|cqL@BtN!c8e(e\0OPVVZd]SH'Yþk\/XUJbCݕ1O}kw%c`]8EO^*Y'Q"& Y%SD5P\tqKI>"9$Mi֮>neV0*ӕtER/һObYzŸY=o/~2蘡 jk^1/#bX-YoKb;Ԡ?x\@B|[x~Eʟ:i|&VGy9߆KӔ{XC4TX2klתpfCKɁېKEJK\+ςb29k.Y瓹7hNlXVF\P0<7 _;V l)T4OA9BI0b)aI uj{@x,'&z%缛Jv֊M9)rᕉxi`NhZ{gt"o۾=ޤlP&=֣I_QEXl ? ɻkcV(_ n PX؇coֱGk[]3qZaPn}(0 .S 40vbZBOMmǎ>. (nĆ3Y'saO'Dic,n#!3JZZ?g^ؗ\ &amTa 'aw?}71 =5(ݝ\>S&sIrHoph3#ړR@ޅz_7 }S}wjiIL_9Ƴi=ǫn[wXAw8=$7?z_d %S}Jlx Zj~KOFVl8F5e>:pg f!ҫix1ƹ4oZxArUof4OccrtP ^oNyE~><͸e煗s[=7] )kAwZȑ]=,Ap> K1wj\jm^fcdRbMd1L,Q{ʼnp"-pHk^t{xak^0 fnr(~ļ*o+W$kQF3nj_fX @+,L0V> S\L DpN"A[H=ud]qmJjo'LWdS?𧂣Vޥ# -vr"<76Hr2C;NĪ2IJcx|mZ8eL6[EX6fŗO8ȫ=)Z ݡx]%^fo鉛OI:1ݧh!m nSD?΁έ PJkۘi{ ˁxAʉ_,Oлɀ+d^A"qHl$?WNr=ҀmZO0f %Ƒq \g>UB6>`lU)!0C!fHt^ȝ~ q2!NX;ܯܥ5zJqKTQ)Հ].g| CB" vߌ _Yw_cL%OLxiaV$*{?i.X}7?/-=K hp/\Ē3ݒPT;WoC56 *+ȵIU_KwӔ0ɗ1m_"zjREƎCˎ)sNIxs#vKGQ(=S 0JC,6ͳzRu1Vҹ.Oor4*4eȼ}( b|B)Xt ]W9x_vCy20;'rr2zDL %Eb)`|"Ti|Ojϼeŭ6g++Z~7;|ܠ?:dFqo @a!:ㇵ/Ḇ0#r*DM@Q6i<`jID ,ԳV'}&wCkS~ݒp^=Q*-PjPRXp!X IcJ!4qbЄtSFIJ9;y߶Voh2A9WTg|ס i2P]#Th7M X.R6Vc%F~UZ((9!S ARiH??&`0@,G)i M$3o dԀEG颷WfmSxSum^+ '},Oii¤ 2)ٞ:ˮ;Jڐ+|L5Jª/yať(s1`ؑYݙ~1HʕMx,υv?L:>@)&@Jy]$FT735w'vgWBU9L_R#*B-3?X:v4RյP3(TP!H^4 1QQ!m5F'$+Wҍc[[<3ne̸d[jX6Ës81n]_,T"}3K8vԺWUl7xstCf$#NGCb,4ZgO&qO*S^1*] q ywgsy&-zDmEׇ5?^sڢ7d-0ѵ締&b'e5Kf l9Ejo}^)u@ Nb$|u:$I17{ir!w @@dje|ٝ+;n8d7wqA5JY:'+"|6v7Rhsp"ο ~kRmY NDV:fr'*T臓G9zMtX;0$wz-]l)Qxb]y|cx֙Y:i_tlvl:(_; 4j16hR>DŽreDa&.O@P%{8'xF8qk_ϙ7f)nc[nMnVa3+åqR< &[ƕr~ZgQ\ע6 Me Ii$:^s*3ezu]K0=袨MEErJߜ@9 .t*Nue\=RBtFb Z| KN[ <0ZHo75Sb3M.[B{h_WB{%slGnB#Bf'o'e,o&PUr&\+/o'ܖf_&m#쁩Ý0?e8`zP2;A ]$Tw$ .(~ǎd/!0QQƳȚb;+NwvGܕ);Q$~f&-K|ye[M0['wy;,PWB&6rۦC`kbW' >5{;?eJI Z* r[k- eÍwH!%'([T=&nJ@ ù7fѡ&0bž&A+;U`az7l3"NMK:_V!oЪ{|[1HhhA7y}X<ݔ}LrY*^HMs˸.ej.,xc4bg*MwWh,`Iӏg9GYIi$ YBQ9溌_pLrV}WǝDYclF5q,XXZG}Eߪ{EvȮTZYȴWمd"p A9߻dpp`! "E2xe^l趾A$'Br]r qQAib7_~4aդi Rz &Eqr_R a;ݶPbԥr{] uq;=\٢MBrc+fV C*e79ΩM|L6b:œYw3ӢL.HѽVFpwa.%fj{JݶzTLvܷℴI&zY(ڐ(&.vݹW ¥ds_+ b zhL3Z-u_]r I]E~I_,vW%P݊7,0'8|~jxJ9:+A9O;nV߱ RlZ4畗j2A{!)v=_5SwƧSt -2S~T{}Wkߛ?M]ngXߙ O ,@^f[0uh W5O SFۃg}zf Uc)E4R*,D*(Twɫc7R 8]l:YUq4ZQKȚCg3gsDbp9.{An:c ^t26`v̼Ro6ҥvUl+C9yrGRefw4 rPµzꖗgًk.o%P V+k犐/Q.4_i顂U铯Q7 ٴ#O|չ\:fwH?Rŗ#<Ih£ȕPV! s0{qjR-I -v_p+ 8#߽'yF@;)]/ˁ_z"ۚ5n/+yg>f޵eȒE:.{#=F:)0bK{m=,]'٣~Yݴ-`7O{^K6鿞#%--ox{o2PY}zwd{|Ҷe4n:a*i#WbQw/=o%|kRBz`D&Ihbj>˰I^>*'np,SЌ`.̶B>IyN+h»q8Aʼn{1 fBkJ_+O-ԿpsCd*4綅G^U;rB|#*\u"3f/iINUvJL sBV}! a26 D1P]B\1#:wM ^ ^ 8!C0diV?8=S6;'w-"| :ir5{cœo).1߯Wr("m\^,b5xluںp/n?*:-A\Vɻ,O(v)(IufϼQ8snZq|xBUr"TN.]ʞ-WS?ף+ ak=? }yWmŞn@mO@) ( j'ZuPT8F0͢{ @3fO~~᧤0z_AA;hpw(/׷T2{0:#.O%z-gEON#]@rêX* Ki9]x{5LQia n\R$PJ}8;HH(5mjxh|{]ׯK_lᾴӬ$vn'okg5ލ\:bxAFh<9`14 ?s5/r(-8zIC+V QMjObE܇mvޝ{ eKc+7޵fGd&zӖjfH+}'JpUsAhBA0 ηH[#==Tأx)ErECLWMvRɀ7QY gK@KymFb!vchY %VTwBOݾPߦW8bp/r+NS8;iN@f3c1h.7B^VD@NRv#!)c BνPi1YjG&x;Gi]aEVӓq5o7*CCH$u57gz] *8Ϫ)vD,Mh,R>M}AҬݩuHB Fk(}5Z[Nnٲg|.S0q RiR4S9R7Y=pU-KBHf\lSc9W^ )׏>nFp@hn0zҾx ^.Xy);RT:݅>_ _:vԴ}uB؉XL8b+-Mla!3DblA$p'o~zJod:8L3TPԔSfk@sE68NhdNS2e{%ʤ]MQ96\/%Jf bvFdx=L5_@ڔd7#VJN SR >Ć3+H͂B !*ZI9pF]!!U#?lz U[D~w҈RP:i y*6sB;j6*4`+R #88AqÚTZc6 5"V]ӎQϧӞux wi}td"d C6mċL&/}nм:sZg$u9(@qm-㾝sR6 !$ d r zg!O*l !K>H{l6|"Թ$^̿Y$YQa ݼ{H3~Ԏ7oȁ<0!gHR#D(؄ <lďAVyүG/{nǨw^`ٖ„#dTkPhEbZx_^+\,$MͭdzZ7Z1~I'Xqɨ׃<'-;"} 3乢4*|%;5:k99Ot .X@H^x~Wrwwuǎb@B\aTȝ*R?$:vr^eU:7?g9jRch eȹҍns.ʬ݂Akᚅ*=%0jKQկыzvgX~U.A[Q#3t͒;K`pSĎH:noUrv !')2곈BWufXh*$B*爦34RrAA{9d`@ j~9~Z(d:t*y 䧓%g܃T4-~j41=8_)2F?K1t ɆT &h` 5Ztf@#]9x0ր[ M:`5)!@FĎ!S$kδ<勤X*}ZY ֲhTIAw+ +9dld:lc@iF$-=2cZOӡ`I: [wxff]uK/䐣gSaJ NP/ Q")-y1~Vq"la(LNV% [uU8x!o{{wc>$!1vN JPu韂KU"C %5 .JXgC[ȜU/تJ:?"輽$gˌ@TTT~BvNdyMjXPoG͆b6*XjE]JPRQc o@x)r,㖗=8u'/!٪d)jJ%O&`m (T,eQԈ<$r(Lg+CY'?imz\Qa{wV%wMrE%);E~~& W[_P 88"T0CWEG#(o+H(z ?X4=$m`.}=J#a?Ҩ7um䳵k篕a͗i䰺v)1W#kvJ=hȍ(F_ᄜ|w|s7j5olR:5m9,_rj֕:gGu>RzO=j푅܊_EmsLî#X1=<0-8—1H97FoFYVH6;D2lBNif6 [rvA]ju{:)sj)&͂_}(ɘgř<"d!nΠyƟW4*<:$ǴUf| Z|K !N-cP_fX.g{5xYe\bIlS 5A~* _gON<7LW)| |c瘠:*m ܳLդ~u*QH;32W%Hn >n<:i *ԫǺ<.mSV;ǙK'G0)&UǠ NH&d(`W;?kl^|>-|m`C"R$jz{kFU&P w5Ck̳pf氒߁SlR] $AP7֗6 ߩx-L+!exy%cYMZ{٦~hSx?Wt;~E6cV1M} ^)q ptqUR>YE\f)3lVZ[]c͕>%/"]tge5SPNPf]Y84pЪ+KyƉptcZaLK>noq4u" qo)7*:c0c?©V]#nc%} {ZێrNr:F][2\>HYV#knۆfkFGp[_vn"z mX #)X1tpDBv[7S$~-W!C1;B;Hd 5k^:{d9lfSVJԇ3;4C8ߚTYs1ڔ 7]7!ቼ: p=U\YbNcWlm}A'"ӔD;=+P/QR)[JE]ЍN"9ç6iK `d'yO윫N19_n$tJ5V&cWPkPL╚s]3 bD)oc\z*tAv ػ]Af6EuB:zjJZP`aajOʆi|yiɂb7tfZ@;J2ˎXsb8kee# πEʨ@x@H: #ʏFZȈ%G_Ѽ[Ev}&Yf̝ڈiXWʹ@~}D`xpXjt=hI!^Hq3x h37 Q&Clj^fh]UsDY_fKmƬ+3^mu!釔Y[7-KAvY>lF~?qcaezgŒFpGlv XbDV6eG^v( nwͳ8d3Emk\ZSPLݚ6m+V3H'귗I2IO}EB(I/z̮KlɡFJ¢qhA,z~' HrqYjr0R%1ݻ0Y:B'Фt:}: D#/]wi!1L۸[0%nÚ0u\T 1:'N^i`"LdT.QEE]΀ ~3/so~L'=4PgW.=]:S)D\,P9NB\h!Dc/ЃUs 9~^ȱE>Ѓ$bd ׀#:-@}KNbWe.@XpFK&b$du!7s#IBk5k˲U#\cƎ^߿\;LpP~moAɁE 5FdE4Wm!HATIvx RVZM@m}t$d:GsEכ7@r K&l~s4l vISW<&%ZjJ$~ ':80)E )_Ek*Y'kB=@ugʴ"yJ_|&Cʗ4*A#N"o,!xr&N&eU{#Gdž&Nмixj>\ĦYyry%(PFӡh"}N%ɬHq -lD :}p`pG 9t؆=,Η7j6??#i&߯}]hV[3cuUg{fwJ ث Da[д!@wAqďMRR-Tز5F'Ġ &`O+9r/5!O#?r}W˭2*'6 [j&T/KI!5h \*4NO!AwgNjtxM:~M?)YLg%wh=d%s5VJ3FO?Ik'|:w0z pk,=`]4ێZ/3)f5#T9-tJ}*zđ 2ʣBs}cq₅,},6=ϴYE -6gbI], %'{Ǚ.29jwyӨ Ie_ew9Vl \a8ulAM'}P me+B.gxW&@ SMʣ \b~Kvb;Tl#$Nak1pl'MW5:;bS=-H`p>u7=MęF抶Q]q4*HR4,UtQ~12tWMXUyH+ҿoD0_9N,ԭ¹WD1=+tVG$q]A|بQDJXkj^*v~p"&u_ Ml۬b[kpF۩uR)I 9䫻tm VZbۅ*Bs}8~ó G>9HmUݿն9Gs~=Z{ jړU~X6*;` H3,lI/猇Bٽ'7 :נ"p`rE ^Eaא6I&Fj"xd=KpBvSHRV}cZ2舢y%bDٲzU'1˼<>u2'yaEV^۲}5x nPsz ,?#J KQ^unЧ]eѷytVØ:Xߔ7Nӊ@tR+i.TH엟 "S3oxQ0>&sL,C@N8eP%dl7'Ii1:XpZ6Ma8'X~T[g>62Zlgԛ &d鬂gQK G|B L`m]n@FD}r/]>WNS>Lh:`+ #mzhqjP<mш*Mɲ,$. "[< HJ>>Q&4|΋k(۞ҩz~_֣;h<ȥ'5!^hƝa1zobf"H~EӋsdwf2О>]sjZ戶yuWd7[!HUbzMּ*OGt'RR}ЛAN*OJQq.7o]R%gWW4= =bLt z]KV}ȕ:90[! ru0BSah2=i+;qn 8.vY5s5aj}ٛ[F6v悝f[UpW-+VmkrPV#,M5a%`"I^`P2/15hNl9$||۷`r;!sWh:U;*6"!_R9K]M9*zPF9XK"Nx{JMSF/Xҡ!e+ &0l=BM uzǪ@ A]s)A+9l8?W!޸>}Dž6y \oC(͝J?^h)͙{R!bXfO}Bx8 QG̹zYxcfIcP/)R c/sE:mL:G]Б$bbEK<_J%MaFҐSu@dέ@c*heV߆Xz̊Hx',mphYCɡk  gŧR9Ǝ2Jv)F5f<:%Hm rԥPjIicnӏY^-%(b;fjfSԚVUiÈ!3uQCRO"pK:NrWM|(J#tL~SU'wXHq٣F1`d#,:LR#^1xB: zL[1 *7|j8`p?kxix0衑my$JIT:n{Q0~4l֊P%R=e:Ϧu fI qQdgd*ve9j-ׁ|@QUnҬCFA|r9 H<8}0Lkɸ.lL(ѨӃ8  TthY(# /LP eD~P[SYJYpF U~|g+FP0YӔ3ES͐OtUi t]+GMȬ*8Y#L5\,dXz~ź Ub.Mmj$I«w`N/(7ԇVMh6-6Ź_geІ"ŝZXڃ[sӓ+=~;T{SHno`sLW}k3tlb sXbe4(4Gw映$ѱ&;'cQ^M/U E 6Q+=/[tCScGAA]Q-zTG$FlI{)@K(l\R=6UQp6:uf2CLjmjdzf;>:E.\º,n&7ht'R\*ݵ -hb /O|nq@PԺA`=dU G46!qUSN4+bheBvӂ+9Sy03m᜾%}j8,ʳvk:}u:Ã/z0"C4Mؼ3cQi)).aAV? ?>wEsḘJ9E~Wkm":._ˣϣLtS+Rp֦;;$ M*`{ǒ !Pk{MqZNA.C\~4F]Qhs:0UU $_%ܧS͍Fjۖ']4U;x=U4$hMEtXc)f?wf$Wdz~%Z[;3dF-*^uV@:eu.>C{QM8&8-[JaËՆmPa\fl-X_Y4Ѫt5;d'hvo | `:i VȦU:<* UFj޿ Π"o!Ԧד}q{ hCH`=R[w5?vkiLzփ%OVfY/WH',?햑6ۘw#x*Xql׮Vdr%F7_ҵ_~ui-DҪiD43n s鉶!@;; hfC4Ӯ9BsKw8zZ;/&si#N^ sA'Z~޵C+u#SY=i6NSmԝX%+aN!{- pQ<_[SP9i\*474n׌{(Joz/OSJJt`5 Uq"ܿ 5 R.!{N"\I$G$jitOew"YbcmѡXn(&3+Lu@gE{z@fje$>mJsD::IMʴ<%feUwUB8aG:V6I0[P5:70Kh#/*%=~t{}4$#'lA ;=޺tbVENG{$""E7 )e/M==S3ˑc:(Td{4C`6<{p;o*n;il(DV^DV/7f/*ICGi@enZ|S3{|en2J;.ӜviK\N/]T|JȖ"R.h\IC9!`Vڡ5sBX1+->&Di4 30 Z1+tu+C,'D]}] SA;u*V;ExF(wB|`ķ4b\%Dv*;ɟZ48`-C̣!CT?XP0Co՘Lvdjܰ%'ꩫ%[6a ,BvC1w%Bg~NwCa2v}`v'XyUb:UI`@5^ן\υ[ Iqss:O"|ډc\# zf/r:IMsz4 Śc}*p<DZSIT$k ޻dKVV<)G?e0fbs9N'iQvm8J} @ Q9#!k B`X znq?`3x#1alF&`k9A@v[CƩNk>D8 6@Ks.{iδ\VSKJ# ]R R-w)E$wO֢P[mDwu^*9<4ɪkڅv2&LM\$ 4ڠ `xS/ Ֆ橋!J!!N1?DlRI_H!c(&J# U +ջ7!82'.;qpF-Z0op\%rT&\/cU* ό P_,pM_{ڡ/_kyf:O&hNuVlce﨑I`ӽƭw OfcȞT|)s&z=H†㘦g4[yY?g[(>!u-G J2 0s[\eddJa[7ZjY"@& ӹ !;0kLplspsX&yj=Bˮf9 ٥rXqhALIBbQ~) Lʏ =Mk !304_=!IJa"$Aw([AډG{!Hd+ƚpڷ(K9~ 'jZs0 ~" 9|fr9X%.n/ RE;xcCEپp#/s%c^G7&Xn9L^]V"TƯoyc|N>jʅ;A{=aGGO6..yxC.O7"}xfj(ZK6*rs]b x_}w"FZZ H[[fuc،6[IFow /r\qNxߴCY_R%55H,_k̟I a:xR'Mnd>% E6'e<n7!m-WU1JJDC dT XxeG{6BRIK/(k5&j.!#2 2 z}'%ٔxgAߢ~ `.pE1=W_e(+KCMWX{ޏipqb0^?HH!aÃ_W-yKy1y|PgvG/?ÉܝtC#a.;pZg؋FIvo>;&mA{ kl:^A9F (ex"UČ@S0.?"Eޟh.r_p?IzjOޓO/ oT+Fc[&q@8hRLI3`t)oВ}L^Ou;~- `yy`F&-a_Ua _9~%\~%L=6DY_:_7Vۥ(eXx1idCPb =;7WXUZ/cHΉMbv`Y2tlפƆBә@E蝀o=R['fLvͱ;qӋ&3'aXHIM˜?– Q<}WI{+ulh(G6.%W߈֢7 V%hXRȔUErK`0AwǠ-@+v:{":$`o`i玲CGT3(yTl!8 ;|W/܏mĉM x-8)q9BQ5I8xl}T/LF+H"1N;;%w)tBE盀j I#n:'k 䘧 {X~FQrt(s/d%M`++]1~M}b{2g߬|fEK?S$K}MkDjS56ГZXrQSD:IO1?ҡ& Nk@M״xٛbd+o|&.jJN«i ,Nv+#'#vHL*U 3ہ7F,NvHmȕ{Ɂol>ocr%}S^S;zI*?,„Lpغ c`9Or5qZj ?@`߂J]S}u4Św1a1Gē++RZ%`$2tj$(o Oul}QX<;hfтQT>._RXoMlbFG^}Tv3`c63J6r}jSA|ejN|h^.bbx gX;SCA>b>ӡ0jS;fa9XcѴeB5f0]; F`\OpT0fpudu[-֔p`{%:wk]i= rEfXVUx֢!Q]8724b6I;c)AoR?Bby%3A'5F򛳱vm #VE;% jފzP^|cA/L%n nJ5RZ fp]BE4P~/WȞr[TQ~Wh˸ܯyhl2&_p<)h=mqI#-;X&U{s4(yeTQZcSyDQ_}-mZ>d4<1fo-6,F4w/3 ӽ޽cE^GW׵P}~{<O1EUzLd53G9>L vy'h;}O/673aEjbz㥝n^eL~(<8UThfCRq==m23Cz o3}tJ-ޠ &y8~{$= yKU6ȥ yh-*t6qs؏$^>Rdl GcL3,+*Ƅnav6!S}KW1Q#M3KDLGXK%N9_D [Q-rٵ>Wu0v}9J5Щ&y`:-JT8:Bf ]1/0S]O[vrطb zD:T #&q9R*$Wh MfHVNd,Zr1"BK~~Fk6qn**"+3 "25002^ӹ1Bdc`ݽș] &B nT~ԓt //Mcӫgf|OwS`(B<} 9.d8!p5( ,岁Y ωe>PAħHč?n),eeÊqϺQ,uxeb2ed]BU9J*~ѬNVԜI<sV1hKu2Eg(D|6qb9Q Rb<eWxA A_0y.8ڤ*D@nB~oSg:>g((U"g .ڻ5RxyRdNZ\X9/%,ijHع{i/T")kg-.6pLh䔷jXrf65T[ښXZmdBB8-S7k+㕱1cԘY`t55pw<౩fdz68DÓ(e}񖰠"8^<¸d!~& 8>ۀ^# q$:]h@<σnhcHy\QIUw$'U`k]9|J>3+0W @pLi.^ioyM讹$6p{e-{5ݫNF L2 "q)j& |ջUf3(0 %I͗UT/H4W1OkpƢ:>B}GK t}hUڢdƱN I,ezD`}^ʅKm*"`n;:b^Fq;Աq8vF$5Wh/>pfxuUId&hUsO]]|~9Ϋb kr^0 nYHxacb%gmF|C4oX!0PKC5 BL3-:9 ^f{0oRG/#Bx%V|cbj4p6v}؛7ooR8YSψ}#RKw}C]JyX|4lwg8yӔUOH! {n[V%n"2lp%X N<9YV|j֖4\i`|5Ub!K=0@7QbR%K ŎqYkY񨸹LX2ʢ)X=-d)a; ҖT" e8W:0%>M_uYIiw\V $4X9/pJ>ۀ)Of!{ҦGh!Py,B&!ӿP#=Ws )BܽE^F!UAObuRB_.ب!u7lcpc75iO+{9Z'+٩F%(4I܄8^UĒ@ l Knι`2)CS }t+ђSeC \Y☊ 2-sSz@,@ 4 R"/!{)2( 8(bcPA j4b#| e={g!Hu*ٜ\t닱`u]H 9 Bl&iQlZFufi"K[ |d}ӯ>y[ܻ_avVLጳ)-I0oeɢFaCiݔ?ozUCEQSs'`K:L&hoyo'BaM,LCa9g@Ų[8}zѳq#|(͒Vv}Ge%W vCX|֏F[t泷3vnjMp5,1)NbN(-24xAy sVY׷*#K$ont4"ӥ/Qn o-.nͿ*9(H0`OW0y 2%ccHG* #nc!Q/L_RqBK)vp4}l'>sN":|/d fX">cQ:|X_l<yD_&+!K6sPY<$;yш> ]8[]YUbaى1bX%AP]-ktʬd.˭CUV.JQ(q$"aGQr7c閈P/ $bJۖM%kw+>!yK+`-Q׃Wc 4Ss3!-Y;;n,%8ݜ7hv{!\㾱P%"|ZopQ5o9Q·.XwEPZJ'Lv,X=(妇 33ƢNXeN[HĘ{JTefHkF+̾I7~H/z1g%>RXz]zz4JS4d,ϲfs+{øio796QM[eo&_ pλ]&A6 :.LkzWݺ*7"hQux-y}Zf)B5߫򐢳(g *ml𔢔, hǐϲ^Z*ftlN+3x%@QـYGho~iO^ ofAjtCܚيg0\u){r Sbb&ޥXqK&ى>J׉~vv+?|w'qi_gSX |ɼJ$g>Qsf * |yՌ ؠs Z5 'fpE1^l.H;.S 茺ħڍ +D5&QM}}>o,Kkhw͡F,i~Z]vy^r!1:=yBr\l7v7EG]ppo e(PfJ4J?y4wZw9O>,1#VDsL@4E88*2bQ-{]dI.TKtlLy7>Z%@{[751;}U"RXשjkv:ob _iOo zp7F =i dqH!?т}OAׄ+%ng1^-z6>ՍjbԑUW8k7#2 F1&EhTfg]--)I%OՂ|ޘuX bwG;rMx!ZJ qx?pqG*ڭP#<РLjJfr&fl^3}<w6葿@ ˺ 7xŢHd|B'ꍀr 0&Ӣn}?*g:Yyl '$>) *c7D|QKv!0,>Ksz ,pǙFE3@6/b2] w ]^9y[ Vj WaEe#Hq2z?#M*;ֈt/3Sy;OI ʲQUwLQ r%!Z.Ygp=4p\N\Yr(sXdG(V;2?KϻmMsϝp#燧8'LzKᣤ0ZZW hW4KgG}ćI&|MchQwR&]J 8뚶xhĒ $%.i*R4my׆Wd>#@X/`ȷwGOp/+8/; ⢉例VÑ8Sy~G`E</ӢEݳZcx0<G[T̵O{Keԗ:DID_tQu9KRb3)$q` *ĥE%2/S*&j 4a%᠙7 B,rU \ͅʸ4uwi?UΥO >a%×NVː7'8;C/6WO"f]! F">UˎF6a-F3$֘;]#zďLJi3`=1"=%s4SYa)cYtZ~c(,sHˉϒqbI/%Js^wyIkڤ;Y̘VoXxX^{Qry%z- %,&@?;)zC2eoVB^`Y D:)Gp@ 75B1kd.PqCQ?mE emf͕>_2$dO 2s8D]_j +BP4}"AAq!0EnqI `4ZvG0ABhs`yq@RN8Bڼ*:eA8]\WI^K]"Gڄ\V:oNt/ս.tx˼cC!?d;F&gL̈ "0t=ew:Zp<-ZXC›KtC+/.<92 J )۟h@'xXY8*~ V3Ӕ 'T`VI'іA5N{6Sweah=k! %́i)ab(ܡ<&BqQbIsD4ġBlHL`ңhx̟QS@_ =yi9c,_wlݍccM0#c2/lr6V^A2)5噘Y{ÜUGc"+:sq;p^6H\SRmf#Pnnhtg*!k3#_&Yvyڶ=En;P|`UFQ8a iDv;tEwJ !!L=I;w: {¨ I>~6 ;)'aMs"dEdh ǣ=Nї8M.#ӊ<%Q ' {k("v6VwqsOTS<4JF5+Iƺ0gA9 L=k>3!s0ϓ8w"dEpT삁k'&<>P(Jem ;X dVy >c~ϸKEJ:i!Uզ?*^wD:̣˼cg9YyIfNZAch4qPip⎶%- cIc+ I fL4R1T'.wї+Gy INadga0`14^bdcS1)+Xo*cv_@aL'+3+dnP2安 zs̶o FXԎgK-»!^&fo'TspLpHᲕl\\*1=(wro#] ^90lm7?=Lnt ol#k",;zIt &M}Q͎eZW~Lol|d*7KAI)VF5 mM06fvm/"lE2e^ Bth@.|7J;:=Ԗu4V[ÌEqPEKsYYLε$}"bl/:} 8;lj@B[a!w<^m /Ds*}$u6 9mTIt ն^r+CѨ rGDqRۻ\BJ5ՎnŪks}ZL-gҶTnMҴFj#'夰CoiΩJtˏ&DºÈ87B B6zG|- | F9luFDP)!m/(X!BOw!U&l4–O 1qQ3*@'g K.)=FPoBYy,K4\;CC> xU|O`X?Up>CB)Se;SrZޥL ӵހ{5tsg(( (M^wt 7=w2JN"72\ :KzL׋韓$eL=ې*4z# :{>j*(n II&3zJiDș!T@V∡]\TI+#Rkf=, v'uGA3%h'<$MNJꍟu6US+0}^jyA/$Z[kQpTe?ŲG»Jܒ=aޝFз#QC"18 iO ,34ȌVgC51,IIJlb @5Pʝ#E1luyfiַ[}yL[4#^+@;؋Iz mjGk[: \\`V>ۘz:QcE-]e#xHzAbZG&?6aܙLGAg^O)`cL#dOlz~gin^wE5J89tUIJ3:Sg sXhp8nDmmȺ|^{ @Q@NH܏N+` 4:yN9G6QeP ⎖ AzG BȘJ,2us-PE<ʖ660vX{5]_Yϴ5z7CɐY3݆C0X%i?%p<9& n-A8lRZےUj1kVm~W##ÚpsS=ϴWg@.U*T NrT&`f.8mEV] j̣]-DI1T5%W@N5i@CEQӔh:v5,"\# #5àג%q&p`D9D։gt6ö}PQ׭Slg#o%H/Ԓqp99չެ(ݺ)qw'j[1)[v#O!/g{5)@\_j۳*lUT^m-M׌<ٶz'c}nN1Klr?)8g1Ӱ2 QQqFM0W*5'!bHpo|sU錄u#Oj`Di9l,@ Hw-B| @8R_WбS]\*-n>Ns/ C1͞"fRis\#++[O7ҵO{MCSWSLw4&AMU PkD~\Xvܬo[ٛ 5; h}xQx'cB(ˬ~td'X>IfPK׌;%bI {?e:Km>VE3(`j>-1Cg{aEl;Ju+j BT ھ)lr/+:ЖYyZ9ڬca-ƒz m# FɔHlXt0})ҔPȥ{7doihu{fFBQ|fZ_$S}NN)6'6P<>T*WLD(߶swUGGTNݎNP:D!Y+9[TsU{8D1V-K#VN(SYr("tMUp 23 xnбN#R}?i*WZ"T%ʁT״"q諯E}Lԡu ej[)Pp(.-OA^&c6找F6>ټ)y_*߫"!Y2{k g?]9RXI&NQ|ЁUBEѶ̕nzy)~\9S̺|! -C.s+v {7POe>$PuG*q wN<8/5#Kq¦kH[*e ?qkZf?hOF$rm[pJcˣx2X+`bOy}r_B/jRت mwɔdGNX۰Pg ֆw fƯ4whOG\H_! lĈ/g@72,u_xEU [dnGa8'nZ:>?7lHFil]K{P;EB'TpӉN֚p-.Q0 !:;z9[ﱉjZ4ۇF:/%#_g=dy'B#TS{r'H4m >#I&6?% |ڸ{[ؘ52(4 to_JyJc{8"n`0o|!!E[tAX*V=t>{8^`ԄDKy᝗R$ bX04Mͦ ;A/%kA<$AWph8d4y5{۱[Wgpqsh_{ZJfH5zp\|)!aaہ*، &aouqL'{" J]#*Dt{W65CDk` tIŶk:k4%|D wY'g{<֕w@Eaߦ`Ʒ2}/ ~>/Y#Zﻲ.ڑʵzfC*ZA䖬t\uTrJd٭O,@GVo&i)q'JO?m=?ż (Kn 'Vy]Ed7-mfJ!>o2tOpMiG:&BW$؎# (l-SJ*+9 LGD!'滸_ /X V_K6+_u:0NcHN>Ϝ!filw;yk.kdwSTZ]):d`^e_";2O jOu ߜ]Բ{zZECk1+jwzhhqXO@=$?dpi':'XdS:1JԱS;HN0ol; }ٰ-qq?1xl7EsWt者 ߇n.GnU]ezu~eܾX=; ,Lqš[V9>i:"9VfB;tw.bh9G(RyZ'iiuQ:Aa (09z/EZViQF͜GRvz497E P-O`꠱W,\ &4 {:l]]=YU¬=V{YY7iUV)cՅ6]8-1[![Ѽr“EjF 'im9,_&%BNw0B#ZTЕSohsHYFe(a<,=8ݜp&9!~JOM ePX5 kp(֓Arnj9,eZKK51uINJH(CEs1XK-&j\M O>xSXꕾ>ť>`-fҸ/B!bzG'Qi!_(/Yzç)nU)9)AiFrcSY𿻣ė)E~%(O MH rd)*ke2"_'A&X[ #ש76 BX:ܬ?0&iMӿɏdx q]޲KL"mjbx?.bxT? )]-FcMM )S R$Gqj*iC.D%#Уs> j(aNt?j:od7ks+uǶ>$զa%%:Rh(Kby][RrD&Z dZP.͔j*TmG:6 d$'S(@ 0P=[J|~;)/oVݳmjzHKk-uo:-&.=CC;< >{6(9[.0 EX֖v3s >SV}oyS/w\~PB qp$[f6:ueI{uzw`^E ,X.Q]SWAklL[6Ǿ0c-ip+- 5/j,C1QvQ(- gl;+"hA5l)wrDoiq]^o„ Q]`Ưʟۗ)vO9F-z@4{oKJW XƙʀZN.9CC{ ZQ'SekU IGHU*`16jٚ2}a9bwuJdac=e51 9;DDkO @-ְFhSK>SZ7(}ܙX{.5gq,T )3f;h~\uE{SニGq&̑632iu~L[@W>0ٱ&`hMKT|t8,jsq4U4DVu;F(|9K2{:ʪk+ڃ4 !̛W9fOXyWU{LJOW{ NvTf/<lQ*jAwCQZQTӸSS[W-{EVUw&X>01fвنP3o FnvAJbi핾:]|_Nƚ˅xCh1:AkJBrQ?Hd2Xqƽ)yB fM3]⇓^A_ kqZ&,MNȔ.6IµhX|s ՝! t}'x* ݸo=jX`u%)+f%*)X# %5d>5b ߖM?ߕ i"I+Pfĥy8ƼrwnP [z/d·|ᬮ%h*΅FŏGIceHQ6w:@)D1×t")y„N#qC]UVUnLp9l-ykih/9'r`'muKN7ey`Û-k" ς]q!W}!5$hw5x1 <5]&*iE~BiS;7$a}eHLqW kv+߽ a|&8xZu5d=0?EKVF0!_U_GS~MLW FPB d2=jʭqzb[̔ ]K|.soKՁoMi'2r9)#vz֚8MhLcmɦ H ::n泓F4uoT_}pp6(RxyR T NՖREC*du\ Mq`1*T"9myݬ"F;[#Ay\цԤvl('Bo2BIG0avKV?).^Q/;9x_ &6Usfmh\ p2bJ&ks" $g,G=[i ʵV &W?|rȕeۑ}! :U jm@S4#q[^c=0-*&Po6)͘:6c(-1oYa,[e}"Cu@Y3tB6Ȅ}Fe{ MtTЍ @ lCG\-)$5|k[f/7I%elSG'wY3[MZz>Śh'8KoI"=LK0őI+V gZ.+W0a6hx)L-w`bx TvjXɨHqB]/^gk\1.K$EfO=hQ,.щ-~ƺw&w\?x6!tA!xe#%d44 kkSCsg06_e(#Fky;sPQ+Õј@e+,mcb,h eh CT#&b 1fc\K]kgmrAmg{TK,KV0/IfC/Av Zb|F!ƒY3>@P4SeB/q.5),ځk)eᜍ(S8AfB$<Ʈ9Gg%UDʫ!BtGQfvRF8q:QLEHL#q%`Rlm~rStu1|M *'eJ I$81kz:aqLZ ".O; q3Sݟk(AJ ,Y4=FW[k+0yr;ǶcdWd?}5Z%COE 솷{<_oxKoG /Xy@@qfX,Ga&q򥭺(9ak%/g`,W@¿ Ѕ4lGP9xٺvO `x )S|NC40k6GW<@+j| (mv8ZN<:4`=ż1>9C䚥BPG&GGƕFpb {}4+Pk:h> y>p^`V2}xlol442@p;@L8Sv<z#f^< F:lyȃ֜:ۆd:dg^djPӟ,$HvNTo/kHNr*L t2{4P:7< .@qT$ CcYX$1u:yzGKy@{nG= Tc<,$ A$<81B@ܾhā2Ie ! aɞ4{֠+Nڊq@$@2'g3<~P](@t{~)tceQi#v*g?6fs -U k>ޙ`\z4Ar9CGj V7e7 p] i}*.+Ni HN6 }()950 k"Z{PZX2AKqOx nFq`Cx7%lu0B5>ӂ|/ ]CSxniP? :8@N:q/*]3lEκN2NU6[ȹ@{qU0> f ;ɷFR%;1tY=@O³C5L 'pF[:oMU?aFX`?#k$9`F➑~ KyJ3Z -? i{ S-=KFmms"ę)/.^B 7&UN{,T.$ߺ9X 9HyhFݤ&GTL@+>M{*`]KMc tR SwsWva&r2 LMz }3Z! "Ab~Z eP=S!遧>R{1BȖ܍1Vu|@k6mAR+`s}H&vuT:# J"012'COPrtϓWfh(kD/Ai97 AO7Rf`3 DS7UEp0q⽸CcchT͸6!Sp+R+U*Qǡޑʘ"@RO+$(f=| RH7=՞p n,V}63|eʥƹa@eH1BV7#L{r 1 J5dT9=b'̳bȫй?BMB5 r[ve!8LŸez“tק8.eˆD8Spxtw‡JD%iv~ޜS vs (jOлS 9vwtW@R!|ķF0/"~_1x,L:,1Ӑ?3 x-ӡC4&9w8 (5]|nQn8>ꨡpF٭1b^s ǀ /Nf}&Q.#7'XS3֒U =&.@(_EH]Tr_SZIP`>D6bwe>\v)R~e $(3M*74ĐVlL=rL"kD)yW- .KE, `7c5`o]uNi>!ejXؖE+w>#^&BwoxX!43a1:,f  {D!*q@> 6bc͜aA)ϗ\ ϭʭBP!~lxE!BQ." OkDa>f~Z~`RWJ_R8.[p0}1Ͷԑ\QS8EZ۰2.@(T햝 rX#XT_?^)LZ}ݝ{0w_|<%r}RQ'Lk1ן,;t;ZWdJ>~5 +yAߔ%KP2[<^@vUBa&X%c=Nv`ƳF ϊ <uYL^W#q!.c9_ cagӮqД >c@gv^;VxK* v7qPBsvN[yz+[CG\?$>RV,Id:;isMi$v^ef/wbxu9~}fUf4`! t&; aB(*죣4}Ȍ!с4 pl*f _y8܀y.؎iyVsO3vV$AegB޼߅a]W)iR*^i]=߀ ~#QAhe7f2yJWP~Ȣ y7~T&SP($qP%<1Ƭwmϸ ƄYSDLxtD# kφXP-J$ZKqr;(^)J7Z~c )O\ xwW˳A zag-+f!X:E*AJ$ 1auEΆ_܈Y@ ҝ/y P4duw\3#gIhI?]-$@3 듆i2 d t] cb|Aſ'OtWl\GV nETcJ#%Jx\] #Wf?T[یa&(>|``UYzw?֬9 '^Ⱦ#D iLk9uq:v&S H|Ƌ Iˣ큊0Unl[Us.1rbb W%ӟ@ƛJvU@(}lx"FL9l狙(}Pq;j2 ̦z<]$Ӎ q\JF=VwYhNBsI>w`@U,f+>~ܴ:/V1mv ̃UxъH:U`Weq@l9s|9Vsit,8)d#O?#g3x ΟH@{4 ,FFob5, bLXBjd}1޷#!&11AɈF,LLFD5bbc2qaĈtpFXrP|ILFbD:R'49FjĘ]4&::eD{nb4nŀA~$O"$F #"bFh*AI bD&29F @ZtQK1ٷ&c9ciqى2ϢŐ"ƈ%MĈ )QĈQˆ :Ĉ^ZbĂtaic:01bAUF 8j jfcNhc(AĚ b@-!1bO01,BĠxbb60A g+FK#%DLj&B91oG5BU2;j{;j2kПdʟes DFhL0FddhDLFd0FdDFhL0FddQV3-&1Db~;p#Zԋ.uݍs\ѺNŐuБ"r0R=iJ/yJr>ܹ1\|K7f}n>:u|0!<8CNuģF;1*@ilVF!?-?y]KХB~ulex}۶sֿ}LpwrMݸnT)ZR~F>W;RG飗L8 ^WGQ\S旘5M:%i/Iyz9uص=Jgv/g_t%6_S>/S |w*\_QU*"Op\~S/* CU[r}Z _p daXU<_<[| /_V7_ [튉'yZ52 3ԬU?/).B2r~Udk|oϬHqPB P(B ]mrX^9 $ (#hW.  ^ z)%x5\@ P@jA|/8"P?WB,1 x}:` C!gڮv%%肍^ -X^ ._GcX>5Ą٠o ]CxJ0 #4cAu _CYSѡڦEIY isc=7 v%dx7?)pQ1  +SY1bG- p^1qs`sqJ~J` ~؊sp;Fv9QeN.# o~T)Q<- P!91zAw@Q<|aÊ+"Z@-pF4+ BC#PA: qr-qRp4cx(vi ᣨCJ-1J|B΁{AZٷ(<{ox,^b[ }A 8o&!HQKRwL8>zcScR16az'pjw>nf0`+(rEg %`<rFT ){ Ѕ@)0|)[B-= b):/bd Hs0_A,LБ&et*c}q~c@᧸}$%@ #l=fp`:}%8s".hJa .^6Dic~T;M0uxY@T/ш8G LR|$0d+ k̟%X`ETlsGG$)`a9^L+oϦ #Mu]1a&SmǰҟWFDn ,73OA=&4W-j4M]BE99P2ӸبDzr=@]`b_8vS07En+ `+$Hw3?74Y:*YU$wӴrˊrO h]`ި"7)o`Ur@Z,="otb8 $:3$^XL!I_%ȭ*XgCyk θU;©l t>L6j%l{>fV<H85F f/Mʨ1`FI:&JbX;$.Ύ# 2p-Qܶ\ENip*;U7PŠRت]YLWv2oV_b%c6>bR$3zi<]*%‰2:_5sڹ.D "Y L毠wc9IZ[̀OAJjQ$ HoMqS"\elڗEZxâ2U8.s $@8!MJH_[A%l \}ݺf.ȊTot)!M\ޙ\{%zD RHN˪Ƃ%灚 PKɵ@%`1v{G 4|(%d׵*<%?fy*늋wVNNjHXpt*# dt7zQ.xhgAV'HRbso@6%RޕR`lzĿ1"3>sL;_c.O-2Yg0륚3)sP@L91LB”*IaU`Z֥M'޺ {ic f7$Q}eg :g~6gͬHT2ۡQ-+z WAE`"|0`vHwoNxpp74F8hN yM, V6,446-V !ϋW3zlf3u~9;Aλy/`ק[(ҭ|/0L^xbOaaQgGr&]g[Rd6õ.l[pl1XlvD|;! ,7.vyÑN)&[uWjkk&,0](PJ: |D$+AMۯRRhYsaFHb9*5Y\2z.f - ůx|7'*=Y1h(ٚQ8A7a, VV4dҦGR1dQLBH8d]m MUK]-{#3^U\/IwiGF堐Vn+'S4g*hˁd;J 'VSqPÞv}.wL$;$ ,ڋ&؎*%7n{ov$G'7?R!V= 52H?,&.gRY:J!l Ҏ2p#$;c>9ج٢ʃٚE84ES3jsѼNTQrUp)oMSk']t 1VJQ@6 vFl(cq&AqU5cÉ3;~9[ほp^h׸ zLvj(%8^wy~:<>-E(bnAؿ`' im_F0ݱ)vF. XwydGFMovCXDW~Vn'`Ӕ{Ƕd K3'Hx .Ur/nhl`D+~ݧWYZ/[bkٟ\B"ن*:t4sV$ە\Zڦ `Zy+ u3)uJxӋؖ$} h }xVHaV?rX09;!yIܺ_ dy.6fRu*'[@) m p.n촆֋=npogڷņ~ruP qL-.6uSԢ*.OS.EJfvrZWm U@X8oS2>QW^፽\A^RIp[L&-ev|_`ʅe txدE-" %DM6p,~WZ9`s.aYL#WFo 1/G9˻p7w ~m^/m  )b=x彖R!`7f~am:v/Ry@ lǻ7O3Prn簹3ߛWMJEZfT q^7pܥ{9 oŮt6DʼnN$ogmXGBnZmͧ9_sMXt9_O1_e~t 23p}G-]'Ds/4)% {׾AIX$:}`3F"Y%~Ӧ`tN ~n6uV}_2[ <C :7險3#4]2`jIC~(/bi[]Wـ6O]ҊUگKV0vv#1;E.D; :A 5;gn!LLq^dF`kzmyT(Z,yRbd?wU,H($ FIim( &ᤠ2V?&[w+µmL:48~(]nrM/gtUʤ,gbq]B%o9|UWVwoZB%aT=Mz+uj%Eꈚ?'3Ns^'=K)npzJy=|x%i*F_j}Y8r x۠,Ew%UuhCeՒC:= ݘR)YfäKvgei5~DXrѬm$d9oD&U]qE`|XYXE\VU`~]_u`3|),i*EtYr(dŭҒ΍K ͳLl=uEOrcIzU)|"oW\v)\\*7fǟ5fE(P4R}S"ˆ6u.k{Drli[i 4Ԯ.9Z0B>Zߜp nA#r$WT+= s7qūeEIUzϢF"P8/W$>\yܶ7Y?s+rѪzN{[._gǗ!~ِ@5*HMڂOQcEw x衧k/{qվEڙ#PK֎*Y\WQYLBiow VAh.W_ֱ8XˏOJ1H_=NW/~F~>3+>I]v?wkC3g_h58xNmw yȺmΩhnh+:ήY5Ǜ5Oi$'HzҮE-Tp]l9U+GMUVjԟ|1-r_MtQE3 FAhxy7}6_Prpm?д髢:iuqi>{k{W0Mo L}u>Qzw\fE!^g_I\XEL u\kXE2tVWʡDorip?QG;0W'\zuDUyG\$e Λ VDb=[gύL29\w]Zmx:QYץg.]{ל}TNA,"^(\pwkF{fJ}#Z0{ fow4kɈdm$[ i=}\Qy˻x箎[7{y-sL|1}YhD'G>FOנsk*kYq'R׬v'uGg-577:j~jNIDR;Y KmαIKՓjZa=>0>Jzf{F!_dYނa񝃊n|^`HeUV߄1p䟪6$֭([Ts}fkJP6fؠzti3h>lbrub9G p: kwË]"~Rnٴ̙a7Dz;^$]3< ?'D{e4#(x7{2@-_=4[+ʜ$+B%*m),Oz;Vh,#>,сi"E9/9ԊӖ$OO{cf>Wַuȡ3GC;9 랔Yjҳm|IV(_jGM(\k~~ޢ|h~k$.>aJ$JojW]Wڗ/v$2ƅv !9$lûMdo 5;;Bi|nwاߑp\AϨރ@U'1mrRBwO6MC|Ch~O')zR,ސ~G L~{{1e]Aة!s>\tCqߺgɲԕ!ǎC_|dh(_}l =Mgnx0#q|| hIkWVsHui\`'FKlZJ@m6K)?y8hݳpnyW@~ra${s-K<-+v#\T|$l氚rY%"a}}Fvt*MJ3&*+>]IR BFG>mޟCgLi5nOmךɻ,S|')ڂw'K~0?erw)iMFM䗖fIE8~!SO;_~0(VTqȯwoʗv5MΪG_M!aFr=HnSѿX:]6_!n쀯N}ԺqfnS1cϦe\l'vv^\NvC>kooJe'~4uzҮ&3{M1U4,iк=u^K5WϾbw':_|W2!ra4P1%3#򄾙O/lz^_p("oW~#sɞׇI-5m lgYWzQcJ쟣e":Ǎ2URL S ȤiY^{tk.$&ayn{?$]W-ၙlCt:}_{M>(PB P(B (PB P(B (PB P(B (PB P(B (PB P(B (PB P(B (PB`xboard-4.7.3/winboard/help/html/0000755000175000001440000000000012262415351013503 500000000000000xboard-4.7.3/winboard/help/html/08.htm0000644000175000001440000000251712262415351014371 00000000000000 Help Menu

Help Menu

Help Contents

Brings up this help file, starting at the Contents page.

Help Index

Brings up this help file, starting at the Index/Find dialog.

How to Use Help

Brings up the standard help file that explains how to use Windows Help.

Hint

Displays a move hint from the chess engine.

Book

Displays a list of possible moves from the chess engines opening book. The first column gives moves, the second column gives one possible response for each move, and the third column shows the number of lines in the book that include the move from the first column. If you select this option and nothing happens, the engine is out of its book or does not support the book command.

About WinBoard

Displays the WinBoard version number.

xboard-4.7.3/winboard/help/html/11.htm0000644000175000001440000000576712262415351014375 00000000000000 Command Line Options

COMMAND LINE OPTIONS

All WinBoard options can be set either on the command line (if you start WinBoard by typing into an MSDOS Prompt box), in the Properties/Shortcut/Target box of a Windows shortcut, in a settings file, or in the Additional Options box of the WinBoard startup dialog. Exactly the same syntax is used in all four places. Most options can also be set from the menus and saved using Save Settings Now or Save Settings on Exit, so most people will not need to read this section.

Most options have two names, a long one that is easy to read and a short one that is easy to type. To turn on a boolean (true/false) option opt, you can just give its short name preceded by a minus sign or slash (-opt or /opt); to turn one off, prefix the short name by an x or an extra minus sign (-xopt or /-opt). To set any other kind of option, or to set a boolean option using its long name, give the value after the name, separated by a space, colon, or equal sign. (-opt 23 or /option:true). If a string option contains spaces or special characters, enclose it in double quotes and use the \ quoting convention of C to name the special characters. Alternatively, you can enclose a string value in curly braces (/opt={string}), as long as the value does not contain a closing curly brace. If a filename option contains spaces, enclose it in either single or double quotes. In filename options, the \ character is not treated specially, so use single quotes around the outside of the value if it has double quotes inside (and vice versa).

When you start WinBoard, it will pop up the Startup dialog box unless you provide sufficient options on the command line for WinBoard to determine which major mode to be in and what engines to use or chess server to connect to. To bypass this box, you must at minimum give one of the three options /cp, /ics, or /ncp. If you give the /cp option, you must also give the /fcp and /scp options. If you give the /ics option, you must also give the /icshost option.

Chess Engine Options

UCI Engine Support !NEW!

Internet Chess Server Options

Load and Save Options

User Interface Options

Adjudication Options !NEW!

Other Options

xboard-4.7.3/winboard/help/html/01.htm0000644000175000001440000001524312262415351014362 00000000000000 Contents

WinBoard: Chessboard for Windows

A (not completely) updated description with the release of version 4.5.0.

For the ultimate WinBoard Experience

New features since WinBoard 4.2.7 that are implemented in Alessandro Scottis Winboard_x are highlighted in red. New features in the WinBoard 4.3.xx series by H.G. Muller are highlighted in green, that in the unified 4.4 series in blue. New additions for series 4.5 are in purple.

Description

WinBoard is a graphical user interface for chess. It displays a chessboard on the screen, accepts moves made with the mouse, and loads and saves game files in standard chess notation. WinBoard serves as a front-end for many different services, including:

  • Chess engines that run on your PC. You can play a game against an engine, set up arbitrary positions, force variations, or watch a game between two engines. Fairy-Max is supplied with WinBoard 4.3.14, and over 100 other free chess engines are available separately. Of these, Crafty is the most popular. See Installing Chess Engines for instructions on installing additional chess engines.

  • Chess servers on the Internet. You can play against other Internet Chess Server (ICS) users, observe games they are playing, review games in the ICS libraries, chat, analyze observed games with a chess program, and more. WinBoard can also be used to run an automated computer player on the ICS, but this feature is for advanced users only and is subject to some caveats; see the separate file zippy.README for information.

  • The Web and your own saved games. You can use WinBoard as a helper application to view files in your Web browser or the Explorer. You can use it to keep track of email postal games, browse games off the net, or review games you have saved.

Getting Started

WinBoard starts up in one of three major modes: chess engine mode, ICS client mode, or game viewer mode. You cannot change modes while WinBoard is running, but you can access all the game viewer features directly from the other two modes. Also, you can start WinBoard several times to get multiple chessboard windows running in any combination of modes.

You will usually run WinBoard by choosing an item from the Windows Start menu that runs it in the mode you want. If you just double-click on WinBoard.exe, you get a startup dialog asking which mode you want. If you choose chess engine mode, you can then select from the installed engines; if you choose ICS client mode, you can then select from a list of known chess servers. More advanced users can customize these lists or type in WinBoard command line options directly.

After starting WinBoard, you can make moves in several different ways. To move by dragging, press the left mouse button while the cursor is on one of your pieces, move the cursor to another square, and release the button. You can also move by clicking the left mouse button once (press and release) over one of your pieces, moving the cursor to another square, and clicking again. You drop new pieces on the board when setting up a position by selecting from a context menu. Press the right mouse button over a square to bring up the menu in Edit Position mode; no menu will come up in modes where dropping a new piece is not permitted. In games with piece drops, such as bughouse or shogi, the pieces you hold for dropping are displayed next to the board, and you can move them to the drop location the same way you perform normal moves. You can also make moves by typing them in standard algebraic chess notation. Either a dialog box will pop up for you to type into, or in ICS mode, your typing will be redirected into the ICS interaction window.

When using an engine, the right-most mouse button allows you to see on the board what the engine is thinking about. Pressing the button shows the deepest position of the engines most recent analysis. Moving the mouse vertically while keeping this button pressed down will make you do step through the principal variation, and allows you to see how the engine thinks this position will be reached.

When WinBoard is iconized, its icon is a white knight if it is White's turn to move, a black knight if it is Black's turn.

Next to the main window, WinBoard does use many auxiliary windows for dedicated tasks. We mention the Engine-Output window (formerly analysis window) for a better display of the thinking output of engines (which you can then right-click to play out the selected PV in the board window), the Game-History window (where the game is displayed in SAN, and where you can double-click a move to call up the corresponding position in the board window), the Evaluation Graph window (where you see a graph of engine scores vs. move number, and can call up the corresponding position in the board window by clicking a point on the graph), the Comment popup (where you can right-click variation comments to play them out on the main board, or add and edit comments), the Game-List window (where you see an overview of all games in a game file you loaded, and can select a game for loading by clicking on it, and limit the list to games you are interested in by filtering). These auxiliary windows can be opened or closed as the need arises.

Additional Information

Menus

Shortcut Buttons

Command Line Options

Initialization Files

Installing Chess Engines

Firewalls

Limitations

Authors

Copyright

Frequently Asked Questions

xboard-4.7.3/winboard/help/html/05.htm0000644000175000001440000000635512262415351014372 00000000000000 Action Menu

Action Menu

Most of these commands are available in chess server mode only.

Accept

Accepts a pending match offer. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice.

Decline

Declines a pending offer (match, draw, etc.). If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice.

Rematch

Issues the ICS rematch command, which asks for another game against your last opponent with the same time control and rule set.

Call Flag

Calls your opponent's flag, claiming a win on time, or claiming a draw if you are both out of time. You can also call your opponent's flag by clicking on his clock.

Draw

Offers a draw to your opponent, accepts a pending draw offer from your opponent, or claims a draw by repetition or the 50-move rule, as appropriate.

Adjourn

Asks your opponent to agree to adjourning the current game, or agrees to a pending adjournment offer from your opponent. You continue an adjourned ICS game by challenging the same player again with the ICS match command.

Abort

Asks your opponent to agree to abort the current game, or agrees to a pending abort offer from your opponent. An aborted ICS game ends immediately without affecting either player's rating.

Resign

Resigns the game to your opponent.

Stop Observing

Ends your participation in observing a game, by issuing the ICS unobserve command.

Stop Examining

Ends your participation in observing a game, by issuing the ICS unobserve command.

Upload To Examine

Starts an examined game on the ICS, and uploads the game currently loaded in WinBoard (by pasting it, or loading from a file) to it.

Adjudicate To White

End the current game and stop participating engine. The result will appear in the PGN as a win for white.

Adjudicate To Black

Same as above, but game will appear as a win for black.

Adjudicate Draw

Same as above, but game will appear as a draw.

xboard-4.7.3/winboard/help/html/21.htm0000644000175000001440000000715212262415351014364 00000000000000 Firewalls

FIREWALLS

By default, "WinBoard /ics" communicates with an Internet Chess Server by opening a TCP socket directly from the machine it is running on to the ICS. If there is a firewall between your machine and the ICS, this won't work. Here are some recipes for getting around common kinds of firewalls using special options to WinBoard. Important: See the paragraph in the LIMITATIONS section below about extra echoes.

Suppose that you can't telnet directly to ICS, but you can telnet to a firewall host, log in, and then telnet from there to ICS. Let's say the firewall is called fire.wall.com. Set command-line options as follows:

WinBoard -ics -icshost fire.wall.com -icsport 23

Then when you run WinBoard in ICS mode, you will be prompted to log in to the firewall host. (This works because port 23 is the standard telnet login service.) Do so, then telnet to ICS, using a command like "telnet chessclub.com 5000", or whatever command the firewall provides for telnetting to port 5000.

If your firewall lets you telnet (or rlogin) to remote hosts, but doesn't let you telnet to port 5000, you will have to find some other host outside the firewall that does let you do this, and hop through it. For instance, suppose you have an account at foo.edu. Follow the recipe above, but instead of typing "telnet chessclub.com 5000" to the firewall, type "telnet foo.edu" (or "rlogin foo.edu"), log in there, and then type "telnet chessclub.com 5000".

Exception: chessclub.com itself lets you connect to the chess server on the default telnet port (23), which is what you get if you dont specify a port to the telnet program. But the other chess servers dont allow this.

Suppose that you can't telnet directly to ICS, but you can use rsh to run programs on a firewall host, and that host can telnet to ICS. Let's say the firewall is called rsh.wall.com. Set command-line options as follows:

WinBoard -ics -gateway rsh.wall.com -icshost chessclub.com

Then when you run WinBoard in ICS mode, it will connect to the ICS by using rsh to run the command "telnet chessclub.com 5000" on host rsh.wall.com.

ICC timestamp and FICS timeseal do not work through many firewalls. You can use them only if your firewall gives a clean TCP connection with a full 8-bit wide path. If your firewall allows you to get out only by running a special telnet program, you can't use timestamp or timeseal across it. But if you have access to a computer just outside your firewall, and you have much lower netlag when talking to that computer than to the ICS, it might be worthwhile running timestamp there. Follow the instructions above for hopping through a host outside the firewall (foo.edu in the example), but run timestamp or timeseal on that host instead of telnet.

Suppose that you have a SOCKS firewall that requires you to go through some extra level of authentication, but after that will give you a clean 8-bit wide TCP connection to the chess server. In that case, if you are using timestamp or timeseal, you need to somehow socksify it; if not, you need to socksify WinBoard itself. Socksification is beyond the scope of this document, but see the SOCKS Web site at http://www.socks.nec.com/how2socksify.html.

xboard-4.7.3/winboard/help/html/19.htm0000644000175000001440000000571712262415351014400 00000000000000 Files

INITIALIZATION FILES

Settings

When WinBoard starts up, it reads option settings from a file named WinBoard.ini in its installation directory (the directory containing WinBoard.exe). Options in this file have the same format as command line options, except that they do not all have to be on a single line. You can put a comment in a settings file by preceding it with a semicolon (;).

The WinBoard.ini file is read before the command line is processed, so any options you give on the command line override options in the file.

If WinBoard encounters a /settingsFile filename or @filename option while reading settings (whether from the command line or a file), it reads more settings from the given file before reading the next option.

The Save Settings Now menu command writes the current values of most options to a file. In addition, settings are saved automatically when WinBoard exits if Save Settings on Exit is checked. The settings are written to the last file named in a /settingsFile command, if any; otherwise to WinBoard.ini. The @ option does not affect which file settings are saved to.

Warning: Because Save Settings overwrites the last settings file (usually WinBoard.ini) and only saves a subset of WinBoard's options, you should not add settings of more options to such a file with a text editor. If you do this, your additional options will be lost on the next Save Settings. You can change the values of existing settings freely, using Notepad or any plain text editor. Be careful not to do this while WinBoard is running, however, unless you know that Save Settings on Exit is off. Otherwise all your changes will be overwritten and lost when WinBoard exits.

Notice that tournament managers, like PSWBTM, usually call WinBoard with the option not to save settings on exit, so that the entire tournament uses the same settings. So it does make sense to edit volatile options, such as /variant, into the settings file.

ICS Logon

Whenever WinBoard connects to the Internet Chess Server, if it finds a file called ICS.ini in its installation directory, it feeds the file's contents to the ICS as commands. Usually the first two lines of the file should be your ICS user name and password. You can specify a different name instead of ICS.ini by using the icslogon command line option.

xboard-4.7.3/winboard/help/html/17.htm0000644000175000001440000000721112262415351014365 00000000000000 Adjudication Options

Adjudication Options

/adjudicateLossThreshold scorethreshold

If the given value is non-zero, WinBoard adjudicates the game as a loss if both engines agree for a duration of 6 consecutive ply that the score is below the given score threshold for that engine. Make sure the score is interpreted properly by WinBoard, using /firstScoreAbs and /secondScoreAbs if needed.

/adjudicateDrawMoves number

If the given value is non-zero, WinBoard adjudicates the game as a draw if after the given number of moves it was not yet decided.

/checkMates true|false

If this option is True, WinBoard detects all checkmates and stalemates, and ends the game as soon as they occur. Legality-testing must be on for this option to work.

/testClaims true|false

If this option is True, WinBoard verifies all result claims made by engines, and those who send false claims will forfeit the game because of it. Legality-testing must be on for this option to work.

/materialDraws true|false

If this option is True, WinBoard adjudicates games as draws when there is no sufficient material left to create a checkmate. This applies to KBKB with like bishops, and to KBK, KNK and KK. Legality-testing must be on for this option to work.

/trivialDraws true|false

If this option is True, WinBoard adjudicates games as draws that cannot be usualy won without opponent assistance. This applies to KBKB with unlike bishops, and to KBKN, KNKN, KNNK, KRKR and KQKQ. The draw is called after 6 ply into these end-games, to allow quick mates that can occur in some positions. KQKQ does not really belong in this category, and might be taken out in the future. (When bitbase-based adjudications are implemented.) Legality-testing must be on for this option to work.

/ruleMoves number

If the given value is non-zero, WinBoard adjudicates the game as a draw after the given number of consecutive reversible moves. Engines can claim draws after 50 moves, irrespective of the value of number.

/repeatsToDraw number

If the given value is non-zero, WinBoard adjudicates the game as a draw if a position is repeated the given number of times. Engines can claim draws after 3 repeats, (on the 3rd occurrence, actually), irrespective of the value of number. Beware that positions that have different castling or en-passant rights do not count as repeats, WinBoard is fully e.p. and castling aware!

xboard-4.7.3/winboard/help/html/07.htm0000644000175000001440000007572412262415351014402 00000000000000 Options Menu

Options Menu

Flip View

Inverts your view of the chessboard.

If you are playing a game on the ICS, the board is always oriented at the start of the game so that your pawns move from the bottom of the window towards the top. Otherwise, the starting position is determined by the flipView command line option.

Swap Clocks

Interchanges the position of the white and black clocks on the screen. Intended for manually-operated computer-computer games, where the monitor is standing to the side of the playing board, to make sure that the operator sees the time of his own machine on his side of the table. Note that it is possible to adjust the clocks in steps of one minute, by left- (decrement) or right-clicking (increment) it with the mouse in Edit Game mode. (Clicking the clocks in other modes is interpreted as claiming the flag.)

Mute all Sounds

Provides a quick way to switch on or off all sounds, without affecting the settings for them.

General

Always On Top

If this option is on, WinBoard sets its chessboard to be a topmost window, meaning that it always appears on top of all ordinary windows on the screen.

Always Queen

If Always Queen is off, WinBoard brings up a dialog box whenever you move a pawn to the last rank, asking what piece you want to promote it to. If the option is on, your pawns are always promoted to queens. Your opponent can still underpromote, however.

Animate Dragging

If Animate Dragging is on while you are dragging a piece with the mouse, an image of the piece follows the mouse cursor. If Animate Dragging is off, there is no visual feedback while you are

dragging a piece, but if Animate Moving is on, the move will be animated when it is complete.

Animate Moving

If Animate Moving is on, all piece moves are animated. An image of the piece is shown moving from the old square to the new square when the move is completed (unless the move was already animated by Animate Dragging). If Animate Moving is off, a moved piece instantly disappears from its old square and reappears on its new square when the move is complete.

Auto Flag

If this option is on and one player runs out of time before the other, WinBoard will automatically call his flag, claiming a win on time. In ICS mode, Auto Flag will only call your opponent's flag, not yours, and the ICS may award you a draw instead of a win if you have insufficient mating material. On most chess servers, you can now do set autoflag 1 instead and have the server call the flag. In local chess engine mode, WinBoard may call either player's flag and will not take material into account.

Auto Flip View

If this option is on when you start a game, the board will be automatically oriented so that your pawns move from the bottom of the window towards the top.

Auto Raise Board

If this option is on, whenever a new game begins, the chessboard window will be deiconized (if necessary) and raised to the top of the stack of windows on your screen.

Blindfold

If Blindfold is on, WinBoard displays a blank board. Moves can still be entered with the mouse, either by dragging the (invisible) piece or clicking the starting and ending square. You can also enter your move by typing it on the keyboard.

Highlight Dragging

If Highlight Dragging is on while you are dragging a piece with the mouse, the starting square and the square that the mouse cursor is over are highlighted. This option works even if Animate Dragging is off. When the option /showTargetSquares is set, WinBoard will also indicate all squares where a piece can legally move to as soon as you lift it.

Extended PGN Info

The PGN will contain the engine search depth, score and time for each move where the depth is non-zero, as a comment behind the move if this option is on. Works only when Show Thinking is enabled. The recorded time is the time reported by the engine.

Extra Info In Move History

Same as above, but in move-history window.

Highlight Last Move

If Highlight Last Move is on, after a move is made, the starting and ending squares remain highlighted. In addition, after you use Backward or Back to Start, the starting and ending squares of the last move to be unmade are highlighted.

Periodic Updates

If Periodic Updates is on, the Analysis window is updated every two seconds. If not, it is updated only when the best move found changes. The Analysis window currently works only with Crafty, and Periodic Updates may not work with all versions of Crafty.

Ponder Next Move

If this option is off, the chess engine will think only when it is on move. If the option is on, the engine will also think while waiting for you to make your move.

Popup Exit Message

If this option is on, when WinBoard wants to display a message just before exiting, it brings up a modal dialog box and waits for you to click OK before exiting. If the option is off, WinBoard prints exits immediately without showing the message. If debugMode is on, however, the message will appear in the debug log.

Popup Move Errors

If this option is off, when you make an error in moving (such as attempting an illegal move or moving the wrong color piece), the error message is displayed in the message area. If the option is on, move errors are displayed in small popup windows like other errors. You can dismiss an error popup either by clicking its OK button or by clicking anywhere on the board, including downclicking to start a move.

Show Button Bar

If Show Button Bar is on, WinBoard displays on-screen buttons to step forward, backward, or pause the game. If it is off, the buttons are hidden, making the message line wider.

Show Coords

If Show Coords is on, WinBoard displays algebraic coordinates along the board's left and bottom edges.

Show Thinking

If this option is set, WinBoard displays the chess engines current search depth and its notion of the score and best line of play from the current position as it is thinking. The score indicates how many pawns ahead (or if negative, behind) the engine thinks it is. In matches between two machines, the score is prefixed by W or B to indicate whether it is showing White's thinking or Black's.

Test Legality

If Test Legality is on, WinBoard tests whether the moves you enter with the mouse or read from game files are legal, and displays an error if they are not. Turn this option off if you are playing a chess variant that WinBoard does not understand. (Bughouse, suicide, and wild variants where the king may castle after starting on the d file are generally supported with Test Legality on. The same holds for variants with non-FIDE pieces, like shatranj, xangqi, shogi, gothic, capablanca, courier, knightmate: WinBoard knows how all pieces occurring in those variants move. Falcon, cylinder and berolina are only partly supported, though, and the latter two should definitely be played with legality testing off, and falcon uses a wildcard piece for the Falcons, so it considers any move of them legal, but might miss checkmates that involve a Falcon. So you should not play it with claim verification switched on.)

Hide Thinking From Human

An alternative to suppressing the Thinking Output in the display above the board by switching Show Thinking off, but doing it in a way that still allows the extended PGN info to be recorded.

Highlight Move With Arrow

A big, fat arrow is drawn between the start and target field of the last move, so you cannot possibly miss it.

Display Logos

Controls the display of engine, user or ICS logos above the board, next to the clocks, by switching on or off the option /autoLogo.

Board

Board Size

Determines how large the board will be and what fonts and piece bitmaps will be used. On a Titanic board the piece bitmaps are 129x129 pixels, on Colossal 116x116, Giant 108x108, Huge 95x95, Big 87x87, Large 80x80, Bulky 72x72, Medium 64x64, Moderate 58x58, Average 54x54, Middling 49x49, Mediocre 45x45, Small 40x40, Slim 37x37, Petite 33x33, Dinky 29x29, Teeny 25x25, and Tiny 21x21. The smaller boards have no system menu, but you can minimize or close them from the File menu.

You can also change the board size by dragging the window edges or corners with the mouse. The board will snap to the largest size that fits into the area you outline.

Note that only sizes Bulky, Middling and to a lesser extent Petite have built-in bitmaps for the non-FIDE- pieces. Archbishop, Chancellor and the wildcard Lance exist in all sizes from Petite to Bulky, though. In size Moderate, variant shogi uses the traditional Japanese piece representation.

Board Colors

Lets you change the colors WinBoard is using to draw the board and pieces.

All White

Uses the representation of the white pieces (a filled-in black outline) also for the black pieces (where you can fill them with another color to distinguish them). If you do not choose a very dark color for the black pieces, they look very ugly without outline, and using this option can fix that.

Flip Black

Displays the black pieces upside down (or the white pieces in Flip View). This is useful in Shogi, when you want to use the traditional Japanese representation of the pieces.

Adjudications

Ponder Next Move, Show Thinking, Hide Thinking from Human and Periodic Updates

Duplicates of the controls in the General option menu.

Adjudicate Draw Moves

Adjudicate a draw after the given number of moves, to prevent games from dragging on forever if two engines in a dead-drawn position, conspire to avoid 50-move draws. This and the folowing options are only active in Two Machines mode.

Adjudicate Loss Threshold

Adjudicate the game as a loss when both engines agree that the (negative) score is below the given threshold for the duration of 6 consecutive plies.

Verify Claims

Verify result claims made by engines when they terminate the game. If needed, correct the results to a loss for the engine making the false claim. Needs Test Legality to be on in order to work.

Detect Mates

Let WinBoard detect checkmate and stalemate, even before the engine gets the chance to claim it. Useful with buggy engines, that exit without a claim, or just hang. Needs Test Legality to be on in order to work.

Draw If Insufficient Material

If this option is on, WinBoard will recognize KBKB positions with equally colored Bishops, KBK, KNK, and KK positions as draws, even before the engine can claim them. Needs Test Legality to be on in order to work.

Adjudicate Trivial Draws

If this option is on, KBKB (with B on unlike color), KBKN, KNKN, KNNK, KRKR and KQKQ positions will be adjudicated draw after 6 ply. For KQKQ this is not really sound, and in the future it might be taken out of this option. But as long as tablebase adjudications are not implemented, it seems best to group this end-game with the trivial draws. Needs Test Legality to be on in order to work.

N-Move Rule

Here you can set the number of reversible moves (non-pawn, non-capture) after which WinBoard should adjudicate a game as draw. Engine draw claims are always consider ed valid after 50 moves (in the context of Verify Claims), but you can set a different value here to either give the engine more leeway if it wants to play on, or test its claiming capabilities, or set it to a smaller value if you are impatient.

N-Fold Repetition Rule

Here you can set the number of repetitions of the same position that should occur in order for WinBoard to adjudicate the game as draw. Engine draw claims are always consider ed valid after 3 repetitions (in the context of Verify Claims) , but you can set a different value here to either give the engine more leeway if it wants to play on, or test its claiming capabilities, or set it to 2 if you are impatient. (Do not set it to 1!)

Common Engine Settings

Polyglot Directory

If WinBoard knows where to find Polyglot, you can install UCI engines as if they were WinBoard engines, and WinBoard will automatically invoke Polyglot as an adapter to run them.

Hash Size, EGTB Path, EGTB Cache Size, Opening Book, Number of CPUs

These are options that UCI engines expect to be specified. WinBoard protocol now also allows native WinBoard engines to request similar information, so it might be used for these engines as well. The memory size specified by the WinBoard-protocol memory command is the sum of the hash and EGTB cache sizes. The specified opening book, when enabled through the Use Book check box, will be used as GUI book for engines that do not have their own book (as indicated by the check boxes). It must be a book in Polyglot format.

Engine #1 Settings, Engine #2 Settings

This pops up a dialog that allows the user to set engine-defined options of the mentioned engine (if it is in use). What is in the dialog is entirely determined by the engine. Generally, any changes you make to the controls are only sent to the engine after you press OK. An exception are engine-defined push buttons; the corresponding signal is sent to the engine immediately when you push those. To see the options of UCI engines, you need a Polyglot adapter that supports the recent WB-protocol extensions.

ICS

Auto Comment

If Auto Comment is on, any remarks made on ICS while you are observing or playing a game are recorded as a comment on the current move. This includes remarks made with the ICS commands say, tell, whisper, and kibitz. Limitation: remarks that you type yourself are not

recognized; WinBoard scans only the output from ICS, not the input you type to it.

Auto Observe

If Auto Observe is on and you add a player to your gnotify list on ICS, WinBoard will automatically observe all of that player's games, unless you are doing something else (such as observing or playing a game of your own) when one starts. On most chess servers, you can now do follow player instead, and the server will automatically observe all of players games.

Auto Kibitz

Auto Kibitz controls how output of computers playing on an ICS is handled. In many tournaments, computers are obliged to kibitz their thinking output to the ICS, and this option will do that automatically, without the engine having to know it. In addition, such kibitzed output by your opponent will be kept out of the console window, and will be diverted to the engine-output window.

Get Move List

If Get Move List is on, whenever WinBoard receives the first board of a new ICS game (or a different ICS game from the one it is currently displaying), it retrieves the list of past moves from the server. You can then review the moves with the Forward and Backward commands or save them with Save Game. You might want to turn off this option if you are observing several blitz games at once, to keep from wasting time and network bandwidth fetching the move lists over and over. If you turn this option on while a game is in progress, WinBoard immediately fetches the current move list.

Local Line Editing

If Local Line Editing is on, your machine handles echoing, backspacing, etc., for the characters that you type into the ICS Interaction window. Output is forwarded to the ICS only when you hit Enter.The Enter key produces a newline character, also known as Ctrl+J, \n, LF, linefeed, or decimal ASCII code 10. In this mode you can force a control character into the edit buffer by preceding it with Ctrl+Q (quote); however, the edit buffer will not accept certain control characters even when they are quoted in this way. You can force a control character to be sent immediately to ICS, bypassing the edit buffer, by preceding it with Ctrl+S (send).

WinBoard keeps a history of lines you recently typed in Local Line Editing mode. You can bring back old lines by pressing the cursor up key in the text entry box. Press the cursor down key to go back down to newer lines.

If Local Line Editing is off, all characters are sent to ICS as you type them. The Enter key produces a carriage return character, also known as Ctrl+M, \r, CR, or decimal ASCII code 13. Use Ctrl+Backspace if you need the ASCII DEL character. You can enter any character code by holding down the Alt key and typing its decimal value (always beginning with 0) on the numeric keypad; this is a little-known standard feature of Windows.

In both modes, if WinBoards internal telnet protocol implementation is active, it translates all \n characters to the standard telnet end-of-line sequence \r\n just before sending them out to ICS; see telnetProgram.

It is generally not a good idea to turn off this option while connected to ICS. If you are tempted to do so because everything you type is being echoed an extra time, see the paragraph about extra echoes under LIMITATIONS below.

Quiet Play

If Quiet Play is on, WinBoard will automatically issue an ICS set shout 0 command whenever you start a game and a set shout 1 command whenever you finish one. Thus you will not be distracted by shouts from other ICS users while playing.

Seek Graph

Auto Refresh

If Seek Graph is on, you can summon up a graphical representation of players seeking a game on the ICS in stead of the chess board, by left-clicking the latter when you are not using it. The requested games are separated out by rating and time control. Rated, unrated and wild games are displayed in different colors, computers as squares, humans as dots. Hovering the mouse over a dot in the graph will display the details of the corresponding seek ad in the message field above the board. Left-clicking the dot will take up the challenge. Right-clicking dots will push them to the back, so you can see seek ads that might have been hidden behind it. Right-clicking off dots will refresh the graph, left-clicking off dots will take the graph down ad display the chess board again.

In combination with Auto Refresh, the seek graph will be updated automatically. This is only implemented for the FICS and ICC servers. To make switching on of this option effective might require you to log off and on again to the ICS, as it requires changing ICS settings that are locked during a session.

Background Observe

Dual Board

If Background Observe is on, boards sent to you by the ICS when you are playing, but which are not of your game, (but of games you are observing), will not be displayed automatically. In stead WinBoard will remember the last board it received that way, and display it when you press the right mouse button in stead of the board of your own game. This feature is meant to enable bughouse players a peek at their partners game, without the need to log on to the ICS a second time.

If in addition Dual Board is also on, such background games are even displayed on a second board, side by side with your own game, so that it is always in view. This feature is experimental, and largely undeveloped; there is no animation of moves on this second board, while the effets are undefined if the board format of the observed game is not the same as that of your own game.

Premove

Premove allows you to play a move on the board before you have received your opponents move. This move is highlighted on the board using the Premove Highlight color, and is sent to the ICS as soon as your opponents move is received. To cancel a premove, either click twice on the piece that was premoved or premove an illegal move.

This group of controls allows you to set the following options: premove, premoveWhite, premoveWhiteText, premoveBlack, premoveBlackText.

One-Click Move

When One-Click Move is set, a click on an own piece will immediately move that piece if it only has a single legal move, without waiting for you to click a to-square. Similarly, clicking an opponent piece or empty square will immediately perform the move to that square, if only a single legal move to it existed. This is the mouse equivalent of having to type only e4 when you mean e2-e4. Finally, double clicking an own piece (or clicking an already selected piece) will make it execute its only capture, which can save you some time if the target square was far away. Legality testing has to be switched on for this to work.

ICS Alarm

When icsAlarm is set to True, the alarm sound is played when your clock counts down to icsAlarmTime seconds. For ICS games with time controls that include an increment, the alarm will sound each time the clock counts down to the icsAlarmTime.

ICS Interaction Colors

Lets you change the colors and type styles that WinBoard uses to distinguish between different types of messages in the ICS Interaction window. The types distinguished are: shout, sshout, channel 1 tell, other channel tell, kibitz (or whisper), personal tell (or new message notification), challenge, request (including abort, adjourn, draw, pause, and takeback), seek, and normal (all other messages).

Startup Chat Boxes

You can put a semicolon-separated list of ICS handles or channel numbers here, WinBoard will open a Chat Window for each handle at startup in ICS mode.

Fonts

Lets you change the fonts WinBoard is using. The clock font, message font and coordinates font are specific to each board size. The tags font, comments font and ICS Interaction font are not dependent on the current size of the board. The Revert to Defaults button will reset the clock font, message font and coordinates font for the current board size, and will set the tags font, message font and Ics Interaction font for all board sizes.

Sounds

Lets you change the sounds that WinBoard plays for various events.

If the Move sound is on, WinBoard alerts you by playing a sound after each of your opponent's moves (or after every move if you are observing a game on the Internet Chess Server). The sound is not played after moves you make or moves read from a saved game file. If you turn on the Move sound when using WinBoard with the Internet Chess Server, you will probably want to give the set bell 0 command to the ICS. Otherwise the ICS will send a bell character after every move (not just yours), causing WinBoard to play the ICS Bell sound too. Alternatively, you could turn off the ICS Bell sound in WinBoard, but that might cause you to miss ICS alerts for other interesting events.

The other sound events correspond directly to the types of messages that the ICS Interaction Colors option knows how to colorize.

Game List

Lets you select which information is displayed in the Game List window.

Communications

Lets you change the communication port parameters when the internetChessServerComPort option is in use.

Load Game

Lets you change options used while loading games (timeDelay option).

Save Game

Lets you change options used for saving games (autoSaveGames, oldSaveStyle, and saveGameFile options).

Time Control

Lets you change the time control to be used in games against a chess engine. Two types of timing are available.

With conventional chess clocks, each player begins with his clock set to the timeControl period. When both players have made movesPerSession moves, a new time control period begins. The time in the new period is added to whatever time the players have left on their clocks.

With incremental clocks, each player is given an initial time allotment, and a timeIncrement is added to his clock after every move. The increment may be zero, in which case the entire game must be finished within the initial time allotment.

With fixed time per move, the clock is reset to the given time before each move, and any left-over time is discarded (i.e. not added to the time for the next move).

Note that in local modes it is always possible to adjust the clocks during a game by Shift + click on it, where a right-click adds a minute, and a left-click subtracts one.

Save Settings Now

Save the current option settings to a file, along with the current window sizes and positions, to be automatically reloaded next time WinBoard is run. See Settings for the fine points.

Save Settings on Exit

If this option is on, the current settings are automatically saved when WinBoard exits, as with Save Settings Now.

xboard-4.7.3/winboard/help/html/23.htm0000644000175000001440000000577712262415351014401 00000000000000 Authors

AUTHORS AND CONTRIBUTORS

WinBoard is partly based on xboard, a chessboard program for Unix and the X Window System. Tim Mann has been responsible for all versions of WinBoard, and for xboard versions 1.3 and beyond. H.G.Muller is responsible for version 4.3.

Mark Williams added many features to WinBoard 4.1.0, including copy/paste, premove, icsAlarm, autoFlipView, training mode, auto raise, and blindfold. Hugh Fischer added piece animation to xboard, and Henrik Gram added it to WinBoard. Frank McIngvale contributed many xboard user interface improvements and improved Crafty support. Jochen Wiedmann ported xboard to the Amiga, creating AmyBoard, and converted the documentation to texinfo. Elmar Bartel contributed the new piece bitmaps for version 3.2. Evan Welsh wrote CMail. John Chanak contributed the initial implementation of ICS mode. The default color scheme was adapted from Wayne Christopher's XChess program. Chris Sears and Dan Sears wrote the original xboard. They were responsible for xboard versions 1.0 through 1.2. Alessandro Scotti added many elements to the user interface, including the board textures and font-based rendering, the evaluation-graph, move-history and engine-output window. He was also responsible for adding the UCI support. H.G. Muller made WinBoard castling- and e.p.-aware, added variant support with adjustable board sizes, the Crazyhouse holdings, and the fairy pieces. In addition he added most of the adjudication options, made WinBoard ore robust in dealing with buggy and crashing engines, and extended time control with a time-odds and node-count-based modes.

Send bug reports to <bug-xboard@gnu.org>. Please run WinBoard with the /debug option and include the output from the resulting WinBoard.debug file in your message.

The WinBoard 4.3.xx line is being developed by H.G. Muller independently of the GNU Savannah xboard project. Bug reports on this version, and suggestions for improvements and additions, are best posted in the WinBoard forum, development section (www.open-aurec.com/wbforum/).

Michel van den Bergh provided the code for reading Polyglot opening books.

Arun Persaud worked with H.G. Muller to combine all the features of the never-released WinBoard 4.2.8 of the Savannah project (mainly by Daniel Mehrmann), and the never-released 4.3.16 into a unified WinBoard 4.4, which is now available both from the Savannah web site and the WinBoard forum.

xboard-4.7.3/winboard/help/html/16.htm0000644000175000001440000007377612262415351014407 00000000000000 User Interface Options

User Interface Options

/firstLogo filename

/secondLogo filename

The appearance of either of these options causes WinBoard to reserve space for displaying logos on both sides of the clocks. Normally the first logo goes left, the second right, unless the option swap clocks is in effect. The filename must refer to a bitmap file (.bmp) containing a logo for the particular player (usually a 130x65 or 100x50 bitmap, which will be scaled to the height of two clock lines.)

/autoLogo true|false

When true, causes WinBoard to automatically supply a logo for the first and second chess program, by looking for a fie named logo.bmp in the engine directory (as specified by the /fd or /sd option), and then displays it like this file was given as an argument to the /firstLogo or /secondLogo option. In this mode it will also look in a sub-folder of its installation folder called logos, for finding logos with names corresponding to the ICS (e.g. chessclub.com.bmp) or to the human user, should they be involved in a game.

/hideThinkingFromHuman true|false

Prevents the engine thinking output to appear in the display, without necessitating to suppress the sending of this information altogether (so it can still appear in the PGN).

/noGUI

Suppresses all GUI functions of WinBoard (to speed up automated ultra-fast engine-engine games, which you dont want to watch). There will be no board or clock updates, no printing of moves, and no update of the icon on the task bar in this mode.

/top or /xtop, or /alwaysOnTop true|false

Sets the Always On Top option. Default: False.

/queen or /xqueen, or /alwaysPromoteToQueen true|false

Sets the Always Queen option. Default: False.

/drag or /xdrag, or /animateDragging true|false

Sets the Animate Dragging option. Default: True.

/animate or /xanimate, or /animateMoving true|false

Sets the Animate Moving option. Default: True.

/flip or /xflip, or /flipView true|false

If Auto Flip View is not set, or if you are observing but not participating in a game, then the positioning of the board at the start of each game depends on the flipView option. If flipView is False (the default), the board is positioned so that the white pawns move from the bottom to the top; if True, the black pawns move from the bottom to the top. In any case, the Flip View menu command can be used to flip the board after the game starts

/autoflip or /xautoflip, or /autoFlipView true|false

Sets the Auto Flip View option. Default: True.

/autoraise or /xautoraise, or /autoRaiseBoard true|false

Sets the Auto Raise Board option. Default: True.

/highdrag or /xhighdrag, or /highlightDragging true|false

Sets the Highlight Dragging option. Must be on for /showTargetSquares to work. Default: False.

/showTargetSquares true|false

When set, and the Highlight Dragging option is set, WinBoard will indicate all squares a piece can legally move to when you pick up that piece, by drawing a colored dot in it. Default: False.

/highlight or /xhighlight, or /highlightLastMove true|false

Sets the Highlight Last Move option. Default: False.

/exit or /xexit, or /popupExitMessage true|false

Sets the Popup Exit Message menu option. Default: False.

/popup or /xpopup, or /popupMoveErrors true|false

Sets the Popup Move Errors menu option. Default: False.

/coords or /xcoords, or /showCoords true|false

Sets the Show Coords option. Default: False.

/legal or /xlegal, or /testLegality true|false

Sets the Test Legality option. Default: True.

/size or /boardSize sizename

Sets the Board Size option. Also chooses which board size any following Font options will affect. The default is the largest size that will fit on your screen.

/wpc or /whitePieceColor color
/bpc
or /blackPieceColor color
/lsc
or /lightSquareColor color
/dsc
or /darkSquareColor color

Color specifications for white pieces, black pieces, light squares, and dark squares. Colors can be specified only by red/green/blue intensity, either in hexadecimal (as #rrggbb) or in decimal (as rrr,ggg,bbb). In the latter format, you must enclose the string in quotation marks if you leave spaces after the commas. The defaults are respectively #FFFFCC, #202020, #C8C365, and #77A26D. Available on the Board Colors section of the Board Options dialog.

If you are using a grayscale monitor, try setting the colors to:

-whitePieceColor:#FFFFFF
-blackPieceColor:#000000
-lightSquareColor:#CCCCCC
-darkSquareColor:#999999

/hsc or /highlightSquareColor color
/phc
or /premoveHighlightColor color

Color specifications for the Highlight Last Move and Premove options, respectively. Colors can be specified only by red/green/blue intensity, either in hexadecimal (as #rrggbb) or in decimal (as rrr,ggg,bbb). In the latter format, you must enclose the string in quotation marks if you leave spaces after the commas. The defaults are respectively #FFFF00 and #FF0000, respectively. These colors are also used to indicate non-captures and captures, respectively, with the /showTargetSquares option. The premove color is also used to indicate the most recent move when stepping through the principal variation of an engine.

/mono or /xmono, or /monoMode true|false

Determines whether WinBoard displays its pieces and squares in black and white (True) or color (False, the default). Available in the Board Colors section of the Board Options dialog.

/flipBlack true|false

Determines whether WinBoard displays the black pieces upside down (or the white pieces in Flip View). Useful with Shogi with the traditional Japanese pieces, which are not distinguished by color but by orientation.

/allWhite true|false

Determines whether the white piece bitmaps will be used to display black pieces. The white pieces have a dark outline, which the black pieces lack. This makes the latter look vague if the color you give them is not very dark.

/renderPiecesWithFont fontname

Uses the named true-type font to render the pieces, rather than the built-in bitmaps. The font must be installed on your computer. If the name starts with a * it is ignored, allowing you to easily disable a font temporarily in the whinboard.ini file.

/fontPieceToCharTable characterstring

If font-based rendering of the pieces is used, this table specifies which character of the font alphabet should be used for which piece. The format of the character strings is the same as that of the argument of /pieceToCharTable.

/fontPieceSize number

The number gives the size of the piece, as a percentage of the square size.

/fontPieceBackColorWhite color
/fontPieceForeColorWhite color
/fontPieceBackColorBlack color
/fontPieceForeColorBlack color

Color specifications for white pieces, black pieces that are generated with font-based rendering.

/liteBackTextureFile filename

/darkBackTextureFile filename

The filename indicates a bitmap file that should be used to display the light or dark squares, allowing you to make boards that look like wood, marble, etc. A filename starting with * is ignored.

/liteBackTextureMode number

/darkBackTextureMode number

The number indicates the way the files given in the background-texture options should be used to fill in the squares. Valid texture modes are 1 (default) and 2. In mode 1 the squares are taken from portions of the texture bitmap and copied without further processing. In mode 2, squares can also be rotated, mirrored and so on in order to provide a little more variety to the texture. The operations are selected at random so the board will look slightly different every time the program is run.

/overideLineGap number

The number specifies the width, in pixels, of the grid lines used to separate the squares. If it is very small (like a single pixel), it becomes vey hard to see which squares are highlighted (to indicate the last move), as this highlighting is a color change of these grid lines. Highlighting the moves with an arrow is then recommended.

/highlightMovesWithArrow true|false

If this option is true, a big, fat arrow is drawn to indicate the last move.

/highlightArrowColor color

Specifies the color of the arrow that highlights the moves.

/evalHistoColorWhite color

/evalHistoColorBlack color

Specifies the colors to be used to plot the white and black scores in the evaluation graph.

/colorShout effects color
/colorSShout effects color
/colorChannel1 effects color
/colorChannel effects color
/colorKibitz effects color
/colorTell effects color
/colorChallenge effects color
/colorRequest effects color
/colorSeek effects color
/colorNormal effects color

Select colors and effects to colorize messages in the ICS Interaction window. The effects may be any combination of bold, italic, underline, and strikeout. Colors are specified as for squares and pieces. Available on the ICS Interaction Colors section of the ICS Options dialog. Limitation: On 256 color displays, Windows chooses the nearest solid color from the system palette, which will not always be close to the color you selected.

/colorBackground color

Sets the background color for the ICS Interaction window. Available on the ICS Interaction Colors section of the ICS Options dialog.

/colorize or /xcolorize, or /colorizeMessages true|false

If True, WinBoard colorizes messages in the ICS Interaction window with the colors listed above. Default: True. Available in the ICS Interaction Colors section of the ICS Options dialog.

/clockFont fontname:size effects
/messageFont fontname:size effects
/coordFont fontname:size effects
/tagsFont fontname:size effects
/commentFont fontname:size effects
/icsFont fontname:size effects

The fonts used respectively for the clocks, the message display line, rank and file coordinate labels, the Edit Tags dialog, the Edit Comment dialog, and the ICS Interaction window. These options may be given more than once. Each occurrence affects the fonts for the current board size; that is, the size given in the last preceding /boardSize option, if any, or else the default size. The font size may contain a decimal point, and the effects may be any combination of bold, italic, underline, and strikeout. Example: /clockFont="Arial:20.0 bi". Available on the Fonts menu.

/soundShout sound
/soundSShout sound
/soundChannel1 sound
/soundChannel sound
/soundKibitz sound
/soundTell sound
/soundChallenge sound
/soundRequest sound
/soundMove sound
/soundBell sound

/soundIcsWin sound
/soundIcsLoss sound
/soundIcsDraw sound
/soundIcsUnfinished sound

/soundIcsAlarm sound

Associate sounds with WinBoard events. Most of the events are the same ones that cause text colorization. In addition, soundMove is played if a chess engine or another player makes a move. SoundBell is played if the chess server sends an ASCII BEL character (Ctrl+G). Available on the Sounds menu.

SoundIcsWin, soundIcsLoss, soundIcsDraw and soundIcsUnfinished are played at the conclusion of an ICS game. The result of the game determines which sound is played.

SoundIcsAlarm is played when your game clock counts down to icsAlarmTime.

The sound argument may be one of the following:

  • The name of a .wav file. The filename is interpreted relative to WinBoard's installation directory (the directory containing WinBoard.exe).

  • $, indicating the default system sound.

  • ! followed by the name of a built-in WinBoard wave resource.

  • ! alone, or (empty string), indicating silence.

The default for soundMove and soundBell is $, while the others default to silence.

/dropMenu true|false

This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) drop menu rather than displaying the position at the end of the principal variation. Default: False.

/icsMenu={entries} or /icsMenu=@filename

This option lets you customize the right-button context menu that is available in the upper (output) pane of the ICS Interaction window. It consists of a list of menu entries, one per line. If the option value starts with an @ sign, it is the name of a file that contains the entries. Each entry contains either four fields separated by commas or the single character "-". The fields are:

  1. The menu text. If this field begins with "|", the item begins a new column in the menu and the "|" is not shown. If this field contains an "&", the character after the ampersand is underlined in the menu and acts as a keyboard shortcut for the item when the menu is displayed. Do not assign the same shortcut key to two different menu items.

  2. Text to insert into the input pane. The text cannot include a comma. You can use ICS aliases to get around this limitation.

  3. A flag (1 or 0) saying whether to insert a space and name (see above) after the text. If you set this flag, you might also want to put "(name)" into the menu text as a memory aid.

  4. A flag (1 or 0) saying whether the result should be sent immediately to ICS or left in the input pane for further editing.

You can now use two special insert texts chat and none in the entry definitions. In stead of being sent to the ICS, WinBoard will recognize them as special cases (they are not valid ICS commands anyway). Chat will open a chat box for the handle you clicked on, none will define a disabled entry (usually used with an item name of spaces), which you could put in the position of the menu that pops up under your mouse pointer, so there would be no default action when you up-click without moving the mouse first.

The entry "-" produces a separator line in the menu. The top three menu entries are always Copy and Paste, Copy, and Paste, but you have full control over the rest of the menu.

The default menu is:


&Who,who,0,1
Playe&rs,players,0,1
&Games,games,0,1
&Sought,sought,0,1
| ,none,0,0
Open Chat &Box (name),chat,1,0
&Tell (name),tell,1,0
M&essage (name),message,1,0

&Finger (name),finger,1,1
&Vars (name),vars,1,1
&Observe (name),observe,1,1
&Match (name),match,1,1
Pl&ay (name),play,1,1

There is no graphical user interface to set this option. To change it, edit your settings file with a plain text editor such as Notepad.

/icsNames={names} or /icsNames=@filename

This option lets you customize the drop-down list of ICS names that appears in the WinBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text /ics /icsHost= and adds the result to the command-line options. There is no graphical user interface to set this option. To change it, edit your settings file with a plain text editor such as Notepad.

/firstChessProgramNames={names} or /firstChessProgramNames="@filename"

This option lets you customize the first drop-down list of chess engine names that appears in the WinBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text /cp /firstChessProgram= and adds the result to the command-line options.

There is no graphical user interface to set this option. To change it, edit your settings file with a plain text editor such as Notepad. Example:

/firstChessProgramNames={GNUChess
WCrafty-15_11 /fd="C:\Program Files\Crafty"
ArasanX /fd="C:\Program Files\Arasan\Arasan 4.1"
"EXchess xb" /fd=C:\EXchess
Comet-WB /fd=C:\Comet
}

/secondChessProgramNames={names} or /secondChessProgramNames="@filename"

This option lets you customize the second drop-down list of chess engine names that appears in the WinBoard startup dialog. It consists of a list of strings, one per line. If the option value starts with an @ sign, it is the name of a file that contains the strings. When you select a string from the drop-down list, WinBoard prepends the text /cp /secondChessProgram= and adds the result to the command-line options.

There is no graphical user interface to set this option. To change it, edit your settings file with a plain text editor such as Notepad. Example:

/secondChessProgramNames={GNUChess
WCrafty-15_11 /sd="C:\\Program Files\\Crafty\"
ArasanX /sd="C:\Program Files\Arasan\Arasan 4.1"
"EXchess xb" /sd=C:\EXchess
Comet-WB /sd=C:\Comet
}

/x=xcoord /y=ycoord

Sets the initial location of the board window, giving the screen coordinates of the upper left-hand corner. Both arguments must be given together.

/analysisX=xcoord /analysisY=ycoord /analysisW=width /analysisH=height

These options have been deprecated, as the analysis window is replaced by the more general engine-output window. They are recognized, but ignored, and no longer saved in the winboard.ini file.

/commentX=xcoord /commentY=ycoord /commentW=width /commentH=height

Sets the initial location and size of the Comment window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/gameListX=xcoord /gameListY=ycoord /gameListW=width /gameListH=height

Sets the initial location and size of the Game List window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/icsX=xcoord /icsY=ycoord /icsW=width /icsH=height

Sets the initial location and size of the ICS Interaction window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/tagsX=xcoord /tagsY=ycoord /tagsW=width /tagsH=height

Sets the initial location and size of the Tags window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/moveHistoryX=xcoord moveHistoryY=ycoord /moveHistoryW=width /moveHistoryH=height

Sets the initial location and size of the move-history window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/evalGraphX=xcoord /evalGraphY=ycoord /evalGraphW=width /evalGraphH=height

Sets the initial location and size of the evaluation-graph window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/engineOutputX=xcoord /engineOutputY=ycoord

/engineOutputW=width /engineOutputH=height

Sets the initial location and size of the engine-output window, giving the screen coordinates of the upper left-hand corner (relative to the main window), the width, and the height. All four arguments must be given together.

/engineOutputUp true|false

/evalGraphUp true|false

/moveHistoryUp true|false

If set to True, the corresponding window is displayed, if False, the window is absent.

/stickyWindows true|false

Auxiliary windows touching the main window will stay attached to the latter when you move it.

/autoDisplayComment true|false

/autoDisplayTags true|false

If set to True, these options cause the window with the move comments, and the window with PGN tags, respectively, to pop up automatically when such tags or comments are encountered during the replaying a stored or loaded game.

/gameListTags string

The string contains single-character codes specifying the PGN tags that have to be listed for each game in the game-list window, and their order. The meaning of the characters is a=out-of-book info, b=black Elo, e=event, d=date, o=round, p=players, r=result, w=white Elo, s=site, t=time control and v=variant, Default: eprd.

xboard-4.7.3/winboard/help/html/24.htm0000644000175000001440000000441512262415351014366 00000000000000 Copyright

COPYRIGHT

Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.
Enhancements Copyright 1992-2014 Free Software Foundation, Inc.

The following terms apply to Digital Equipment Corporation's copyright interest in WinBoard:

All Rights Reserved

Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.

DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

The following terms apply to the enhanced version of WinBoard distributed by the Free Software Foundation:

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

xboard-4.7.3/winboard/help/html/04.htm0000644000175000001440000004061212262415351014363 00000000000000 Mode Menu

Mode Menu

Machine White

Forces the chess engine to play white.

Machine Black

Forces the chess engine to play black.

Two Machines

Starts a game between two chess engines.

Machine Both

A single chess engine plays itself. Mainly useful for pseudo-engines, that are in fact communication links to another machine, where you want to observe a game that is being played. (E.g. the gothic-chess.com server). This command is not implemented yet (version 4.3.14).

Analysis Mode

In this mode, you can make moves for both sides on the board. After each move, the chess engine will think about possible replies and display its analysis in a separate window. Crafty was the first engine to support this feature, but by now there are many others that support it as well. With respect to playing variations, the same holds as in Edit Game mode.

From WinBoard 4.4 on this function can also be invoked in zippy mode, i.e. when you are logged on to an ICS with an engine loaded. In that case it is not your own moves that the engine analyzes, but the moves that are played in a game on the ICS that you are observing. You must start observing before you start the analysis mode! See the file zippy.README for how to connect to an ICS and a chess engine running on your local computer at the same time. (Basically this amounts to adding the /zp command-line option in addition to all options you would need for connecting to the ICS, as well as those needed for running the chess engine.)

Analyze File

In this mode, you can load a game from a file, and the chess engine will analyze each move as in Analysis Mode. Crafty was the first engine to support this feature, but by now there are many others that support it as well.

ICS Client

This is the normal mode when WinBoard is connected to a chess server. If you have moved into Edit Game or Edit Position mode, you can select this option to get out.

When you run WinBoard in ICS mode, it starts up a console window in which you can type commands and receive text responses from the chess server. You can use the standard Windows editing keys to edit your command line before pressing Enter. The console window keeps a history of the last few commands you typed. Press the up-arrow key to go back to a previous command; press the down-arrow key to go forward again to a later command. Press the right mouse button in the output area for a context menu of editing commands and ICS command shortcuts.

Some useful ICS commands include who to see who is logged on, games to see what games are being played, match to challenge another player to a game, observe to observe an ongoing game, examine or smoves to review a recently completed game, and of course help.

Whenever you ask to observe an ongoing game, review a completed game, or resume an adjourned game, WinBoard retrieves and parses the list of past moves from the ICS, so you can review them with Forward and Backward or save them with Save Game.

In ICS mode a graph of players seeking games can be displayed in stead of the chess board, when you are idle (i.e. not playing, observing or examining). When this feature is enabled, left-clicking in the board area will switch between board and the seek graph. For details on this, see the Seek Graph command.

Some special ICS Client features are activated when you are in examine or bsetup mode on ICS. See the descriptions of the menu commands Forward, Backward, Pause, and Stop Examining below. You can also issue the ICS position-editing commands with the mouse. Move pieces by dragging with the left mouse button, or by left-clicking once on the starting square and once on the ending square. Press the right mouse button over a square for a context menu that lets you drop a new piece, empty the square, or clear the board. Click on the White or Black clock to set the side to play. You cannot set the side to play or drag pieces to arbitrary squares while examining on ICC, but you can do so in bsetup mode on FICS. You can also make moves by typing them into the ICS window; you may have to do this occasionally if you are playing a chess variant whose rules WinBoard does not understand. (But this list is getting shorter, and Fischer Random is not on it anymore; you can enter castling there with the mouse by dragging the King on top of the Rook.)

If you are playing a bughouse game on the ICS, a list of the offboard pieces that each player holds is shown in the window title bar, and graphically in the holdings area next to the board. To drop an offboard piece, drag it from the holdings to the board. (Pressing the right mouse button over an empty square to bring up a context menu will still work if you have set the /dropMenu option.) To observe your partner's games, start a second copy of WinBoard, log in as a guest, and use the ICS follow or pfollow command in the new window. You can also use the Background Observe or Dual Board features to follow your partners game through a single connection on which you are also playing yourself, in the background (peeking at it by pressing the right mouse button), or on side-by-side boards in the board window.

Edit Game

Allows you to make moves for both Black and White, and to change moves after backing up with the Backward command. The clocks do not run, but you can adjust their reading by clicking on them. A left-click subtracts one minute, a right-click adds one minute.

In chess engine mode, the chess engine continues to check moves for legality but does not participate in the game. You can bring the chess engine back into the game by selecting Machine White, Machine Black, or Two Machines.

In ICS mode, the moves are not sent to the ICS: Edit Game takes WinBoard out of ICS Client mode and lets you edit games locally. If you want to edit a game on ICS in a way that other ICS users can see, use the ICS examine command or start an ICS match against yourself.

If you edit an existing game locally by playing new moves while not at the end, you will create a new variation. (New moves at the end will simply be appended to the existing game.) WinBoard will then shelve the original variation (main line) from beyond the point where you played a new move. You can later revert to that main line with the Revert or Annotate commands. This will discard the variation you just entered, and restores the moves of the original main line that you overwrote. This procedure can be applied recursively, so you an make (sub-)variations on variations. Rather than entering variations move by move, you can also recall them from PGN variations in the Comment window, by right-clicking those.

Edit Position

Lets you set up an arbitrary board position. Use the left mouse button to drag pieces to new squares, or to delete a piece by dragging it off the board or dragging an empty square on top of it. To drop a new piece on a square, press the right mouse button over the square. This brings up a menu of pieces. Additional menu choices let you empty the square or clear the board. You can set the side to play next by clicking on the White or Black indicator at the top of the screen. The pop-up menu also contains options to promote or demote the piece currently in the square. (In variants like Crazyhouse a piece has a different representation when it is a promoted Pawn rater than an original piece.) This allows you to create some of the not-so-common pieces (e.g. a Unicorn is a promoted King, a Commoner is a demoted King).

In Edit Position mode you can type a FEN in the move type-in box to setup the corresponding position.

Selecting Edit Position causes WinBoard to discard all remembered moves in the current game.

In ICS mode, change made to the position by Edit Position are not sent to the ICS: Edit Position takes WinBoard out of ICS Client mode and lets you edit positions locally. If you want to edit positions on ICS in a way that other ICS users can see, use the ICS examine command, or start an ICS match against yourself. (See also ICS Client above.)

Show Engine Output

Open a new window dedicated to showing the thinking output of the engine(s), as controlled by Show Thinking. In ICS mode kibitzed info of an opponent engine can appear here as well, under control of the /autoKibitz option. Right-clicking a line of thinking output will allow you to step through the PV it contains on the main board, by vertically moving the mouse, keeping the right-button pressed. This also works for PVs kibitzed to you through an ICS.

WinBoard will display lines of thinking output of the same depth ordered by score, (highest score on top), rather than in the order the engine produced them. Usually this amounts to the same, as a normal engine search will only find new PV (and emit it as thinking output) when it searches a move with a higher score than the previous variation. But when the engine is in multi-variation mode this needs not always be true, and it is more convenient for someone analyzing games to see the moves sorted by score. The order in which the engine found them is only of interest o the engine author, and can still be deduced from the time or node count printed with the line.

Show Evaluation Graph

Open a new window dedicated to displaying a graph, representing the development of the engine score(s) from the current game over time. (Needs Show Thinking to be enabled in order to work.) Right-clicking on the graph will take you to the corresponding move in the board display.

Show Game List

Shows or hides the list of games generated by the last Load Game command. Which info from the PGN tags is included in the game-description line can be customized. A 'Filter' field in this window allows you to display only lines that contain a certain string. (E.g. a player name to see only games of that player from a big tournament file.)

Show Move History

Open a new window dedicated to showing the game currently in progress. Double-clicking on a move takes you to the corresponding position in the board display.

Open Chat Window

Open a new window that in ICS mode can be used to display messages received from ICS tell commands from a specified ICS handle, from a channel (when you set the handle to the channel number), shouts / c-shouts, or whispers / kibitzes from co-observers of a game (when you set the handle to shouts, c-shouts, whisper or kibitzes). You have to press the Change button in the chat window to activate the entered handle, or type . Typing into the bottom field of the window will send tell messages to the handle or channel, or whispers to co-observers. You can open up to five chat windows. Messages that are diverted to such a chat window will not appear in the ICS interaction window. A window dedicated to shouts will also capture c-shouts (if there is no dedicated c-shout box) and It messages, recognizable on the type of bracketing used around the shouter name ( [ ], ( ) or < >, respectively).

Training

Training mode lets you interactively guess the moves of a game for one of the players. While in Training mode, the navigation buttons are disabled. You guess the next move of the game by playing the move on the board (or using the Type In Move command). If the move played matches the next move of the game, the move is accepted and the opponents response is autoplayed. If the move played is incorrect, an error message is displayed.

Edit Tags

Lets you edit the PGN (portable game notation) tags for the current game. After editing, the tags must still conform to the PGN tag syntax:


<tag-section> ::= <tag-pair> <tag-section>
                  <empty>
<tag-pair>    ::= [ <tag-name> <tag-value> ]
<tag-name>    ::= <identifier>
<tag-value>   ::= <string>

See the PGN Standard for full details. Here is an example:


[Event "Portoroz Interzonal"]
[Site "Portoroz, Yugoslavia"]
[Date "1958.08.16"]
[Round "8"]
[White "Robert J. Fischer"]
[Black "Bent Larsen"]
[Result "1-0"]

Any characters that do not match this syntax are silently ignored. Note that the PGN standard requires all games to have at least the seven tags shown above. Any that you omit will be filled in by WinBoard with "?" (unknown value) or "-" (inapplicable value).

Edit Comment

Adds or modifies a comment on the current position. Comments are saved by Save Game and are displayed by Load Game, Forward, and Backward.

Enter Username

Allows you to type the name of the human player, which will appear in the PGN header and in the window title.

Pause

Pauses updates to the board, and if you are playing against a local chess engine, also pauses your clock. To continue, select Pause again, and the display will automatically update to the latest position. The P (or C) button is equivalent to selecting Pause.

If you select Pause when you are playing against a chess engine and it is not your move, the chess engines clock will continue to run and it will eventually make a move, at which point both clocks will stop. Since board updates are paused, however, you will not see the move until you exit from Pause mode (or select Forward). This behavior is meant to simulate adjournment with a sealed move.

If you select Pause while you are in examine mode on ICS, you can step backward and forward in the current history of the examined game without affecting the other examiners or observers. Select Pause again to reconnect yourself to the current state of the game on ICS.

If you select Pause while you are loading a game, the game stops loading. You can load more moves one at a time by selecting Forward, or resume automatic loading by selecting Pause again.

xboard-4.7.3/winboard/help/html/22.htm0000644000175000001440000001167212262415351014367 00000000000000 Limitations

LIMITATIONS AND NON-LIMITATIONS

WinBoard is a Win32 application. It runs only on Windows NT and Windows 95. It does not work on Windows 3.11 or earlier, even with the Win32s compatibility package.

CMail, the companion program to xboard for playing electronic mail correspondence chess, has not been ported to Win32.

There is no way for two people running copies of WinBoard to play each other without going through the Internet Chess Server.

Under some circumstances, your ICS password may be echoed when you log on.

If you are connecting to the ICS by running telnet, timestamp, or timeseal on an Internet provider host, you may find that each line you type is echoed back an extra time after you hit Enter. You can probably turn this echo off. If your Internet provider is a Unix system, type "stty -echo" after you log in to the provider but before you run telnet, timestamp, or timeseal. In addition, you may need to type the sequence Ctrl+Q Ctrl+E Enter after you have finished logging in to ICS. On VMS, type set terminal /noecho /nowrap, and after you telnet to the ICS, type Ctrl+Q Ctrl+] Enter set mode char Enter Enter. It is a good idea to turn off the extra remote echo if you can, because otherwise it can get interleaved with output from the ICS and confuse WinBoard's parsing routines. Dont just turn off Local Line Editing so that you see only the remote echo and not the local one; that will make the interleaving problem worse.

The game parser recognizes only algebraic notation (SAN).

The ICS logon file does not work properly when you connect to ICS through a Unix gateway host by setting icsPort to 23. The Unix login process apparently discards type-ahead.

Some WinBoard functions may not work with versions of GNU Chess earlier than 4.0, patchlevel 77. The current version of WinBoard works best with Crafty version 15.11 or later.

Many of the following points used to be limitations in WinBoard 4.2.7 and earlier, but are now fixed:

The internal move legality tester in WinBoard 4.3.xx does look at the game history, and is fully aware of castling or en passant-capture rights. It permits castling with the king on the d file because this is possible in some "wild 1" games on ICS. The piece-drop menu does not check piece drops in bughouse to see if you actually hold the piece you are trying to drop. But this way of dropping pieces should be considered an obsolete feature, now that pieces can be dropped by dragging them from the holdings to the board. Anyway, if you would attempt an illegal move when using a chess engine or the ICS, WinBoard will accept the error message that comes back, undo the move, and let you try another.

FEN positions saved by WinBoard do include correct information about whether castling or en passant are legal, and also handle the 50-move counter.

The mate detector does not understand that non-contact mate is not really mate in bughouse. The only problem this causes while playing is minor: a "#" (mate indicator) character will show up after a non-contact mating move in the move list. WinBoard will not assume the game is over at that point, not even when the option Detect Mates is on.

Edit Game mode always uses the rules of the selected variant, which can be a variant that uses piece drops. You can load and edit games that contain piece drops. The (obsolete) piece menus are not active, but you can perform piece drops by dragging pieces from the holdings.

Edit Position mode does not allow you to edit the Crazyhouse holdings properly. You cannot drag pieces to the holding, and using the popup menu to put pieces there does not adapt the holding counts and leads to an inconsistent state. Set up Crazyhouse positions by loading / pasting a bFEN, from there you can set the holdings.

Fischer Random castling is fully understood. You can enter castlings by dragging the King on top of your Rook. You can probably also play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window.

Also see the ToDo file included with the distribution for many other possible bugs, limitations, and ideas for improvement that have been suggested.

xboard-4.7.3/winboard/help/html/06.htm0000644000175000001440000001407712262415351014373 00000000000000 Step Menu

Step Menu

Type In Move

Pops up a dialog box, into which you can type moves in standard algebraic chess notation. (You can also get this dialog box by simply starting to type over the chessboard, except in ICS mode, where such typing is redirected into the ICS interaction window.) Typing a number will have the same effect as stepping forward or backward to the position after that move. In Edit Position mode you can also type a FEN to set up the position.

Backward

Steps backward through a series of remembered moves. The < button is equivalent to selecting Backward, as is turning the mouse wheel towards you. In most modes, Backward only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on the ICS, or loading a game. If you select Backward in any of these situations, you will not be allowed to make a different move. Use Retract Move or Edit Game if you want to change past moves.

If you are examining a game on the ICS, the behavior of Backward depends on whether WinBoard is in Pause mode. If Pause mode is off, Backward issues the ICS command backward, which backs up everyone's view of the game and allows you to make a different move. If Pause mode is on, Backward only backs up your local view.

Forward

Steps forward through a series of remembered moves (undoing the effect of Backward) or through a game file. The > button is equivalent, as is turning the mouse wheel away from you.

If you are examining a game on the ICS, the behavior of Forward depends on whether WinBoard is in Pause mode. If Pause mode is off, Forward issues the ICS command forward, which moves everyone's view of the game forward along the current line. If Pause mode is on, Forward only moves your local view forward, and it will not go past the position the game was in when you paused.

Back to Start

Jumps backward to the first remembered position in the game. The << button is equivalent.

In most modes, Back to Start only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on the ICS, or loading a game. If you select Back to Start in any of these situations, you will not be allowed to make a different move. Use Retract Move or Edit Game if you want to change past moves; or use New Game to start a new game.

If you are examining a game on the ICS, the behavior of Back to Start depends on whether WinBoard is in Pause mode. If Pause mode is off, Backward issues the ICS command backward 999999, which backs up everyone's view of the game to the start and allows you to make different moves. If Pause mode is on, Back to Start only backs up your local view.

Forward to End

Jumps forward to the last position in the game. The >> button is equivalent.

If you are examining a game on the ICS, the behavior of Forward to End depends on whether WinBoard is in Pause mode. If Pause mode is off, Forward to End issues the ICS command forward 999999, which moves everyone's view of the game forward to the end of the current line. If Pause mode is on, Forward to End only moves your local view forward, and it will not go past the position the game was in when you paused.

Revert

If you are examining a game on the ICS, issues the ICS command revert. In local mode, when you were editing or analyzing a game, and have been entering a number of moves by hand, starting from a position not at the end of the game, the revert command restores the game to the variation you started from. This can be applied recursively, so that you can analyze variations on variations; each time you create a new variation by entering an alternative move, the current variation will be shelved. Revert allows you to return to the most recently shelved variation.

Annotate

Similar to the Revert command, but in local mode it will add the variation you are abandoning as a comment to the move where it first deviated, in PGN variation format (i.e. in parentheses). You can right-click such variation comments to recall them.

Truncate Game

Discards all remembered moves of the game beyond the current position. Puts WinBoard into Edit Game mode if it was not there already.

Move Now

Forces the chess engine to move immediately. May not work with all chess engines.

Retract Move

Retracts your last move.

In chess engine mode, you can do this only after the chess engine has replied to your move. If the chess engine is still thinking, use Move Now first.

In ICS mode, Retract Move issues the command takeback 1 or takeback 2, depending on whether it is your opponent's move or yours.

xboard-4.7.3/winboard/help/html/20.htm0000644000175000001440000001256312262415351014365 00000000000000 Installing Chess Engines

INSTALLING CHESS ENGINES

Introduction

WinBoard is capable of operating with many different chess engines. You can play chess against a compatible engine, set up matches between two engines, or (advanced users only) run an automated computer player on an ICS.

Typically, the main difficulty in installing a new chess engine for use by WinBoard comes in getting the engine itself running and setting its options appropriately. The connection to WinBoard is relatively straightforward.

WinBoard-compatible chess engines are Win32 command line programs that you can run by hand in an MS-DOS Prompt box and type human-readable commands to. WinBoard connects to an engine simply by starting the engine up in the background and communicating with it through a pair of pipes. Therefore the basic procedure for installing an engine is:

1. Get a copy of the engine and any supporting files it needs.

2. Install and configure the engine as a command-line program by following the instructions that come with it. Try it out by running it from the command line in an MS-DOS Prompt box and make sure it works.

3. Optional, but recommended: Try out the WinBoard plus engine combination by running WinBoard with the proper command line arguments in an MS-DOS Prompt box.

4. Create a shortcut on your desktop or Start menu to run the engine with WinBoard.

5. Optionally edit your WinBoard.ini file to add the engine to the drop-down lists on WinBoard's startup dialog.

This document cannot explain steps 1 and 2 in detail for all engines, but we will take you through all five steps in outline, using Crafty as an example.

Example: Crafty

1. Choose a directory to put Crafty in. We'll use C:\Program Files\Crafty in this example. Download your copy of Crafty into this directory from its author's FTP site, ftp://ftp.cis.uab.edu/pub/hyatt. At this writing, you will need at least the following files:

read.me
v15/crafty.doc
v15/crafty.faq
v15/wcrafty-15.*.exe
(where * is replaced by the largest number there)
common/start.zip
common/medium.zip
(or another book).

2. The first three files are documentation that you can read with a text editor. Read the read.me file first and follow the instructions carefully. This will take some time. Do not write to the author of WinBoard if you have trouble with the instructions in the Crafty read.me. Try running Crafty from an MS-DOS Prompt box and make sure it works before you go on.

3. Optional, but recommended: In an MS-DOS Prompt box, cd to the directory where WinBoard is installed, typically "C:\Program Files\WinBoard". Then type the following command line. Use the actual name of the wcrafty file you downloaded, not an *, and if your browser changed the first period to an underscore when you downloaded the file, make that change in the command line too.

WinBoard /cp /fcp=WCrafty-15.* /fd="C:\Program Files\Crafty" /scp=WCrafty-15.* /sd="C:\Program Files\Crafty"

WinBoard should start up, with Crafty running as its chess engine. Check that you can play chess against Crafty.

4. To make a shortcut or Start menu entry for Crafty: Right-click on the desktop and select New/Shortcut. Use the Browse button to find your winboard.exe file and get its name into the Command Line box. (It usually will be "C:\Program Files\WinBoard\winboard.exe".) Click in the Command Line box and hit the End key to go to the end. Add the following to the end of the command line, after the closing quotation mark. Use the actual name of the wcrafty file you downloaded, not an *, and if your browser changed the first period to an underscore when you downloaded the file, make that change in the command line too.

/cp /fcp=WCrafty-15.* /fd="C:\Program Files\Crafty" 
/scp=WCrafty-15.* /sd="C:\Program Files\Crafty"

Press Next, choose a name for the shortcut, and press Finish. You can now use this shortcut to run WinBoard with Crafty. Double-click it to check that it works. You can drag or copy the shortcut into your Start menu if you like.

5. To add Crafty as an option in the WinBoard Startup dialog, edit your WinBoard.ini file with Notepad or another plain text editor, carefully following the example shown under /firstChessProgramNames above.

For more information

If you would like to run an automated computer player on the ICS, see the separate file zippy.README. If you would like to write your own engine to interface to WinBoard, see the separate file engine-intf.html, and join the mailing list mentioned there. Both files are included in the WinBoard distribution. You might also want to get the source code for WinBoard. It is available from the author's Web page, http://www.tim-mann.org/chess.html.

xboard-4.7.3/winboard/help/html/15.htm0000644000175000001440000001602012262415351014361 00000000000000 Load and Save Options

Load and Save Options

/lgf or /loadGameFile filename
/lgi
or /loadGameIndex N

If loadGameFile is set, WinBoard reads the specified game file at startup. You can leave out the name of this option and give just the file name, which is handy if you want to configure WinBoard as a game viewer with a browser such as the Windows Explorer or Netscape. The filename is interpreted relative to WinBoard's initial working directory. The filename "-" specifies the standard input. If there is more than one game in the file, WinBoard pops up a menu of the available games, with entries based on their PGN tags. If loadGameIndex is set to N, the menu is suppressed and the Nth game found in the file is loaded immediately. A game index of 1 will load the first game, but step to the next game on each new game in Match Mode. Similarly, an index of 2 will step to the next game every two games, so that all games are played by each player with both colors.

/td or /timeDelay seconds

Time delay between moves during Load Game. Fractional seconds are allowed; try 0.4. A time delay value of -1 tells WinBoard not to step through game files automatically. Default: 1 second.

/sgf or /saveGameFile filename

If this option is set, WinBoard appends a record of every game played to the specified file. The filename is interpreted relative to WinBoard's initial working directory. The filename "-" specifies the standard output.

/autosave or /xautosave, or /autoSaveGames true|false

If this option is True, at the end of every game WinBoard prompts you for a filename and appends a record of the game to the file you specify. Ignored if saveGameFile is set. Default: False.

/lpf or /loadPositionFile filename
/lpi
or /loadPositionIndex N

If loadPositionFile is set, WinBoard loads the specified position file at startup. The filename is interpreted relative to WinBoard's initial working directory. The filename "-" specifies the standard input. If loadPositionIndex is set to N, the Nth position found in the file is loaded; otherwise the first is loaded. A position index of 1 will load the first position, but step to the next position on each new game in Match Mode. Similarly, an index of 2 will step to the next position every two games, so that all positions are played by each player with both colors.

/rewindIndex number

When number is non-zero, resets the game or position index used in the /lgf or /lpf options back to 1 after it has reached the value number. Default: 0.

/spf or /savePositionFile filename

If this option is set, WinBoard appends the final position reached in every game played to the specified file. The filename is interpreted relative to WinBoard's initial working directory. The file name "-" specifies the standard output.

/pgnExtendedInfo true|false

If this option is set, WinBoard saves depth, score and time used for each move that the engine found as a comment in the PGN file.

/pgnEventHeader string

Sets the name used in the PGN event tag to string.

/saveOutOfBookInfo true|false

Include the information on how the engine(s) game out of its opening book in a special annotator tag with the PGN file.

/oldsave or /xoldsave, or /oldSaveStyle true|false

If this option is False (the default), WinBoard saves games in PGN (portable game notation) and positions in FEN (Forsythe-Edwards notation). If the option is True, a save style that is compatible with older versions of WinBoard (and of xboard) is used instead.

/debug or /xdebug, or /debugMode true|false

Writes debugging information to the file WinBoard.debug, including all commands sent to the chess engine, all output received from it, and all commands sent to ICS. You can press Ctrl+Alt+F12 to turn this option on or off while WinBoard is running. Each time you turn it on, any existing debug file is overwritten.

/debugFile filename or /nameOfDebugFile filename

Sets the name of the file to which WinBoard saves debug information (including all communication to and from the engines).

/engineDebugOutput number

Specifies how WinBoard should handle unsollicited output from the engine, with respect to saving it in the debug file. The output is further (hopefully) ignored. If number=0, WinBoard refrains from writing such spurious output to the debug file. If number=1, all engine output is written faithfully to the debug file. If number=2, any protocol-violating line is prefixed with a # character, as the engine itself should have done if it wanted to submit info for inclusion in the debug file.

This option is provided for the benefit of applications that use the debug file as a source of information, such as the broadcaster of live games TLCV / TLCS. Such applications can be protected from spurious engine output that might otherwise confuse them.The case number=3 is similar, but now marks non-compliant engine output with a more conspicuous prefix.

xboard-4.7.3/winboard/help/html/14.htm0000644000175000001440000002760012262415351014366 00000000000000 Internet Chess Server Options

Internet Chess Server Options

/ics or /xics, or /internetChessServerMode true|false

Connect with an Internet Chess Server to play chess against its other users, observe games they are playing, or review games that have recently finished. See ICS Client Default: False.

You can create a script file containing ICS commands that WinBoard will type in for you whenever you connect to the ICS. See ICS Logon.

/icshost or /internetChessServerHost hostname

The host name or numeric address of the Internet Chess Server to connect to when in ICS mode. The default is the empty string, which causes WinBoard to pop up a menu of known ICS sites. The file ics-addresses.txt in the WinBoard distribution gives slightly more information on these sites. It includes their numeric addresses, which you can use if your site does not have a working name server.

/icsport or /internetChessServerPort portnumber

The port number to use when connecting to a chess server in ICS mode. Default: 5000.

/icshelper program

An external helper program used to communicate with the chess server. Typically timestamp for the ICC (chessclub.com) or timeseal for FICS (freechess.org, eics.daimi.aau.dk, etc.). This option is shorthand for /useTelnet /telnetProgram program.

/telnet or /xtelnet, or /useTelnet true|false

This option is poorly named; it should be called /useHelper. If set to True, it instructs WinBoard to use an external helper program to communicate with the ICS, as specified by the telnetProgram option. The external program must be a pure console application that can communicate with WinBoard through pipes; the Windows telnet application is not suitable. If the option is False (the default), WinBoard communicates with the ICS by opening a Winsock TCP socket and using its own internal implementation of the telnet protocol.

/gateway hostname

If this option is set to a host name, WinBoard uses rsh to run the telnetProgram remotely on the given host to communicate with the Internet Chess Server instead of using its own internal implementation of the telnet protocol. See the FIREWALLS section below for an explanation of when this option is useful.

/telnetProgram program

This option is poorly named; it should be called /helperProgram. It gives the name of the remote or external helper program to be used with the gateway or useTelnet option. The default is "telnet". The telnet program is invoked with the value of internetChessServer as the first argument and the value of internetChessServerPort as the second argument on its command line.

/icscom or /internetChessServerComPort name

If this option is set, WinBoard communicates with the Internet Chess Server using a serial communication port instead of a network connection. Use this option if your machine is not connected to a network (not even via SLIP or PPP), but you do have Internet access through another machine by dialing in using a modem or by connecting directly to a serial terminal port. Example:

WinBoard /ics /icscom:com1

After you start WinBoard in this way, type whatever modem commands are necessary to dial out to your Internet provider and log in. You may need to turn off Local Line Editing on the Options menu while typing commands to the modem, but turn it on again afterwards. Then telnet to the ICS, using a command like "telnet chessclub.com 5000". Important: See the paragraph in the LIMITATIONS section below about extra echoes.

/comPortSettings dataRate,dataBits,parity,stopBits,flow

This option allows serial port parameters to be set from the command line or a settings file. The values are simply filled in to the Communications dialog.

/icslogon or /internetChessServerLogonScript filename

This option lets you change the name used for the ICS Logon file. Default: "ICS.ini". The filename is interpreted relative to WinBoard's installation directory (the directory containing WinBoard.exe).

/autocomm or /xautocomm, or /autoComment true|false

Sets the Auto Comment option. Default: False.

/autoflag or /xautoflag, or /autoCallFlag true|false

Sets the Auto Flag option. Default: False.

/autobs or /xautobs, or /autoObserve true|false

Sets the Auto Observe option. Default: False.

/autoKibitz

Kibitzes the engines last thinking output (depth, score, time, speed, PV) to the ICS in zippy mode. Show Thinking must be on for this option to work. Also diverts similar kibitz information of an opponent engine that is playing you through the ICS to the engine-output window, as if the engine was playing locally.

/moves or /xmoves, or /getMoveList true|false

Sets the Get Move List option. Default: True.

/edit or /xedit, or /localLineEditing true|false

Sets the Local Line Editing option. Default: True.

/quiet or /xquiet, or /quietPlay true|false

Sets the Quiet Play option. Default: False

/blindfold true|false

Sets the Blindfold option. Default: False

/seekGraph true|false, or /sg

Enables summoning up of the Seek Graph by left-clicking the board. Default: False

/autoRefresh true|false

Sets the Auto Refresh option of the Seek Graph. Default: False

/backgroundObserve true|false

Sets the Background Observe option for observing other games during play. Default: False

/dualBoard true|false

Sets the Dual Board option for observing your partner's bughouse game. Default: False

/pre or /xpre, or /premove true|false

Sets the Premove option. If set to True, the premove feature is enabled. If set to False, premove is disabled and the other Premove settings are ignored. Default: False.

/prewhite or /xprewhite, or /premoveWhite true|false

/premoveWhiteText movetext

If premoveWhite is set to True and you are playing white in an ICS game, the text specified by the premoveWhiteText option is sent to the ICS as soon as the game starts. These options can be set from the Premove section of the ICS Options dialog box. The default for premoveWhite is False.

/preblack or /xpreblack, or /premoveBlack true|false

/premoveBlackText movetext

If premoveBlack is set to True and you are playing black in an ICS game, the text specified by the premoveBlackText option is sent to the ICS as soon as the first move is received from your opponent, even if you make a different premove on the board before the first white move is received. These options can be set from the Premove section of the ICS Options dialog box. The default for premoveBlack is False.

/oneClickMove true|false

Sets the One-Click Move option. Default: False

/alarm or /xalarm, or /icsAlarm true|false

/icsAlarmTime milliseconds

When icsAlarm is set to True, the alarm sound is played when your clock counts down to icsAlarmTime seconds. For ICS games with time controls that include an increment, the alarm will sound each time the clock counts down to the icsAlarmTime. The icsAlarmTime can be set by selecting ICS Alarm from the ICS options dialog. The default is 5 seconds.

/keepAlive time

When time is non-zero, send a date command every time minutes after your last move to the ICS, to prevent it from logging you off. (Do not use frivolously! The ICS operator might ban you.) Default: 0.

/chatBoxes handles

Sets the list of Chat Boxes to be opened at startup. The given string handles should be a semicolon-separated list, like shouts;53;Johnny to open 3 chat boxes, to capture all shouts (including c-shouts and it messages), the traffic on channel 53, and for a player named Johnny. Default: no chat windows.

xboard-4.7.3/winboard/help/html/02.htm0000644000175000001440000000265312262415351014364 00000000000000 Menus

The menus of WinBoard 4.5.0 have been re-organized, and the new menu structure has not been incorporated in this help file yet. New menus Edit, View and Engine have been added, and the Step menu has disappeared. Sorry about this, but we are working on a new way to generate Help files, and we did not want to delay release of 4.5.0 until that is done.

Items now in the Edit menu previously were in the File menu, (for Copy and Paste items), or the Step menu (Revert, Truncate, Forward, Backward, etc.). Items now in the View menu used to be in the Mode Menu, (opening and closing auxiliary windows), or the Option Menu (for options that determine look, such as Board and Fonts). Items in the Engine menu where in the Option (settings), Help (Hint, Book) or Step menu (Retract Move, Move Now).

MENUS

File Menu

Mode Menu

Action Menu

Step Menu

Options Menu

Help Menu

ICS Interaction Context Menu

xboard-4.7.3/winboard/help/html/12.htm0000644000175000001440000004307712262415351014372 00000000000000 Chess Engine Options

Chess Engine Options

/cp or /xcp, or /chessProgram true|false

If true, puts WinBoard in chess engine mode. In this mode, you can play against a chess program running on your PC or use it as an analysis partner.

/tc or /timeControl minutes[:seconds]

Each player begins with his clock set to the timeControl period. Default: 5 minutes. The additional options movesPerSession and timeIncrement are mutually exclusive.

/mps or /movesPerSession moves

When both players have made movesPerSession moves, a new timeControl period is added to both clocks. Default: 40 moves.

/inc or /timeIncrement seconds

If this option is specified, movesPerSession is ignored. Instead, after each player's move, timeIncrement seconds are added to his clock. Use -timeIncrement 0 if you want to require the entire game to be played in one timeControl period, with no increment. Default: -1, which specifies movesPerSession mode.

/clock or /xclock, or /clockMode true|false

Determines whether or not to display the chess clocks. If clockMode is False, the clocks are not shown, but the side that is to play next is still highlighted. Also, unless searchTime is set, the chess engine still keeps track of the clock time and uses it to determine how fast to make its moves.

/st or /searchTime minutes[:seconds]

Tells the chess engine to spend at most the given amount of time searching for each of its moves. Without this option, the engine chooses its search time based on the number of moves and amount of time remaining until the next time control. Setting this option also sets clockMode to False.

/depth or /searchDepth number

Tells the chess engine to look ahead at most the given number of moves when searching for a move to make. Without this option, the engine chooses its search depth based on the number of moves and amount of time remaining until the next time control. With the option, the engine will cut off its search early if it reaches the specified depth.

/firstNPS number

/secondNPS number

Tells the chess engine to use an internal time standard based on its node count, rather then wall-clock time, to make its timing decisions. The time in virtual seconds should be obtained by dividing the node count through the given number, like the number was a rate in nodes per second. WinBoard will manage the clocks in accordance with this, relying on the number of nodes reported by the engine in its thinking output. If number equals zero, it can obviously not be used to convert nodes to seconds, and the time reported by the engine is used to decrement the WinBoard clock. The engine is supposed to report in CPU time it uses, rather than wall-clock time in this mode. This option can provide fairer conditions for engine-engine matches on heavily loaded machines, or with very fast games (where the wall clock is too inaccurate). Show Thinking must be on for this option to work. Not many engines might support this yet!

/firstTimeOdds factor

/secondTimeOdds factor

Reduces the time given to the mentioned engine by the given factor. If pondering is off, the effect is indistinguishable from what would happen if the engine was running on a factor times slower machine.

/timeOddsMode mode

This option determines how the case is handled when both engines have a time-odds handicap. If mode=1, the engine that gets the most time will always get the nominal time, as specified by the time-control options, and its opponents time is normalized similarly. If mode=0, both play with reduced time.

/ponder or /xponder, or /ponderNextMove true|false

Sets the Ponder Next Move option. Default: True.

/thinking or /xthinking, or /showThinking true|false

Sets the Show Thinking option. Default: False.

/periodic or /xperiodic, or /periodicUpdates true|false

Sets the Periodic Updates option. Default: True.

/mg or /matchGames n

Automatically runs an n-game match between two chess engines, with alternating colors. If the loadGameFile or loadPositionFile option is set, WinBoard will start each game with the given opening moves or the given position; otherwise, the games will start with the standard initial chess position. If the saveGameFile option is set, a move record for the match will be appended to the specified file. If the savePositionFile option is set, the final position reached in each game of the match will be appended to the specified file. When the match is over, WinBoard will display the match score and exit. Default: 0 (do not run a match).

/mm or /xmm, or /matchMode true|false

Provided for backward compatibility. If true and matchGames=0, sets matchGames=1.

/matchPause number

Sets the length of the pause between games in match mode to number msec. Default value is 10000, i.e. 10 sec. (If this pause is too short, engines not implementing ping will sometimes send the last move of their previous game only when a new game has started, at which time the move is illegal, and causes them to forfeit the game.)

/fd or /firstDirectory dir
/sd
or /secondDirectory dir
/fcp
or /firstChessProgram command
/scp
or /secondChessProgram command

Names of the chess engines and working directories in which they are to be run. The second chess engine is started only in Two Machines (match) mode. These arguments are parsed as filenames; that is, the \ character is interpreted literally, not as a C-style escape.

The dir argument specifies the initial working directory for the chess engine. It should usually be the directory where the engine and its working files are installed. If dir is not an absolute pathname, it is interpreted relative to the directory from which WinBoard.exe itself was loaded. The dir argument is ignored if the chess engine is being run on a remote machine (see firstHost and secondHost below). The default value for dir "", meaning that the chess engine is expected to be installed in the same directory as WinBoard.

The command argument is actually the command line to the chess engine, so if the engine itself needs command line arguments, you can include them by enclosing command in single or double quotes. If the engine name or an engine argument has a space in it, use single quotes around the whole command, and inside them use double quotes around each item that contains spaces. If the engine name has more than one period in it (for example, QChess1.5.exe), you must include the ".exe" extension; otherwise you can leave it out. The default value for command is "", which brings up the startup dialog to ask which engines you want.

Examples:

WinBoard /cp /fd="C:\Program Files\Crafty" /fcp=WCrafty-15.12.exe /scp=GNUChess
WinBoard /cp /fd="C:\Miracle Games" /fcp='"Miracle Chess.exe" /wow' /scp=GNUChess

The basic rule is thus that what is inside the quotes delimiting the argument to /fcp and /scp, all goes to the engine, and is ignored by WinBoard. WinBoard 4.3.13 and later, however, knows an exception to this: If, within the quotes, the word WBopt appears, everything that follows this word will be interpreted as a WinBoard argument, in stead of being passed to the engine on startup of the latter. (The WBopt itself is also not passed to the engine.) This possibility of hiding WinBoard arguments in the engine command is provided in order to create options that follow the engine in a tournament, when a tournament manager like PSWBTM is used to invoke WinBoard. Because, in order to apply to a given engine, some options need to know if they apply to first or second engine, which might vary during the tournament, options hidden inside the engine command-line can contain %s which will be replaced at the time the option is used by first or second, as applicable.

Examples:

WinBoard /cp /fd="C:\Engines\Crafty" /fcp=WCrafty-15.12 WBopt /%sTimeOdds=2 /scp=GNUChess

Meaning that Crafty will have to play with half the time GNUChess will get.





/fh or /firstHost host
/sh
or /secondHost host

Hosts on which the chess engines are to run. The default for each is "localhost". If you specify another host, WinBoard uses rsh to run the chess program there. The /fd and /sd flags do not work in conjunction with these flags; if you need a remote chess engine to run somewhere other than your default login directory on the remote machine, you will have to include a "cd" command in the argument to /fcp or /scp.

/firstInitString or /initString string
/secondInitString string

The strings that are sent to initialize the chess engines. Default: "new\nrandom\n". The "\n" sequences represent newlines. You can type "\n" on the command line or in a settings file, and WinBoard will convert it to a newline.

All chess engines require the "new" command to start a new game.

You can remove the "random" command if you like; including it causes GNU Chess to randomize its move selection slightly so that it doesn't play the same moves in every game. Even without "random", GNU Chess randomizes its choice of moves from its opening book. You can also try adding other commands to the initString; see the GNU Chess documentation (gnuchess.txt) for details. Crafty ignores the "random" command; see its documentation for the commands it accepts.

/firstComputerString string
/secondComputerString string

If the chess engine is playing against another computer program (whether locally or on a chess server), by default the command "computer\n" is sent to it. Some chess engines change their playing style when they receive this command. If you do not want the engine to know when it is playing another computer, you can set the string to "".

Note that the computer string is sent to the engine after most other initialization commands, and is thus ideal for hiding a WinBoard-protocol command in that should be sent only to one engine, when the WinBoard option that normally specifies this command cannot be differentiated by engine, but s always sent to both engines. E.g. if you want one of the engines to ponder, and the other not. Because it is sent last, in can overrule earlier commands.

/fb or /xfb, or /firstPlaysBlack true|false

In games between two chess programs, the firstChessProgram normally plays white. (This is a change from earlier versions of WinBoard.) If this option is True, firstChessProgram plays black. In a multi-game match, this option affects the colors only for the first game; they still alternate in subsequent games.

/reuse or /xreuse, or /reuseFirst true|false
/reuse2
or /xreuse2, or /reuseSecond true|false

If this option is True (the default), WinBoard uses the same chess engine process repeatedly when playing multiple games. If the option is False, WinBoard kills off the chess engine after every game and starts a fresh one for the next game. Starting a fresh chess engine can be slow, so it is not recommended. However, some chess engines may not work properly when reused, such as versions of Crafty earlier than 12.0.

/firstProtocolVersion ver
/secondProtocolVersion ver

This option specifies which version of the chess engine communication protocol to use. By default, version-number is 2. In version 1, the "protover" command is not sent to the engine; since version 1 is a subset of version 2, nothing else changes. Other values for version-number are not supported.

/firstScoreAbs true|false
/secondScoreAbs true|false

If this option is true, the score reported by the engine is taken to be that in favor of white, even when the engine plays black. Important when winboard uses the score for adjudications, or in PGN reporting. This can be a useful option in combination with WBopt in the engine command-line, see under /fcp.

/niceEngines priority

This option allows you to lower the priority of the engine processes, so that the generally insatiable hunger for CPU time of chess engines does not interfere so much with smooth operation of WinBoard (or the rest of your system). Try priority = 10 or even 20 to lower the priority of the engines. Negative values could increase the engine priority, which is not recommended.

/firstOptions string
/secondOptions string

The given string is a comma-separated list of (option name, option value) pairs, like the following example: style=Karpov,blunder rate=0. If the options announced by the engine at startup through the feature commands of WinBoard protocol matches one of the option names (i.e. style or blunder rate), it would be set to the given value (i.e. Karpov or 0) through a corresponding option command to the engine. This provided that the type of the value (text or numeric) matches as well.

/firstNeedsNoncompliantFEN string
/secondNeedsNoncompliantFEN string

The castling rights and e.p. fields of the FEN sent to the mentioned engine with the setboard command will be replaced by the given string. This can for instance be used to run engines that do not understand Chess960 FENs in variant fischerandom, to make them at least understand the opening position, through setting the string to KQkq -. (Note you also have to give the e.p. field!) Other possible applications are to provide work-arounds for engines that want to see castling and e.p. fields in variants that do not have castling or e.p. (shatranj, courier, xiangqi, shogi) so that WinBoard would normally omit them (string = - -, or to add variant-specific fields that are not yet supported by WinBoard (e.g. to indicate the number of checks in 3check).

xboard-4.7.3/winboard/help/html/09.htm0000644000175000001440000000720712262415351014373 00000000000000 ICS Interaction Context Menu

ICS Interaction Context Menu

To see this menu, press the right mouse button anywhere in the output (upper) pane of the ICS Interaction window. Pressing the right mouse button in the input (lower) pane gives a standard editing context menu, not described here. Use the help command on ICS to learn what these commands mean.

You can customize the lower part of this menu (below the Paste option) by setting the icsMenu option. The easiest way to accomplish this is to edit your settings file with Notepad or another plain text editor. Sorry, there is no graphical user interface for customizing the menu.

Copy and Paste

Copies the current selection to the clipboard, then pastes it to the input box. As a shortcut to this function, you can press the middle mouse button (if you have one), or Shift plus the right mouse button.

Copy

Copies the current selection to the clipboard.

Paste

Pastes the clipboard contents to the input box.

Who

Sends the command who to ICS.

Players

Sends the command players to ICS.

Games

Sends the command games to ICS.

Sought

Sends the command sought to ICS.

Tell (name)

Inserts tell name into the input box. The string name is the current selection if it is not empty. Otherwise name is the word surrounding the mouse position, where a word is a string of letters, digits, or hyphens (-), such as an ICS user handle or game number.

Open Chat Box (name)

Causes WinBoard to open a new Chat Window, with name in the chat Partner field, where name is as defined above.

Message (name)

Inserts message name into the input box, where name is as defined above.

Finger (name)

Sends the command finger name to ICS, where name is as defined above.

Vars (name)

Sends the command vars name to ICS, where name is as defined above.

Observe (name)

Sends the command observe name to ICS, where name is as defined above. Here name can be either a user handle or a game number.

Match (name)

Sends the command match name to ICS, where name is as defined above.

Play (name)

Sends the command play name to ICS, where name is as defined above. Here name can be either a user handle or a seek ad number.

xboard-4.7.3/winboard/help/html/03.htm0000644000175000001440000002274612262415351014372 00000000000000 File Menu

File Menu

New Game (former Reset)

Resets WinBoard and the chess engine (if any) to the beginning of a new chess game. In Internet Chess Server mode, clears the current state of WinBoard, then resynchronizes with ICS by sending a refresh command. If you want to stop playing, observing, or examining a game on ICS, use an appropriate command from the Action menu, not New Game.

New Shuffle Game

Brings you to a dialog box where you can enter the number of an opening setup for shuffle variants like FRC, or ask for a random number. After pressing OK, a new game is set up, using this position. The chosen position will continue to be used on every subsequent New Game, even if you are playing a variant that normally is not shuffled, until you select a new variant through the New Variant menu. If you enter -1 for the position number, new random number is drawn before every game.

The type of shuffling that is done in reaction to a given position number obeys restrictions that depend on the selected variant. In variants that allow castling, Kings remain on the central files, Rooks in the corners. In games with FRC-style castlings, the King starts between the Rooks, but apart from that they could be anywhere. In games without castling, there are no restrictions on King and Rook placement. Pairs of color-bound pieces (such as Bishops) will be placed on oppositely colored squares. In ICS mode this feature has no effect, as the ICS determines the starting position.

New Variant

Select a new variant. There are controls to enter a board width, board height and holdings size, but normally you leave them at -1, which means the default value for the selected variant will be used (e.g. 8x8 for normal Chess, 9x10 for xiangqi, 10x8 for capablanca, holdings for 5 pieces in crazyhouse). You can set a deviating value for each of the three parameters (e.g. to play a crazyhouse version of xiangqi or capablanca you would set the holdings to 6 or 7). If the board width deviates from the default, the game will start with an empty board.

The variant will remain in force until you select a new one; i.e. subsequent New Game commands will start a new game of the same variant. In ICS mode this command has no effect, as the ICS determines which variant will be played.

Load Game

Plays a game from a record file. A popup dialog prompts you for the filename. If the file contains more than one game, a second popup dialog displays a list of games (with information drawn from their PGN tags, if any), and you can select the one you want.

The game file parser will accept PGN (portable game notation), or in fact almost any file that contains moves in algebraic notation. Notation of the form P@f7 is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. If the file includes a PGN position (FEN tag), or a WinBoard position diagram bracketed by "[--" and "--]" before the first move, the game starts from that position. Text enclosed in parentheses, square brackets, or curly braces is assumed to be commentary and is displayed in a pop-up window. Any other text in the file is ignored. PGN variations (enclosed in parentheses) appear in the comment popup amongst genuine comments; to walk the variation tree, you have to right-click them in this window. This will cause WinBoard to load them as the current line. You can revert to the previous line with the Revert command. (Beware! Currently WinBoards PGN parser is limited to 3 levels of nesting in variations.) The nonstandard PGN tag [Variant "varname"] functions similarly to the variant command-line option, allowing games in certain chess variants to be loaded. Note that it has to appear before any FEN tag! There is also a heuristic to recognize chess variants from the Event tag, by looking for the strings that the Internet Chess Servers put there when saving variant ("wild") games.

Load Next Game

Loads the next game from the last game record file you loaded.

Load Previous Game

Loads the previous game from the last game record file you loaded. Not available if the last game was loaded from a pipe.

Reload Same Game

Reloads the last game you loaded. Not available if the last game was loaded from a pipe.

Save Game

Appends a record of the current game to a file. A popup dialog prompts you for the filename. If the game did not begin with the standard starting position, the game file includes the starting position used. Game files are saved in the PGN (portable game notation) format, unless the oldSaveStyle option is True, in which case they are saved in an older format that is specific to WinBoard. Both formats are human-readable, and both can be read back by the Load Game command. Notation of the form P@f7 is generated for piece-drops in bughouse games; this is a nonstandard extension to PGN.

Copy Game To Clipboard

Copies the record of the current game to the Windows clipboard in PGN (portable game notation) format.

Paste Game From Clipboard

Plays a game from the Windows clipboard. See Load Game for a discussion of game file format and parser behavior.

Load Position

Sets up a position from a position file. A popup dialog prompts you for the filename. Position files must be in FEN (Forsythe-Edwards notation), or in the format that the Save Position command writes when oldSaveStyle is turned on. Note that many variants require an extension of the original FEN standard. WinBoard tries to be as universal as possible in understanding FENs when different standards are raound, but has to make a choice when writing them. In FRC is uses Shredder-FEN (Haha castling notation) , but it understands KQkq as the outermost Rook, so it also reads X-FEN. In Crazyhouse / Bughouse it appends the holdings immediately behind the board info between brackets [], but on input it also understands bFEN (which puts it behind a slash / as if it were an extra board rank). It uses a tilde ~ behind a piece to indicate it is really a promoted Pawn (like bFEN). In Shogi the holdings are printed like in Crazyhouse, but promoted pieces are represented by a plus sign + before the letter of the original piece. Letters used for the pieces can be set with the /pieceToCharTable command-line option.

Load Next Position

Loads the next position from the last position file you loaded.

Load Previous Position

Loads the previous position from the last position file you loaded. Not available if the last position was loaded from a pipe.

Reload Same Position

Reloads the last position you loaded. Not available if the last position was loaded from a pipe.

Save Position

Appends a diagram of the current position to a file. A popup dialog prompts you for the filename. Positions are saved in FEN (Forsythe-Edwards notation) format, unless the oldSaveStyle option is True, in which case they are saved in an older, human-readable format that is specific to WinBoard. Both formats can be read back by the Load Position command; however, currently Load Position can load only the first position in a file.

Save Diagram

Writes the current board display as a bitmap file. With this command you can use WinBoard as a diagram generator.

Copy Position To Clipboard

Places a diagram of the current position (in Forsythe-Edwards notation) into the Windows clipboard.

Paste Position From Clipboard

Sets up a position from the Windows clipboard. Position must be in FEN (Forsythe-Edwards notation). Puts WinBoard into Edit Game mode if it was not there already.

Exit

Exits from WinBoard.

xboard-4.7.3/winboard/help/html/13.htm0000644000175000001440000000556512262415351014373 00000000000000 UCI Engine Support

UCI Engine Support

/fUCI or /firstIsUCI true|false

/sUCI or /secondIsUCI true|false

Indicates if the mentioned engine executable file is an UCI engine, and should be run with the aid of the Polyglot adapter rather than directly. WinBoard will then pass the other UCI options and engine name to Polyglot through a .ini temporary file ceated for the purpose.

/PolyglotDir filename

Gives the name of the folder in which Polyglot is installed.

/usePolyglotBook true|false

Specifies if the Polygot book should be used.

/PolyglotBook filename

Gives the filename of the opening book that Polyglot should use.

/fNoOwnBookUCI or /firstXBook or /firstHasOwnBookUCI true|false

/sNoOwnBookUCI or /secondXBook or /secondHasOwnBookUCI true|false

Indicates if the mentioned engine lacks an opening book or not. Engines that have an own opening book will not use the GUI book (as given by /polyglotBook) even if /usePolyglotBook is set to true.

/defaultHashSize number

Sets the size of the hash table to number MegaBytes.

/defaultCacheSizeEGTB number

Sets the size of the EGTB cache to number MegaBytes.

/defaultPathEGTB filename

Gives the name of the folder where the end-game tablebases are installed.

xboard-4.7.3/winboard/help/html/10.htm0000644000175000001440000000163012262415351014355 00000000000000 Buttons

BUTTONS

<<

Same as Back to Start.

<

Same as Backward.

P

Same as Pause. The button label changes to C while WinBoard is pausing.

>

Same as Forward.

>>

Same as Forward to End.

Note that using the mouse wheel has the same effect as using the < or > button.

xboard-4.7.3/winboard/help/html/18.htm0000644000175000001440000002515412262415351014374 00000000000000 Other Options

Other Options

/ncp or /xncp, or /noChessProgram true|false

If this option is True, WinBoard acts as a passive chessboard; it does not start a chess program or connect to ICS. This option also sets clockMode to False. Default: False.

/mode or /initialMode modename

If this option is given, WinBoard selects the given modename from the Mode menu after starting and (if applicable) processing the loadGameFile or loadPositionFile option. Default: "". Other supported values are TwoMachines, AnalyzeFile, Analysis, MachineWhite, MachineBlack, EditGame, EditPosition, and Training.

/variant varname

Activates preliminary, partial support for playing chess variants against a local engine or editing variant games. This flag is not needed in ICS mode. Recognized variant names are:

normalNormal chess
wildcastleShuffle chess, king can castle from d file
nocastleShuffle chess, no castling allowed
fischerandomFischer Random shuffle chess
bughouseBughouse, ICC/FICS rules
crazyhouseCrazyhouse, ICC/FICS rules
losersLose all pieces or get mated (ICC wild 17)
suicideLose all pieces including king (FICS)
giveawayTry to have no legal moves (ICC wild 26)
twokingsWeird ICC wild 9
kriegspielOpponent's pieces are invisible
atomicCapturing piece explodes (ICC wild 27)
3checkWin by giving check 3 times (ICC wild 25)
xiangqiChinese Chess (on a 9x10 board)
shogiJapanese Chess (on a 9x9 board, with piece drops)
capablancaCapablanca Chess (10x8 board, with Archbishop and Chancellor pieces)
gothicsimilar, with a better initial position
caparandomAn FRC-like version of Capablanca Chess (10x8 board)
janusA game with two Archbishops (10x8 board)
shatranjAncient Arabic Chess, with Elephants and General replacing B and Q.
courierMedieval intermedite between shatranj and modern Chess (on 12x8 board)
falconA patented Chess variant with two Falcon pieces (10x8) board
berolinaPawns capture straight ahead, and move diagonal (legality testing off!)
cylinderPieces wrap around the board, as if it were a cylinder (legality testing off!)
fairyA variant in which all pieces known to WinBoard can participate
knightmateKing moves a Knight, and vice versa
makrukThai Chess (shatranj-like, pawns promote on 6th rank)
superSuperchess, a shuffle variant with B+N, R+N, K+N and Q+N compound
greatGreat Shatranj, whithout sliders, on 10x8 board (legality testing off!)

In the shuffle variants, WinBoard does now shuffle the pieces, although you can still do it by hand using Edit Position. Some variants are supported only in ICS mode, including bughouse, and kriegspiel. The winning/drawing conditions in crazyhouse (off-board interposition on mate) is not fully understood, but losers, suicide, giveaway, atomic, and 3check should be OK. In crazyhouse, WinBoard now does keep track of off-board pieces. In shatranj it does implement the baring rule when mate detection is switched on. In xiangqi it does implement the rules for perpetual checking and chasing (in Two-Machines mode).

/shuffleOpenings

This volatile option will cause shuffling of all pieces on the back rank, even in variants that normally have a fixed opening setup, according to the setting of the /defaultFrcPosition. It will remain in effect untill you select a new variant. In variants with normal castling, corner Rooks and King will be exempted from shuffling. Color-bound pieces such as Bishops will be kept on differently colored squares.

/boardHeight height

Allows you to set a non-standard number of board ranks in any variant. If the height is given as -1, the default height for the variant is used.

/boardWidth width

Allows you to set a non-standard number of board files in any variant. If the width is given as -1, the default width for the variant is used. Width a non-standard width, the initial position will always be an empty board, as the usual opening array will not fit.

/holdingsSize size

Allows you to set a non-standard size for the holdings in any variant. If the size is given as -1, the default holdings size for the variant is used. The first size piece types will go into the holdings on capture, and you will be able to drop them on the board in stead of making a normal move. If size equals 0, there will be no holdings.

/defaultFrcPosition number

Specifies the number of the opening position in shuffle games like FRC. A value of -1 means the position is randomly generated by WinBoard.

/pieceToCharTable characterstring

The characters that are used to represent the piece types WinBoard knows in FEN diagrams and SAN moves. The string argument has to have an even length (or it will be ignored), as white and black pieces have to be given separately (in that order). The last letter for each color will be the King. The letters before that will be PNBRQ and then a whole host of fairy pieces in an order that has not fully crystallized yet (currently FEACWMOHIJGDVSLU, F=Ferz, Elephant, A=Archbishop, C=Chancellor, W=Wazir, M=Commoner, O=Cannon, H=Nightrider). You should list at least all pieces that occur in the variant you are playing. If you have less than 44 characters in the string, the pieces not mentioned will get assigned a period, and you will not be able to distinguish them in FENs. You can also explicitly assign pieces a period, in which case they will not be counted in deciding which captured pieces can go into the holdings.

A tilde as a piece name does mean this piece is used to represent a promoted Pawn in Crazyhouse-like games, i.e. on capture it turns back onto a Pawn. A + similarly indicate the piece is a Shogi-style promoted piece, that should revert to its non-promoted version on capture (rather than to a Pawn).

Note that promoted pieces are represented by pieces 11 further in the list.

You should not have to use this option often: each variant has its own default setting for the piece representation in FEN, which should be sufficient in normal use.

/rsh or /remoteShell shellname

Name of the command used to run programs remotely. If this option is not given, WinBoard uses its own built-in implementation of the Unix rcmd protocol (the protocol used by rsh).

/ruser or /remoteUser username

User name on the remote system when running programs with the remoteShell. The default is your local user name.

/userName username

Name under which the Human player will be listed in the PGN file. (Default is the login name on your local computer.)

/delayBeforeQuit number

/delayAfterQuit number

These options specify how long WinBoard has to wait before sending a termination signal to rogue engine processes, that do not want to react to the quit command. The second one determines the pause after killing the engine, to make sure it dies.

/ini or /settingsFile filename
@ file-name

See Settings.

xboard-4.7.3/winboard/wclipbrd.h0000644000175000001440000000256312262415351013514 00000000000000/* * wclipbrd.c -- Clipboard routines for WinBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ VOID CopyFENToClipboard(); VOID CopyGameToClipboard(); VOID CopyGameListToClipboard(); int CopyTextToClipboard(char *text); VOID PasteFENFromClipboard(); VOID PasteGameFromClipboard(); int PasteTextFromClipboard(char **text); VOID DeleteClipboardTempFiles(); VOID PasteGameOrFENFromClipboard(); /* [AS] */ xboard-4.7.3/xboard-config.desktop0000644000175000001440000000207512262415351014043 00000000000000[Desktop Entry] Name=Xboard Name[af]=X-bord Name[ar]=Xboard Name[bg]=Xboard Name[bn]=এক্সবোর্ড Name[cs]=Xboard Name[da]=Xboard Name[de]=Xboard Name[el]=Xboard Name[es]=Xboard Name[et]=Xboard Name[fi]=XBoard Name[fr]=XBoard Name[gl]=Xboard Name[hi]=एक्सबोर्ड Name[hr]=Xboard Name[hu]=XBoard Name[it]=XBoard Name[ja]=Xboard Name[km]=XBoard Name[ko]=X보드 Name[lt]=Xboard Name[mr]=Xबोर्ड Name[nb]=Xboard Name[nl]=Xboard Name[pa]=Xboard Name[pl]=Xboard Name[pt]=Xboard Name[pt_BR]=Xboard Name[ru]=Xboard Name[sk]=Xboard Name[sv]=Xboard Name[ta]=பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): எக்ஸ்போர்ட் Name[th]=Xboard Name[tr]=XBoard Name[uk]=Xboard Name[vi]=XBoard Name[xh]=Ibhodi ye-X Name[zh_CN]=X 国际象棋 Name[zh_TW]=Xboard 國際象棋 Name[zu]=I-Xboard Comment=Start preconfigured XBoard GenericName=X-windows chess board Type=Application Categories=Game;BoardGame; Exec=xboard -opt %f Icon=xboard NoDisplay=true Terminal=false MimeType=application/x-xboard-opt; xboard-4.7.3/DIFFSTAT0000644000175000001440000056703112262562252011070 00000000000000** Version 4.7.3 ** (git diff -b --stat --summary -M v4.7.2 HEAD) COPYRIGHT | 2 +- README | 1 - args.h | 10 +- autogen.sh | 2 +- backend.c | 27 +++- backend.h | 42 +----- backendz.h | 2 +- board.c | 2 +- board.h | 2 +- book.c | 3 + childio.c | 2 +- childio.h | 2 +- cmail.in | 2 +- common.h | 42 +++++- configure.ac | 4 +- copyright.texi | 2 +- dialogs.c | 14 +- dialogs.h | 2 +- doc-maint/release.org | 0 draw.c | 2 +- draw.h | 2 +- engineoutput.c | 4 +- engineoutput.h | 2 +- evalgraph.c | 2 +- evalgraph.h | 2 +- frontend.h | 4 +- gamelist.c | 2 +- gtk/xboard.c | 84 +++++++++--- gtk/xboard.h | 2 +- gtk/xengineoutput.c | 2 +- gtk/xoptions.c | 55 ++++++-- gtk/xtimer.c | 2 +- history.c | 2 +- lists.c | 2 +- lists.h | 2 +- menus.c | 4 +- menus.h | 2 +- moves.c | 4 +- moves.h | 2 +- nengineoutput.c | 2 +- nevalgraph.c | 2 +- ngamelist.c | 2 +- nhistory.c | 2 +- parser.c | 6 +- parser.h | 2 +- pgntags.c | 2 +- po/da.po | 280 +++++++++++++++++++------------------- po/de.po | 280 +++++++++++++++++++------------------- po/es.po | 280 +++++++++++++++++++------------------- po/it.po | 280 +++++++++++++++++++------------------- po/lng2po.sh | 2 +- po/ru.po | 280 +++++++++++++++++++------------------- po/tr.po | 280 +++++++++++++++++++------------------- po/uk.po | 282 +++++++++++++++++++-------------------- po/vi.po | 280 +++++++++++++++++++------------------- po/xboard.pot | 282 +++++++++++++++++++-------------------- po/zh_CN.po | 280 +++++++++++++++++++------------------- po/zh_HK.po | 280 +++++++++++++++++++------------------- po/zh_TW.po | 280 +++++++++++++++++++------------------- themes/xiangqi/.DS_Store | Bin 6148 -> 0 bytes uci.c | 2 +- usounds.c | 2 +- usystem.c | 2 +- usystem.h | 2 +- winboard/config.h | 6 +- winboard/defaults.h | 2 +- winboard/help.c | 2 +- winboard/help/html/24.htm | 2 +- winboard/jaws.c | 2 +- winboard/language.txt | 2 +- winboard/language/deutsch.lng | 2 +- winboard/language/italiano.lng | 2 +- winboard/language/nederlands.lng | 2 +- winboard/language/romanian.lng | 2 +- winboard/language/russian.lng | 2 +- winboard/language/spanish.lng | 2 +- winboard/language/vietnamese.lng | 2 +- winboard/makefile.gcc | 5 +- winboard/wchat.c | 2 +- winboard/wclipbrd.c | 2 +- winboard/wclipbrd.h | 2 +- winboard/wedittags.c | 2 +- winboard/wengineoutput.c | 2 +- winboard/wevalgraph.c | 2 + winboard/wgamelist.c | 2 +- winboard/whistory.c | 2 + winboard/winboard.c | 46 +++++-- winboard/winboard.h | 4 +- winboard/winboard.rc | 4 +- winboard/wlayout.c | 14 +- winboard/woptions.c | 2 +- winboard/woptions.h | 2 +- winboard/wsettings.c | 23 ++++ winboard/wsockerr.c | 2 +- winboard/wsockerr.h | 2 +- xaw/xboard.c | 3 +- xaw/xboard.h | 2 +- xaw/xengineoutput.c | 3 +- xaw/xgamelist.c | 2 +- xaw/xgamelist.h | 2 +- xaw/xhistory.c | 2 +- xaw/xhistory.h | 2 +- xaw/xoptions.c | 14 +- xboard2.h | 22 +++ zippy.README | 0 zippy.c | 2 +- zippy.h | 2 +- zippy.lines | 0 108 files changed, 2077 insertions(+), 1867 deletions(-) delete mode 100644 themes/xiangqi/.DS_Store ** Version 4.7.2 ** (git diff -b --stat --summary -M v4.7.1 HEAD) backend.c | 10 ++++++---- book.c | 4 +++- parser.c | 4 +++- winboard/winboard.c | 8 ++++++-- winboard/wsettings.c | 9 ++++++--- zippy.c | 2 +- 6 files changed, 25 insertions(+), 12 deletions(-) ** Version 4.7.1 ** (git diff -b --stat --summary -M v4.7.0 HEAD) args.h | 10 ++- backend.c | 120 +++++++++++++++++------------ backend.h | 6 +- configure.ac | 2 +- dialogs.c | 19 ++--- gtk/xboard.c | 40 +++++++--- gtk/xoptions.c | 16 ++-- po/da.po | 2 +- po/de.po | 61 ++++++++++----- po/es.po | 2 +- po/it.po | 2 +- po/ru.po | 2 +- po/tr.po | 2 +- po/uk.po | 213 +++++++++++++++++++--------------------------------- po/vi.po | 2 +- po/xboard.pot | 4 +- po/zh_CN.po | 2 +- po/zh_HK.po | 2 +- po/zh_TW.po | 2 +- winboard/config.h | 6 +- winboard/wchat.c | 11 ++- xaw/xboard.c | 3 +- xaw/xengineoutput.c | 4 +- xaw/xhistory.c | 2 +- xaw/xoptions.c | 3 +- xboard.texi | 145 ++++++++++++++++++----------------- zippy.README | 9 ++- 27 files changed, 368 insertions(+), 324 deletions(-) ** Version 4.7.0 ** (git diff -b --stat --summary -M v4.6.2 HEAD) AUTHORS | 2117 +---------- COPYRIGHT | 2 +- ChangeLog | 2868 +++++++++++++- DIFFSTAT | 3076 ++++++++++++++- Makefile.am | 214 +- NEWS | 90 +- SHORTLOG | 442 ++- args.h | 105 +- autogen.sh | 2 +- backend.c | 942 ++++- backend.h | 64 +- backendz.h | 9 +- bitmaps/README.bitmaps | 101 - bitmaps/a33o.bm | 16 - bitmaps/a33s.bm | 16 - bitmaps/a37o.bm | 17 - bitmaps/a37s.bm | 17 - bitmaps/a40o.bm | 18 - bitmaps/a40s.bm | 18 - bitmaps/a45o.bm | 23 - bitmaps/a45s.bm | 23 - bitmaps/a49o.bm | 27 - bitmaps/a49s.bm | 27 - bitmaps/a54o.bm | 30 - bitmaps/a54s.bm | 30 - bitmaps/a58o.bm | 35 - bitmaps/a58s.bm | 35 - bitmaps/a64o.bm | 39 - bitmaps/a64s.bm | 39 - bitmaps/a72o.bm | 48 - bitmaps/a72s.bm | 48 - bitmaps/as45o.bm | 23 - bitmaps/as45s.bm | 23 - bitmaps/b108o.bm | 105 - bitmaps/b108s.bm | 105 - bitmaps/b116o.bm | 121 - bitmaps/b116s.bm | 121 - bitmaps/b129o.bm | 186 - bitmaps/b129s.bm | 186 - bitmaps/b21o.bm | 9 - bitmaps/b21s.bm | 9 - bitmaps/b25o.bm | 11 - bitmaps/b25s.bm | 11 - bitmaps/b29o.bm | 12 - bitmaps/b29s.bm | 12 - bitmaps/b33o.bm | 16 - bitmaps/b33s.bm | 16 - bitmaps/b37o.bm | 17 - bitmaps/b37s.bm | 17 - bitmaps/b40o.bm | 18 - bitmaps/b40s.bm | 18 - bitmaps/b45o.bm | 23 - bitmaps/b45s.bm | 23 - bitmaps/b49o.bm | 27 - bitmaps/b49s.bm | 27 - bitmaps/b54o.bm | 30 - bitmaps/b54s.bm | 30 - bitmaps/b58o.bm | 35 - bitmaps/b58s.bm | 35 - bitmaps/b64o.bm | 39 - bitmaps/b64s.bm | 39 - bitmaps/b72o.bm | 48 - bitmaps/b72s.bm | 48 - bitmaps/b80o.bm | 58 - bitmaps/b80s.bm | 58 - bitmaps/b87o.bm | 68 - bitmaps/b87s.bm | 68 - bitmaps/b95o.bm | 81 - bitmaps/b95s.bm | 81 - bitmaps/bitmaps.h | 530 --- bitmaps/c33o.bm | 16 - bitmaps/c33s.bm | 16 - bitmaps/c37o.bm | 17 - bitmaps/c37s.bm | 17 - bitmaps/c40o.bm | 18 - bitmaps/c40s.bm | 18 - bitmaps/c45o.bm | 23 - bitmaps/c45s.bm | 23 - bitmaps/c49o.bm | 27 - bitmaps/c49s.bm | 27 - bitmaps/c54o.bm | 30 - bitmaps/c54s.bm | 30 - bitmaps/c58o.bm | 35 - bitmaps/c58s.bm | 35 - bitmaps/c64o.bm | 39 - bitmaps/c64s.bm | 39 - bitmaps/c72o.bm | 48 - bitmaps/c72s.bm | 48 - bitmaps/d33o.bm | 16 - bitmaps/d33s.bm | 16 - bitmaps/d37o.bm | 17 - bitmaps/d37s.bm | 17 - bitmaps/d40o.bm | 18 - bitmaps/d40s.bm | 18 - bitmaps/d45o.bm | 23 - bitmaps/d45s.bm | 23 - bitmaps/d49o.bm | 27 - bitmaps/d49s.bm | 27 - bitmaps/d54o.bm | 30 - bitmaps/d54s.bm | 30 - bitmaps/d58o.bm | 35 - bitmaps/d58s.bm | 35 - bitmaps/d64o.bm | 39 - bitmaps/d64s.bm | 39 - bitmaps/d72o.bm | 48 - bitmaps/d72s.bm | 48 - bitmaps/dopkbm.sh | 16 - bitmaps/dopkbm1.sh | 27 - bitmaps/e33o.bm | 16 - bitmaps/e33s.bm | 16 - bitmaps/e49o.bm | 27 - bitmaps/e49s.bm | 27 - bitmaps/e72o.bm | 48 - bitmaps/e72s.bm | 48 - bitmaps/f33o.bm | 16 - bitmaps/f33s.bm | 16 - bitmaps/f49o.bm | 27 - bitmaps/f49s.bm | 27 - bitmaps/f72o.bm | 48 - bitmaps/f72s.bm | 48 - bitmaps/g33o.bm | 16 - bitmaps/g33s.bm | 16 - bitmaps/g49o.bm | 27 - bitmaps/g49s.bm | 27 - bitmaps/g72o.bm | 48 - bitmaps/g72s.bm | 48 - bitmaps/h33o.bm | 16 - bitmaps/h33s.bm | 16 - bitmaps/h49o.bm | 27 - bitmaps/h49s.bm | 27 - bitmaps/h72o.bm | 48 - bitmaps/h72s.bm | 48 - bitmaps/i33o.bm | 16 - bitmaps/i33s.bm | 16 - bitmaps/i49o.bm | 27 - bitmaps/i49s.bm | 27 - bitmaps/i72o.bm | 48 - bitmaps/i72s.bm | 48 - bitmaps/icon_b.bm | 13 - bitmaps/icon_outline.bm | 14 - bitmaps/j33o.bm | 16 - bitmaps/j33s.bm | 16 - bitmaps/j49o.bm | 27 - bitmaps/j49s.bm | 27 - bitmaps/j72o.bm | 48 - bitmaps/j72s.bm | 48 - bitmaps/k108o.bm | 105 - bitmaps/k108s.bm | 105 - bitmaps/k116o.bm | 121 - bitmaps/k116s.bm | 121 - bitmaps/k129o.bm | 186 - bitmaps/k129s.bm | 186 - bitmaps/k21o.bm | 9 - bitmaps/k21s.bm | 9 - bitmaps/k25o.bm | 11 - bitmaps/k25s.bm | 11 - bitmaps/k29o.bm | 12 - bitmaps/k29s.bm | 12 - bitmaps/k33o.bm | 16 - bitmaps/k33s.bm | 16 - bitmaps/k37o.bm | 17 - bitmaps/k37s.bm | 17 - bitmaps/k40o.bm | 18 - bitmaps/k40s.bm | 18 - bitmaps/k45o.bm | 23 - bitmaps/k45s.bm | 23 - bitmaps/k49o.bm | 27 - bitmaps/k49s.bm | 27 - bitmaps/k54o.bm | 30 - bitmaps/k54s.bm | 30 - bitmaps/k58o.bm | 35 - bitmaps/k58s.bm | 35 - bitmaps/k64o.bm | 39 - bitmaps/k64s.bm | 39 - bitmaps/k72o.bm | 48 - bitmaps/k72s.bm | 48 - bitmaps/k80o.bm | 58 - bitmaps/k80s.bm | 58 - bitmaps/k87o.bm | 68 - bitmaps/k87s.bm | 68 - bitmaps/k95o.bm | 81 - bitmaps/k95s.bm | 81 - bitmaps/l33o.bm | 16 - bitmaps/l33s.bm | 16 - bitmaps/l37o.bm | 17 - bitmaps/l37s.bm | 17 - bitmaps/l40o.bm | 18 - bitmaps/l40s.bm | 18 - bitmaps/l45o.bm | 23 - bitmaps/l45s.bm | 23 - bitmaps/l49o.bm | 27 - bitmaps/l49s.bm | 27 - bitmaps/l54o.bm | 30 - bitmaps/l54s.bm | 30 - bitmaps/l58o.bm | 35 - bitmaps/l58s.bm | 35 - bitmaps/l64o.bm | 39 - bitmaps/l64s.bm | 39 - bitmaps/l72o.bm | 48 - bitmaps/l72s.bm | 48 - bitmaps/m33o.bm | 16 - bitmaps/m33s.bm | 16 - bitmaps/m49o.bm | 27 - bitmaps/m49s.bm | 27 - bitmaps/m72o.bm | 48 - bitmaps/m72s.bm | 48 - bitmaps/n108o.bm | 105 - bitmaps/n108s.bm | 105 - bitmaps/n116o.bm | 121 - bitmaps/n116s.bm | 121 - bitmaps/n129o.bm | 186 - bitmaps/n129s.bm | 186 - bitmaps/n21o.bm | 9 - bitmaps/n21s.bm | 9 - bitmaps/n25o.bm | 11 - bitmaps/n25s.bm | 11 - bitmaps/n29o.bm | 12 - bitmaps/n29s.bm | 12 - bitmaps/n33o.bm | 16 - bitmaps/n33s.bm | 16 - bitmaps/n37o.bm | 17 - bitmaps/n37s.bm | 17 - bitmaps/n40o.bm | 18 - bitmaps/n40s.bm | 18 - bitmaps/n45o.bm | 23 - bitmaps/n45s.bm | 23 - bitmaps/n49o.bm | 27 - bitmaps/n49s.bm | 27 - bitmaps/n54o.bm | 30 - bitmaps/n54s.bm | 30 - bitmaps/n58o.bm | 35 - bitmaps/n58s.bm | 35 - bitmaps/n64o.bm | 39 - bitmaps/n64s.bm | 39 - bitmaps/n72o.bm | 48 - bitmaps/n72s.bm | 48 - bitmaps/n80o.bm | 58 - bitmaps/n80s.bm | 58 - bitmaps/n87o.bm | 68 - bitmaps/n87s.bm | 68 - bitmaps/n95o.bm | 81 - bitmaps/n95s.bm | 81 - bitmaps/o33o.bm | 16 - bitmaps/o33s.bm | 16 - bitmaps/o49o.bm | 27 - bitmaps/o49s.bm | 27 - bitmaps/o72o.bm | 48 - bitmaps/o72s.bm | 48 - bitmaps/p108o.bm | 105 - bitmaps/p108s.bm | 105 - bitmaps/p116o.bm | 121 - bitmaps/p116s.bm | 121 - bitmaps/p129o.bm | 186 - bitmaps/p129s.bm | 186 - bitmaps/p21o.bm | 9 - bitmaps/p21s.bm | 9 - bitmaps/p25o.bm | 11 - bitmaps/p25s.bm | 11 - bitmaps/p29o.bm | 12 - bitmaps/p29s.bm | 12 - bitmaps/p33o.bm | 16 - bitmaps/p33s.bm | 16 - bitmaps/p37o.bm | 17 - bitmaps/p37s.bm | 17 - bitmaps/p40o.bm | 18 - bitmaps/p40s.bm | 18 - bitmaps/p45o.bm | 23 - bitmaps/p45s.bm | 23 - bitmaps/p49o.bm | 27 - bitmaps/p49s.bm | 27 - bitmaps/p54o.bm | 30 - bitmaps/p54s.bm | 30 - bitmaps/p58o.bm | 35 - bitmaps/p58s.bm | 35 - bitmaps/p64o.bm | 39 - bitmaps/p64s.bm | 39 - bitmaps/p72o.bm | 48 - bitmaps/p72s.bm | 48 - bitmaps/p80o.bm | 58 - bitmaps/p80s.bm | 58 - bitmaps/p87o.bm | 68 - bitmaps/p87s.bm | 68 - bitmaps/p95o.bm | 81 - bitmaps/p95s.bm | 81 - bitmaps/q108o.bm | 105 - bitmaps/q108s.bm | 105 - bitmaps/q116o.bm | 121 - bitmaps/q116s.bm | 121 - bitmaps/q129o.bm | 186 - bitmaps/q129s.bm | 186 - bitmaps/q21o.bm | 9 - bitmaps/q21s.bm | 9 - bitmaps/q25o.bm | 11 - bitmaps/q25s.bm | 11 - bitmaps/q29o.bm | 12 - bitmaps/q29s.bm | 12 - bitmaps/q33o.bm | 16 - bitmaps/q33s.bm | 16 - bitmaps/q37o.bm | 17 - bitmaps/q37s.bm | 17 - bitmaps/q40o.bm | 18 - bitmaps/q40s.bm | 18 - bitmaps/q45o.bm | 23 - bitmaps/q45s.bm | 23 - bitmaps/q49o.bm | 27 - bitmaps/q49s.bm | 27 - bitmaps/q54o.bm | 30 - bitmaps/q54s.bm | 30 - bitmaps/q58o.bm | 35 - bitmaps/q58s.bm | 35 - bitmaps/q64o.bm | 39 - bitmaps/q64s.bm | 39 - bitmaps/q72o.bm | 48 - bitmaps/q72s.bm | 48 - bitmaps/q80o.bm | 58 - bitmaps/q80s.bm | 58 - bitmaps/q87o.bm | 68 - bitmaps/q87s.bm | 68 - bitmaps/q95o.bm | 81 - bitmaps/q95s.bm | 81 - bitmaps/r108o.bm | 105 - bitmaps/r108s.bm | 105 - bitmaps/r116o.bm | 121 - bitmaps/r116s.bm | 121 - bitmaps/r129o.bm | 186 - bitmaps/r129s.bm | 186 - bitmaps/r21o.bm | 9 - bitmaps/r21s.bm | 9 - bitmaps/r25o.bm | 11 - bitmaps/r25s.bm | 11 - bitmaps/r29o.bm | 12 - bitmaps/r29s.bm | 12 - bitmaps/r33o.bm | 16 - bitmaps/r33s.bm | 16 - bitmaps/r37o.bm | 17 - bitmaps/r37s.bm | 17 - bitmaps/r40o.bm | 18 - bitmaps/r40s.bm | 18 - bitmaps/r45o.bm | 23 - bitmaps/r45s.bm | 23 - bitmaps/r49o.bm | 27 - bitmaps/r49s.bm | 27 - bitmaps/r54o.bm | 30 - bitmaps/r54s.bm | 30 - bitmaps/r58o.bm | 35 - bitmaps/r58s.bm | 35 - bitmaps/r64o.bm | 39 - bitmaps/r64s.bm | 39 - bitmaps/r72o.bm | 48 - bitmaps/r72s.bm | 48 - bitmaps/r80o.bm | 58 - bitmaps/r80s.bm | 58 - bitmaps/r87o.bm | 68 - bitmaps/r87s.bm | 68 - bitmaps/r95o.bm | 81 - bitmaps/r95s.bm | 81 - bitmaps/s49o.bm | 27 - bitmaps/s49s.bm | 27 - bitmaps/s72o.bm | 48 - bitmaps/s72s.bm | 48 - bitmaps/test.c | 14 - bitmaps/u49o.bm | 27 - bitmaps/u49s.bm | 27 - bitmaps/u72o.bm | 48 - bitmaps/u72s.bm | 48 - bitmaps/v33o.bm | 16 - bitmaps/v33s.bm | 16 - bitmaps/v49o.bm | 27 - bitmaps/v49s.bm | 27 - bitmaps/v72o.bm | 48 - bitmaps/v72s.bm | 48 - bitmaps/w33o.bm | 16 - bitmaps/w33s.bm | 16 - bitmaps/w49o.bm | 27 - bitmaps/w49s.bm | 27 - bitmaps/w72o.bm | 48 - bitmaps/w72s.bm | 48 - bitmaps/wl49o.bm | 27 - bitmaps/wl49s.bm | 27 - bitmaps/wl72o.bm | 48 - bitmaps/wl72s.bm | 48 - bitmaps/wn49o.bm | 27 - bitmaps/wn49s.bm | 27 - bitmaps/wn72o.bm | 48 - bitmaps/wn72s.bm | 48 - bitmaps/wp49o.bm | 27 - bitmaps/wp49s.bm | 27 - bitmaps/wp72o.bm | 48 - bitmaps/wp72s.bm | 48 - bitmaps/ws49o.bm | 27 - bitmaps/ws49s.bm | 27 - bitmaps/ws72o.bm | 48 - bitmaps/ws72s.bm | 48 - board.c | 1244 ++++++ board.h | 98 + book.c | 362 +- childio.c | 2 +- childio.h | 2 +- cmail.in | 2 +- common.h | 49 +- configure.ac | 136 +- copyright.texi | 2 +- dialogs.c | 2588 +++++++++++++ dialogs.h | 196 + doc-maint/coding-standards.org | 6 + doc-maint/gendocs.sh | 361 ++ doc-maint/make-xboard-release | 186 + doc-maint/release.org | 71 + doc-maint/web-pages.org | 40 + draw.c | 927 +++++ draw.h | 76 + engine-intf.html | 45 + engineoutput.c | 28 +- engineoutput.h | 25 +- evalgraph.c | 4 +- evalgraph.h | 12 +- filebrowser/README | 3 - filebrowser/dir.c | 169 - filebrowser/draw.c | 981 ----- filebrowser/path.c | 905 ----- filebrowser/selfile.c | 902 ----- filebrowser/selfile.h | 170 - filebrowser/xstat.h | 23 - frontend.h | 34 +- gamelist.c | 5 +- gettext.h | 6 +- gtk/.dirstamp | 0 gtk/xboard.c | 2126 +++++++++++ gtk/xboard.h | 177 + gtk/xengineoutput.c | 137 + gtk/xoptions.c | 1587 ++++++++ gtk/xtimer.c | 237 ++ history.c | 3 +- install-sh | 0 lists.c | 2 +- lists.h | 18 +- menus.c | 1213 ++++++ menus.h | 197 + moves.c | 13 +- moves.h | 2 +- nengineoutput.c | 194 + nevalgraph.c | 189 + ngamelist.c | 377 ++ nhistory.c | 124 + parser.c | 6 +- parser.h | 2 +- pgntags.c | 2 +- pixmaps/README.pixmaps | 8 - pixmaps/add33.xpm | 42 - pixmaps/add37.xpm | 46 - pixmaps/add40.xpm | 49 - pixmaps/add45.xpm | 54 - pixmaps/add49.xpm | 58 - pixmaps/add54.xpm | 63 - pixmaps/add58.xpm | 67 - pixmaps/add64.xpm | 73 - pixmaps/add72.xpm | 81 - pixmaps/adl33.xpm | 42 - pixmaps/adl37.xpm | 46 - pixmaps/adl40.xpm | 49 - pixmaps/adl45.xpm | 54 - pixmaps/adl49.xpm | 58 - pixmaps/adl54.xpm | 63 - pixmaps/adl58.xpm | 67 - pixmaps/adl64.xpm | 73 - pixmaps/adl72.xpm | 81 - pixmaps/ald33.xpm | 42 - pixmaps/ald37.xpm | 46 - pixmaps/ald40.xpm | 49 - pixmaps/ald45.xpm | 54 - pixmaps/ald49.xpm | 58 - pixmaps/ald54.xpm | 63 - pixmaps/ald58.xpm | 67 - pixmaps/ald64.xpm | 73 - pixmaps/ald72.xpm | 81 - pixmaps/all33.xpm | 42 - pixmaps/all37.xpm | 46 - pixmaps/all40.xpm | 49 - pixmaps/all45.xpm | 54 - pixmaps/all49.xpm | 58 - pixmaps/all54.xpm | 63 - pixmaps/all58.xpm | 67 - pixmaps/all64.xpm | 73 - pixmaps/all72.xpm | 81 - pixmaps/asdd33.xpm | 42 - pixmaps/asdd49.xpm | 58 - pixmaps/asdd72.xpm | 81 - pixmaps/asdl33.xpm | 42 - pixmaps/asdl49.xpm | 58 - pixmaps/asdl72.xpm | 81 - pixmaps/asld33.xpm | 42 - pixmaps/asld49.xpm | 58 - pixmaps/asld72.xpm | 81 - pixmaps/asll33.xpm | 42 - pixmaps/asll49.xpm | 58 - pixmaps/asll72.xpm | 81 - pixmaps/bdd108.xpm | 117 - pixmaps/bdd116.xpm | 125 - pixmaps/bdd129.xpm | 138 - pixmaps/bdd21.xpm | 30 - pixmaps/bdd25.xpm | 34 - pixmaps/bdd29.xpm | 38 - pixmaps/bdd33.xpm | 42 - pixmaps/bdd37.xpm | 46 - pixmaps/bdd40.xpm | 49 - pixmaps/bdd45.xpm | 54 - pixmaps/bdd49.xpm | 58 - pixmaps/bdd54.xpm | 63 - pixmaps/bdd58.xpm | 67 - pixmaps/bdd64.xpm | 73 - pixmaps/bdd72.xpm | 81 - pixmaps/bdd80.xpm | 89 - pixmaps/bdd87.xpm | 96 - pixmaps/bdd95.xpm | 104 - pixmaps/bdl108.xpm | 117 - pixmaps/bdl116.xpm | 125 - pixmaps/bdl129.xpm | 138 - pixmaps/bdl21.xpm | 30 - pixmaps/bdl25.xpm | 34 - pixmaps/bdl29.xpm | 38 - pixmaps/bdl33.xpm | 42 - pixmaps/bdl37.xpm | 46 - pixmaps/bdl40.xpm | 49 - pixmaps/bdl45.xpm | 54 - pixmaps/bdl49.xpm | 58 - pixmaps/bdl54.xpm | 63 - pixmaps/bdl58.xpm | 67 - pixmaps/bdl64.xpm | 73 - pixmaps/bdl72.xpm | 81 - pixmaps/bdl80.xpm | 89 - pixmaps/bdl87.xpm | 96 - pixmaps/bdl95.xpm | 104 - pixmaps/bld108.xpm | 117 - pixmaps/bld116.xpm | 125 - pixmaps/bld129.xpm | 138 - pixmaps/bld21.xpm | 30 - pixmaps/bld25.xpm | 34 - pixmaps/bld29.xpm | 38 - pixmaps/bld33.xpm | 42 - pixmaps/bld37.xpm | 43 - pixmaps/bld40.xpm | 49 - pixmaps/bld45.xpm | 54 - pixmaps/bld49.xpm | 58 - pixmaps/bld54.xpm | 63 - pixmaps/bld58.xpm | 67 - pixmaps/bld64.xpm | 73 - pixmaps/bld72.xpm | 81 - pixmaps/bld80.xpm | 89 - pixmaps/bld87.xpm | 96 - pixmaps/bld95.xpm | 104 - pixmaps/bll108.xpm | 117 - pixmaps/bll116.xpm | 125 - pixmaps/bll129.xpm | 138 - pixmaps/bll21.xpm | 30 - pixmaps/bll25.xpm | 34 - pixmaps/bll29.xpm | 38 - pixmaps/bll33.xpm | 42 - pixmaps/bll37.xpm | 43 - pixmaps/bll40.xpm | 49 - pixmaps/bll45.xpm | 54 - pixmaps/bll49.xpm | 58 - pixmaps/bll54.xpm | 63 - pixmaps/bll58.xpm | 67 - pixmaps/bll64.xpm | 73 - pixmaps/bll72.xpm | 81 - pixmaps/bll80.xpm | 89 - pixmaps/bll87.xpm | 96 - pixmaps/bll95.xpm | 104 - pixmaps/cdd33.xpm | 42 - pixmaps/cdd37.xpm | 46 - pixmaps/cdd40.xpm | 49 - pixmaps/cdd45.xpm | 54 - pixmaps/cdd49.xpm | 58 - pixmaps/cdd54.xpm | 63 - pixmaps/cdd58.xpm | 67 - pixmaps/cdd64.xpm | 73 - pixmaps/cdd72.xpm | 81 - pixmaps/cdl33.xpm | 42 - pixmaps/cdl37.xpm | 46 - pixmaps/cdl40.xpm | 49 - pixmaps/cdl45.xpm | 54 - pixmaps/cdl49.xpm | 58 - pixmaps/cdl54.xpm | 63 - pixmaps/cdl58.xpm | 67 - pixmaps/cdl64.xpm | 73 - pixmaps/cdl72.xpm | 81 - pixmaps/cld33.xpm | 42 - pixmaps/cld37.xpm | 46 - pixmaps/cld40.xpm | 49 - pixmaps/cld45.xpm | 54 - pixmaps/cld49.xpm | 58 - pixmaps/cld54.xpm | 63 - pixmaps/cld58.xpm | 67 - pixmaps/cld64.xpm | 73 - pixmaps/cld72.xpm | 81 - pixmaps/cll33.xpm | 42 - pixmaps/cll37.xpm | 46 - pixmaps/cll40.xpm | 49 - pixmaps/cll45.xpm | 54 - pixmaps/cll49.xpm | 58 - pixmaps/cll54.xpm | 63 - pixmaps/cll58.xpm | 67 - pixmaps/cll64.xpm | 73 - pixmaps/cll72.xpm | 81 - pixmaps/convbm | 35 - pixmaps/convbm.sed | 4 - pixmaps/convbm2.sed | 5 - pixmaps/convert.c | 168 - pixmaps/cvdd33.xpm | 42 - pixmaps/cvdd37.xpm | 46 - pixmaps/cvdd40.xpm | 49 - pixmaps/cvdd45.xpm | 54 - pixmaps/cvdd49.xpm | 58 - pixmaps/cvdd54.xpm | 63 - pixmaps/cvdd58.xpm | 67 - pixmaps/cvdd64.xpm | 73 - pixmaps/cvdd72.xpm | 81 - pixmaps/cvdl33.xpm | 42 - pixmaps/cvdl37.xpm | 46 - pixmaps/cvdl40.xpm | 49 - pixmaps/cvdl45.xpm | 54 - pixmaps/cvdl49.xpm | 58 - pixmaps/cvdl54.xpm | 63 - pixmaps/cvdl58.xpm | 67 - pixmaps/cvdl64.xpm | 73 - pixmaps/cvdl72.xpm | 81 - pixmaps/cvld33.xpm | 42 - pixmaps/cvld37.xpm | 46 - pixmaps/cvld40.xpm | 49 - pixmaps/cvld45.xpm | 54 - pixmaps/cvld49.xpm | 58 - pixmaps/cvld54.xpm | 63 - pixmaps/cvld58.xpm | 67 - pixmaps/cvld64.xpm | 73 - pixmaps/cvld72.xpm | 81 - pixmaps/cvll33.xpm | 42 - pixmaps/cvll37.xpm | 46 - pixmaps/cvll40.xpm | 49 - pixmaps/cvll45.xpm | 54 - pixmaps/cvll49.xpm | 58 - pixmaps/cvll54.xpm | 63 - pixmaps/cvll58.xpm | 67 - pixmaps/cvll64.xpm | 73 - pixmaps/cvll72.xpm | 81 - pixmaps/dkdd33.xpm | 42 - pixmaps/dkdd49.xpm | 58 - pixmaps/dkdd72.xpm | 81 - pixmaps/dkdl33.xpm | 42 - pixmaps/dkdl49.xpm | 58 - pixmaps/dkdl72.xpm | 81 - pixmaps/dkld33.xpm | 42 - pixmaps/dkld49.xpm | 58 - pixmaps/dkld72.xpm | 81 - pixmaps/dkll33.xpm | 42 - pixmaps/dkll49.xpm | 58 - pixmaps/dkll72.xpm | 81 - pixmaps/edd33.xpm | 42 - pixmaps/edd49.xpm | 58 - pixmaps/edd72.xpm | 81 - pixmaps/edl33.xpm | 42 - pixmaps/edl49.xpm | 58 - pixmaps/edl72.xpm | 81 - pixmaps/eld33.xpm | 42 - pixmaps/eld49.xpm | 58 - pixmaps/eld72.xpm | 81 - pixmaps/ell33.xpm | 42 - pixmaps/ell49.xpm | 58 - pixmaps/ell72.xpm | 81 - pixmaps/fdd33.xpm | 42 - pixmaps/fdd49.xpm | 58 - pixmaps/fdd72.xpm | 81 - pixmaps/fdl33.xpm | 42 - pixmaps/fdl49.xpm | 58 - pixmaps/fdl72.xpm | 81 - pixmaps/fld33.xpm | 42 - pixmaps/fld49.xpm | 58 - pixmaps/fld72.xpm | 81 - pixmaps/fll33.xpm | 42 - pixmaps/fll49.xpm | 58 - pixmaps/fll72.xpm | 81 - pixmaps/gdd33.xpm | 42 - pixmaps/gdd49.xpm | 58 - pixmaps/gdd72.xpm | 81 - pixmaps/gdl33.xpm | 42 - pixmaps/gdl49.xpm | 58 - pixmaps/gdl72.xpm | 81 - pixmaps/gld33.xpm | 42 - pixmaps/gld49.xpm | 58 - pixmaps/gld72.xpm | 81 - pixmaps/gll33.xpm | 42 - pixmaps/gll49.xpm | 58 - pixmaps/gll72.xpm | 81 - pixmaps/hdd33.xpm | 42 - pixmaps/hdd49.xpm | 58 - pixmaps/hdd72.xpm | 81 - pixmaps/hdl33.xpm | 42 - pixmaps/hdl49.xpm | 58 - pixmaps/hdl72.xpm | 81 - pixmaps/hld33.xpm | 42 - pixmaps/hld49.xpm | 58 - pixmaps/hld72.xpm | 81 - pixmaps/hll33.xpm | 42 - pixmaps/hll49.xpm | 58 - pixmaps/hll72.xpm | 81 - pixmaps/ini32.xpm | 41 + pixmaps/ini48.xpm | 57 + pixmaps/kdd108.xpm | 117 - pixmaps/kdd116.xpm | 125 - pixmaps/kdd129.xpm | 138 - pixmaps/kdd21.xpm | 30 - pixmaps/kdd25.xpm | 34 - pixmaps/kdd29.xpm | 38 - pixmaps/kdd33.xpm | 42 - pixmaps/kdd37.xpm | 46 - pixmaps/kdd40.xpm | 46 - pixmaps/kdd45.xpm | 54 - pixmaps/kdd49.xpm | 58 - pixmaps/kdd54.xpm | 63 - pixmaps/kdd58.xpm | 67 - pixmaps/kdd64.xpm | 73 - pixmaps/kdd72.xpm | 81 - pixmaps/kdd80.xpm | 89 - pixmaps/kdd87.xpm | 96 - pixmaps/kdd95.xpm | 104 - pixmaps/kdl108.xpm | 117 - pixmaps/kdl116.xpm | 125 - pixmaps/kdl129.xpm | 138 - pixmaps/kdl21.xpm | 30 - pixmaps/kdl25.xpm | 34 - pixmaps/kdl29.xpm | 38 - pixmaps/kdl33.xpm | 42 - pixmaps/kdl37.xpm | 46 - pixmaps/kdl40.xpm | 46 - pixmaps/kdl45.xpm | 54 - pixmaps/kdl49.xpm | 58 - pixmaps/kdl54.xpm | 63 - pixmaps/kdl58.xpm | 67 - pixmaps/kdl64.xpm | 73 - pixmaps/kdl72.xpm | 81 - pixmaps/kdl80.xpm | 89 - pixmaps/kdl87.xpm | 96 - pixmaps/kdl95.xpm | 104 - pixmaps/kld108.xpm | 117 - pixmaps/kld116.xpm | 125 - pixmaps/kld129.xpm | 138 - pixmaps/kld21.xpm | 30 - pixmaps/kld25.xpm | 34 - pixmaps/kld29.xpm | 38 - pixmaps/kld33.xpm | 42 - pixmaps/kld37.xpm | 46 - pixmaps/kld40.xpm | 46 - pixmaps/kld45.xpm | 54 - pixmaps/kld49.xpm | 58 - pixmaps/kld54.xpm | 63 - pixmaps/kld58.xpm | 67 - pixmaps/kld64.xpm | 73 - pixmaps/kld72.xpm | 81 - pixmaps/kld80.xpm | 89 - pixmaps/kld87.xpm | 96 - pixmaps/kld95.xpm | 104 - pixmaps/kll108.xpm | 117 - pixmaps/kll116.xpm | 125 - pixmaps/kll129.xpm | 138 - pixmaps/kll21.xpm | 30 - pixmaps/kll25.xpm | 34 - pixmaps/kll29.xpm | 38 - pixmaps/kll33.xpm | 42 - pixmaps/kll37.xpm | 46 - pixmaps/kll40.xpm | 46 - pixmaps/kll45.xpm | 54 - pixmaps/kll49.xpm | 58 - pixmaps/kll54.xpm | 63 - pixmaps/kll58.xpm | 67 - pixmaps/kll64.xpm | 73 - pixmaps/kll72.xpm | 81 - pixmaps/kll80.xpm | 89 - pixmaps/kll87.xpm | 96 - pixmaps/kll95.xpm | 104 - pixmaps/ldd33.xpm | 42 - pixmaps/ldd37.xpm | 46 - pixmaps/ldd40.xpm | 49 - pixmaps/ldd45.xpm | 54 - pixmaps/ldd49.xpm | 58 - pixmaps/ldd54.xpm | 63 - pixmaps/ldd58.xpm | 67 - pixmaps/ldd64.xpm | 73 - pixmaps/ldd72.xpm | 81 - pixmaps/ldl33.xpm | 42 - pixmaps/ldl37.xpm | 46 - pixmaps/ldl40.xpm | 49 - pixmaps/ldl45.xpm | 54 - pixmaps/ldl49.xpm | 58 - pixmaps/ldl54.xpm | 63 - pixmaps/ldl58.xpm | 67 - pixmaps/ldl64.xpm | 73 - pixmaps/ldl72.xpm | 81 - pixmaps/lld33.xpm | 42 - pixmaps/lld37.xpm | 46 - pixmaps/lld40.xpm | 49 - pixmaps/lld45.xpm | 54 - pixmaps/lld49.xpm | 58 - pixmaps/lld54.xpm | 63 - pixmaps/lld58.xpm | 67 - pixmaps/lld64.xpm | 73 - pixmaps/lld72.xpm | 81 - pixmaps/lll33.xpm | 42 - pixmaps/lll37.xpm | 46 - pixmaps/lll40.xpm | 49 - pixmaps/lll45.xpm | 54 - pixmaps/lll49.xpm | 58 - pixmaps/lll54.xpm | 63 - pixmaps/lll58.xpm | 67 - pixmaps/lll64.xpm | 73 - pixmaps/lll72.xpm | 81 - pixmaps/marble_d.xpm | 238 -- pixmaps/marble_l.xpm | 359 -- pixmaps/mdd33.xpm | 42 - pixmaps/mdd49.xpm | 58 - pixmaps/mdd72.xpm | 81 - pixmaps/mdl33.xpm | 42 - pixmaps/mdl49.xpm | 58 - pixmaps/mdl72.xpm | 81 - pixmaps/mld33.xpm | 42 - pixmaps/mld49.xpm | 58 - pixmaps/mld72.xpm | 81 - pixmaps/mll33.xpm | 42 - pixmaps/mll49.xpm | 58 - pixmaps/mll72.xpm | 81 - pixmaps/ndd108.xpm | 117 - pixmaps/ndd116.xpm | 125 - pixmaps/ndd129.xpm | 138 - pixmaps/ndd21.xpm | 30 - pixmaps/ndd25.xpm | 34 - pixmaps/ndd29.xpm | 35 - pixmaps/ndd33.xpm | 42 - pixmaps/ndd37.xpm | 43 - pixmaps/ndd40.xpm | 46 - pixmaps/ndd45.xpm | 51 - pixmaps/ndd49.xpm | 55 - pixmaps/ndd54.xpm | 63 - pixmaps/ndd58.xpm | 67 - pixmaps/ndd64.xpm | 73 - pixmaps/ndd72.xpm | 81 - pixmaps/ndd80.xpm | 89 - pixmaps/ndd87.xpm | 96 - pixmaps/ndd95.xpm | 104 - pixmaps/ndl108.xpm | 117 - pixmaps/ndl116.xpm | 125 - pixmaps/ndl129.xpm | 138 - pixmaps/ndl21.xpm | 30 - pixmaps/ndl25.xpm | 34 - pixmaps/ndl29.xpm | 35 - pixmaps/ndl33.xpm | 42 - pixmaps/ndl37.xpm | 43 - pixmaps/ndl40.xpm | 46 - pixmaps/ndl45.xpm | 51 - pixmaps/ndl49.xpm | 55 - pixmaps/ndl54.xpm | 63 - pixmaps/ndl58.xpm | 67 - pixmaps/ndl64.xpm | 73 - pixmaps/ndl72.xpm | 81 - pixmaps/ndl80.xpm | 89 - pixmaps/ndl87.xpm | 96 - pixmaps/ndl95.xpm | 104 - pixmaps/nld108.xpm | 117 - pixmaps/nld116.xpm | 125 - pixmaps/nld129.xpm | 138 - pixmaps/nld21.xpm | 30 - pixmaps/nld25.xpm | 34 - pixmaps/nld29.xpm | 38 - pixmaps/nld33.xpm | 42 - pixmaps/nld37.xpm | 46 - pixmaps/nld40.xpm | 46 - pixmaps/nld45.xpm | 51 - pixmaps/nld49.xpm | 58 - pixmaps/nld54.xpm | 63 - pixmaps/nld58.xpm | 67 - pixmaps/nld64.xpm | 73 - pixmaps/nld72.xpm | 81 - pixmaps/nld80.xpm | 89 - pixmaps/nld87.xpm | 96 - pixmaps/nld95.xpm | 104 - pixmaps/nll108.xpm | 117 - pixmaps/nll116.xpm | 125 - pixmaps/nll129.xpm | 138 - pixmaps/nll21.xpm | 30 - pixmaps/nll25.xpm | 34 - pixmaps/nll29.xpm | 38 - pixmaps/nll33.xpm | 42 - pixmaps/nll37.xpm | 46 - pixmaps/nll40.xpm | 46 - pixmaps/nll45.xpm | 51 - pixmaps/nll49.xpm | 58 - pixmaps/nll54.xpm | 63 - pixmaps/nll58.xpm | 67 - pixmaps/nll64.xpm | 73 - pixmaps/nll72.xpm | 81 - pixmaps/nll80.xpm | 89 - pixmaps/nll87.xpm | 96 - pixmaps/nll95.xpm | 104 - pixmaps/odd33.xpm | 42 - pixmaps/odd49.xpm | 58 - pixmaps/odd72.xpm | 81 - pixmaps/odl33.xpm | 42 - pixmaps/odl49.xpm | 58 - pixmaps/odl72.xpm | 81 - pixmaps/old33.xpm | 42 - pixmaps/old49.xpm | 58 - pixmaps/old72.xpm | 81 - pixmaps/oll33.xpm | 42 - pixmaps/oll49.xpm | 58 - pixmaps/oll72.xpm | 81 - pixmaps/pdd108.xpm | 116 - pixmaps/pdd116.xpm | 124 - pixmaps/pdd129.xpm | 137 - pixmaps/pdd21.xpm | 29 - pixmaps/pdd25.xpm | 33 - pixmaps/pdd29.xpm | 37 - pixmaps/pdd33.xpm | 41 - pixmaps/pdd37.xpm | 45 - pixmaps/pdd40.xpm | 48 - pixmaps/pdd45.xpm | 53 - pixmaps/pdd49.xpm | 57 - pixmaps/pdd54.xpm | 62 - pixmaps/pdd58.xpm | 66 - pixmaps/pdd64.xpm | 72 - pixmaps/pdd72.xpm | 80 - pixmaps/pdd80.xpm | 88 - pixmaps/pdd87.xpm | 95 - pixmaps/pdd95.xpm | 103 - pixmaps/pdl108.xpm | 116 - pixmaps/pdl116.xpm | 124 - pixmaps/pdl129.xpm | 137 - pixmaps/pdl21.xpm | 29 - pixmaps/pdl25.xpm | 33 - pixmaps/pdl29.xpm | 37 - pixmaps/pdl33.xpm | 41 - pixmaps/pdl37.xpm | 45 - pixmaps/pdl40.xpm | 48 - pixmaps/pdl45.xpm | 53 - pixmaps/pdl49.xpm | 57 - pixmaps/pdl54.xpm | 62 - pixmaps/pdl58.xpm | 66 - pixmaps/pdl64.xpm | 72 - pixmaps/pdl72.xpm | 80 - pixmaps/pdl80.xpm | 88 - pixmaps/pdl87.xpm | 95 - pixmaps/pdl95.xpm | 103 - pixmaps/pixmaps.h | 1349 ------- pixmaps/pld108.xpm | 117 - pixmaps/pld116.xpm | 125 - pixmaps/pld129.xpm | 138 - pixmaps/pld21.xpm | 30 - pixmaps/pld25.xpm | 34 - pixmaps/pld29.xpm | 38 - pixmaps/pld33.xpm | 42 - pixmaps/pld37.xpm | 46 - pixmaps/pld40.xpm | 49 - pixmaps/pld45.xpm | 54 - pixmaps/pld49.xpm | 58 - pixmaps/pld54.xpm | 63 - pixmaps/pld58.xpm | 67 - pixmaps/pld64.xpm | 73 - pixmaps/pld72.xpm | 81 - pixmaps/pld80.xpm | 89 - pixmaps/pld87.xpm | 96 - pixmaps/pld95.xpm | 104 - pixmaps/pll108.xpm | 117 - pixmaps/pll116.xpm | 125 - pixmaps/pll129.xpm | 138 - pixmaps/pll21.xpm | 30 - pixmaps/pll25.xpm | 34 - pixmaps/pll29.xpm | 38 - pixmaps/pll33.xpm | 42 - pixmaps/pll37.xpm | 46 - pixmaps/pll40.xpm | 49 - pixmaps/pll45.xpm | 54 - pixmaps/pll49.xpm | 58 - pixmaps/pll54.xpm | 63 - pixmaps/pll58.xpm | 67 - pixmaps/pll64.xpm | 73 - pixmaps/pll72.xpm | 81 - pixmaps/pll80.xpm | 89 - pixmaps/pll87.xpm | 96 - pixmaps/pll95.xpm | 104 - pixmaps/qdd108.xpm | 117 - pixmaps/qdd116.xpm | 125 - pixmaps/qdd129.xpm | 138 - pixmaps/qdd21.xpm | 30 - pixmaps/qdd25.xpm | 31 - pixmaps/qdd29.xpm | 38 - pixmaps/qdd33.xpm | 42 - pixmaps/qdd37.xpm | 46 - pixmaps/qdd40.xpm | 49 - pixmaps/qdd45.xpm | 54 - pixmaps/qdd49.xpm | 58 - pixmaps/qdd54.xpm | 63 - pixmaps/qdd58.xpm | 67 - pixmaps/qdd64.xpm | 73 - pixmaps/qdd72.xpm | 78 - pixmaps/qdd80.xpm | 89 - pixmaps/qdd87.xpm | 96 - pixmaps/qdd95.xpm | 104 - pixmaps/qdl108.xpm | 117 - pixmaps/qdl116.xpm | 125 - pixmaps/qdl129.xpm | 138 - pixmaps/qdl21.xpm | 30 - pixmaps/qdl25.xpm | 31 - pixmaps/qdl29.xpm | 38 - pixmaps/qdl33.xpm | 42 - pixmaps/qdl37.xpm | 46 - pixmaps/qdl40.xpm | 49 - pixmaps/qdl45.xpm | 54 - pixmaps/qdl49.xpm | 58 - pixmaps/qdl54.xpm | 63 - pixmaps/qdl58.xpm | 67 - pixmaps/qdl64.xpm | 73 - pixmaps/qdl72.xpm | 78 - pixmaps/qdl80.xpm | 89 - pixmaps/qdl87.xpm | 96 - pixmaps/qdl95.xpm | 104 - pixmaps/qld108.xpm | 117 - pixmaps/qld116.xpm | 125 - pixmaps/qld129.xpm | 138 - pixmaps/qld21.xpm | 30 - pixmaps/qld25.xpm | 31 - pixmaps/qld29.xpm | 38 - pixmaps/qld33.xpm | 42 - pixmaps/qld37.xpm | 46 - pixmaps/qld40.xpm | 49 - pixmaps/qld45.xpm | 54 - pixmaps/qld49.xpm | 58 - pixmaps/qld54.xpm | 63 - pixmaps/qld58.xpm | 67 - pixmaps/qld64.xpm | 73 - pixmaps/qld72.xpm | 78 - pixmaps/qld80.xpm | 89 - pixmaps/qld87.xpm | 96 - pixmaps/qld95.xpm | 104 - pixmaps/qll108.xpm | 117 - pixmaps/qll116.xpm | 125 - pixmaps/qll129.xpm | 138 - pixmaps/qll21.xpm | 30 - pixmaps/qll25.xpm | 31 - pixmaps/qll29.xpm | 38 - pixmaps/qll33.xpm | 42 - pixmaps/qll37.xpm | 46 - pixmaps/qll40.xpm | 49 - pixmaps/qll45.xpm | 54 - pixmaps/qll49.xpm | 58 - pixmaps/qll54.xpm | 63 - pixmaps/qll58.xpm | 67 - pixmaps/qll64.xpm | 73 - pixmaps/qll72.xpm | 78 - pixmaps/qll80.xpm | 89 - pixmaps/qll87.xpm | 96 - pixmaps/qll95.xpm | 104 - pixmaps/rdd108.xpm | 117 - pixmaps/rdd116.xpm | 125 - pixmaps/rdd129.xpm | 138 - pixmaps/rdd21.xpm | 30 - pixmaps/rdd25.xpm | 34 - pixmaps/rdd29.xpm | 38 - pixmaps/rdd33.xpm | 42 - pixmaps/rdd37.xpm | 46 - pixmaps/rdd40.xpm | 46 - pixmaps/rdd45.xpm | 54 - pixmaps/rdd49.xpm | 58 - pixmaps/rdd54.xpm | 63 - pixmaps/rdd58.xpm | 67 - pixmaps/rdd64.xpm | 73 - pixmaps/rdd72.xpm | 81 - pixmaps/rdd80.xpm | 89 - pixmaps/rdd87.xpm | 96 - pixmaps/rdd95.xpm | 104 - pixmaps/rdl108.xpm | 117 - pixmaps/rdl116.xpm | 125 - pixmaps/rdl129.xpm | 138 - pixmaps/rdl21.xpm | 30 - pixmaps/rdl25.xpm | 34 - pixmaps/rdl29.xpm | 38 - pixmaps/rdl33.xpm | 42 - pixmaps/rdl37.xpm | 46 - pixmaps/rdl40.xpm | 46 - pixmaps/rdl45.xpm | 54 - pixmaps/rdl49.xpm | 58 - pixmaps/rdl54.xpm | 63 - pixmaps/rdl58.xpm | 67 - pixmaps/rdl64.xpm | 73 - pixmaps/rdl72.xpm | 81 - pixmaps/rdl80.xpm | 89 - pixmaps/rdl87.xpm | 96 - pixmaps/rdl95.xpm | 104 - pixmaps/rld108.xpm | 117 - pixmaps/rld116.xpm | 125 - pixmaps/rld129.xpm | 138 - pixmaps/rld21.xpm | 30 - pixmaps/rld25.xpm | 34 - pixmaps/rld29.xpm | 38 - pixmaps/rld33.xpm | 42 - pixmaps/rld37.xpm | 46 - pixmaps/rld40.xpm | 49 - pixmaps/rld45.xpm | 54 - pixmaps/rld49.xpm | 58 - pixmaps/rld54.xpm | 63 - pixmaps/rld58.xpm | 67 - pixmaps/rld64.xpm | 73 - pixmaps/rld72.xpm | 81 - pixmaps/rld80.xpm | 89 - pixmaps/rld87.xpm | 96 - pixmaps/rld95.xpm | 104 - pixmaps/rll108.xpm | 117 - pixmaps/rll116.xpm | 125 - pixmaps/rll129.xpm | 138 - pixmaps/rll21.xpm | 30 - pixmaps/rll25.xpm | 34 - pixmaps/rll29.xpm | 38 - pixmaps/rll33.xpm | 42 - pixmaps/rll37.xpm | 46 - pixmaps/rll40.xpm | 49 - pixmaps/rll45.xpm | 54 - pixmaps/rll49.xpm | 58 - pixmaps/rll54.xpm | 63 - pixmaps/rll58.xpm | 67 - pixmaps/rll64.xpm | 73 - pixmaps/rll72.xpm | 81 - pixmaps/rll80.xpm | 89 - pixmaps/rll87.xpm | 96 - pixmaps/rll95.xpm | 104 - pixmaps/sdd49.xpm | 58 - pixmaps/sdd72.xpm | 81 - pixmaps/sdl49.xpm | 58 - pixmaps/sdl72.xpm | 81 - pixmaps/sld49.xpm | 58 - pixmaps/sld72.xpm | 81 - pixmaps/sll49.xpm | 58 - pixmaps/sll72.xpm | 81 - pixmaps/test.c | 13 - pixmaps/udd49.xpm | 58 - pixmaps/udd72.xpm | 81 - pixmaps/udl49.xpm | 58 - pixmaps/udl72.xpm | 81 - pixmaps/uld49.xpm | 58 - pixmaps/uld72.xpm | 81 - pixmaps/ull49.xpm | 58 - pixmaps/ull72.xpm | 81 - pixmaps/vdd33.xpm | 42 - pixmaps/vdd49.xpm | 58 - pixmaps/vdd72.xpm | 81 - pixmaps/vdl33.xpm | 42 - pixmaps/vdl49.xpm | 58 - pixmaps/vdl72.xpm | 81 - pixmaps/vld33.xpm | 42 - pixmaps/vld49.xpm | 58 - pixmaps/vld72.xpm | 81 - pixmaps/vll33.xpm | 42 - pixmaps/vll49.xpm | 58 - pixmaps/vll72.xpm | 81 - pixmaps/wdd33.xpm | 42 - pixmaps/wdd49.xpm | 58 - pixmaps/wdd72.xpm | 81 - pixmaps/wdl33.xpm | 42 - pixmaps/wdl49.xpm | 58 - pixmaps/wdl72.xpm | 81 - pixmaps/wld33.xpm | 42 - pixmaps/wld49.xpm | 58 - pixmaps/wld72.xpm | 81 - pixmaps/wldd49.xpm | 58 - pixmaps/wldd72.xpm | 81 - pixmaps/wldl49.xpm | 58 - pixmaps/wldl72.xpm | 81 - pixmaps/wll33.xpm | 42 - pixmaps/wll49.xpm | 58 - pixmaps/wll72.xpm | 81 - pixmaps/wlld49.xpm | 58 - pixmaps/wlld72.xpm | 81 - pixmaps/wlll49.xpm | 58 - pixmaps/wlll72.xpm | 81 - pixmaps/wndd49.xpm | 58 - pixmaps/wndd72.xpm | 81 - pixmaps/wndl49.xpm | 58 - pixmaps/wndl72.xpm | 81 - pixmaps/wnld49.xpm | 58 - pixmaps/wnld72.xpm | 81 - pixmaps/wnll49.xpm | 58 - pixmaps/wnll72.xpm | 81 - pixmaps/wood_d.xpm | 239 -- pixmaps/wood_l.xpm | 192 - pixmaps/wpdd49.xpm | 58 - pixmaps/wpdd72.xpm | 81 - pixmaps/wpdl49.xpm | 58 - pixmaps/wpdl72.xpm | 81 - pixmaps/wpld49.xpm | 58 - pixmaps/wpld72.xpm | 81 - pixmaps/wpll49.xpm | 58 - pixmaps/wpll72.xpm | 81 - pixmaps/wsdd49.xpm | 58 - pixmaps/wsdd72.xpm | 81 - pixmaps/wsdl49.xpm | 58 - pixmaps/wsdl72.xpm | 81 - pixmaps/wsld49.xpm | 58 - pixmaps/wsld72.xpm | 81 - pixmaps/wsll49.xpm | 58 - pixmaps/wsll72.xpm | 81 - pixmaps/xqboard.xpm | 498 --- pixmaps/xqwood.xpm | 597 --- png/BlackAdvisor.png | Bin 0 -> 1928 bytes png/BlackArchbishop.png | Bin 0 -> 1856 bytes png/BlackBishop.png | Bin 0 -> 1478 bytes png/BlackCanon.png | Bin 0 -> 1302 bytes png/BlackChancellor.png | Bin 0 -> 2147 bytes png/BlackCobra.png | Bin 0 -> 1308 bytes png/BlackCommoner.png | Bin 0 -> 1954 bytes png/BlackCrownedBishop.png | Bin 0 -> 1537 bytes png/BlackCrownedRook.png | Bin 0 -> 1133 bytes png/BlackElephant.png | Bin 0 -> 2437 bytes png/BlackGold.png | Bin 0 -> 2198 bytes png/BlackGoldKnight.png | Bin 0 -> 2219 bytes png/BlackGoldLance.png | Bin 0 -> 2268 bytes png/BlackGoldPawn.png | Bin 0 -> 1936 bytes png/BlackGoldSilver.png | Bin 0 -> 2161 bytes png/BlackHawk.png | Bin 0 -> 2071 bytes png/BlackKing.png | Bin 0 -> 3255 bytes png/BlackKnight.png | Bin 0 -> 2715 bytes png/BlackLance.png | Bin 0 -> 810 bytes png/BlackMarshall.png | Bin 0 -> 2143 bytes png/BlackNightrider.png | Bin 0 -> 2930 bytes png/BlackPawn.png | Bin 0 -> 800 bytes png/BlackPrincess.png | Bin 0 -> 1845 bytes png/BlackQueen.png | Bin 0 -> 2165 bytes png/BlackRook.png | Bin 0 -> 885 bytes png/BlackUnicorn.png | Bin 0 -> 2035 bytes png/WhiteAdvisor.png | Bin 0 -> 2836 bytes png/WhiteArchbishop.png | Bin 0 -> 2452 bytes png/WhiteBishop.png | Bin 0 -> 2607 bytes png/WhiteCanon.png | Bin 0 -> 1914 bytes png/WhiteChancellor.png | Bin 0 -> 2490 bytes png/WhiteCobra.png | Bin 0 -> 2336 bytes png/WhiteCommoner.png | Bin 0 -> 2879 bytes png/WhiteCrownedBishop.png | Bin 0 -> 2626 bytes png/WhiteCrownedRook.png | Bin 0 -> 1492 bytes png/WhiteElephant.png | Bin 0 -> 3871 bytes png/WhiteGold.png | Bin 0 -> 3141 bytes png/WhiteGoldKnight.png | Bin 0 -> 3183 bytes png/WhiteGoldLance.png | Bin 0 -> 3240 bytes png/WhiteGoldPawn.png | Bin 0 -> 2909 bytes png/WhiteGoldSilver.png | Bin 0 -> 3166 bytes png/WhiteHawk.png | Bin 0 -> 3078 bytes png/WhiteKing.png | Bin 0 -> 3159 bytes png/WhiteKnight.png | Bin 0 -> 2926 bytes png/WhiteLance.png | Bin 0 -> 1611 bytes png/WhiteMarshall.png | Bin 0 -> 2876 bytes png/WhiteNightrider.png | Bin 0 -> 2926 bytes png/WhitePawn.png | Bin 0 -> 1609 bytes png/WhitePrincess.png | Bin 0 -> 3630 bytes png/WhiteQueen.png | Bin 0 -> 4397 bytes png/WhiteRook.png | Bin 0 -> 1072 bytes png/WhiteUnicorn.png | Bin 0 -> 3162 bytes png/hatch.png | Bin 0 -> 397 bytes png/marble_d.png | Bin 0 -> 40546 bytes png/marble_l.png | Bin 0 -> 47660 bytes png/wood_d.png | Bin 0 -> 34729 bytes png/wood_l.png | Bin 0 -> 30195 bytes png/xqboard.png | Bin 0 -> 4423 bytes png/xqwood.png | Bin 0 -> 359345 bytes po/POTFILES.in | 25 +- po/da.po | 3791 ++++++++++--------- po/de.po | 3806 ++++++++++--------- po/es.po | 3341 ++++++++-------- po/it.po | 3331 ++++++++-------- po/lng2po.sh | 2 +- po/ru.po | 3343 ++++++++-------- po/tr.po | 3017 ++++++++------- po/uk.po | 3831 ++++++++++--------- po/vi.po | 3120 ++++++++------- po/xboard.pot | 2609 +++++++------ po/zh_CN.po | 3332 ++++++++-------- po/zh_HK.po | 3316 ++++++++-------- po/zh_TW.po | 3302 ++++++++-------- shogipixmaps/bdd64.xpm | 73 - shogipixmaps/bdl64.xpm | 73 - shogipixmaps/bld64.xpm | 74 - shogipixmaps/bll64.xpm | 74 - shogipixmaps/fdd64.xpm | 73 - shogipixmaps/fdl64.xpm | 73 - shogipixmaps/fld64.xpm | 74 - shogipixmaps/fll64.xpm | 74 - shogipixmaps/kdd64.xpm | 73 - shogipixmaps/kdl64.xpm | 73 - shogipixmaps/kld64.xpm | 73 - shogipixmaps/kll64.xpm | 73 - shogipixmaps/ldd64.xpm | 73 - shogipixmaps/ldl64.xpm | 73 - shogipixmaps/lld64.xpm | 73 - shogipixmaps/lll64.xpm | 73 - shogipixmaps/ndd64.xpm | 73 - shogipixmaps/ndl64.xpm | 73 - shogipixmaps/nld64.xpm | 74 - shogipixmaps/nll64.xpm | 74 - shogipixmaps/pdd64.xpm | 73 - shogipixmaps/pdl64.xpm | 73 - shogipixmaps/pld64.xpm | 74 - shogipixmaps/pll64.xpm | 74 - shogipixmaps/qdd64.xpm | 73 - shogipixmaps/qdl64.xpm | 73 - shogipixmaps/qld64.xpm | 73 - shogipixmaps/qll64.xpm | 73 - shogipixmaps/rdd64.xpm | 73 - shogipixmaps/rdl64.xpm | 73 - shogipixmaps/rld64.xpm | 73 - shogipixmaps/rll64.xpm | 73 - shogipixmaps/wdd64.xpm | 73 - shogipixmaps/wdl64.xpm | 73 - shogipixmaps/wld64.xpm | 73 - shogipixmaps/wldd64.xpm | 73 - shogipixmaps/wldl64.xpm | 73 - shogipixmaps/wll64.xpm | 73 - shogipixmaps/wlld64.xpm | 73 - shogipixmaps/wlll64.xpm | 73 - shogipixmaps/wndd64.xpm | 73 - shogipixmaps/wndl64.xpm | 73 - shogipixmaps/wnld64.xpm | 73 - shogipixmaps/wnll64.xpm | 73 - shogipixmaps/wpdd64.xpm | 73 - shogipixmaps/wpdl64.xpm | 73 - shogipixmaps/wpld64.xpm | 73 - shogipixmaps/wpll64.xpm | 73 - shogipixmaps/wsdd64.xpm | 73 - shogipixmaps/wsdl64.xpm | 73 - shogipixmaps/wsld64.xpm | 73 - shogipixmaps/wsll64.xpm | 73 - svg/BlackAdvisor.svg | 70 + svg/BlackArchbishop.svg | 92 + svg/BlackBishop.svg | 78 + svg/BlackCanon.svg | 68 + svg/BlackChancellor.svg | 73 + svg/BlackCobra.svg | 78 + svg/BlackCommoner.svg | 71 + svg/BlackCrownedBishop.svg | 73 + svg/BlackCrownedRook.svg | 82 + svg/BlackElephant.svg | 98 + svg/BlackGold.svg | 63 + svg/BlackGoldKnight.svg | 63 + svg/BlackGoldLance.svg | 63 + svg/BlackGoldPawn.svg | 58 + svg/BlackGoldSilver.svg | 63 + svg/BlackHawk.svg | 98 + svg/BlackKing.svg | 83 + svg/BlackKnight.svg | 48 + svg/BlackLance.svg | 58 + svg/BlackMarshall.svg | 77 + svg/BlackNightrider.svg | 58 + svg/BlackPawn.svg | 38 + svg/BlackPrincess.svg | 98 + svg/BlackQueen.svg | 58 + svg/BlackRook.svg | 78 + svg/BlackUnicorn.svg | 63 + svg/WhiteAdvisor.svg | 65 + svg/WhiteArchbishop.svg | 86 + svg/WhiteBishop.svg | 72 + svg/WhiteCanon.svg | 62 + svg/WhiteChancellor.svg | 91 + svg/WhiteCobra.svg | 68 + svg/WhiteCommoner.svg | 63 + svg/WhiteCrownedBishop.svg | 68 + svg/WhiteCrownedRook.svg | 73 + svg/WhiteElephant.svg | 87 + svg/WhiteGold.svg | 63 + svg/WhiteGoldKnight.svg | 63 + svg/WhiteGoldLance.svg | 63 + svg/WhiteGoldPawn.svg | 58 + svg/WhiteGoldSilver.svg | 63 + svg/WhiteHawk.svg | 94 + svg/WhiteKing.svg | 73 + svg/WhiteKnight.svg | 58 + svg/WhiteLance.svg | 58 + svg/WhiteMarshall.svg | 80 + svg/WhiteNightrider.svg | 58 + svg/WhitePawn.svg | 38 + svg/WhitePrincess.svg | 98 + svg/WhiteQueen.svg | 110 + svg/WhiteRook.svg | 68 + svg/WhiteUnicorn.svg | 77 + svg/eo_Analyzing.svg | 115 + svg/eo_Black.svg | 84 + svg/eo_Clear.svg | 36 + svg/eo_Ponder.svg | 111 + svg/eo_Thinking.svg | 132 + svg/eo_Unknown.svg | 84 + svg/eo_White.svg | 84 + svg/icon_black.svg | 41 + svg/icon_white.svg | 41 + themes/Mono/BlackAdvisor.svg | 92 + themes/Mono/BlackArchbishop.svg | 111 + themes/Mono/BlackBishop.svg | 100 + themes/Mono/BlackCanon.svg | 92 + themes/Mono/BlackChancellor.svg | 90 + themes/Mono/BlackCobra.svg | 99 + themes/Mono/BlackCommoner.svg | 92 + themes/Mono/BlackCrownedBishop.svg | 95 + themes/Mono/BlackCrownedRook.svg | 106 + themes/Mono/BlackElephant.svg | 120 + themes/Mono/BlackGold.svg | 85 + themes/Mono/BlackGoldKnight.svg | 85 + themes/Mono/BlackGoldLance.svg | 85 + themes/Mono/BlackGoldPawn.svg | 80 + themes/Mono/BlackGoldSilver.svg | 85 + themes/Mono/BlackHawk.svg | 125 + themes/Mono/BlackKing.svg | 104 + themes/Mono/BlackKnight.svg | 66 + themes/Mono/BlackLance.svg | 81 + themes/Mono/BlackMarshall.svg | 99 + themes/Mono/BlackNightrider.svg | 76 + themes/Mono/BlackPawn.svg | 65 + themes/Mono/BlackPrincess.svg | 120 + themes/Mono/BlackQueen.svg | 80 + themes/Mono/BlackRook.svg | 106 + themes/Mono/BlackUnicorn.svg | 81 + themes/Mono/WhiteAdvisor.svg | 89 + themes/Mono/WhiteArchbishop.svg | 112 + themes/Mono/WhiteBishop.svg | 97 + themes/Mono/WhiteCanon.svg | 86 + themes/Mono/WhiteChancellor.svg | 105 + themes/Mono/WhiteCobra.svg | 92 + themes/Mono/WhiteCommoner.svg | 87 + themes/Mono/WhiteCrownedBishop.svg | 92 + themes/Mono/WhiteCrownedRook.svg | 97 + themes/Mono/WhiteElephant.svg | 107 + themes/Mono/WhiteGold.svg | 87 + themes/Mono/WhiteGoldKnight.svg | 80 + themes/Mono/WhiteGoldLance.svg | 87 + themes/Mono/WhiteGoldPawn.svg | 82 + themes/Mono/WhiteGoldSilver.svg | 87 + themes/Mono/WhiteHawk.svg | 120 + themes/Mono/WhiteKing.svg | 97 + themes/Mono/WhiteKnight.svg | 75 + themes/Mono/WhiteLance.svg | 75 + themes/Mono/WhiteMarshall.svg | 106 + themes/Mono/WhiteNightrider.svg | 72 + themes/Mono/WhitePawn.svg | 62 + themes/Mono/WhitePrincess.svg | 122 + themes/Mono/WhiteQueen.svg | 134 + themes/Mono/WhiteRook.svg | 92 + themes/Mono/WhiteUnicorn.svg | 85 + themes/Mono/eo_Analyzing.svg | 71 + themes/Mono/eo_Black.svg | 64 + themes/Mono/eo_Clear.svg | 36 + themes/Mono/eo_Ponder.svg | 71 + themes/Mono/eo_Thinking.svg | 185 + themes/Mono/eo_Unknown.svg | 36 + themes/Mono/eo_White.svg | 36 + themes/Mono/icon_black.svg | 41 + themes/Mono/icon_white.svg | 41 + themes/Mono/shogi_bishop.svg | 119 + themes/Mono/shogi_bishop_promoted.svg | 83 + themes/Mono/shogi_gold.svg | 153 + themes/Mono/shogi_king.svg | 125 + themes/Mono/shogi_knight.svg | 138 + themes/Mono/shogi_knight_promoted.svg | 65 + themes/Mono/shogi_lance.svg | 134 + themes/Mono/shogi_lance_promoted.svg | 65 + themes/Mono/shogi_pawn.svg | 108 + themes/Mono/shogi_pawn_promoted.svg | 54 + themes/Mono/shogi_rook.svg | 137 + themes/Mono/shogi_rook_promoted.svg | 112 + themes/Mono/shogi_silver.svg | 163 + themes/Mono/shogi_silver_promoted.svg | 73 + themes/shogi/BlackAdvisor.svg | 187 + themes/shogi/BlackBishop.svg | 143 + themes/shogi/BlackCrownedBishop.svg | 107 + themes/shogi/BlackCrownedRook.svg | 136 + themes/shogi/BlackGold.svg | 177 + themes/shogi/BlackGoldKnight.svg | 89 + themes/shogi/BlackGoldLance.svg | 89 + themes/shogi/BlackGoldPawn.svg | 78 + themes/shogi/BlackGoldSilver.svg | 97 + themes/shogi/BlackKing.svg | 149 + themes/shogi/BlackKnight.svg | 162 + themes/shogi/BlackLance.svg | 158 + themes/shogi/BlackPawn.svg | 132 + themes/shogi/BlackRook.svg | 161 + themes/shogi/WhiteAdvisor.svg | 163 + themes/shogi/WhiteBishop.svg | 119 + themes/shogi/WhiteCrownedBishop.svg | 83 + themes/shogi/WhiteCrownedRook.svg | 112 + themes/shogi/WhiteGold.svg | 153 + themes/shogi/WhiteGoldKnight.svg | 65 + themes/shogi/WhiteGoldLance.svg | 65 + themes/shogi/WhiteGoldPawn.svg | 54 + themes/shogi/WhiteGoldSilver.svg | 73 + themes/shogi/WhiteKing.svg | 125 + themes/shogi/WhiteKnight.svg | 138 + themes/shogi/WhiteLance.svg | 134 + themes/shogi/WhitePawn.svg | 108 + themes/shogi/WhiteRook.svg | 137 + themes/xiangqi/.DS_Store | Bin 0 -> 6148 bytes themes/xiangqi/BlackAdvisor.svg | 86 + themes/xiangqi/BlackCanon.svg | 81 + themes/xiangqi/BlackElephant.svg | 80 + themes/xiangqi/BlackGold.svg | 80 + themes/xiangqi/BlackKnight.svg | 81 + themes/xiangqi/BlackPawn.svg | 83 + themes/xiangqi/BlackRook.svg | 80 + themes/xiangqi/WhiteAdvisor.svg | 90 + themes/xiangqi/WhiteCanon.svg | 85 + themes/xiangqi/WhiteElephant.svg | 85 + themes/xiangqi/WhiteGold.svg | 85 + themes/xiangqi/WhiteKnight.svg | 85 + themes/xiangqi/WhitePawn.svg | 85 + themes/xiangqi/WhiteRook.svg | 86 + uci.c | 2 +- usounds.c | 174 + usystem.c | 792 ++++ usystem.h | 75 + winboard/config.h | 6 +- winboard/defaults.h | 2 +- winboard/help.c | 2 +- winboard/help/html/24.htm | 2 +- winboard/jaws.c | 2 +- winboard/language.txt | 45 +- winboard/language/deutsch.lng | 2 +- winboard/language/italiano.lng | 2 +- winboard/language/nederlands.lng | 46 +- winboard/language/romanian.lng | 2 +- winboard/language/russian.lng | 2 +- winboard/language/spanish.lng | 2 +- winboard/language/vietnamese.lng | 2 +- winboard/resource.h | 7 +- winboard/wchat.c | 2 +- winboard/wclipbrd.c | 2 +- winboard/wclipbrd.h | 2 +- winboard/wedittags.c | 2 +- winboard/wengineoutput.c | 4 +- winboard/wevalgraph.c | 4 +- winboard/wgamelist.c | 23 +- winboard/winboard.c | 259 +- winboard/winboard.h | 6 +- winboard/winboard.rc | 28 +- winboard/wlayout.c | 12 +- winboard/woptions.c | 46 +- winboard/woptions.h | 2 +- winboard/wsettings.c | 250 +- winboard/wsockerr.c | 2 +- winboard/wsockerr.h | 2 +- xaw/.dirstamp | 0 xaw/xboard.c | 2600 +++++++++++++ xaw/xboard.h | 176 + xaw/xengineoutput.c | 285 ++ xaw/xgamelist.c | 117 + xaw/xgamelist.h | 31 + xaw/xhistory.c | 111 + xaw/xhistory.h | 30 + xaw/xoptions.c | 1365 +++++++ xboard-config.desktop | 52 + xboard.c | 8845 ------------------------------------------- xboard.conf.in | 19 +- xboard.h | 177 - xboard.texi | 289 +- xboard.xml | 6 + xboard2.h | 9 + xedittags.c | 128 - xedittags.h | 31 - xengineoutput.c | 617 --- xevalgraph.c | 443 --- xevalgraph.h | 29 - xgamelist.c | 930 ----- xgamelist.h | 35 - xhistory.c | 168 - xhistory.h | 32 - xoptions.c | 1912 ---------- zic2xpm.c | 2 +- zic2xpm.man | 2 +- zippy.c | 12 +- zippy.h | 2 +- 1574 files changed, 63046 insertions(+), 113777 deletions(-) delete mode 100644 bitmaps/README.bitmaps delete mode 100644 bitmaps/a33o.bm delete mode 100644 bitmaps/a33s.bm delete mode 100644 bitmaps/a37o.bm delete mode 100644 bitmaps/a37s.bm delete mode 100644 bitmaps/a40o.bm delete mode 100644 bitmaps/a40s.bm delete mode 100644 bitmaps/a45o.bm delete mode 100644 bitmaps/a45s.bm delete mode 100644 bitmaps/a49o.bm delete mode 100644 bitmaps/a49s.bm delete mode 100644 bitmaps/a54o.bm delete mode 100644 bitmaps/a54s.bm delete mode 100644 bitmaps/a58o.bm delete mode 100644 bitmaps/a58s.bm delete mode 100644 bitmaps/a64o.bm delete mode 100644 bitmaps/a64s.bm delete mode 100644 bitmaps/a72o.bm delete mode 100644 bitmaps/a72s.bm delete mode 100644 bitmaps/as45o.bm delete mode 100644 bitmaps/as45s.bm delete mode 100644 bitmaps/b108o.bm delete mode 100644 bitmaps/b108s.bm delete mode 100644 bitmaps/b116o.bm delete mode 100644 bitmaps/b116s.bm delete mode 100644 bitmaps/b129o.bm delete mode 100644 bitmaps/b129s.bm delete mode 100644 bitmaps/b21o.bm delete mode 100644 bitmaps/b21s.bm delete mode 100644 bitmaps/b25o.bm delete mode 100644 bitmaps/b25s.bm delete mode 100644 bitmaps/b29o.bm delete mode 100644 bitmaps/b29s.bm delete mode 100644 bitmaps/b33o.bm delete mode 100644 bitmaps/b33s.bm delete mode 100644 bitmaps/b37o.bm delete mode 100644 bitmaps/b37s.bm delete mode 100644 bitmaps/b40o.bm delete mode 100644 bitmaps/b40s.bm delete mode 100644 bitmaps/b45o.bm delete mode 100644 bitmaps/b45s.bm delete mode 100644 bitmaps/b49o.bm delete mode 100644 bitmaps/b49s.bm delete mode 100644 bitmaps/b54o.bm delete mode 100644 bitmaps/b54s.bm delete mode 100644 bitmaps/b58o.bm delete mode 100644 bitmaps/b58s.bm delete mode 100644 bitmaps/b64o.bm delete mode 100644 bitmaps/b64s.bm delete mode 100644 bitmaps/b72o.bm delete mode 100644 bitmaps/b72s.bm delete mode 100644 bitmaps/b80o.bm delete mode 100644 bitmaps/b80s.bm delete mode 100644 bitmaps/b87o.bm delete mode 100644 bitmaps/b87s.bm delete mode 100644 bitmaps/b95o.bm delete mode 100644 bitmaps/b95s.bm delete mode 100644 bitmaps/bitmaps.h delete mode 100644 bitmaps/c33o.bm delete mode 100644 bitmaps/c33s.bm delete mode 100644 bitmaps/c37o.bm delete mode 100644 bitmaps/c37s.bm delete mode 100644 bitmaps/c40o.bm delete mode 100644 bitmaps/c40s.bm delete mode 100644 bitmaps/c45o.bm delete mode 100644 bitmaps/c45s.bm delete mode 100644 bitmaps/c49o.bm delete mode 100644 bitmaps/c49s.bm delete mode 100644 bitmaps/c54o.bm delete mode 100644 bitmaps/c54s.bm delete mode 100644 bitmaps/c58o.bm delete mode 100644 bitmaps/c58s.bm delete mode 100644 bitmaps/c64o.bm delete mode 100644 bitmaps/c64s.bm delete mode 100644 bitmaps/c72o.bm delete mode 100644 bitmaps/c72s.bm delete mode 100644 bitmaps/d33o.bm delete mode 100644 bitmaps/d33s.bm delete mode 100644 bitmaps/d37o.bm delete mode 100644 bitmaps/d37s.bm delete mode 100644 bitmaps/d40o.bm delete mode 100644 bitmaps/d40s.bm delete mode 100644 bitmaps/d45o.bm delete mode 100644 bitmaps/d45s.bm delete mode 100644 bitmaps/d49o.bm delete mode 100644 bitmaps/d49s.bm delete mode 100644 bitmaps/d54o.bm delete mode 100644 bitmaps/d54s.bm delete mode 100644 bitmaps/d58o.bm delete mode 100644 bitmaps/d58s.bm delete mode 100644 bitmaps/d64o.bm delete mode 100644 bitmaps/d64s.bm delete mode 100644 bitmaps/d72o.bm delete mode 100644 bitmaps/d72s.bm delete mode 100644 bitmaps/dopkbm.sh delete mode 100644 bitmaps/dopkbm1.sh delete mode 100644 bitmaps/e33o.bm delete mode 100644 bitmaps/e33s.bm delete mode 100644 bitmaps/e49o.bm delete mode 100644 bitmaps/e49s.bm delete mode 100644 bitmaps/e72o.bm delete mode 100644 bitmaps/e72s.bm delete mode 100644 bitmaps/f33o.bm delete mode 100644 bitmaps/f33s.bm delete mode 100644 bitmaps/f49o.bm delete mode 100644 bitmaps/f49s.bm delete mode 100644 bitmaps/f72o.bm delete mode 100644 bitmaps/f72s.bm delete mode 100644 bitmaps/g33o.bm delete mode 100644 bitmaps/g33s.bm delete mode 100644 bitmaps/g49o.bm delete mode 100644 bitmaps/g49s.bm delete mode 100644 bitmaps/g72o.bm delete mode 100644 bitmaps/g72s.bm delete mode 100644 bitmaps/h33o.bm delete mode 100644 bitmaps/h33s.bm delete mode 100644 bitmaps/h49o.bm delete mode 100644 bitmaps/h49s.bm delete mode 100644 bitmaps/h72o.bm delete mode 100644 bitmaps/h72s.bm delete mode 100644 bitmaps/i33o.bm delete mode 100644 bitmaps/i33s.bm delete mode 100644 bitmaps/i49o.bm delete mode 100644 bitmaps/i49s.bm delete mode 100644 bitmaps/i72o.bm delete mode 100644 bitmaps/i72s.bm delete mode 100644 bitmaps/icon_b.bm delete mode 100644 bitmaps/icon_outline.bm delete mode 100644 bitmaps/j33o.bm delete mode 100644 bitmaps/j33s.bm delete mode 100644 bitmaps/j49o.bm delete mode 100644 bitmaps/j49s.bm delete mode 100644 bitmaps/j72o.bm delete mode 100644 bitmaps/j72s.bm delete mode 100644 bitmaps/k108o.bm delete mode 100644 bitmaps/k108s.bm delete mode 100644 bitmaps/k116o.bm delete mode 100644 bitmaps/k116s.bm delete mode 100644 bitmaps/k129o.bm delete mode 100644 bitmaps/k129s.bm delete mode 100644 bitmaps/k21o.bm delete mode 100644 bitmaps/k21s.bm delete mode 100644 bitmaps/k25o.bm delete mode 100644 bitmaps/k25s.bm delete mode 100644 bitmaps/k29o.bm delete mode 100644 bitmaps/k29s.bm delete mode 100644 bitmaps/k33o.bm delete mode 100644 bitmaps/k33s.bm delete mode 100644 bitmaps/k37o.bm delete mode 100644 bitmaps/k37s.bm delete mode 100644 bitmaps/k40o.bm delete mode 100644 bitmaps/k40s.bm delete mode 100644 bitmaps/k45o.bm delete mode 100644 bitmaps/k45s.bm delete mode 100644 bitmaps/k49o.bm delete mode 100644 bitmaps/k49s.bm delete mode 100644 bitmaps/k54o.bm delete mode 100644 bitmaps/k54s.bm delete mode 100644 bitmaps/k58o.bm delete mode 100644 bitmaps/k58s.bm delete mode 100644 bitmaps/k64o.bm delete mode 100644 bitmaps/k64s.bm delete mode 100644 bitmaps/k72o.bm delete mode 100644 bitmaps/k72s.bm delete mode 100644 bitmaps/k80o.bm delete mode 100644 bitmaps/k80s.bm delete mode 100644 bitmaps/k87o.bm delete mode 100644 bitmaps/k87s.bm delete mode 100644 bitmaps/k95o.bm delete mode 100644 bitmaps/k95s.bm delete mode 100644 bitmaps/l33o.bm delete mode 100644 bitmaps/l33s.bm delete mode 100644 bitmaps/l37o.bm delete mode 100644 bitmaps/l37s.bm delete mode 100644 bitmaps/l40o.bm delete mode 100644 bitmaps/l40s.bm delete mode 100644 bitmaps/l45o.bm delete mode 100644 bitmaps/l45s.bm delete mode 100644 bitmaps/l49o.bm delete mode 100644 bitmaps/l49s.bm delete mode 100644 bitmaps/l54o.bm delete mode 100644 bitmaps/l54s.bm delete mode 100644 bitmaps/l58o.bm delete mode 100644 bitmaps/l58s.bm delete mode 100644 bitmaps/l64o.bm delete mode 100644 bitmaps/l64s.bm delete mode 100644 bitmaps/l72o.bm delete mode 100644 bitmaps/l72s.bm delete mode 100644 bitmaps/m33o.bm delete mode 100644 bitmaps/m33s.bm delete mode 100644 bitmaps/m49o.bm delete mode 100644 bitmaps/m49s.bm delete mode 100644 bitmaps/m72o.bm delete mode 100644 bitmaps/m72s.bm delete mode 100644 bitmaps/n108o.bm delete mode 100644 bitmaps/n108s.bm delete mode 100644 bitmaps/n116o.bm delete mode 100644 bitmaps/n116s.bm delete mode 100644 bitmaps/n129o.bm delete mode 100644 bitmaps/n129s.bm delete mode 100644 bitmaps/n21o.bm delete mode 100644 bitmaps/n21s.bm delete mode 100644 bitmaps/n25o.bm delete mode 100644 bitmaps/n25s.bm delete mode 100644 bitmaps/n29o.bm delete mode 100644 bitmaps/n29s.bm delete mode 100644 bitmaps/n33o.bm delete mode 100644 bitmaps/n33s.bm delete mode 100644 bitmaps/n37o.bm delete mode 100644 bitmaps/n37s.bm delete mode 100644 bitmaps/n40o.bm delete mode 100644 bitmaps/n40s.bm delete mode 100644 bitmaps/n45o.bm delete mode 100644 bitmaps/n45s.bm delete mode 100644 bitmaps/n49o.bm delete mode 100644 bitmaps/n49s.bm delete mode 100644 bitmaps/n54o.bm delete mode 100644 bitmaps/n54s.bm delete mode 100644 bitmaps/n58o.bm delete mode 100644 bitmaps/n58s.bm delete mode 100644 bitmaps/n64o.bm delete mode 100644 bitmaps/n64s.bm delete mode 100644 bitmaps/n72o.bm delete mode 100644 bitmaps/n72s.bm delete mode 100644 bitmaps/n80o.bm delete mode 100644 bitmaps/n80s.bm delete mode 100644 bitmaps/n87o.bm delete mode 100644 bitmaps/n87s.bm delete mode 100644 bitmaps/n95o.bm delete mode 100644 bitmaps/n95s.bm delete mode 100644 bitmaps/o33o.bm delete mode 100644 bitmaps/o33s.bm delete mode 100644 bitmaps/o49o.bm delete mode 100644 bitmaps/o49s.bm delete mode 100644 bitmaps/o72o.bm delete mode 100644 bitmaps/o72s.bm delete mode 100644 bitmaps/p108o.bm delete mode 100644 bitmaps/p108s.bm delete mode 100644 bitmaps/p116o.bm delete mode 100644 bitmaps/p116s.bm delete mode 100644 bitmaps/p129o.bm delete mode 100644 bitmaps/p129s.bm delete mode 100644 bitmaps/p21o.bm delete mode 100644 bitmaps/p21s.bm delete mode 100644 bitmaps/p25o.bm delete mode 100644 bitmaps/p25s.bm delete mode 100644 bitmaps/p29o.bm delete mode 100644 bitmaps/p29s.bm delete mode 100644 bitmaps/p33o.bm delete mode 100644 bitmaps/p33s.bm delete mode 100644 bitmaps/p37o.bm delete mode 100644 bitmaps/p37s.bm delete mode 100644 bitmaps/p40o.bm delete mode 100644 bitmaps/p40s.bm delete mode 100644 bitmaps/p45o.bm delete mode 100644 bitmaps/p45s.bm delete mode 100644 bitmaps/p49o.bm delete mode 100644 bitmaps/p49s.bm delete mode 100644 bitmaps/p54o.bm delete mode 100644 bitmaps/p54s.bm delete mode 100644 bitmaps/p58o.bm delete mode 100644 bitmaps/p58s.bm delete mode 100644 bitmaps/p64o.bm delete mode 100644 bitmaps/p64s.bm delete mode 100644 bitmaps/p72o.bm delete mode 100644 bitmaps/p72s.bm delete mode 100644 bitmaps/p80o.bm delete mode 100644 bitmaps/p80s.bm delete mode 100644 bitmaps/p87o.bm delete mode 100644 bitmaps/p87s.bm delete mode 100644 bitmaps/p95o.bm delete mode 100644 bitmaps/p95s.bm delete mode 100644 bitmaps/q108o.bm delete mode 100644 bitmaps/q108s.bm delete mode 100644 bitmaps/q116o.bm delete mode 100644 bitmaps/q116s.bm delete mode 100644 bitmaps/q129o.bm delete mode 100644 bitmaps/q129s.bm delete mode 100644 bitmaps/q21o.bm delete mode 100644 bitmaps/q21s.bm delete mode 100644 bitmaps/q25o.bm delete mode 100644 bitmaps/q25s.bm delete mode 100644 bitmaps/q29o.bm delete mode 100644 bitmaps/q29s.bm delete mode 100644 bitmaps/q33o.bm delete mode 100644 bitmaps/q33s.bm delete mode 100644 bitmaps/q37o.bm delete mode 100644 bitmaps/q37s.bm delete mode 100644 bitmaps/q40o.bm delete mode 100644 bitmaps/q40s.bm delete mode 100644 bitmaps/q45o.bm delete mode 100644 bitmaps/q45s.bm delete mode 100644 bitmaps/q49o.bm delete mode 100644 bitmaps/q49s.bm delete mode 100644 bitmaps/q54o.bm delete mode 100644 bitmaps/q54s.bm delete mode 100644 bitmaps/q58o.bm delete mode 100644 bitmaps/q58s.bm delete mode 100644 bitmaps/q64o.bm delete mode 100644 bitmaps/q64s.bm delete mode 100644 bitmaps/q72o.bm delete mode 100644 bitmaps/q72s.bm delete mode 100644 bitmaps/q80o.bm delete mode 100644 bitmaps/q80s.bm delete mode 100644 bitmaps/q87o.bm delete mode 100644 bitmaps/q87s.bm delete mode 100644 bitmaps/q95o.bm delete mode 100644 bitmaps/q95s.bm delete mode 100644 bitmaps/r108o.bm delete mode 100644 bitmaps/r108s.bm delete mode 100644 bitmaps/r116o.bm delete mode 100644 bitmaps/r116s.bm delete mode 100644 bitmaps/r129o.bm delete mode 100644 bitmaps/r129s.bm delete mode 100644 bitmaps/r21o.bm delete mode 100644 bitmaps/r21s.bm delete mode 100644 bitmaps/r25o.bm delete mode 100644 bitmaps/r25s.bm delete mode 100644 bitmaps/r29o.bm delete mode 100644 bitmaps/r29s.bm delete mode 100644 bitmaps/r33o.bm delete mode 100644 bitmaps/r33s.bm delete mode 100644 bitmaps/r37o.bm delete mode 100644 bitmaps/r37s.bm delete mode 100644 bitmaps/r40o.bm delete mode 100644 bitmaps/r40s.bm delete mode 100644 bitmaps/r45o.bm delete mode 100644 bitmaps/r45s.bm delete mode 100644 bitmaps/r49o.bm delete mode 100644 bitmaps/r49s.bm delete mode 100644 bitmaps/r54o.bm delete mode 100644 bitmaps/r54s.bm delete mode 100644 bitmaps/r58o.bm delete mode 100644 bitmaps/r58s.bm delete mode 100644 bitmaps/r64o.bm delete mode 100644 bitmaps/r64s.bm delete mode 100644 bitmaps/r72o.bm delete mode 100644 bitmaps/r72s.bm delete mode 100644 bitmaps/r80o.bm delete mode 100644 bitmaps/r80s.bm delete mode 100644 bitmaps/r87o.bm delete mode 100644 bitmaps/r87s.bm delete mode 100644 bitmaps/r95o.bm delete mode 100644 bitmaps/r95s.bm delete mode 100644 bitmaps/s49o.bm delete mode 100644 bitmaps/s49s.bm delete mode 100644 bitmaps/s72o.bm delete mode 100644 bitmaps/s72s.bm delete mode 100644 bitmaps/test.c delete mode 100644 bitmaps/u49o.bm delete mode 100644 bitmaps/u49s.bm delete mode 100644 bitmaps/u72o.bm delete mode 100644 bitmaps/u72s.bm delete mode 100644 bitmaps/v33o.bm delete mode 100644 bitmaps/v33s.bm delete mode 100644 bitmaps/v49o.bm delete mode 100644 bitmaps/v49s.bm delete mode 100644 bitmaps/v72o.bm delete mode 100644 bitmaps/v72s.bm delete mode 100644 bitmaps/w33o.bm delete mode 100644 bitmaps/w33s.bm delete mode 100644 bitmaps/w49o.bm delete mode 100644 bitmaps/w49s.bm delete mode 100644 bitmaps/w72o.bm delete mode 100644 bitmaps/w72s.bm delete mode 100644 bitmaps/wl49o.bm delete mode 100644 bitmaps/wl49s.bm delete mode 100644 bitmaps/wl72o.bm delete mode 100644 bitmaps/wl72s.bm delete mode 100644 bitmaps/wn49o.bm delete mode 100644 bitmaps/wn49s.bm delete mode 100644 bitmaps/wn72o.bm delete mode 100644 bitmaps/wn72s.bm delete mode 100644 bitmaps/wp49o.bm delete mode 100644 bitmaps/wp49s.bm delete mode 100644 bitmaps/wp72o.bm delete mode 100644 bitmaps/wp72s.bm delete mode 100644 bitmaps/ws49o.bm delete mode 100644 bitmaps/ws49s.bm delete mode 100644 bitmaps/ws72o.bm delete mode 100644 bitmaps/ws72s.bm create mode 100644 board.c create mode 100644 board.h create mode 100644 dialogs.c create mode 100644 dialogs.h create mode 100644 doc-maint/coding-standards.org create mode 100755 doc-maint/gendocs.sh create mode 100644 doc-maint/make-xboard-release create mode 100644 doc-maint/release.org create mode 100644 doc-maint/web-pages.org create mode 100644 draw.c create mode 100644 draw.h delete mode 100644 filebrowser/README delete mode 100644 filebrowser/dir.c delete mode 100644 filebrowser/draw.c delete mode 100644 filebrowser/path.c delete mode 100644 filebrowser/selfile.c delete mode 100644 filebrowser/selfile.h delete mode 100644 filebrowser/xstat.h create mode 100644 gtk/.dirstamp create mode 100644 gtk/xboard.c create mode 100644 gtk/xboard.h create mode 100644 gtk/xengineoutput.c create mode 100644 gtk/xoptions.c create mode 100644 gtk/xtimer.c create mode 100644 menus.c create mode 100644 menus.h create mode 100644 nengineoutput.c create mode 100644 nevalgraph.c create mode 100644 ngamelist.c create mode 100644 nhistory.c delete mode 100644 pixmaps/README.pixmaps delete mode 100644 pixmaps/add33.xpm delete mode 100644 pixmaps/add37.xpm delete mode 100644 pixmaps/add40.xpm delete mode 100644 pixmaps/add45.xpm delete mode 100644 pixmaps/add49.xpm delete mode 100644 pixmaps/add54.xpm delete mode 100644 pixmaps/add58.xpm delete mode 100644 pixmaps/add64.xpm delete mode 100644 pixmaps/add72.xpm delete mode 100644 pixmaps/adl33.xpm delete mode 100644 pixmaps/adl37.xpm delete mode 100644 pixmaps/adl40.xpm delete mode 100644 pixmaps/adl45.xpm delete mode 100644 pixmaps/adl49.xpm delete mode 100644 pixmaps/adl54.xpm delete mode 100644 pixmaps/adl58.xpm delete mode 100644 pixmaps/adl64.xpm delete mode 100644 pixmaps/adl72.xpm delete mode 100644 pixmaps/ald33.xpm delete mode 100644 pixmaps/ald37.xpm delete mode 100644 pixmaps/ald40.xpm delete mode 100644 pixmaps/ald45.xpm delete mode 100644 pixmaps/ald49.xpm delete mode 100644 pixmaps/ald54.xpm delete mode 100644 pixmaps/ald58.xpm delete mode 100644 pixmaps/ald64.xpm delete mode 100644 pixmaps/ald72.xpm delete mode 100644 pixmaps/all33.xpm delete mode 100644 pixmaps/all37.xpm delete mode 100644 pixmaps/all40.xpm delete mode 100644 pixmaps/all45.xpm delete mode 100644 pixmaps/all49.xpm delete mode 100644 pixmaps/all54.xpm delete mode 100644 pixmaps/all58.xpm delete mode 100644 pixmaps/all64.xpm delete mode 100644 pixmaps/all72.xpm delete mode 100644 pixmaps/asdd33.xpm delete mode 100644 pixmaps/asdd49.xpm delete mode 100644 pixmaps/asdd72.xpm delete mode 100644 pixmaps/asdl33.xpm delete mode 100644 pixmaps/asdl49.xpm delete mode 100644 pixmaps/asdl72.xpm delete mode 100644 pixmaps/asld33.xpm delete mode 100644 pixmaps/asld49.xpm delete mode 100644 pixmaps/asld72.xpm delete mode 100644 pixmaps/asll33.xpm delete mode 100644 pixmaps/asll49.xpm delete mode 100644 pixmaps/asll72.xpm delete mode 100644 pixmaps/bdd108.xpm delete mode 100644 pixmaps/bdd116.xpm delete mode 100644 pixmaps/bdd129.xpm delete mode 100644 pixmaps/bdd21.xpm delete mode 100644 pixmaps/bdd25.xpm delete mode 100644 pixmaps/bdd29.xpm delete mode 100644 pixmaps/bdd33.xpm delete mode 100644 pixmaps/bdd37.xpm delete mode 100644 pixmaps/bdd40.xpm delete mode 100644 pixmaps/bdd45.xpm delete mode 100644 pixmaps/bdd49.xpm delete mode 100644 pixmaps/bdd54.xpm delete mode 100644 pixmaps/bdd58.xpm delete mode 100644 pixmaps/bdd64.xpm delete mode 100644 pixmaps/bdd72.xpm delete mode 100644 pixmaps/bdd80.xpm delete mode 100644 pixmaps/bdd87.xpm delete mode 100644 pixmaps/bdd95.xpm delete mode 100644 pixmaps/bdl108.xpm delete mode 100644 pixmaps/bdl116.xpm delete mode 100644 pixmaps/bdl129.xpm delete mode 100644 pixmaps/bdl21.xpm delete mode 100644 pixmaps/bdl25.xpm delete mode 100644 pixmaps/bdl29.xpm delete mode 100644 pixmaps/bdl33.xpm delete mode 100644 pixmaps/bdl37.xpm delete mode 100644 pixmaps/bdl40.xpm delete mode 100644 pixmaps/bdl45.xpm delete mode 100644 pixmaps/bdl49.xpm delete mode 100644 pixmaps/bdl54.xpm delete mode 100644 pixmaps/bdl58.xpm delete mode 100644 pixmaps/bdl64.xpm delete mode 100644 pixmaps/bdl72.xpm delete mode 100644 pixmaps/bdl80.xpm delete mode 100644 pixmaps/bdl87.xpm delete mode 100644 pixmaps/bdl95.xpm delete mode 100644 pixmaps/bld108.xpm delete mode 100644 pixmaps/bld116.xpm delete mode 100644 pixmaps/bld129.xpm delete mode 100644 pixmaps/bld21.xpm delete mode 100644 pixmaps/bld25.xpm delete mode 100644 pixmaps/bld29.xpm delete mode 100644 pixmaps/bld33.xpm delete mode 100644 pixmaps/bld37.xpm delete mode 100644 pixmaps/bld40.xpm delete mode 100644 pixmaps/bld45.xpm delete mode 100644 pixmaps/bld49.xpm delete mode 100644 pixmaps/bld54.xpm delete mode 100644 pixmaps/bld58.xpm delete mode 100644 pixmaps/bld64.xpm delete mode 100644 pixmaps/bld72.xpm delete mode 100644 pixmaps/bld80.xpm delete mode 100644 pixmaps/bld87.xpm delete mode 100644 pixmaps/bld95.xpm delete mode 100644 pixmaps/bll108.xpm delete mode 100644 pixmaps/bll116.xpm delete mode 100644 pixmaps/bll129.xpm delete mode 100644 pixmaps/bll21.xpm delete mode 100644 pixmaps/bll25.xpm delete mode 100644 pixmaps/bll29.xpm delete mode 100644 pixmaps/bll33.xpm delete mode 100644 pixmaps/bll37.xpm delete mode 100644 pixmaps/bll40.xpm delete mode 100644 pixmaps/bll45.xpm delete mode 100644 pixmaps/bll49.xpm delete mode 100644 pixmaps/bll54.xpm delete mode 100644 pixmaps/bll58.xpm delete mode 100644 pixmaps/bll64.xpm delete mode 100644 pixmaps/bll72.xpm delete mode 100644 pixmaps/bll80.xpm delete mode 100644 pixmaps/bll87.xpm delete mode 100644 pixmaps/bll95.xpm delete mode 100644 pixmaps/cdd33.xpm delete mode 100644 pixmaps/cdd37.xpm delete mode 100644 pixmaps/cdd40.xpm delete mode 100644 pixmaps/cdd45.xpm delete mode 100644 pixmaps/cdd49.xpm delete mode 100644 pixmaps/cdd54.xpm delete mode 100644 pixmaps/cdd58.xpm delete mode 100644 pixmaps/cdd64.xpm delete mode 100644 pixmaps/cdd72.xpm delete mode 100644 pixmaps/cdl33.xpm delete mode 100644 pixmaps/cdl37.xpm delete mode 100644 pixmaps/cdl40.xpm delete mode 100644 pixmaps/cdl45.xpm delete mode 100644 pixmaps/cdl49.xpm delete mode 100644 pixmaps/cdl54.xpm delete mode 100644 pixmaps/cdl58.xpm delete mode 100644 pixmaps/cdl64.xpm delete mode 100644 pixmaps/cdl72.xpm delete mode 100644 pixmaps/cld33.xpm delete mode 100644 pixmaps/cld37.xpm delete mode 100644 pixmaps/cld40.xpm delete mode 100644 pixmaps/cld45.xpm delete mode 100644 pixmaps/cld49.xpm delete mode 100644 pixmaps/cld54.xpm delete mode 100644 pixmaps/cld58.xpm delete mode 100644 pixmaps/cld64.xpm delete mode 100644 pixmaps/cld72.xpm delete mode 100644 pixmaps/cll33.xpm delete mode 100644 pixmaps/cll37.xpm delete mode 100644 pixmaps/cll40.xpm delete mode 100644 pixmaps/cll45.xpm delete mode 100644 pixmaps/cll49.xpm delete mode 100644 pixmaps/cll54.xpm delete mode 100644 pixmaps/cll58.xpm delete mode 100644 pixmaps/cll64.xpm delete mode 100644 pixmaps/cll72.xpm delete mode 100644 pixmaps/convbm delete mode 100644 pixmaps/convbm.sed delete mode 100644 pixmaps/convbm2.sed delete mode 100644 pixmaps/convert.c delete mode 100644 pixmaps/cvdd33.xpm delete mode 100644 pixmaps/cvdd37.xpm delete mode 100644 pixmaps/cvdd40.xpm delete mode 100644 pixmaps/cvdd45.xpm delete mode 100644 pixmaps/cvdd49.xpm delete mode 100644 pixmaps/cvdd54.xpm delete mode 100644 pixmaps/cvdd58.xpm delete mode 100644 pixmaps/cvdd64.xpm delete mode 100644 pixmaps/cvdd72.xpm delete mode 100644 pixmaps/cvdl33.xpm delete mode 100644 pixmaps/cvdl37.xpm delete mode 100644 pixmaps/cvdl40.xpm delete mode 100644 pixmaps/cvdl45.xpm delete mode 100644 pixmaps/cvdl49.xpm delete mode 100644 pixmaps/cvdl54.xpm delete mode 100644 pixmaps/cvdl58.xpm delete mode 100644 pixmaps/cvdl64.xpm delete mode 100644 pixmaps/cvdl72.xpm delete mode 100644 pixmaps/cvld33.xpm delete mode 100644 pixmaps/cvld37.xpm delete mode 100644 pixmaps/cvld40.xpm delete mode 100644 pixmaps/cvld45.xpm delete mode 100644 pixmaps/cvld49.xpm delete mode 100644 pixmaps/cvld54.xpm delete mode 100644 pixmaps/cvld58.xpm delete mode 100644 pixmaps/cvld64.xpm delete mode 100644 pixmaps/cvld72.xpm delete mode 100644 pixmaps/cvll33.xpm delete mode 100644 pixmaps/cvll37.xpm delete mode 100644 pixmaps/cvll40.xpm delete mode 100644 pixmaps/cvll45.xpm delete mode 100644 pixmaps/cvll49.xpm delete mode 100644 pixmaps/cvll54.xpm delete mode 100644 pixmaps/cvll58.xpm delete mode 100644 pixmaps/cvll64.xpm delete mode 100644 pixmaps/cvll72.xpm delete mode 100644 pixmaps/dkdd33.xpm delete mode 100644 pixmaps/dkdd49.xpm delete mode 100644 pixmaps/dkdd72.xpm delete mode 100644 pixmaps/dkdl33.xpm delete mode 100644 pixmaps/dkdl49.xpm delete mode 100644 pixmaps/dkdl72.xpm delete mode 100644 pixmaps/dkld33.xpm delete mode 100644 pixmaps/dkld49.xpm delete mode 100644 pixmaps/dkld72.xpm delete mode 100644 pixmaps/dkll33.xpm delete mode 100644 pixmaps/dkll49.xpm delete mode 100644 pixmaps/dkll72.xpm delete mode 100644 pixmaps/edd33.xpm delete mode 100644 pixmaps/edd49.xpm delete mode 100644 pixmaps/edd72.xpm delete mode 100644 pixmaps/edl33.xpm delete mode 100644 pixmaps/edl49.xpm delete mode 100644 pixmaps/edl72.xpm delete mode 100644 pixmaps/eld33.xpm delete mode 100644 pixmaps/eld49.xpm delete mode 100644 pixmaps/eld72.xpm delete mode 100644 pixmaps/ell33.xpm delete mode 100644 pixmaps/ell49.xpm delete mode 100644 pixmaps/ell72.xpm delete mode 100644 pixmaps/fdd33.xpm delete mode 100644 pixmaps/fdd49.xpm delete mode 100644 pixmaps/fdd72.xpm delete mode 100644 pixmaps/fdl33.xpm delete mode 100644 pixmaps/fdl49.xpm delete mode 100644 pixmaps/fdl72.xpm delete mode 100644 pixmaps/fld33.xpm delete mode 100644 pixmaps/fld49.xpm delete mode 100644 pixmaps/fld72.xpm delete mode 100644 pixmaps/fll33.xpm delete mode 100644 pixmaps/fll49.xpm delete mode 100644 pixmaps/fll72.xpm delete mode 100644 pixmaps/gdd33.xpm delete mode 100644 pixmaps/gdd49.xpm delete mode 100644 pixmaps/gdd72.xpm delete mode 100644 pixmaps/gdl33.xpm delete mode 100644 pixmaps/gdl49.xpm delete mode 100644 pixmaps/gdl72.xpm delete mode 100644 pixmaps/gld33.xpm delete mode 100644 pixmaps/gld49.xpm delete mode 100644 pixmaps/gld72.xpm delete mode 100644 pixmaps/gll33.xpm delete mode 100644 pixmaps/gll49.xpm delete mode 100644 pixmaps/gll72.xpm delete mode 100644 pixmaps/hdd33.xpm delete mode 100644 pixmaps/hdd49.xpm delete mode 100644 pixmaps/hdd72.xpm delete mode 100644 pixmaps/hdl33.xpm delete mode 100644 pixmaps/hdl49.xpm delete mode 100644 pixmaps/hdl72.xpm delete mode 100644 pixmaps/hld33.xpm delete mode 100644 pixmaps/hld49.xpm delete mode 100644 pixmaps/hld72.xpm delete mode 100644 pixmaps/hll33.xpm delete mode 100644 pixmaps/hll49.xpm delete mode 100644 pixmaps/hll72.xpm create mode 100644 pixmaps/ini32.xpm create mode 100644 pixmaps/ini48.xpm delete mode 100644 pixmaps/kdd108.xpm delete mode 100644 pixmaps/kdd116.xpm delete mode 100644 pixmaps/kdd129.xpm delete mode 100644 pixmaps/kdd21.xpm delete mode 100644 pixmaps/kdd25.xpm delete mode 100644 pixmaps/kdd29.xpm delete mode 100644 pixmaps/kdd33.xpm delete mode 100644 pixmaps/kdd37.xpm delete mode 100644 pixmaps/kdd40.xpm delete mode 100644 pixmaps/kdd45.xpm delete mode 100644 pixmaps/kdd49.xpm delete mode 100644 pixmaps/kdd54.xpm delete mode 100644 pixmaps/kdd58.xpm delete mode 100644 pixmaps/kdd64.xpm delete mode 100644 pixmaps/kdd72.xpm delete mode 100644 pixmaps/kdd80.xpm delete mode 100644 pixmaps/kdd87.xpm delete mode 100644 pixmaps/kdd95.xpm delete mode 100644 pixmaps/kdl108.xpm delete mode 100644 pixmaps/kdl116.xpm delete mode 100644 pixmaps/kdl129.xpm delete mode 100644 pixmaps/kdl21.xpm delete mode 100644 pixmaps/kdl25.xpm delete mode 100644 pixmaps/kdl29.xpm delete mode 100644 pixmaps/kdl33.xpm delete mode 100644 pixmaps/kdl37.xpm delete mode 100644 pixmaps/kdl40.xpm delete mode 100644 pixmaps/kdl45.xpm delete mode 100644 pixmaps/kdl49.xpm delete mode 100644 pixmaps/kdl54.xpm delete mode 100644 pixmaps/kdl58.xpm delete mode 100644 pixmaps/kdl64.xpm delete mode 100644 pixmaps/kdl72.xpm delete mode 100644 pixmaps/kdl80.xpm delete mode 100644 pixmaps/kdl87.xpm delete mode 100644 pixmaps/kdl95.xpm delete mode 100644 pixmaps/kld108.xpm delete mode 100644 pixmaps/kld116.xpm delete mode 100644 pixmaps/kld129.xpm delete mode 100644 pixmaps/kld21.xpm delete mode 100644 pixmaps/kld25.xpm delete mode 100644 pixmaps/kld29.xpm delete mode 100644 pixmaps/kld33.xpm delete mode 100644 pixmaps/kld37.xpm delete mode 100644 pixmaps/kld40.xpm delete mode 100644 pixmaps/kld45.xpm delete mode 100644 pixmaps/kld49.xpm delete mode 100644 pixmaps/kld54.xpm delete mode 100644 pixmaps/kld58.xpm delete mode 100644 pixmaps/kld64.xpm delete mode 100644 pixmaps/kld72.xpm delete mode 100644 pixmaps/kld80.xpm delete mode 100644 pixmaps/kld87.xpm delete mode 100644 pixmaps/kld95.xpm delete mode 100644 pixmaps/kll108.xpm delete mode 100644 pixmaps/kll116.xpm delete mode 100644 pixmaps/kll129.xpm delete mode 100644 pixmaps/kll21.xpm delete mode 100644 pixmaps/kll25.xpm delete mode 100644 pixmaps/kll29.xpm delete mode 100644 pixmaps/kll33.xpm delete mode 100644 pixmaps/kll37.xpm delete mode 100644 pixmaps/kll40.xpm delete mode 100644 pixmaps/kll45.xpm delete mode 100644 pixmaps/kll49.xpm delete mode 100644 pixmaps/kll54.xpm delete mode 100644 pixmaps/kll58.xpm delete mode 100644 pixmaps/kll64.xpm delete mode 100644 pixmaps/kll72.xpm delete mode 100644 pixmaps/kll80.xpm delete mode 100644 pixmaps/kll87.xpm delete mode 100644 pixmaps/kll95.xpm delete mode 100644 pixmaps/ldd33.xpm delete mode 100644 pixmaps/ldd37.xpm delete mode 100644 pixmaps/ldd40.xpm delete mode 100644 pixmaps/ldd45.xpm delete mode 100644 pixmaps/ldd49.xpm delete mode 100644 pixmaps/ldd54.xpm delete mode 100644 pixmaps/ldd58.xpm delete mode 100644 pixmaps/ldd64.xpm delete mode 100644 pixmaps/ldd72.xpm delete mode 100644 pixmaps/ldl33.xpm delete mode 100644 pixmaps/ldl37.xpm delete mode 100644 pixmaps/ldl40.xpm delete mode 100644 pixmaps/ldl45.xpm delete mode 100644 pixmaps/ldl49.xpm delete mode 100644 pixmaps/ldl54.xpm delete mode 100644 pixmaps/ldl58.xpm delete mode 100644 pixmaps/ldl64.xpm delete mode 100644 pixmaps/ldl72.xpm delete mode 100644 pixmaps/lld33.xpm delete mode 100644 pixmaps/lld37.xpm delete mode 100644 pixmaps/lld40.xpm delete mode 100644 pixmaps/lld45.xpm delete mode 100644 pixmaps/lld49.xpm delete mode 100644 pixmaps/lld54.xpm delete mode 100644 pixmaps/lld58.xpm delete mode 100644 pixmaps/lld64.xpm delete mode 100644 pixmaps/lld72.xpm delete mode 100644 pixmaps/lll33.xpm delete mode 100644 pixmaps/lll37.xpm delete mode 100644 pixmaps/lll40.xpm delete mode 100644 pixmaps/lll45.xpm delete mode 100644 pixmaps/lll49.xpm delete mode 100644 pixmaps/lll54.xpm delete mode 100644 pixmaps/lll58.xpm delete mode 100644 pixmaps/lll64.xpm delete mode 100644 pixmaps/lll72.xpm delete mode 100644 pixmaps/marble_d.xpm delete mode 100644 pixmaps/marble_l.xpm delete mode 100644 pixmaps/mdd33.xpm delete mode 100644 pixmaps/mdd49.xpm delete mode 100644 pixmaps/mdd72.xpm delete mode 100644 pixmaps/mdl33.xpm delete mode 100644 pixmaps/mdl49.xpm delete mode 100644 pixmaps/mdl72.xpm delete mode 100644 pixmaps/mld33.xpm delete mode 100644 pixmaps/mld49.xpm delete mode 100644 pixmaps/mld72.xpm delete mode 100644 pixmaps/mll33.xpm delete mode 100644 pixmaps/mll49.xpm delete mode 100644 pixmaps/mll72.xpm delete mode 100644 pixmaps/ndd108.xpm delete mode 100644 pixmaps/ndd116.xpm delete mode 100644 pixmaps/ndd129.xpm delete mode 100644 pixmaps/ndd21.xpm delete mode 100644 pixmaps/ndd25.xpm delete mode 100644 pixmaps/ndd29.xpm delete mode 100644 pixmaps/ndd33.xpm delete mode 100644 pixmaps/ndd37.xpm delete mode 100644 pixmaps/ndd40.xpm delete mode 100644 pixmaps/ndd45.xpm delete mode 100644 pixmaps/ndd49.xpm delete mode 100644 pixmaps/ndd54.xpm delete mode 100644 pixmaps/ndd58.xpm delete mode 100644 pixmaps/ndd64.xpm delete mode 100644 pixmaps/ndd72.xpm delete mode 100644 pixmaps/ndd80.xpm delete mode 100644 pixmaps/ndd87.xpm delete mode 100644 pixmaps/ndd95.xpm delete mode 100644 pixmaps/ndl108.xpm delete mode 100644 pixmaps/ndl116.xpm delete mode 100644 pixmaps/ndl129.xpm delete mode 100644 pixmaps/ndl21.xpm delete mode 100644 pixmaps/ndl25.xpm delete mode 100644 pixmaps/ndl29.xpm delete mode 100644 pixmaps/ndl33.xpm delete mode 100644 pixmaps/ndl37.xpm delete mode 100644 pixmaps/ndl40.xpm delete mode 100644 pixmaps/ndl45.xpm delete mode 100644 pixmaps/ndl49.xpm delete mode 100644 pixmaps/ndl54.xpm delete mode 100644 pixmaps/ndl58.xpm delete mode 100644 pixmaps/ndl64.xpm delete mode 100644 pixmaps/ndl72.xpm delete mode 100644 pixmaps/ndl80.xpm delete mode 100644 pixmaps/ndl87.xpm delete mode 100644 pixmaps/ndl95.xpm delete mode 100644 pixmaps/nld108.xpm delete mode 100644 pixmaps/nld116.xpm delete mode 100644 pixmaps/nld129.xpm delete mode 100644 pixmaps/nld21.xpm delete mode 100644 pixmaps/nld25.xpm delete mode 100644 pixmaps/nld29.xpm delete mode 100644 pixmaps/nld33.xpm delete mode 100644 pixmaps/nld37.xpm delete mode 100644 pixmaps/nld40.xpm delete mode 100644 pixmaps/nld45.xpm delete mode 100644 pixmaps/nld49.xpm delete mode 100644 pixmaps/nld54.xpm delete mode 100644 pixmaps/nld58.xpm delete mode 100644 pixmaps/nld64.xpm delete mode 100644 pixmaps/nld72.xpm delete mode 100644 pixmaps/nld80.xpm delete mode 100644 pixmaps/nld87.xpm delete mode 100644 pixmaps/nld95.xpm delete mode 100644 pixmaps/nll108.xpm delete mode 100644 pixmaps/nll116.xpm delete mode 100644 pixmaps/nll129.xpm delete mode 100644 pixmaps/nll21.xpm delete mode 100644 pixmaps/nll25.xpm delete mode 100644 pixmaps/nll29.xpm delete mode 100644 pixmaps/nll33.xpm delete mode 100644 pixmaps/nll37.xpm delete mode 100644 pixmaps/nll40.xpm delete mode 100644 pixmaps/nll45.xpm delete mode 100644 pixmaps/nll49.xpm delete mode 100644 pixmaps/nll54.xpm delete mode 100644 pixmaps/nll58.xpm delete mode 100644 pixmaps/nll64.xpm delete mode 100644 pixmaps/nll72.xpm delete mode 100644 pixmaps/nll80.xpm delete mode 100644 pixmaps/nll87.xpm delete mode 100644 pixmaps/nll95.xpm delete mode 100644 pixmaps/odd33.xpm delete mode 100644 pixmaps/odd49.xpm delete mode 100644 pixmaps/odd72.xpm delete mode 100644 pixmaps/odl33.xpm delete mode 100644 pixmaps/odl49.xpm delete mode 100644 pixmaps/odl72.xpm delete mode 100644 pixmaps/old33.xpm delete mode 100644 pixmaps/old49.xpm delete mode 100644 pixmaps/old72.xpm delete mode 100644 pixmaps/oll33.xpm delete mode 100644 pixmaps/oll49.xpm delete mode 100644 pixmaps/oll72.xpm delete mode 100644 pixmaps/pdd108.xpm delete mode 100644 pixmaps/pdd116.xpm delete mode 100644 pixmaps/pdd129.xpm delete mode 100644 pixmaps/pdd21.xpm delete mode 100644 pixmaps/pdd25.xpm delete mode 100644 pixmaps/pdd29.xpm delete mode 100644 pixmaps/pdd33.xpm delete mode 100644 pixmaps/pdd37.xpm delete mode 100644 pixmaps/pdd40.xpm delete mode 100644 pixmaps/pdd45.xpm delete mode 100644 pixmaps/pdd49.xpm delete mode 100644 pixmaps/pdd54.xpm delete mode 100644 pixmaps/pdd58.xpm delete mode 100644 pixmaps/pdd64.xpm delete mode 100644 pixmaps/pdd72.xpm delete mode 100644 pixmaps/pdd80.xpm delete mode 100644 pixmaps/pdd87.xpm delete mode 100644 pixmaps/pdd95.xpm delete mode 100644 pixmaps/pdl108.xpm delete mode 100644 pixmaps/pdl116.xpm delete mode 100644 pixmaps/pdl129.xpm delete mode 100644 pixmaps/pdl21.xpm delete mode 100644 pixmaps/pdl25.xpm delete mode 100644 pixmaps/pdl29.xpm delete mode 100644 pixmaps/pdl33.xpm delete mode 100644 pixmaps/pdl37.xpm delete mode 100644 pixmaps/pdl40.xpm delete mode 100644 pixmaps/pdl45.xpm delete mode 100644 pixmaps/pdl49.xpm delete mode 100644 pixmaps/pdl54.xpm delete mode 100644 pixmaps/pdl58.xpm delete mode 100644 pixmaps/pdl64.xpm delete mode 100644 pixmaps/pdl72.xpm delete mode 100644 pixmaps/pdl80.xpm delete mode 100644 pixmaps/pdl87.xpm delete mode 100644 pixmaps/pdl95.xpm delete mode 100644 pixmaps/pixmaps.h delete mode 100644 pixmaps/pld108.xpm delete mode 100644 pixmaps/pld116.xpm delete mode 100644 pixmaps/pld129.xpm delete mode 100644 pixmaps/pld21.xpm delete mode 100644 pixmaps/pld25.xpm delete mode 100644 pixmaps/pld29.xpm delete mode 100644 pixmaps/pld33.xpm delete mode 100644 pixmaps/pld37.xpm delete mode 100644 pixmaps/pld40.xpm delete mode 100644 pixmaps/pld45.xpm delete mode 100644 pixmaps/pld49.xpm delete mode 100644 pixmaps/pld54.xpm delete mode 100644 pixmaps/pld58.xpm delete mode 100644 pixmaps/pld64.xpm delete mode 100644 pixmaps/pld72.xpm delete mode 100644 pixmaps/pld80.xpm delete mode 100644 pixmaps/pld87.xpm delete mode 100644 pixmaps/pld95.xpm delete mode 100644 pixmaps/pll108.xpm delete mode 100644 pixmaps/pll116.xpm delete mode 100644 pixmaps/pll129.xpm delete mode 100644 pixmaps/pll21.xpm delete mode 100644 pixmaps/pll25.xpm delete mode 100644 pixmaps/pll29.xpm delete mode 100644 pixmaps/pll33.xpm delete mode 100644 pixmaps/pll37.xpm delete mode 100644 pixmaps/pll40.xpm delete mode 100644 pixmaps/pll45.xpm delete mode 100644 pixmaps/pll49.xpm delete mode 100644 pixmaps/pll54.xpm delete mode 100644 pixmaps/pll58.xpm delete mode 100644 pixmaps/pll64.xpm delete mode 100644 pixmaps/pll72.xpm delete mode 100644 pixmaps/pll80.xpm delete mode 100644 pixmaps/pll87.xpm delete mode 100644 pixmaps/pll95.xpm delete mode 100644 pixmaps/qdd108.xpm delete mode 100644 pixmaps/qdd116.xpm delete mode 100644 pixmaps/qdd129.xpm delete mode 100644 pixmaps/qdd21.xpm delete mode 100644 pixmaps/qdd25.xpm delete mode 100644 pixmaps/qdd29.xpm delete mode 100644 pixmaps/qdd33.xpm delete mode 100644 pixmaps/qdd37.xpm delete mode 100644 pixmaps/qdd40.xpm delete mode 100644 pixmaps/qdd45.xpm delete mode 100644 pixmaps/qdd49.xpm delete mode 100644 pixmaps/qdd54.xpm delete mode 100644 pixmaps/qdd58.xpm delete mode 100644 pixmaps/qdd64.xpm delete mode 100644 pixmaps/qdd72.xpm delete mode 100644 pixmaps/qdd80.xpm delete mode 100644 pixmaps/qdd87.xpm delete mode 100644 pixmaps/qdd95.xpm delete mode 100644 pixmaps/qdl108.xpm delete mode 100644 pixmaps/qdl116.xpm delete mode 100644 pixmaps/qdl129.xpm delete mode 100644 pixmaps/qdl21.xpm delete mode 100644 pixmaps/qdl25.xpm delete mode 100644 pixmaps/qdl29.xpm delete mode 100644 pixmaps/qdl33.xpm delete mode 100644 pixmaps/qdl37.xpm delete mode 100644 pixmaps/qdl40.xpm delete mode 100644 pixmaps/qdl45.xpm delete mode 100644 pixmaps/qdl49.xpm delete mode 100644 pixmaps/qdl54.xpm delete mode 100644 pixmaps/qdl58.xpm delete mode 100644 pixmaps/qdl64.xpm delete mode 100644 pixmaps/qdl72.xpm delete mode 100644 pixmaps/qdl80.xpm delete mode 100644 pixmaps/qdl87.xpm delete mode 100644 pixmaps/qdl95.xpm delete mode 100644 pixmaps/qld108.xpm delete mode 100644 pixmaps/qld116.xpm delete mode 100644 pixmaps/qld129.xpm delete mode 100644 pixmaps/qld21.xpm delete mode 100644 pixmaps/qld25.xpm delete mode 100644 pixmaps/qld29.xpm delete mode 100644 pixmaps/qld33.xpm delete mode 100644 pixmaps/qld37.xpm delete mode 100644 pixmaps/qld40.xpm delete mode 100644 pixmaps/qld45.xpm delete mode 100644 pixmaps/qld49.xpm delete mode 100644 pixmaps/qld54.xpm delete mode 100644 pixmaps/qld58.xpm delete mode 100644 pixmaps/qld64.xpm delete mode 100644 pixmaps/qld72.xpm delete mode 100644 pixmaps/qld80.xpm delete mode 100644 pixmaps/qld87.xpm delete mode 100644 pixmaps/qld95.xpm delete mode 100644 pixmaps/qll108.xpm delete mode 100644 pixmaps/qll116.xpm delete mode 100644 pixmaps/qll129.xpm delete mode 100644 pixmaps/qll21.xpm delete mode 100644 pixmaps/qll25.xpm delete mode 100644 pixmaps/qll29.xpm delete mode 100644 pixmaps/qll33.xpm delete mode 100644 pixmaps/qll37.xpm delete mode 100644 pixmaps/qll40.xpm delete mode 100644 pixmaps/qll45.xpm delete mode 100644 pixmaps/qll49.xpm delete mode 100644 pixmaps/qll54.xpm delete mode 100644 pixmaps/qll58.xpm delete mode 100644 pixmaps/qll64.xpm delete mode 100644 pixmaps/qll72.xpm delete mode 100644 pixmaps/qll80.xpm delete mode 100644 pixmaps/qll87.xpm delete mode 100644 pixmaps/qll95.xpm delete mode 100644 pixmaps/rdd108.xpm delete mode 100644 pixmaps/rdd116.xpm delete mode 100644 pixmaps/rdd129.xpm delete mode 100644 pixmaps/rdd21.xpm delete mode 100644 pixmaps/rdd25.xpm delete mode 100644 pixmaps/rdd29.xpm delete mode 100644 pixmaps/rdd33.xpm delete mode 100644 pixmaps/rdd37.xpm delete mode 100644 pixmaps/rdd40.xpm delete mode 100644 pixmaps/rdd45.xpm delete mode 100644 pixmaps/rdd49.xpm delete mode 100644 pixmaps/rdd54.xpm delete mode 100644 pixmaps/rdd58.xpm delete mode 100644 pixmaps/rdd64.xpm delete mode 100644 pixmaps/rdd72.xpm delete mode 100644 pixmaps/rdd80.xpm delete mode 100644 pixmaps/rdd87.xpm delete mode 100644 pixmaps/rdd95.xpm delete mode 100644 pixmaps/rdl108.xpm delete mode 100644 pixmaps/rdl116.xpm delete mode 100644 pixmaps/rdl129.xpm delete mode 100644 pixmaps/rdl21.xpm delete mode 100644 pixmaps/rdl25.xpm delete mode 100644 pixmaps/rdl29.xpm delete mode 100644 pixmaps/rdl33.xpm delete mode 100644 pixmaps/rdl37.xpm delete mode 100644 pixmaps/rdl40.xpm delete mode 100644 pixmaps/rdl45.xpm delete mode 100644 pixmaps/rdl49.xpm delete mode 100644 pixmaps/rdl54.xpm delete mode 100644 pixmaps/rdl58.xpm delete mode 100644 pixmaps/rdl64.xpm delete mode 100644 pixmaps/rdl72.xpm delete mode 100644 pixmaps/rdl80.xpm delete mode 100644 pixmaps/rdl87.xpm delete mode 100644 pixmaps/rdl95.xpm delete mode 100644 pixmaps/rld108.xpm delete mode 100644 pixmaps/rld116.xpm delete mode 100644 pixmaps/rld129.xpm delete mode 100644 pixmaps/rld21.xpm delete mode 100644 pixmaps/rld25.xpm delete mode 100644 pixmaps/rld29.xpm delete mode 100644 pixmaps/rld33.xpm delete mode 100644 pixmaps/rld37.xpm delete mode 100644 pixmaps/rld40.xpm delete mode 100644 pixmaps/rld45.xpm delete mode 100644 pixmaps/rld49.xpm delete mode 100644 pixmaps/rld54.xpm delete mode 100644 pixmaps/rld58.xpm delete mode 100644 pixmaps/rld64.xpm delete mode 100644 pixmaps/rld72.xpm delete mode 100644 pixmaps/rld80.xpm delete mode 100644 pixmaps/rld87.xpm delete mode 100644 pixmaps/rld95.xpm delete mode 100644 pixmaps/rll108.xpm delete mode 100644 pixmaps/rll116.xpm delete mode 100644 pixmaps/rll129.xpm delete mode 100644 pixmaps/rll21.xpm delete mode 100644 pixmaps/rll25.xpm delete mode 100644 pixmaps/rll29.xpm delete mode 100644 pixmaps/rll33.xpm delete mode 100644 pixmaps/rll37.xpm delete mode 100644 pixmaps/rll40.xpm delete mode 100644 pixmaps/rll45.xpm delete mode 100644 pixmaps/rll49.xpm delete mode 100644 pixmaps/rll54.xpm delete mode 100644 pixmaps/rll58.xpm delete mode 100644 pixmaps/rll64.xpm delete mode 100644 pixmaps/rll72.xpm delete mode 100644 pixmaps/rll80.xpm delete mode 100644 pixmaps/rll87.xpm delete mode 100644 pixmaps/rll95.xpm delete mode 100644 pixmaps/sdd49.xpm delete mode 100644 pixmaps/sdd72.xpm delete mode 100644 pixmaps/sdl49.xpm delete mode 100644 pixmaps/sdl72.xpm delete mode 100644 pixmaps/sld49.xpm delete mode 100644 pixmaps/sld72.xpm delete mode 100644 pixmaps/sll49.xpm delete mode 100644 pixmaps/sll72.xpm delete mode 100644 pixmaps/test.c delete mode 100644 pixmaps/udd49.xpm delete mode 100644 pixmaps/udd72.xpm delete mode 100644 pixmaps/udl49.xpm delete mode 100644 pixmaps/udl72.xpm delete mode 100644 pixmaps/uld49.xpm delete mode 100644 pixmaps/uld72.xpm delete mode 100644 pixmaps/ull49.xpm delete mode 100644 pixmaps/ull72.xpm delete mode 100644 pixmaps/vdd33.xpm delete mode 100644 pixmaps/vdd49.xpm delete mode 100644 pixmaps/vdd72.xpm delete mode 100644 pixmaps/vdl33.xpm delete mode 100644 pixmaps/vdl49.xpm delete mode 100644 pixmaps/vdl72.xpm delete mode 100644 pixmaps/vld33.xpm delete mode 100644 pixmaps/vld49.xpm delete mode 100644 pixmaps/vld72.xpm delete mode 100644 pixmaps/vll33.xpm delete mode 100644 pixmaps/vll49.xpm delete mode 100644 pixmaps/vll72.xpm delete mode 100644 pixmaps/wdd33.xpm delete mode 100644 pixmaps/wdd49.xpm delete mode 100644 pixmaps/wdd72.xpm delete mode 100644 pixmaps/wdl33.xpm delete mode 100644 pixmaps/wdl49.xpm delete mode 100644 pixmaps/wdl72.xpm delete mode 100644 pixmaps/wld33.xpm delete mode 100644 pixmaps/wld49.xpm delete mode 100644 pixmaps/wld72.xpm delete mode 100644 pixmaps/wldd49.xpm delete mode 100644 pixmaps/wldd72.xpm delete mode 100644 pixmaps/wldl49.xpm delete mode 100644 pixmaps/wldl72.xpm delete mode 100644 pixmaps/wll33.xpm delete mode 100644 pixmaps/wll49.xpm delete mode 100644 pixmaps/wll72.xpm delete mode 100644 pixmaps/wlld49.xpm delete mode 100644 pixmaps/wlld72.xpm delete mode 100644 pixmaps/wlll49.xpm delete mode 100644 pixmaps/wlll72.xpm delete mode 100644 pixmaps/wndd49.xpm delete mode 100644 pixmaps/wndd72.xpm delete mode 100644 pixmaps/wndl49.xpm delete mode 100644 pixmaps/wndl72.xpm delete mode 100644 pixmaps/wnld49.xpm delete mode 100644 pixmaps/wnld72.xpm delete mode 100644 pixmaps/wnll49.xpm delete mode 100644 pixmaps/wnll72.xpm delete mode 100644 pixmaps/wood_d.xpm delete mode 100644 pixmaps/wood_l.xpm delete mode 100644 pixmaps/wpdd49.xpm delete mode 100644 pixmaps/wpdd72.xpm delete mode 100644 pixmaps/wpdl49.xpm delete mode 100644 pixmaps/wpdl72.xpm delete mode 100644 pixmaps/wpld49.xpm delete mode 100644 pixmaps/wpld72.xpm delete mode 100644 pixmaps/wpll49.xpm delete mode 100644 pixmaps/wpll72.xpm delete mode 100644 pixmaps/wsdd49.xpm delete mode 100644 pixmaps/wsdd72.xpm delete mode 100644 pixmaps/wsdl49.xpm delete mode 100644 pixmaps/wsdl72.xpm delete mode 100644 pixmaps/wsld49.xpm delete mode 100644 pixmaps/wsld72.xpm delete mode 100644 pixmaps/wsll49.xpm delete mode 100644 pixmaps/wsll72.xpm delete mode 100644 pixmaps/xqboard.xpm delete mode 100644 pixmaps/xqwood.xpm create mode 100644 png/BlackAdvisor.png create mode 100644 png/BlackArchbishop.png create mode 100644 png/BlackBishop.png create mode 100644 png/BlackCanon.png create mode 100644 png/BlackChancellor.png create mode 100644 png/BlackCobra.png create mode 100644 png/BlackCommoner.png create mode 100644 png/BlackCrownedBishop.png create mode 100644 png/BlackCrownedRook.png create mode 100644 png/BlackElephant.png create mode 100644 png/BlackGold.png create mode 100644 png/BlackGoldKnight.png create mode 100644 png/BlackGoldLance.png create mode 100644 png/BlackGoldPawn.png create mode 100644 png/BlackGoldSilver.png create mode 100644 png/BlackHawk.png create mode 100644 png/BlackKing.png create mode 100644 png/BlackKnight.png create mode 100644 png/BlackLance.png create mode 100644 png/BlackMarshall.png create mode 100644 png/BlackNightrider.png create mode 100644 png/BlackPawn.png create mode 100644 png/BlackPrincess.png create mode 100644 png/BlackQueen.png create mode 100644 png/BlackRook.png create mode 100644 png/BlackUnicorn.png create mode 100644 png/WhiteAdvisor.png create mode 100644 png/WhiteArchbishop.png create mode 100644 png/WhiteBishop.png create mode 100644 png/WhiteCanon.png create mode 100644 png/WhiteChancellor.png create mode 100644 png/WhiteCobra.png create mode 100644 png/WhiteCommoner.png create mode 100644 png/WhiteCrownedBishop.png create mode 100644 png/WhiteCrownedRook.png create mode 100644 png/WhiteElephant.png create mode 100644 png/WhiteGold.png create mode 100644 png/WhiteGoldKnight.png create mode 100644 png/WhiteGoldLance.png create mode 100644 png/WhiteGoldPawn.png create mode 100644 png/WhiteGoldSilver.png create mode 100644 png/WhiteHawk.png create mode 100644 png/WhiteKing.png create mode 100644 png/WhiteKnight.png create mode 100644 png/WhiteLance.png create mode 100644 png/WhiteMarshall.png create mode 100644 png/WhiteNightrider.png create mode 100644 png/WhitePawn.png create mode 100644 png/WhitePrincess.png create mode 100644 png/WhiteQueen.png create mode 100644 png/WhiteRook.png create mode 100644 png/WhiteUnicorn.png create mode 100644 png/hatch.png create mode 100644 png/marble_d.png create mode 100644 png/marble_l.png create mode 100644 png/wood_d.png create mode 100644 png/wood_l.png create mode 100644 png/xqboard.png create mode 100644 png/xqwood.png delete mode 100644 shogipixmaps/bdd64.xpm delete mode 100644 shogipixmaps/bdl64.xpm delete mode 100644 shogipixmaps/bld64.xpm delete mode 100644 shogipixmaps/bll64.xpm delete mode 100644 shogipixmaps/fdd64.xpm delete mode 100644 shogipixmaps/fdl64.xpm delete mode 100644 shogipixmaps/fld64.xpm delete mode 100644 shogipixmaps/fll64.xpm delete mode 100644 shogipixmaps/kdd64.xpm delete mode 100644 shogipixmaps/kdl64.xpm delete mode 100644 shogipixmaps/kld64.xpm delete mode 100644 shogipixmaps/kll64.xpm delete mode 100644 shogipixmaps/ldd64.xpm delete mode 100644 shogipixmaps/ldl64.xpm delete mode 100644 shogipixmaps/lld64.xpm delete mode 100644 shogipixmaps/lll64.xpm delete mode 100644 shogipixmaps/ndd64.xpm delete mode 100644 shogipixmaps/ndl64.xpm delete mode 100644 shogipixmaps/nld64.xpm delete mode 100644 shogipixmaps/nll64.xpm delete mode 100644 shogipixmaps/pdd64.xpm delete mode 100644 shogipixmaps/pdl64.xpm delete mode 100644 shogipixmaps/pld64.xpm delete mode 100644 shogipixmaps/pll64.xpm delete mode 100644 shogipixmaps/qdd64.xpm delete mode 100644 shogipixmaps/qdl64.xpm delete mode 100644 shogipixmaps/qld64.xpm delete mode 100644 shogipixmaps/qll64.xpm delete mode 100644 shogipixmaps/rdd64.xpm delete mode 100644 shogipixmaps/rdl64.xpm delete mode 100644 shogipixmaps/rld64.xpm delete mode 100644 shogipixmaps/rll64.xpm delete mode 100644 shogipixmaps/wdd64.xpm delete mode 100644 shogipixmaps/wdl64.xpm delete mode 100644 shogipixmaps/wld64.xpm delete mode 100644 shogipixmaps/wldd64.xpm delete mode 100644 shogipixmaps/wldl64.xpm delete mode 100644 shogipixmaps/wll64.xpm delete mode 100644 shogipixmaps/wlld64.xpm delete mode 100644 shogipixmaps/wlll64.xpm delete mode 100644 shogipixmaps/wndd64.xpm delete mode 100644 shogipixmaps/wndl64.xpm delete mode 100644 shogipixmaps/wnld64.xpm delete mode 100644 shogipixmaps/wnll64.xpm delete mode 100644 shogipixmaps/wpdd64.xpm delete mode 100644 shogipixmaps/wpdl64.xpm delete mode 100644 shogipixmaps/wpld64.xpm delete mode 100644 shogipixmaps/wpll64.xpm delete mode 100644 shogipixmaps/wsdd64.xpm delete mode 100644 shogipixmaps/wsdl64.xpm delete mode 100644 shogipixmaps/wsld64.xpm delete mode 100644 shogipixmaps/wsll64.xpm create mode 100644 svg/BlackAdvisor.svg create mode 100644 svg/BlackArchbishop.svg create mode 100644 svg/BlackBishop.svg create mode 100644 svg/BlackCanon.svg create mode 100644 svg/BlackChancellor.svg create mode 100644 svg/BlackCobra.svg create mode 100644 svg/BlackCommoner.svg create mode 100644 svg/BlackCrownedBishop.svg create mode 100644 svg/BlackCrownedRook.svg create mode 100644 svg/BlackElephant.svg create mode 100644 svg/BlackGold.svg create mode 100644 svg/BlackGoldKnight.svg create mode 100644 svg/BlackGoldLance.svg create mode 100644 svg/BlackGoldPawn.svg create mode 100644 svg/BlackGoldSilver.svg create mode 100644 svg/BlackHawk.svg create mode 100644 svg/BlackKing.svg create mode 100644 svg/BlackKnight.svg create mode 100644 svg/BlackLance.svg create mode 100644 svg/BlackMarshall.svg create mode 100644 svg/BlackNightrider.svg create mode 100644 svg/BlackPawn.svg create mode 100644 svg/BlackPrincess.svg create mode 100644 svg/BlackQueen.svg create mode 100644 svg/BlackRook.svg create mode 100644 svg/BlackUnicorn.svg create mode 100644 svg/WhiteAdvisor.svg create mode 100644 svg/WhiteArchbishop.svg create mode 100644 svg/WhiteBishop.svg create mode 100644 svg/WhiteCanon.svg create mode 100644 svg/WhiteChancellor.svg create mode 100644 svg/WhiteCobra.svg create mode 100644 svg/WhiteCommoner.svg create mode 100644 svg/WhiteCrownedBishop.svg create mode 100644 svg/WhiteCrownedRook.svg create mode 100644 svg/WhiteElephant.svg create mode 100644 svg/WhiteGold.svg create mode 100644 svg/WhiteGoldKnight.svg create mode 100644 svg/WhiteGoldLance.svg create mode 100644 svg/WhiteGoldPawn.svg create mode 100644 svg/WhiteGoldSilver.svg create mode 100644 svg/WhiteHawk.svg create mode 100644 svg/WhiteKing.svg create mode 100644 svg/WhiteKnight.svg create mode 100644 svg/WhiteLance.svg create mode 100644 svg/WhiteMarshall.svg create mode 100644 svg/WhiteNightrider.svg create mode 100644 svg/WhitePawn.svg create mode 100644 svg/WhitePrincess.svg create mode 100644 svg/WhiteQueen.svg create mode 100644 svg/WhiteRook.svg create mode 100644 svg/WhiteUnicorn.svg create mode 100644 svg/eo_Analyzing.svg create mode 100644 svg/eo_Black.svg create mode 100644 svg/eo_Clear.svg create mode 100644 svg/eo_Ponder.svg create mode 100644 svg/eo_Thinking.svg create mode 100644 svg/eo_Unknown.svg create mode 100644 svg/eo_White.svg create mode 100644 svg/icon_black.svg create mode 100644 svg/icon_white.svg create mode 100644 themes/Mono/BlackAdvisor.svg create mode 100644 themes/Mono/BlackArchbishop.svg create mode 100644 themes/Mono/BlackBishop.svg create mode 100644 themes/Mono/BlackCanon.svg create mode 100644 themes/Mono/BlackChancellor.svg create mode 100644 themes/Mono/BlackCobra.svg create mode 100644 themes/Mono/BlackCommoner.svg create mode 100644 themes/Mono/BlackCrownedBishop.svg create mode 100644 themes/Mono/BlackCrownedRook.svg create mode 100644 themes/Mono/BlackElephant.svg create mode 100644 themes/Mono/BlackGold.svg create mode 100644 themes/Mono/BlackGoldKnight.svg create mode 100644 themes/Mono/BlackGoldLance.svg create mode 100644 themes/Mono/BlackGoldPawn.svg create mode 100644 themes/Mono/BlackGoldSilver.svg create mode 100644 themes/Mono/BlackHawk.svg create mode 100644 themes/Mono/BlackKing.svg create mode 100644 themes/Mono/BlackKnight.svg create mode 100644 themes/Mono/BlackLance.svg create mode 100644 themes/Mono/BlackMarshall.svg create mode 100644 themes/Mono/BlackNightrider.svg create mode 100644 themes/Mono/BlackPawn.svg create mode 100644 themes/Mono/BlackPrincess.svg create mode 100644 themes/Mono/BlackQueen.svg create mode 100644 themes/Mono/BlackRook.svg create mode 100644 themes/Mono/BlackUnicorn.svg create mode 100644 themes/Mono/WhiteAdvisor.svg create mode 100644 themes/Mono/WhiteArchbishop.svg create mode 100644 themes/Mono/WhiteBishop.svg create mode 100644 themes/Mono/WhiteCanon.svg create mode 100644 themes/Mono/WhiteChancellor.svg create mode 100644 themes/Mono/WhiteCobra.svg create mode 100644 themes/Mono/WhiteCommoner.svg create mode 100644 themes/Mono/WhiteCrownedBishop.svg create mode 100644 themes/Mono/WhiteCrownedRook.svg create mode 100644 themes/Mono/WhiteElephant.svg create mode 100644 themes/Mono/WhiteGold.svg create mode 100644 themes/Mono/WhiteGoldKnight.svg create mode 100644 themes/Mono/WhiteGoldLance.svg create mode 100644 themes/Mono/WhiteGoldPawn.svg create mode 100644 themes/Mono/WhiteGoldSilver.svg create mode 100644 themes/Mono/WhiteHawk.svg create mode 100644 themes/Mono/WhiteKing.svg create mode 100644 themes/Mono/WhiteKnight.svg create mode 100644 themes/Mono/WhiteLance.svg create mode 100644 themes/Mono/WhiteMarshall.svg create mode 100644 themes/Mono/WhiteNightrider.svg create mode 100644 themes/Mono/WhitePawn.svg create mode 100644 themes/Mono/WhitePrincess.svg create mode 100644 themes/Mono/WhiteQueen.svg create mode 100644 themes/Mono/WhiteRook.svg create mode 100644 themes/Mono/WhiteUnicorn.svg create mode 100644 themes/Mono/eo_Analyzing.svg create mode 100644 themes/Mono/eo_Black.svg create mode 100644 themes/Mono/eo_Clear.svg create mode 100644 themes/Mono/eo_Ponder.svg create mode 100644 themes/Mono/eo_Thinking.svg create mode 100644 themes/Mono/eo_Unknown.svg create mode 100644 themes/Mono/eo_White.svg create mode 100644 themes/Mono/icon_black.svg create mode 100644 themes/Mono/icon_white.svg create mode 100644 themes/Mono/shogi_bishop.svg create mode 100644 themes/Mono/shogi_bishop_promoted.svg create mode 100644 themes/Mono/shogi_gold.svg create mode 100644 themes/Mono/shogi_king.svg create mode 100644 themes/Mono/shogi_knight.svg create mode 100644 themes/Mono/shogi_knight_promoted.svg create mode 100644 themes/Mono/shogi_lance.svg create mode 100644 themes/Mono/shogi_lance_promoted.svg create mode 100644 themes/Mono/shogi_pawn.svg create mode 100644 themes/Mono/shogi_pawn_promoted.svg create mode 100644 themes/Mono/shogi_rook.svg create mode 100644 themes/Mono/shogi_rook_promoted.svg create mode 100644 themes/Mono/shogi_silver.svg create mode 100644 themes/Mono/shogi_silver_promoted.svg create mode 100644 themes/shogi/BlackAdvisor.svg create mode 100644 themes/shogi/BlackBishop.svg create mode 100644 themes/shogi/BlackCrownedBishop.svg create mode 100644 themes/shogi/BlackCrownedRook.svg create mode 100644 themes/shogi/BlackGold.svg create mode 100644 themes/shogi/BlackGoldKnight.svg create mode 100644 themes/shogi/BlackGoldLance.svg create mode 100644 themes/shogi/BlackGoldPawn.svg create mode 100644 themes/shogi/BlackGoldSilver.svg create mode 100644 themes/shogi/BlackKing.svg create mode 100644 themes/shogi/BlackKnight.svg create mode 100644 themes/shogi/BlackLance.svg create mode 100644 themes/shogi/BlackPawn.svg create mode 100644 themes/shogi/BlackRook.svg create mode 100644 themes/shogi/WhiteAdvisor.svg create mode 100644 themes/shogi/WhiteBishop.svg create mode 100644 themes/shogi/WhiteCrownedBishop.svg create mode 100644 themes/shogi/WhiteCrownedRook.svg create mode 100644 themes/shogi/WhiteGold.svg create mode 100644 themes/shogi/WhiteGoldKnight.svg create mode 100644 themes/shogi/WhiteGoldLance.svg create mode 100644 themes/shogi/WhiteGoldPawn.svg create mode 100644 themes/shogi/WhiteGoldSilver.svg create mode 100644 themes/shogi/WhiteKing.svg create mode 100644 themes/shogi/WhiteKnight.svg create mode 100644 themes/shogi/WhiteLance.svg create mode 100644 themes/shogi/WhitePawn.svg create mode 100644 themes/shogi/WhiteRook.svg create mode 100644 themes/xiangqi/.DS_Store create mode 100644 themes/xiangqi/BlackAdvisor.svg create mode 100644 themes/xiangqi/BlackCanon.svg create mode 100644 themes/xiangqi/BlackElephant.svg create mode 100644 themes/xiangqi/BlackGold.svg create mode 100644 themes/xiangqi/BlackKnight.svg create mode 100644 themes/xiangqi/BlackPawn.svg create mode 100644 themes/xiangqi/BlackRook.svg create mode 100644 themes/xiangqi/WhiteAdvisor.svg create mode 100644 themes/xiangqi/WhiteCanon.svg create mode 100644 themes/xiangqi/WhiteElephant.svg create mode 100644 themes/xiangqi/WhiteGold.svg create mode 100644 themes/xiangqi/WhiteKnight.svg create mode 100644 themes/xiangqi/WhitePawn.svg create mode 100644 themes/xiangqi/WhiteRook.svg create mode 100644 usounds.c create mode 100644 usystem.c create mode 100644 usystem.h create mode 100644 xaw/.dirstamp create mode 100644 xaw/xboard.c create mode 100644 xaw/xboard.h create mode 100644 xaw/xengineoutput.c create mode 100644 xaw/xgamelist.c create mode 100644 xaw/xgamelist.h create mode 100644 xaw/xhistory.c create mode 100644 xaw/xhistory.h create mode 100644 xaw/xoptions.c create mode 100644 xboard-config.desktop delete mode 100644 xboard.c delete mode 100644 xboard.h create mode 100644 xboard2.h delete mode 100644 xedittags.c delete mode 100644 xedittags.h delete mode 100644 xengineoutput.c delete mode 100644 xevalgraph.c delete mode 100644 xevalgraph.h delete mode 100644 xgamelist.c delete mode 100644 xgamelist.h delete mode 100644 xhistory.c delete mode 100644 xhistory.h delete mode 100644 xoptions.c ** Version 4.6.2 ** (git diff -b --stat --summary -M v4.6.1 HEAD) backend.c | 16 +++++++++------- configure.ac | 2 +- winboard/config.h | 6 +++--- winboard/language.txt | 2 ++ winboard/language/nederlands.lng | 2 ++ winboard/winboard.c | 1 + 6 files changed, 18 insertions(+), 11 deletions(-) ** Version 4.6.1 ** (git diff -b --stat --summary -M v4.6.0 HEAD) ChangeLog | 228 +++++++++++ DIFFSTAT | 38 ++ NEWS | 28 ++ SHORTLOG | 45 +++ args.h | 5 +- autogen.sh | 2 +- backend.c | 89 ++++- common.h | 1 + configure.ac | 2 +- engineoutput.c | 19 +- evalgraph.c | 4 +- moves.c | 3 +- po/da.po | 987 +++++++++++++++++++++++------------------------ po/de.po | 980 +++++++++++++++++++++++------------------------ po/es.po | 980 +++++++++++++++++++++++------------------------ po/it.po | 980 +++++++++++++++++++++++------------------------ po/ru.po | 980 +++++++++++++++++++++++------------------------ po/tr.po | 980 +++++++++++++++++++++++------------------------ po/uk.po | 1032 +++++++++++++++++++++++++------------------------- po/vi.po | 980 +++++++++++++++++++++++------------------------ po/xboard.pot | 981 +++++++++++++++++++++++------------------------ po/zh_CN.po | 980 +++++++++++++++++++++++------------------------ po/zh_HK.po | 980 +++++++++++++++++++++++------------------------ po/zh_TW.po | 980 +++++++++++++++++++++++------------------------ winboard/config.h | 6 +- winboard/wsettings.c | 13 +- xboard.c | 25 +- xboard.h | 8 +- xboard.texi | 107 ++---- xengineoutput.c | 6 +- xevalgraph.c | 6 +- xgamelist.c | 103 +++-- xoptions.c | 19 +- 33 files changed, 6499 insertions(+), 6078 deletions(-) ** Version 4.6.0 ** (git diff -b --stat --summary -M v4.5.3a HEAD) .gitignore | 3 + ABOUT-NLS | 1282 ++++++++++ COPYRIGHT | 2 +- ChangeLog | 3106 ++++++++++++++++++++++-- DIFFSTAT | 210 ++ Makefile.am | 56 +- NEWS | 35 + SHORTLOG | 435 ++++ args.h | 139 +- autogen.sh | 2 +- backend.c | 3426 ++++++++++++++++++-------- backend.h | 55 +- backendz.h | 2 +- bitmaps/bitmaps.h | 2 +- book.c | 261 ++- childio.c | 26 +- childio.h | 2 +- common.h | 142 +- config.rpath | 280 ++- configure.ac | 37 +- copyright.texi | 2 +- engineoutput.c | 100 +- engineoutput.h | 3 +- evalgraph.c | 85 +- evalgraph.h | 3 +- filebrowser/dir.c | 2 +- filebrowser/draw.c | 42 + filebrowser/path.c | 19 +- filebrowser/selfile.c | 66 +- filebrowser/selfile.h | 2 - frontend.h | 16 +- gamelist.c | 137 +- gettext.h | 262 ++- history.c | 33 +- lists.c | 41 +- lists.h | 2 +- m4/gettext.m4 | 383 +++ m4/iconv.m4 | 214 ++ m4/lib-ld.m4 | 110 + m4/lib-link.m4 | 774 ++++++ m4/lib-prefix.m4 | 224 ++ m4/nls.m4 | 32 + m4/po.m4 | 449 ++++ m4/progtest.m4 | 92 + moves.c | 341 ++-- moves.h | 8 +- parser.c | 4644 ++++------------------------------- parser.h | 2 +- parser.l | 1203 --------- pgntags.c | 145 +- pixmaps/board32.xpm | 42 + pixmaps/board48.xpm | 58 + pixmaps/cross32.xpm | 42 + pixmaps/cross48.xpm | 58 + po/LINGUAS | 3 +- po/Makefile.in.in | 162 +- po/Makevars | 2 +- po/Makevars.template | 41 + po/POTFILES.in | 10 +- po/Rules-quot | 47 + po/boldquot.sed | 10 + po/da.po | 2977 ++++++++++++++++++++++ po/de.po | 3464 +++++++++++++++++++------- po/en@boldquot.header | 25 + po/en@quot.header | 22 + po/es.po | 2925 ++++++++++++++++++++++ po/insert-header.sin | 23 + po/it.po | 2933 ++++++++++++++++++++++ po/lng2po.sh | 96 + po/metascript | 125 + po/normalize.pl | 10 + po/quot.sed | 6 + po/ru.po | 2919 ++++++++++++++++++++++ po/strip-bad-utf8.pl | 14 + po/tr.po | 3306 +++++++++++++++++++------ po/uk.po | 3002 ++++++++++++++++++++++ po/vi.po | 2904 ++++++++++++++++++++++ po/xboard.pot | 2958 +++++++++++++++++------ po/zh_CN.po | 2917 ++++++++++++++++++++++ po/zh_HK.po | 2922 ++++++++++++++++++++++ po/zh_TW.po | 2915 ++++++++++++++++++++++ uci.c | 7 +- winboard/bitmaps/cross.ico | Bin 0 -> 766 bytes winboard/bitmaps/ni49o.bmp | Bin 454 -> 0 bytes winboard/bitmaps/ni49s.bmp | Bin 454 -> 0 bytes winboard/bitmaps/ni49w.bmp | Bin 454 -> 0 bytes winboard/bitmaps/ni72o.bmp | Bin 926 -> 0 bytes winboard/bitmaps/ni72s.bmp | Bin 926 -> 0 bytes winboard/bitmaps/ni72w.bmp | Bin 926 -> 0 bytes winboard/config.h | 6 +- winboard/defaults.h | 3 +- winboard/help.c | 2 +- winboard/help/html/24.htm | 2 +- winboard/jaws.c | 47 +- winboard/language.txt | 138 +- winboard/language/chinese(simp).lng | 787 ++++++ winboard/language/chinese(trad).lng | 785 ++++++ winboard/language/deutsch.lng | 971 ++++++++ winboard/language/italiano.lng | 976 ++++++++ winboard/language/nederlands.lng | 1216 +++++++++ winboard/language/romanian.lng | 1042 ++++++++ winboard/language/russian.lng | 994 ++++++++ winboard/language/spanish.lng | 953 +++++++ winboard/language/vietnamese.lng | 973 ++++++++ winboard/makefile.gcc | 15 +- winboard/makefile.ms | 3 - winboard/resource.h | 31 + winboard/wchat.c | 2 +- winboard/wclipbrd.c | 2 +- winboard/wclipbrd.h | 2 +- winboard/wedittags.c | 16 +- winboard/wengineoutput.c | 10 +- winboard/wevalgraph.c | 3 +- winboard/wgamelist.c | 39 +- winboard/winboard.c | 483 +++-- winboard/winboard.h | 11 +- winboard/winboard.rc | 158 +- winboard/winboard.rtf | 1644 +++++++------ winboard/woptions.c | 163 ++- winboard/woptions.h | 2 +- winboard/wsettings.c | 437 +++- winboard/wsockerr.c | 2 +- winboard/wsockerr.h | 2 +- xboard-fen-viewer.desktop | 52 + xboard-pgn-viewer.desktop | 52 + xboard-tourney.desktop | 52 + xboard.c | 2653 +++++++++----------- xboard.conf.in | 16 +- xboard.h | 26 +- xboard.png | Bin 15116 -> 1726 bytes xboard.texi | 1092 +++++++-- xboard.xml | 61 + xedittags.c | 316 +--- xedittags.h | 2 +- xengineoutput.c | 96 +- xevalgraph.c | 69 +- xevalgraph.h | 2 +- xgamelist.c | 205 +- xgamelist.h | 3 +- xhistory.c | 461 +--- xhistory.h | 4 +- xoptions.c | 1482 ++++++------ zic2xpm.c | 67 +- zic2xpm.man | 2 +- zippy.c | 54 +- zippy.h | 2 +- 146 files changed, 60376 insertions(+), 14197 deletions(-) create mode 100644 ABOUT-NLS create mode 100644 m4/gettext.m4 create mode 100644 m4/iconv.m4 create mode 100644 m4/lib-ld.m4 create mode 100644 m4/lib-link.m4 create mode 100644 m4/lib-prefix.m4 create mode 100644 m4/nls.m4 create mode 100644 m4/po.m4 create mode 100644 m4/progtest.m4 delete mode 100644 parser.l create mode 100644 pixmaps/board32.xpm create mode 100644 pixmaps/board48.xpm create mode 100644 pixmaps/cross32.xpm create mode 100644 pixmaps/cross48.xpm mode change 100755 => 100644 po/Makefile.in.in create mode 100644 po/Makevars.template create mode 100644 po/Rules-quot create mode 100644 po/boldquot.sed create mode 100644 po/da.po create mode 100644 po/en@boldquot.header create mode 100644 po/en@quot.header create mode 100644 po/es.po create mode 100644 po/insert-header.sin create mode 100644 po/it.po create mode 100755 po/lng2po.sh create mode 100644 po/metascript create mode 100755 po/normalize.pl create mode 100644 po/quot.sed mode change 100755 => 100644 po/remove-potcdate.sin create mode 100644 po/ru.po create mode 100755 po/strip-bad-utf8.pl create mode 100644 po/uk.po create mode 100644 po/vi.po mode change 100755 => 100644 po/xboard.pot create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.po create mode 100644 winboard/bitmaps/cross.ico delete mode 100644 winboard/bitmaps/ni49o.bmp delete mode 100644 winboard/bitmaps/ni49s.bmp delete mode 100644 winboard/bitmaps/ni49w.bmp delete mode 100644 winboard/bitmaps/ni72o.bmp delete mode 100644 winboard/bitmaps/ni72s.bmp delete mode 100644 winboard/bitmaps/ni72w.bmp create mode 100644 winboard/language/chinese(simp).lng create mode 100644 winboard/language/chinese(trad).lng create mode 100644 winboard/language/deutsch.lng create mode 100644 winboard/language/italiano.lng create mode 100644 winboard/language/nederlands.lng create mode 100644 winboard/language/romanian.lng create mode 100644 winboard/language/russian.lng create mode 100644 winboard/language/spanish.lng create mode 100644 winboard/language/vietnamese.lng create mode 100644 xboard-fen-viewer.desktop create mode 100644 xboard-pgn-viewer.desktop create mode 100644 xboard-tourney.desktop create mode 100644 xboard.xml ** Version 4.5.3a ** (git diff -b --stat --summary -M v4.5.3 HEAD) winboard/makefile.gcc | 2 +- winboard/winboard.c | 10 +++++----- winboard/winboard.h | 2 +- winboard/woptions.c | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) ** Version 4.5.3 ** (git diff -b --stat --summary -M v4.5.2a HEAD) args.h | 27 +++++++++++++--------- backend.c | 54 +++++++++++++++++++++++++++++++++++-------- backend.h | 4 ++- book.c | 1 + configure.ac | 2 +- engineoutput.c | 14 +++++----- filebrowser/dir.c | 13 +++++----- filebrowser/draw.c | 7 +----- filebrowser/path.c | 10 +------- filebrowser/selfile.c | 17 +++---------- filebrowser/selfile.h | 17 +++++++++++++ history.c | 6 +++- moves.c | 6 ++-- uci.c | 2 +- winboard/config.h | 6 ++-- winboard/jaws.c | 37 +++++++++++++++++++++++++----- winboard/language.txt | 40 +------------------------------- winboard/makefile.gcc | 10 ++++++- winboard/winboard.c | 6 +++- winboard/winboard.h | 1 + winboard/winboard.rc | 32 +++++++++++++------------- winboard/wsettings.c | 33 +++++++++++++++++--------- xboard.c | 24 ++++++++++++------- xboard.h | 28 ++++++++++++++++++++++ xboard.png | Bin 1342 -> 15116 bytes xboard.svg | 26 ++++++++++++++------ xedittags.c | 11 --------- xengineoutput.c | 16 ------------- xevalgraph.c | 14 ----------- xgamelist.c | 61 +++++++++++++++++++++++++++++++----------------- xhistory.c | 6 ----- xoptions.c | 50 +++++++++++----------------------------- 32 files changed, 308 insertions(+), 273 deletions(-) ** Version 4.5.2a (Winboard only) ** (git diff -b --stat --summary -M v4.5.2 HEAD) winboard/wsettings.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) ** Version 4.5.2 ** (git diff -b --stat --summary -M v4.5.1 HEAD) ChangeLog | 361 +++++++++ DIFFSTAT | 31 + Makefile.am | 92 +++- NEWS | 20 + SHORTLOG | 50 ++ args.h | 13 +- backend.c | 112 ++-- backend.h | 7 +- common.h | 1 + configure.ac | 6 +- engineoutput.c | 1 - filebrowser/dir.c | 13 + filebrowser/draw.c | 9 +- filebrowser/path.c | 10 + filebrowser/selfile.c | 149 ++++- filebrowser/selfile.h | 6 + history.c | 1 - moves.c | 1 + parser.l | 4 +- shogipixmaps/add64.xpm | 73 -- shogipixmaps/adl64.xpm | 73 -- shogipixmaps/ald64.xpm | 73 -- shogipixmaps/all64.xpm | 73 -- shogipixmaps/ddd64.xpm | 73 -- shogipixmaps/ddl64.xpm | 73 -- shogipixmaps/dld64.xpm | 73 -- shogipixmaps/dll64.xpm | 73 -- shogipixmaps/qdd64.xpm | 2 +- shogipixmaps/qdl64.xpm | 2 +- shogipixmaps/qld64.xpm | 2 +- shogipixmaps/qll64.xpm | 112 ++-- shogipixmaps/wldd64.xpm | 2 +- shogipixmaps/wldl64.xpm | 2 +- uci.c | 4 - winboard/bitmaps/convert.c | 1 + winboard/config.h | 6 +- winboard/wgamelist.c | 9 +- winboard/winboard.c | 13 +- winboard/winboard.h | 1 + winboard/woptions.c | 2 +- winboard/wsettings.c | 24 +- xboard.c | 962 ++++++++++-------------- xboard.conf.in | 37 +- xboard.h | 2 + xboard.texi | 467 ++++++++---- xgamelist.c | 1 + xoptions.c | 1790 +++++++++++++++++++++++--------------------- 47 files changed, 2591 insertions(+), 2321 deletions(-) delete mode 100644 shogipixmaps/add64.xpm delete mode 100644 shogipixmaps/adl64.xpm delete mode 100644 shogipixmaps/ald64.xpm delete mode 100644 shogipixmaps/all64.xpm delete mode 100644 shogipixmaps/ddd64.xpm delete mode 100644 shogipixmaps/ddl64.xpm delete mode 100644 shogipixmaps/dld64.xpm delete mode 100644 shogipixmaps/dll64.xpm ** Version 4.5.1 ** (git diff -b --stat --summary -M v4.5.0 HEAD) ChangeLog | 142 ++++++++++++++++++++++++++++++++++++++++++++ DIFFSTAT | 26 ++++++++ Makefile.am | 2 +- NEWS | 32 ++++++++++ SHORTLOG | 27 ++++++++ backend.c | 11 ++-- childio.c | 1 + configure.ac | 40 ++++++------- filebrowser/dir.c | 18 ++---- filebrowser/draw.c | 34 ++++++---- filebrowser/path.c | 99 ++++++++++++++++--------------- filebrowser/selfile.c | 12 ++++- moves.c | 5 +- winboard/config.h | 6 +- winboard/help.c | 1 + winboard/help/html/01.htm | 2 +- winboard/help/html/02.htm | 14 ++++- winboard/help/winboard.chm | Bin 86507 -> 86883 bytes winboard/makefile.ms | 4 +- winboard/wchat.c | 2 +- winboard/winboard.c | 29 +++++---- winboard/winboard.dsp | 6 ++- winboard/woptions.c | 3 +- winboard/wsettings.c | 5 +- xboard.c | 5 +- xboard.texi | 10 ++-- 26 files changed, 398 insertions(+), 138 deletions(-) ** Version 4.5.0 ** (git diff -b --stat --summary -M v4.4.4 HEAD) AUTHORS | 16 +- COPYRIGHT | 2 +- ChangeLog | 2326 +++++++++++++++++++-- DIFFSTAT | 271 +++- FAQ.html | 15 + Makefile.am | 55 +- NEWS | 818 +++++++- README | 8 +- SHORTLOG | 293 +++ args.h | 1425 +++++++++++++ autogen.sh | 2 +- backend.c | 3916 ++++++++++++++++++++++------------ backend.h | 48 +- backendz.h | 2 +- bitmaps/bitmaps.h | 2 +- book.c | 39 +- childio.c | 9 +- childio.h | 2 +- cmail.in | 2 +- common.h | 118 +- config.rpath | 2 +- configure.ac | 20 +- copyright.texi | 2 +- engineoutput.c | 518 +++++ engineoutput.h | 69 + evalgraph.c | 339 +++ evalgraph.h | 60 + filebrowser/README | 3 + filebrowser/dir.c | 163 ++ filebrowser/draw.c | 935 ++++++++ filebrowser/path.c | 917 ++++++++ filebrowser/selfile.c | 756 +++++++ filebrowser/selfile.h | 149 ++ filebrowser/xstat.h | 23 + frontend.h | 35 +- gamelist.c | 186 ++- gettext.h | 2 +- history.c | 246 +++ lists.c | 2 +- lists.h | 2 +- moves.c | 666 ++++--- moves.h | 20 +- winboard/parser.c => parser.c | 2669 ++++++++++++----------- parser.h | 9 +- parser.l | 228 ++- pgntags.c | 26 +- pixmaps/convert.c | 29 +- pixmaps/marble_d.xpm | 238 ++ pixmaps/marble_l.xpm | 359 ++++ pixmaps/pixmaps.h | 2 +- pixmaps/wood_d.xpm | 239 +++ pixmaps/wood_l.xpm | 192 ++ pixmaps/xqboard.xpm | 498 +++++ pixmaps/xqwood.xpm | 597 ++++++ readme_HGM.txt | 411 ---- shogipixmaps/add64.xpm | 73 + shogipixmaps/adl64.xpm | 73 + shogipixmaps/ald64.xpm | 73 + shogipixmaps/all64.xpm | 73 + shogipixmaps/bdd64.xpm | 73 + shogipixmaps/bdl64.xpm | 73 + shogipixmaps/bld64.xpm | 74 + shogipixmaps/bll64.xpm | 74 + shogipixmaps/ddd64.xpm | 73 + shogipixmaps/ddl64.xpm | 73 + shogipixmaps/dld64.xpm | 73 + shogipixmaps/dll64.xpm | 73 + shogipixmaps/fdd64.xpm | 73 + shogipixmaps/fdl64.xpm | 73 + shogipixmaps/fld64.xpm | 74 + shogipixmaps/fll64.xpm | 74 + shogipixmaps/kdd64.xpm | 73 + shogipixmaps/kdl64.xpm | 73 + shogipixmaps/kld64.xpm | 73 + shogipixmaps/kll64.xpm | 73 + shogipixmaps/ldd64.xpm | 73 + shogipixmaps/ldl64.xpm | 73 + shogipixmaps/lld64.xpm | 73 + shogipixmaps/lll64.xpm | 73 + shogipixmaps/ndd64.xpm | 73 + shogipixmaps/ndl64.xpm | 73 + shogipixmaps/nld64.xpm | 74 + shogipixmaps/nll64.xpm | 74 + shogipixmaps/pdd64.xpm | 73 + shogipixmaps/pdl64.xpm | 73 + shogipixmaps/pld64.xpm | 74 + shogipixmaps/pll64.xpm | 74 + shogipixmaps/qdd64.xpm | 73 + shogipixmaps/qdl64.xpm | 73 + shogipixmaps/qld64.xpm | 73 + shogipixmaps/qll64.xpm | 73 + shogipixmaps/rdd64.xpm | 73 + shogipixmaps/rdl64.xpm | 73 + shogipixmaps/rld64.xpm | 73 + shogipixmaps/rll64.xpm | 73 + shogipixmaps/wdd64.xpm | 73 + shogipixmaps/wdl64.xpm | 73 + shogipixmaps/wld64.xpm | 73 + shogipixmaps/wldd64.xpm | 73 + shogipixmaps/wldl64.xpm | 73 + shogipixmaps/wll64.xpm | 73 + shogipixmaps/wlld64.xpm | 73 + shogipixmaps/wlll64.xpm | 73 + shogipixmaps/wndd64.xpm | 73 + shogipixmaps/wndl64.xpm | 73 + shogipixmaps/wnld64.xpm | 73 + shogipixmaps/wnll64.xpm | 73 + shogipixmaps/wpdd64.xpm | 73 + shogipixmaps/wpdl64.xpm | 73 + shogipixmaps/wpld64.xpm | 73 + shogipixmaps/wpll64.xpm | 73 + shogipixmaps/wsdd64.xpm | 73 + shogipixmaps/wsdl64.xpm | 73 + shogipixmaps/wsld64.xpm | 73 + shogipixmaps/wsll64.xpm | 73 + uci.c | 105 +- winboard/WB4Jaws.dev | 94 +- winboard/Winboard.dev | 94 +- winboard/bitmaps/wl33o.bmp | Bin 0 -> 326 bytes winboard/bitmaps/wl33s.bmp | Bin 0 -> 326 bytes winboard/bitmaps/wn33o.bmp | Bin 0 -> 326 bytes winboard/bitmaps/wn33s.bmp | Bin 0 -> 326 bytes winboard/bitmaps/wp33o.bmp | Bin 0 -> 326 bytes winboard/bitmaps/wp33s.bmp | Bin 0 -> 326 bytes winboard/bitmaps/ws33o.bmp | Bin 0 -> 326 bytes winboard/bitmaps/ws33s.bmp | Bin 0 -> 326 bytes winboard/config.h | 6 +- winboard/defaults.h | 11 +- winboard/help.c | 4 +- winboard/help/html/01.htm | 8 +- winboard/help/html/03.htm | 2 +- winboard/help/html/04.htm | 35 +- winboard/help/html/05.htm | 6 + winboard/help/html/06.htm | 9 +- winboard/help/html/07.htm | 57 +- winboard/help/html/09.htm | 6 + winboard/help/html/14.htm | 42 + winboard/help/html/15.htm | 16 +- winboard/help/html/16.htm | 19 +- winboard/help/html/18.htm | 12 +- winboard/help/html/24.htm | 2 +- winboard/help/winboard.chm | Bin 79031 -> 86507 bytes winboard/help/winboard.hhk | 138 ++- winboard/help/winboard.hhp | 13 +- winboard/jaws.c | 131 +- winboard/language.txt | 1425 +++++++++---- winboard/makefile.gcc | 38 +- winboard/makefile.ms | 34 +- winboard/resource.h | 87 + winboard/wchat.c | 165 ++- winboard/wclipbrd.c | 65 +- winboard/wclipbrd.h | 2 +- winboard/wedittags.c | 42 +- winboard/wengineo.c | 856 -------- winboard/wengineoutput.c | 436 ++++ winboard/wevalgraph.c | 359 +--- winboard/wgamelist.c | 97 +- winboard/wgamelist.h | 28 - winboard/whistory.c | 264 +-- winboard/winboard.c | 3449 +++++++++++------------------- winboard/winboard.dsp | 18 +- winboard/winboard.h | 57 +- winboard/winboard.rc | 776 ++++---- winboard/winboard.rtf | 1719 ++++++++------- winboard/wlayout.c | 3 +- winboard/woptions.c | 424 ++-- winboard/woptions.h | 2 +- winboard/wsettings.c | 28 +- winboard/wsockerr.c | 2 +- winboard/wsockerr.h | 2 +- xboard.c | 2912 ++++++++++++------------- xboard.conf.in | 77 + xboard.desktop | 154 ++ xboard.h | 26 +- xboard.texi | 960 ++++++--- xedittags.c | 13 +- xedittags.h | 3 +- xengineoutput.c | 597 ++---- xevalgraph.c | 456 ++++ winboard/wedittags.h => xevalgraph.h | 14 +- xgamelist.c | 413 ++++- xgamelist.h | 5 +- xhistory.c | 76 +- xhistory.h | 4 +- xoptions.c | 243 ++- zic2xpm.c | 19 +- zic2xpm.man | 2 +- zippy.c | 88 +- zippy.h | 2 +- 189 files changed, 29433 insertions(+), 12188 deletions(-) create mode 100644 args.h create mode 100644 engineoutput.c create mode 100644 engineoutput.h create mode 100644 evalgraph.c create mode 100644 evalgraph.h create mode 100644 filebrowser/README create mode 100644 filebrowser/dir.c create mode 100644 filebrowser/draw.c create mode 100644 filebrowser/path.c create mode 100644 filebrowser/selfile.c create mode 100644 filebrowser/selfile.h create mode 100644 filebrowser/xstat.h create mode 100644 history.c rename winboard/parser.c => parser.c (51%) mode change 100755 => 100644 parser.l create mode 100644 pixmaps/marble_d.xpm create mode 100644 pixmaps/marble_l.xpm create mode 100644 pixmaps/wood_d.xpm create mode 100644 pixmaps/wood_l.xpm create mode 100644 pixmaps/xqboard.xpm create mode 100644 pixmaps/xqwood.xpm delete mode 100644 readme_HGM.txt create mode 100644 shogipixmaps/add64.xpm create mode 100644 shogipixmaps/adl64.xpm create mode 100644 shogipixmaps/ald64.xpm create mode 100644 shogipixmaps/all64.xpm create mode 100644 shogipixmaps/bdd64.xpm create mode 100644 shogipixmaps/bdl64.xpm create mode 100644 shogipixmaps/bld64.xpm create mode 100644 shogipixmaps/bll64.xpm create mode 100644 shogipixmaps/ddd64.xpm create mode 100644 shogipixmaps/ddl64.xpm create mode 100644 shogipixmaps/dld64.xpm create mode 100644 shogipixmaps/dll64.xpm create mode 100644 shogipixmaps/fdd64.xpm create mode 100644 shogipixmaps/fdl64.xpm create mode 100644 shogipixmaps/fld64.xpm create mode 100644 shogipixmaps/fll64.xpm create mode 100644 shogipixmaps/kdd64.xpm create mode 100644 shogipixmaps/kdl64.xpm create mode 100644 shogipixmaps/kld64.xpm create mode 100644 shogipixmaps/kll64.xpm create mode 100644 shogipixmaps/ldd64.xpm create mode 100644 shogipixmaps/ldl64.xpm create mode 100644 shogipixmaps/lld64.xpm create mode 100644 shogipixmaps/lll64.xpm create mode 100644 shogipixmaps/ndd64.xpm create mode 100644 shogipixmaps/ndl64.xpm create mode 100644 shogipixmaps/nld64.xpm create mode 100644 shogipixmaps/nll64.xpm create mode 100644 shogipixmaps/pdd64.xpm create mode 100644 shogipixmaps/pdl64.xpm create mode 100644 shogipixmaps/pld64.xpm create mode 100644 shogipixmaps/pll64.xpm create mode 100644 shogipixmaps/qdd64.xpm create mode 100644 shogipixmaps/qdl64.xpm create mode 100644 shogipixmaps/qld64.xpm create mode 100644 shogipixmaps/qll64.xpm create mode 100644 shogipixmaps/rdd64.xpm create mode 100644 shogipixmaps/rdl64.xpm create mode 100644 shogipixmaps/rld64.xpm create mode 100644 shogipixmaps/rll64.xpm create mode 100644 shogipixmaps/wdd64.xpm create mode 100644 shogipixmaps/wdl64.xpm create mode 100644 shogipixmaps/wld64.xpm create mode 100644 shogipixmaps/wldd64.xpm create mode 100644 shogipixmaps/wldl64.xpm create mode 100644 shogipixmaps/wll64.xpm create mode 100644 shogipixmaps/wlld64.xpm create mode 100644 shogipixmaps/wlll64.xpm create mode 100644 shogipixmaps/wndd64.xpm create mode 100644 shogipixmaps/wndl64.xpm create mode 100644 shogipixmaps/wnld64.xpm create mode 100644 shogipixmaps/wnll64.xpm create mode 100644 shogipixmaps/wpdd64.xpm create mode 100644 shogipixmaps/wpdl64.xpm create mode 100644 shogipixmaps/wpld64.xpm create mode 100644 shogipixmaps/wpll64.xpm create mode 100644 shogipixmaps/wsdd64.xpm create mode 100644 shogipixmaps/wsdl64.xpm create mode 100644 shogipixmaps/wsld64.xpm create mode 100644 shogipixmaps/wsll64.xpm create mode 100644 winboard/bitmaps/wl33o.bmp create mode 100644 winboard/bitmaps/wl33s.bmp create mode 100644 winboard/bitmaps/wn33o.bmp create mode 100644 winboard/bitmaps/wn33s.bmp create mode 100644 winboard/bitmaps/wp33o.bmp create mode 100644 winboard/bitmaps/wp33s.bmp create mode 100644 winboard/bitmaps/ws33o.bmp create mode 100644 winboard/bitmaps/ws33s.bmp delete mode 100644 winboard/wengineo.c create mode 100644 winboard/wengineoutput.c delete mode 100644 winboard/wgamelist.h create mode 100644 xboard.conf.in create mode 100644 xboard.desktop create mode 100644 xevalgraph.c rename winboard/wedittags.h => xevalgraph.h (74%) ** Version 4.4.4 ** (git diff -b --stat --summary -M v4.4.3...HEAD) backend.c | 69 +++++++++++++++++++++++-------------------------- backend.h | 2 +- configure.ac | 10 +++--- moves.c | 4 +- parser.l | 16 ++++++------ winboard/config.h | 6 ++-- winboard/wgamelist.c | 4 +- winboard/winboard.c | 29 +++++++++++++++++--- winboard/woptions.c | 3 +- xboard.c | 2 +- xoptions.c | 2 +- zippy.c | 11 +------ 12 files changed, 82 insertions(+), 76 deletions(-) ** Version 4.4.3 ** (git diff -b --stat --summary -M v4.4.2...HEAD) AUTHORS | 16 +- COPYRIGHT | 2 +- ChangeLog | 323 ++++ DIFFSTAT | 84 + Makefile.am | 7 +- NEWS | 35 + SHORTLOG | 57 + autogen.sh | 2 +- backend.c | 224 ++- backend.h | 10 +- backendz.h | 2 +- bitmaps/bitmaps.h | 2 +- childio.c | 2 +- childio.h | 2 +- cmail.in | 2 +- common.h | 4 +- config.rpath | 2 +- configure.ac | 6 +- copyright.texi | 2 +- frontend.h | 2 +- gamelist.c | 2 +- gettext.h | 2 +- lists.c | 2 +- lists.h | 2 +- moves.c | 26 +- moves.h | 8 +- parser.h | 2 +- parser.l | 14 +- pgntags.c | 2 +- pixmaps/pixmaps.h | 2 +- winboard/config.h | 6 +- winboard/defaults.h | 2 +- winboard/help.c | 2 +- winboard/help/html/18.htm | 4 +- winboard/help/winboard.hhk | 4 +- winboard/jaws.c | 16 +- winboard/makefile.gcc | 8 +- winboard/makefile.ms | 8 +- winboard/parser.c | 3866 +++++++++++++++++++++++--------------------- winboard/resource.h | 1 + winboard/wchat.c | 30 +- winboard/wclipbrd.c | 2 +- winboard/wclipbrd.h | 2 +- winboard/wedittags.c | 2 +- winboard/wedittags.h | 2 +- winboard/wengineo.c | 1 + winboard/wgamelist.c | 2 +- winboard/wgamelist.h | 2 +- winboard/winboard.c | 29 +- winboard/winboard.h | 2 +- winboard/winboard.rc | 2 + winboard/winboard.rtf | 2 +- winboard/woptions.c | 8 +- winboard/woptions.h | 2 +- winboard/wsockerr.c | 2 +- winboard/wsockerr.h | 2 +- xboard.c | 13 +- xboard.h | 2 +- xboard.png | Bin 0 -> 1342 bytes xboard.svg | 119 ++ xboard.texi | 5 +- xedittags.c | 2 +- xedittags.h | 2 +- xengineoutput.c | 2 +- xgamelist.c | 2 +- xgamelist.h | 2 +- xhistory.c | 2 +- xhistory.h | 2 +- xoptions.c | 15 +- zic2xpm.c | 2 +- zic2xpm.man | 2 +- zippy.c | 2 +- zippy.h | 2 +- 73 files changed, 2973 insertions(+), 2060 deletions(-) mode change 100755 => 100644 backend.c mode change 100755 => 100644 gamelist.c mode change 100755 => 100644 gettext.h mode change 100755 => 100644 winboard/woptions.c create mode 100644 xboard.png create mode 100644 xboard.svg ** Version 4.4.2 ** (git diff --stat --summary -M v4.4.1...HEAD) Makefile.am | 6 +- backend.c | 108 +++++++++++++++++++++++------------------------ backend.h | 1 + configure.ac | 12 ++++- moves.c | 36 +--------------- pixmaps/asdd72.xpm | 26 ++++++------ pixmaps/asdl72.xpm | 26 ++++++------ pixmaps/cvdd37.xpm | 32 +++++++------- pixmaps/cvdd45.xpm | 42 +++++++++--------- pixmaps/cvdd49.xpm | 48 +++++++++++----------- pixmaps/cvdl37.xpm | 32 +++++++------- pixmaps/cvdl45.xpm | 42 +++++++++--------- pixmaps/cvdl49.xpm | 48 +++++++++++----------- pixmaps/hdd49.xpm | 64 ++++++++++++++-------------- pixmaps/hdd72.xpm | 108 ++++++++++++++++++++++++------------------------ pixmaps/hdl49.xpm | 64 ++++++++++++++-------------- pixmaps/hdl72.xpm | 108 ++++++++++++++++++++++++------------------------ shogibitmaps/README | 2 - shogibitmaps/sa58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sb58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sc58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sf58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sg58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sh58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sk58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sk58w.bmp | Bin 526 -> 0 bytes shogibitmaps/sl58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sl58w.bmp | Bin 526 -> 0 bytes shogibitmaps/sn58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sn58w.bmp | Bin 526 -> 0 bytes shogibitmaps/sp58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sp58w.bmp | Bin 526 -> 0 bytes shogibitmaps/sr58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sr58w.bmp | Bin 526 -> 0 bytes shogibitmaps/ss58o.bmp | Bin 526 -> 0 bytes shogibitmaps/su58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sw58o.bmp | Bin 526 -> 0 bytes shogibitmaps/sw58w.bmp | Bin 526 -> 0 bytes winboard/config.h | 6 +- winboard/makefile.gcc | 2 +- winboard/makefile.ms | 2 +- winboard/wchat.c | 5 +- winboard/wclipbrd.c | 3 +- winboard/winboard.c | 9 +--- winboard/woptions.c | 4 +- xboard.c | 1 + xengineoutput.c | 4 ++ xhistory.c | 25 ++++++----- xoptions.c | 5 +- 49 files changed, 424 insertions(+), 447 deletions(-) delete mode 100644 shogibitmaps/README delete mode 100644 shogibitmaps/sa58o.bmp delete mode 100644 shogibitmaps/sb58o.bmp delete mode 100644 shogibitmaps/sc58o.bmp delete mode 100644 shogibitmaps/sf58o.bmp delete mode 100644 shogibitmaps/sg58o.bmp delete mode 100644 shogibitmaps/sh58o.bmp delete mode 100644 shogibitmaps/sk58o.bmp delete mode 100644 shogibitmaps/sk58w.bmp delete mode 100644 shogibitmaps/sl58o.bmp delete mode 100644 shogibitmaps/sl58w.bmp delete mode 100644 shogibitmaps/sn58o.bmp delete mode 100644 shogibitmaps/sn58w.bmp delete mode 100644 shogibitmaps/sp58o.bmp delete mode 100644 shogibitmaps/sp58w.bmp delete mode 100644 shogibitmaps/sr58o.bmp delete mode 100644 shogibitmaps/sr58w.bmp delete mode 100644 shogibitmaps/ss58o.bmp delete mode 100644 shogibitmaps/su58o.bmp delete mode 100644 shogibitmaps/sw58o.bmp delete mode 100644 shogibitmaps/sw58w.bmp ** Version 4.4.1 ** (git diff --stat --summary -M vold...vnew) .gitignore | 27 +- ChangeLog | 1445 +++++++++++++++++++++++++++++++------------- Makefile.am | 41 +- NEWS | 24 + README | 1 - ToDo => TODO | 0 backend.c | 1322 +++++++++++++++++++++++++---------------- backend.h | 15 +- backendz.h | 1 + bitmaps/a49c.bm | 27 - bitmaps/b129o.bm | 189 ++++++- bitmaps/b129s.bm | 189 ++++++- bitmaps/bitmaps.h | 1060 ++++++++++++++++---------------- bitmaps/fixup.sed | 3 - bitmaps/h129o.bm | 5 - bitmaps/k129o.bm | 189 ++++++- bitmaps/k129s.bm | 189 ++++++- bitmaps/m33s.bm | 18 +- bitmaps/n129o.bm | 189 ++++++- bitmaps/n129s.bm | 189 ++++++- bitmaps/p129o.bm | 189 ++++++- bitmaps/p129s.bm | 189 ++++++- bitmaps/q129o.bm | 189 ++++++- bitmaps/q129s.bm | 189 ++++++- bitmaps/r129o.bm | 189 ++++++- bitmaps/r129s.bm | 189 ++++++- bitmaps/unsigned.sh | 8 - bitmaps/v54o.bm | 30 - bitmaps/v54s.bm | 30 - bitmaps/w54o.bm | 27 - bitmaps/w54s.bm | 27 - book.c | 6 +- cmail.in | 6 +- common.h | 14 +- configure.ac | 2 +- copyright.texi | 1 + engine-intf.html | 1118 ++++++++++++++++------------------ frontend.h | 15 +- gamelist.c | 27 +- moves.c | 49 +- parser.h | 4 +- parser.l | 15 +- pgntags.c | 4 + pixmaps/add33.xpm | 23 +- pixmaps/add37.xpm | 21 +- pixmaps/add40.xpm | 23 +- pixmaps/add45.xpm | 27 +- pixmaps/add49.xpm | 29 +- pixmaps/add54.xpm | 39 +- pixmaps/add58.xpm | 35 +- pixmaps/add64.xpm | 39 +- pixmaps/add72.xpm | 41 +- pixmaps/adl33.xpm | 23 +- pixmaps/adl37.xpm | 21 +- pixmaps/adl40.xpm | 23 +- pixmaps/adl45.xpm | 27 +- pixmaps/adl49.xpm | 29 +- pixmaps/adl54.xpm | 39 +- pixmaps/adl58.xpm | 35 +- pixmaps/adl64.xpm | 39 +- pixmaps/adl72.xpm | 41 +- pixmaps/asdd33.xpm | 47 +- pixmaps/asdd45.xpm | 53 -- pixmaps/asdd49.xpm | 61 +- pixmaps/asdd72.xpm | 85 ++-- pixmaps/asdl33.xpm | 47 +- pixmaps/asdl45.xpm | 53 -- pixmaps/asdl49.xpm | 61 +- pixmaps/asdl72.xpm | 85 ++-- pixmaps/asld45.xpm | 54 -- pixmaps/asll45.xpm | 54 -- pixmaps/cdd33.xpm | 41 +- pixmaps/cdd37.xpm | 53 +- pixmaps/cdd40.xpm | 53 +- pixmaps/cdd45.xpm | 57 +- pixmaps/cdd49.xpm | 61 +- pixmaps/cdd54.xpm | 71 ++-- pixmaps/cdd58.xpm | 73 ++-- pixmaps/cdd64.xpm | 81 ++-- pixmaps/cdd72.xpm | 91 ++-- pixmaps/cdl33.xpm | 41 +- pixmaps/cdl37.xpm | 53 +- pixmaps/cdl40.xpm | 53 +- pixmaps/cdl45.xpm | 57 +- pixmaps/cdl49.xpm | 61 +- pixmaps/cdl54.xpm | 71 ++-- pixmaps/cdl58.xpm | 73 ++-- pixmaps/cdl64.xpm | 81 ++-- pixmaps/cdl72.xpm | 91 ++-- pixmaps/convert.c | 30 +- pixmaps/cvdd33.xpm | 39 +- pixmaps/cvdd37.xpm | 23 +- pixmaps/cvdd40.xpm | 49 +- pixmaps/cvdd45.xpm | 27 +- pixmaps/cvdd49.xpm | 31 +- pixmaps/cvdd54.xpm | 67 +- pixmaps/cvdd58.xpm | 77 ++-- pixmaps/cvdd64.xpm | 79 ++-- pixmaps/cvdd72.xpm | 87 ++-- pixmaps/cvdl33.xpm | 39 +- pixmaps/cvdl37.xpm | 23 +- pixmaps/cvdl40.xpm | 49 +- pixmaps/cvdl45.xpm | 27 +- pixmaps/cvdl49.xpm | 31 +- pixmaps/cvdl54.xpm | 67 +- pixmaps/cvdl58.xpm | 77 ++-- pixmaps/cvdl64.xpm | 79 ++-- pixmaps/cvdl72.xpm | 87 ++-- pixmaps/dkdd33.xpm | 19 +- pixmaps/dkdd49.xpm | 23 +- pixmaps/dkdd72.xpm | 37 +- pixmaps/dkdl33.xpm | 19 +- pixmaps/dkdl49.xpm | 23 +- pixmaps/dkdl72.xpm | 37 +- pixmaps/edd33.xpm | 49 +- pixmaps/edd49.xpm | 63 +- pixmaps/edd72.xpm | 101 ++-- pixmaps/edl33.xpm | 49 +- pixmaps/edl49.xpm | 63 +- pixmaps/edl72.xpm | 101 ++-- pixmaps/fdd33.xpm | 35 +- pixmaps/fdd49.xpm | 43 +- pixmaps/fdd72.xpm | 37 +- pixmaps/fdl33.xpm | 35 +- pixmaps/fdl49.xpm | 43 +- pixmaps/fdl72.xpm | 37 +- pixmaps/gdd33.xpm | 11 +- pixmaps/gdd49.xpm | 11 +- pixmaps/gdd72.xpm | 19 +- pixmaps/gdl33.xpm | 11 +- pixmaps/gdl49.xpm | 11 +- pixmaps/gdl72.xpm | 19 +- pixmaps/hdd33.xpm | 47 +- pixmaps/hdd49.xpm | 39 +- pixmaps/hdd72.xpm | 63 +- pixmaps/hdl33.xpm | 47 +- pixmaps/hdl49.xpm | 39 +- pixmaps/hdl72.xpm | 63 +- pixmaps/ldd33.xpm | 23 +- pixmaps/ldd37.xpm | 25 +- pixmaps/ldd40.xpm | 29 +- pixmaps/ldd45.xpm | 31 +- pixmaps/ldd49.xpm | 25 +- pixmaps/ldd54.xpm | 39 +- pixmaps/ldd58.xpm | 39 +- pixmaps/ldd64.xpm | 37 +- pixmaps/ldd72.xpm | 45 +- pixmaps/ldl33.xpm | 23 +- pixmaps/ldl37.xpm | 25 +- pixmaps/ldl40.xpm | 29 +- pixmaps/ldl45.xpm | 31 +- pixmaps/ldl49.xpm | 25 +- pixmaps/ldl54.xpm | 39 +- pixmaps/ldl58.xpm | 39 +- pixmaps/ldl64.xpm | 37 +- pixmaps/ldl72.xpm | 45 +- pixmaps/mdd33.xpm | 84 ++-- pixmaps/mdd49.xpm | 23 +- pixmaps/mdd72.xpm | 29 +- pixmaps/mdl33.xpm | 84 ++-- pixmaps/mdl49.xpm | 23 +- pixmaps/mdl72.xpm | 29 +- pixmaps/odd33.xpm | 19 +- pixmaps/odd49.xpm | 31 +- pixmaps/odd72.xpm | 45 +- pixmaps/odl33.xpm | 19 +- pixmaps/odl49.xpm | 31 +- pixmaps/odl72.xpm | 45 +- pixmaps/sdd49.xpm | 19 +- pixmaps/sdd72.xpm | 27 +- pixmaps/sdl49.xpm | 19 +- pixmaps/sdl72.xpm | 27 +- pixmaps/udd49.xpm | 49 +- pixmaps/udd72.xpm | 59 +- pixmaps/udl49.xpm | 49 +- pixmaps/udl72.xpm | 59 +- pixmaps/vdd33.xpm | 39 +- pixmaps/vdd49.xpm | 57 +- pixmaps/vdd54.xpm | 62 -- pixmaps/vdd72.xpm | 77 ++-- pixmaps/vdl33.xpm | 39 +- pixmaps/vdl49.xpm | 57 +- pixmaps/vdl54.xpm | 62 -- pixmaps/vdl72.xpm | 77 ++-- pixmaps/vld54.xpm | 63 -- pixmaps/vll54.xpm | 63 -- pixmaps/wdd33.xpm | 39 +- pixmaps/wdd49.xpm | 49 +- pixmaps/wdd54.xpm | 62 -- pixmaps/wdd72.xpm | 69 ++- pixmaps/wdl33.xpm | 39 +- pixmaps/wdl49.xpm | 49 +- pixmaps/wdl54.xpm | 62 -- pixmaps/wdl72.xpm | 69 ++- pixmaps/wld54.xpm | 63 -- pixmaps/wldd49.xpm | 49 +- pixmaps/wldd72.xpm | 69 ++- pixmaps/wldl49.xpm | 49 +- pixmaps/wldl72.xpm | 69 ++- pixmaps/wll54.xpm | 63 -- pixmaps/wndd49.xpm | 47 +- pixmaps/wndd72.xpm | 69 ++- pixmaps/wndl49.xpm | 47 +- pixmaps/wndl72.xpm | 69 ++- pixmaps/wpdd49.xpm | 37 +- pixmaps/wpdd72.xpm | 53 +- pixmaps/wpdl49.xpm | 37 +- pixmaps/wpdl72.xpm | 53 +- pixmaps/wsdd49.xpm | 49 +- pixmaps/wsdd72.xpm | 69 ++- pixmaps/wsdl49.xpm | 49 +- pixmaps/wsdl72.xpm | 69 ++- shiphtml | 25 - winboard/COMPILING | 26 +- winboard/WB4Jaws.dev | 30 +- winboard/Winboard.dev | 30 +- winboard/bitmaps/as45o.bmp | Bin 422 -> 0 bytes winboard/bitmaps/as45s.bmp | Bin 422 -> 0 bytes winboard/bitmaps/as45w.bmp | Bin 422 -> 0 bytes winboard/bitmaps/bas.gif | Bin 308 -> 0 bytes winboard/bitmaps/bcv.gif | Bin 295 -> 0 bytes winboard/bitmaps/bitmaps.h | 368 ----------- winboard/bitmaps/convert.c | 4 +- winboard/bitmaps/h129o.bmp | Bin 2642 -> 0 bytes winboard/bitmaps/m129o.bmp | Bin 2642 -> 0 bytes winboard/bitmaps/m33s.bmp | Bin 3354 -> 326 bytes winboard/bitmaps/v54o.bmp | Bin 494 -> 0 bytes winboard/bitmaps/v54s.bmp | Bin 494 -> 0 bytes winboard/bitmaps/v54w.bmp | Bin 494 -> 0 bytes winboard/bitmaps/w54o.bmp | Bin 454 -> 0 bytes winboard/bitmaps/w54s.bmp | Bin 454 -> 0 bytes winboard/bitmaps/w54w.bmp | Bin 454 -> 0 bytes winboard/bitmaps/was.gif | Bin 326 -> 0 bytes winboard/bitmaps/wcv.gif | Bin 314 -> 0 bytes winboard/config.h | 10 +- winboard/internationalize | 3 + winboard/jaws.c | 98 ++-- winboard/language.txt | 460 ++++++++++++++ winboard/makefile.gcc | 9 +- winboard/makefile.ms | 9 +- winboard/metascript.txt | 14 + winboard/resource.h | 9 + winboard/wchat.c | 256 ++++++++ winboard/wclipbrd.c | 13 - winboard/wevalgraph.c | 356 ++++++----- winboard/wgamelist.c | 5 +- winboard/winboard.c | 668 +++++++-------------- winboard/winboard.dsp | 4 + winboard/winboard.h | 1 + winboard/winboard.rc | 70 ++- winboard/winboard.rtf | 1002 ++++++++++++++++--------------- winboard/woptions.c | 60 +-- winboard/wsettings.c | 136 +---- xboard.c | 533 +++++++---------- xboard.texi | 166 +++--- xedittags.c | 16 - xengineoutput.c | 40 +- xhistory.c | 53 -- xoptions.c | 148 +---- zippy.c | 13 +- 260 files changed, 11230 insertions(+), 8943 deletions(-) rename ToDo => TODO (100%) mode change 100644 => 100755 backend.c delete mode 100644 bitmaps/a49c.bm delete mode 100644 bitmaps/fixup.sed delete mode 100644 bitmaps/h129o.bm delete mode 100644 bitmaps/unsigned.sh delete mode 100644 bitmaps/v54o.bm delete mode 100644 bitmaps/v54s.bm delete mode 100644 bitmaps/w54o.bm delete mode 100644 bitmaps/w54s.bm mode change 100644 => 100755 gamelist.c delete mode 100644 pixmaps/asdd45.xpm delete mode 100644 pixmaps/asdl45.xpm delete mode 100644 pixmaps/asld45.xpm delete mode 100644 pixmaps/asll45.xpm delete mode 100644 pixmaps/vdd54.xpm delete mode 100644 pixmaps/vdl54.xpm delete mode 100644 pixmaps/vld54.xpm delete mode 100644 pixmaps/vll54.xpm delete mode 100644 pixmaps/wdd54.xpm delete mode 100644 pixmaps/wdl54.xpm delete mode 100644 pixmaps/wld54.xpm delete mode 100644 pixmaps/wll54.xpm delete mode 100644 shiphtml delete mode 100644 winboard/bitmaps/as45o.bmp delete mode 100644 winboard/bitmaps/as45s.bmp delete mode 100644 winboard/bitmaps/as45w.bmp delete mode 100644 winboard/bitmaps/bas.gif delete mode 100644 winboard/bitmaps/bcv.gif delete mode 100644 winboard/bitmaps/bitmaps.h delete mode 100644 winboard/bitmaps/h129o.bmp delete mode 100644 winboard/bitmaps/m129o.bmp delete mode 100644 winboard/bitmaps/v54o.bmp delete mode 100644 winboard/bitmaps/v54s.bmp delete mode 100644 winboard/bitmaps/v54w.bmp delete mode 100644 winboard/bitmaps/w54o.bmp delete mode 100644 winboard/bitmaps/w54s.bmp delete mode 100644 winboard/bitmaps/w54w.bmp delete mode 100644 winboard/bitmaps/was.gif delete mode 100644 winboard/bitmaps/wcv.gif create mode 100644 winboard/internationalize create mode 100644 winboard/language.txt create mode 100644 winboard/metascript.txt create mode 100644 winboard/wchat.c mode change 100644 => 100755 winboard/winboard.dsp mode change 100644 => 100755 winboard/woptions.c xboard-4.7.3/parser.c0000644000175000001440000005667212262562252011405 00000000000000/* * parser.c -- * * Copyright 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include "common.h" #include "backend.h" #include "frontend.h" #include "parser.h" #include "moves.h" extern Board boards[MAX_MOVES]; extern int PosFlags(int nr); int yyboardindex; int yyskipmoves = FALSE; char currentMoveString[4096]; // a bit ridiculous size? char *yy_text; #define PARSEBUFSIZE 10000 static FILE *inputFile; static char *inPtr, *parsePtr, *parseStart; static char inputBuf[PARSEBUFSIZE]; static char yytext[PARSEBUFSIZE]; static char fromString = 0, lastChar = '\n'; #define NOTHING 0 #define NUMERIC 1 #define ALPHABETIC 2 #define BADNUMBER (-2000000000) int ReadLine () { // Read one line from the input file, and append to the buffer char c, *start = inPtr; if(fromString) return 0; // parsing string, so the end is a hard end if(!inputFile) return 0; while((c = fgetc(inputFile)) != EOF) { *inPtr++ = c; if(c == '\n') { *inPtr = NULLCHAR; return 1; } if(inPtr - inputBuf > PARSEBUFSIZE-2) inPtr--; //prevent crash on overflow } if(inPtr == start) return 0; *inPtr++ = '\n', *inPtr = NULLCHAR; // repair missing linefeed at EOF return 1; } int Scan (char c, char **p) { // line-spanning skip to mentioned character or EOF do { while(**p) if(*(*p)++ == c) return 0; } while(ReadLine()); // no closing bracket; force match for entire rest of file. return 1; } int SkipWhite (char **p) { // skip spaces tabs and newlines; return 1 if anything was skipped char *start = *p; do{ while(**p == ' ' || **p == '\t' || **p == '\n' || **p == '\r') (*p)++; } while(**p == NULLCHAR && ReadLine()); // continue as long as ReadLine reads something return *p != start; } inline int Match (char *pattern, char **ptr) { char *p = pattern, *s = *ptr; while(*p && (*p == *s++ || s[-1] == '\r' && *p--)) p++; if(*p == 0) { *ptr = s; return 1; } return 0; // no match, no ptr update } inline int Word (char *pattern, char **p) { if(Match(pattern, p)) return 1; if(*pattern >= 'a' && *pattern <= 'z' && *pattern - **p == 'a' - 'A') { // capitalized (*p)++; if(Match(pattern + 1, p)) return 1; (*p)--; } return 0; } int Verb (char *pattern, char **p) { int res = Word(pattern, p); if(res && !Match("s", p)) Match("ed", p); // eat conjugation suffix, if any return res; } int Number (char **p) { int val = 0; if(**p < '0' || **p > '9') return BADNUMBER; while(**p >= '0' && **p <= '9') { val = 10*val + *(*p)++ - '0'; } return val; } int RdTime (char c, char **p) { char *start = ++(*p), *sec; // increment *p, as it was pointing to the opening ( or { if(Number(p) == BADNUMBER) return 0; sec = *p; if(Match(":", p) && Number(p) != BADNUMBER && *p - sec == 3) { // well formed sec = *p; if(Match(".", p) && Number(p) != BADNUMBER && *(*p)++ == c) return 1; // well-formed fraction *p = sec; if(*(*p)++ == c) return 1; // matching bracket without fraction } *p = start; // failure return 0; } char PromoSuffix (char **p) { char *start = *p; if(**p == 'e' && (Match("ep", p) || Match("e.p.", p))) { *p = start; return NULLCHAR; } // non-compliant e.p. suffix is no promoChar! if(**p == '+' && gameInfo.variant == VariantShogi) { (*p)++; return '+'; } if(**p == '=' || (gameInfo.variant == VariantSChess) && **p == '/') (*p)++; // optional = (or / for Seirawan gating) if(**p == '(' && (*p)[2] == ')' && isalpha( (*p)[1] )) { (*p) += 3; return ToLower((*p)[-2]); } if(isalpha(**p)) return ToLower(*(*p)++); if(*p != start) return '='; // must be the optional = return NULLCHAR; // no suffix detected } int NextUnit (char **p) { // Main parser routine int coord[4], n, result, piece, i; char type[4], promoted, separator, slash, *oldp, *commentEnd, c; int wom = quickFlag ? quickFlag&1 : WhiteOnMove(yyboardindex); // ********* try white first, because it is so common ************************** if(**p == ' ' || **p == '\n' || **p == '\t') { parseStart = (*p)++; return Nothing; } if(**p == NULLCHAR) { // make sure there is something to parse if(fromString) return 0; // we are parsing string, so the end is really the end *p = inPtr = inputBuf; if(!ReadLine()) return 0; // EOF } else if(inPtr > inputBuf + PARSEBUFSIZE/2) { // buffer fills up with already parsed stuff char *q = *p, *r = inputBuf; while(*r++ = *q++); *p = inputBuf; inPtr = r - 1; } parseStart = oldp = *p; // remember where we begin // ********* attempt to recognize a SAN move in the leading non-blank text ***** piece = separator = promoted = slash = n = 0; for(i=0; i<4; i++) coord[i] = -1, type[i] = NOTHING; if(**p == '+') (*p)++, promoted++; if(**p >= 'a' && **p <= 'z' && (*p)[1]== '@') piece =*(*p)++ + 'A' - 'a'; else if(**p >= 'A' && **p <= 'Z') { piece = *(*p)++; // Note we could test for 2-byte non-ascii names here if(**p == '/') slash = *(*p)++; } while(n < 4) { if(**p >= 'a' && **p < 'x') coord[n] = *(*p)++ - 'a', type[n++] = ALPHABETIC; else if((i = Number(p)) != BADNUMBER) coord[n] = i, type[n++] = NUMERIC; else break; if(n == 2 && type[0] == type[1]) { // if two identical types, the opposite type in between must have been missing type[2] = type[1]; coord[2] = coord[1]; type[1] = NOTHING; coord[1] = -1; n++; } } // we always get here, and might have read a +, a piece, and upto 4 potential coordinates if(n <= 2) { // could be from-square or disambiguator, when -:xX follow, or drop with @ directly after piece, but also to-square if(**p == '-' || **p == ':' || **p == 'x' || **p == 'X' || // these cannot be move suffix, so to-square must follow (**p == '@' || **p == '*') && n == 0 && !promoted && piece) { // P@ must also be followed by to-square separator = *(*p)++; if(n == 1) coord[1] = coord[0]; // must be disambiguator, but we do not know which yet n = 2; while(n < 4) { // attempt to read to-square if(**p >= 'a' && **p < 'x') coord[n] = *(*p)++ - 'a', type[n++] = ALPHABETIC; else if((i = Number(p)) != BADNUMBER) coord[n] = i, type[n++] = NUMERIC; else break; } } else if((**p == '+' || **p == '=') && n == 1 && piece && type[0] == NUMERIC) { // can be traditional Xiangqi notation separator = *(*p)++; n = 2; if((i = Number(p)) != BADNUMBER) coord[n] = i, type[n++] = NUMERIC; } else if(n == 2) { // only one square mentioned, must be to-square while(n < 4) { coord[n] = coord[n-2], type[n] = type[n-2], coord[n-2] = -1, type[n-2] = NOTHING; n++; } } } else if(n == 3 && type[1] != NOTHING) { // must be hyphenless disambiguator + to-square for(i=3; i>0; i--) coord[i] = coord[i-1], type[i] = type[i-1]; // move to-square to where it belongs type[1] = NOTHING; // disambiguator goes in first two positions n = 4; } // we always get here; move must be completely read now, with to-square coord(s) at end if(n == 3) { // incomplete to-square. Could be Xiangqi traditional, or stuff like fxg if(piece && type[1] == NOTHING && type[0] == NUMERIC && type[2] == NUMERIC && (separator == '+' || separator == '=' || separator == '-')) { // Xiangqi traditional return ImpossibleMove; // for now treat as invalid } // fxg stuff, but also things like 0-0, 0-1 and 1-0 if(!piece && type[1] == NOTHING && type[0] == ALPHABETIC && type[2] == ALPHABETIC && (coord[0] != 14 || coord[2] != 14) /* reserve oo for castling! */ ) { piece = 'P'; n = 4; // kludge alert: fake full to-square } } else if(n == 1 && type[0] == NUMERIC && coord[0] > 1) { while(**p == '.') (*p)++; return Nothing; } // fast exit for move numbers if(n == 4 && type[2] != type[3] && // we have a valid to-square (kludge: type[3] can be NOTHING on fxg type move) (piece || !promoted) && // promoted indicator only valid on named piece type (type[2] == ALPHABETIC || gameInfo.variant == VariantShogi)) { // in Shogi also allow alphabetic rank DisambiguateClosure cl; int fromX, fromY, toX, toY; if(slash && (!piece || type[1] == NOTHING)) goto badMove; // slash after piece only in ICS long format if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ if(type[2] == NUMERIC) { // alpha-rank coord[2] = BOARD_RGHT - BOARD_LEFT - coord[2]; coord[3] = BOARD_HEIGHT - coord[3]; if(coord[0] >= 0) coord[0] = BOARD_RGHT - BOARD_LEFT - coord[0]; if(coord[1] >= 0) coord[1] = BOARD_HEIGHT - coord[1]; } toX = cl.ftIn = (currentMoveString[2] = coord[2] + 'a') - AAA; toY = cl.rtIn = (currentMoveString[3] = coord[3] + '0') - ONE; if(type[3] == NOTHING) cl.rtIn = -1; // for fxg type moves ask for toY disambiguation else if(toY >= BOARD_HEIGHT || toY < 0) return ImpossibleMove; // vert off-board to-square if(toX < BOARD_LEFT || toX >= BOARD_RGHT) return ImpossibleMove; if(piece) { cl.pieceIn = CharToPiece(wom ? piece : ToLower(piece)); if(cl.pieceIn == EmptySquare) return ImpossibleMove; // non-existent piece if(promoted) cl.pieceIn = (ChessSquare) (PROMOTED cl.pieceIn); } else cl.pieceIn = EmptySquare; if(separator == '@' || separator == '*') { // drop move. We only get here without from-square or promoted piece fromY = DROP_RANK; fromX = cl.pieceIn; currentMoveString[0] = piece; currentMoveString[1] = '@'; return LegalityTest(boards[yyboardindex], PosFlags(yyboardindex)&~F_MANDATORY_CAPTURE, fromY, fromX, toY, toX, NULLCHAR); } if(type[1] == NOTHING && type[0] != NOTHING) { // there is a disambiguator if(type[0] != type[2]) coord[0] = -1, type[1] = type[0], type[0] = NOTHING; // it was a rank-disambiguator } if( type[1] != type[2] && // means fromY is of opposite type as ToX, or NOTHING (type[0] == NOTHING || type[0] == type[2]) ) { // well formed fromX = (currentMoveString[0] = coord[0] + 'a') - AAA; fromY = (currentMoveString[1] = coord[1] + '0') - ONE; currentMoveString[4] = cl.promoCharIn = PromoSuffix(p); currentMoveString[5] = NULLCHAR; if(type[0] != NOTHING && type[1] != NOTHING && type[3] != NOTHING) { // fully specified. // Note that Disambiguate does not work for illegal moves, but flags them as impossible if(piece) { // check if correct piece indicated ChessSquare realPiece = boards[yyboardindex][fromY][fromX]; if(PieceToChar(realPiece) == '~') realPiece = (ChessSquare) (DEMOTED realPiece); if(!(appData.icsActive && PieceToChar(realPiece) == '+') && // trust ICS if it moves promoted pieces piece && realPiece != cl.pieceIn) return ImpossibleMove; } result = LegalityTest(boards[yyboardindex], PosFlags(yyboardindex), fromY, fromX, toY, toX, cl.promoCharIn); if (currentMoveString[4] == NULLCHAR) { // suppy missing mandatory promotion character if(result == WhitePromotion || result == BlackPromotion) { switch(gameInfo.variant) { case VariantCourier: case VariantShatranj: currentMoveString[4] = PieceToChar(BlackFerz); break; case VariantGreat: currentMoveString[4] = PieceToChar(BlackMan); break; case VariantShogi: currentMoveString[4] = '+'; break; default: currentMoveString[4] = PieceToChar(BlackQueen); } } else if(result == WhiteNonPromotion || result == BlackNonPromotion) { currentMoveString[4] = '='; } } else if(appData.testLegality && gameInfo.variant != VariantSChess && // strip off unnecessary and false promo characters !(result == WhitePromotion || result == BlackPromotion || result == WhiteNonPromotion || result == BlackNonPromotion)) currentMoveString[4] = NULLCHAR; return result; } else if(cl.pieceIn == EmptySquare) cl.pieceIn = wom ? WhitePawn : BlackPawn; cl.ffIn = type[0] == NOTHING ? -1 : coord[0] + 'a' - AAA; cl.rfIn = type[1] == NOTHING ? -1 : coord[1] + '0' - ONE; Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl); if(cl.kind == ImpossibleMove && !piece && type[1] == NOTHING // fxg5 type && toY == (wom ? 4 : 3)) { // could be improperly written e.p. cl.rtIn += wom ? 1 : -1; // shift target square to e.p. square Disambiguate(boards[yyboardindex], PosFlags(yyboardindex), &cl); if((cl.kind != WhiteCapturesEnPassant && cl.kind != BlackCapturesEnPassant)) return ImpossibleMove; // nice try, but no cigar } currentMoveString[0] = cl.ff + AAA; currentMoveString[1] = cl.rf + ONE; currentMoveString[3] = cl.rt + ONE; currentMoveString[4] = cl.promoChar; if((cl.kind == WhiteCapturesEnPassant || cl.kind == BlackCapturesEnPassant) && (Match("ep", p) || Match("e.p.", p))); return (int) cl.kind; } } badMove:// we failed to find algebraic move *p = oldp; // Next we do some common symbols where the first character commits us to things that cannot possibly be a move // ********* PGN tags ****************************************** if(**p == '[') { oldp = ++(*p); if(Match("--", p)) { // "[--" could be start of position diagram if(!Scan(']', p) && (*p)[-3] == '-' && (*p)[-2] == '-') return PositionDiagram; *p = oldp; } SkipWhite(p); if(isdigit(**p) || isalpha(**p)) { do (*p)++; while(isdigit(**p) || isalpha(**p) || **p == '+' || **p == '-' || **p == '=' || **p == '_' || **p == '#'); SkipWhite(p); if(**p == '"') { (*p)++; while(**p != '\n' && (*(*p)++ != '"'|| (*p)[-2] == '\\')); // look for unescaped quote if((*p)[-1] !='"') { *p = oldp; Scan(']', p); return Comment; } // string closing delimiter missing SkipWhite(p); if(*(*p)++ == ']') return PGNTag; } } Scan(']', p); return Comment; } // ********* SAN Castings ************************************* if(**p == 'O' || **p == 'o' || **p == '0' && !Match("00:", p)) { // exclude 00 in time stamps int castlingType = 0; if(Match("O-O-O", p) || Match("o-o-o", p) || Match("0-0-0", p) || Match("OOO", p) || Match("ooo", p) || Match("000", p)) castlingType = 2; else if(Match("O-O", p) || Match("o-o", p) || Match("0-0", p) || Match("OO", p) || Match("oo", p) || Match("00", p)) castlingType = 1; if(castlingType) { //code from old parser, collapsed for both castling types, and streamlined a bit int rf, ff, rt, ft; ChessSquare king; char promo=NULLCHAR; if(gameInfo.variant == VariantSChess) promo = PromoSuffix(p); if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */ if (wom) { rf = 0; rt = 0; king = WhiteKing; } else { rf = BOARD_HEIGHT-1; rt = BOARD_HEIGHT-1; king = BlackKing; } ff = (BOARD_WIDTH-1)>>1; // this would be d-file if (boards[yyboardindex][rf][ff] == king) { /* ICS wild castling */ ft = castlingType == 1 ? BOARD_LEFT+1 : (gameInfo.variant == VariantJanus ? BOARD_RGHT-2 : BOARD_RGHT-3); } else { ff = BOARD_WIDTH>>1; // e-file ft = castlingType == 1 ? BOARD_RGHT-2 : BOARD_LEFT+2; } if(PosFlags(0) & F_FRC_TYPE_CASTLING) { if (wom) { ff = initialRights[2]; ft = initialRights[castlingType-1]; } else { ff = initialRights[5]; ft = initialRights[castlingType+2]; } if (appData.debugMode) fprintf(debugFP, "Parser FRC (type=%d) %d %d\n", castlingType, ff, ft); if(ff == NoRights || ft == NoRights) return ImpossibleMove; } sprintf(currentMoveString, "%c%c%c%c%c",ff+AAA,rf+ONE,ft+AAA,rt+ONE,promo); if (appData.debugMode) fprintf(debugFP, "(%d-type) castling %d %d\n", castlingType, ff, ft); return (int) LegalityTest(boards[yyboardindex], PosFlags(yyboardindex)&~F_MANDATORY_CAPTURE, // [HGM] losers: e.p.! rf, ff, rt, ft, promo); } } // ********* variations (nesting) ****************************** if(**p =='(') { if(RdTime(')', p)) return ElapsedTime; return Open; } if(**p ==')') { (*p)++; return Close; } if(**p == ';') { while(**p != '\n') (*p)++; return Comment; } // ********* Comments and result messages ********************** *p = oldp; commentEnd = NULL; result = 0; if(**p == '{') { if(RdTime('}', p)) return ElapsedTime; if(lastChar == '\n' && Match("--------------\n", p)) { char *q; i = Scan ('}', p); q = *p - 16; if(Match("\n--------------}\n", &q)) return PositionDiagram; } else i = Scan('}', p); commentEnd = *p; if(i) return Comment; // return comment that runs to EOF immediately } if(commentEnd) SkipWhite(p); if(Match("*", p)) result = GameUnfinished; else if(**p == '0') { if( Match("0-1", p) || Match("0/1", p) || Match("0:1", p) || Match("0 - 1", p) || Match("0 / 1", p) || Match("0 : 1", p)) result = BlackWins; } else if(**p == '1') { if( Match("1-0", p) || Match("1/0", p) || Match("1:0", p) || Match("1 - 0", p) || Match("1 / 0", p) || Match("1 : 0", p)) result = WhiteWins; else if(Match("1/2 - 1/2", p) || Match("1/2:1/2", p) || Match("1/2 : 1/2", p) || Match("1 / 2 - 1 / 2", p) || Match("1 / 2 : 1 / 2", p) || Match("1/2", p) || Match("1 / 2", p)) result = GameIsDrawn; } if(result) { if(Match(" (", p) && !Scan(')', p) || Match(" {", p) && !Scan('}', p)) { // there is a comment after the PGN result! if(commentEnd) { *p = commentEnd; return Comment; } // so comment before it is normal comment; return that first } return result; // this returns a possible preceeding comment as result details } if(commentEnd) { *p = commentEnd; return Comment; } // there was no PGN result following, so return as normal comment // ********* Move numbers (after castlings or PGN results!) *********** if((i = Number(p)) != BADNUMBER) { // a single number was read as part of our attempt to read a move char *numEnd = *p; if(**p == '.') (*p)++; SkipWhite(p); if(**p == '+' || isalpha(**p) || gameInfo.variant == VariantShogi && *p != numEnd && isdigit(**p)) { *p = numEnd; return i == 1 ? MoveNumberOne : Nothing; } *p = numEnd; return Nothing; } // ********* non-compliant game-result indicators ********************* if(Match("+-+", p) || Word("stalemate", p)) return GameIsDrawn; if(Match("++", p) || Verb("resign", p) || (Word("check", p) || 1) && Word("mate", p) ) return (wom ? BlackWins : WhiteWins); c = ToUpper(**p); if(Word("w", p) && (Match("hite", p) || 1) || Word("b", p) && (Match("lack", p) || 1) ) { if(**p != ' ') return Nothing; ++*p; if(Verb("disconnect", p)) return GameUnfinished; if(Verb("resign", p) || Verb("forfeit", p) || Word("mated", p) || Word("lost", p) || Word("loses", p)) return (c == 'W' ? BlackWins : WhiteWins); if(Word("mates", p) || Word("wins", p) || Word("won", p)) return (c != 'W' ? BlackWins : WhiteWins); return Nothing; } if(Word("draw", p)) { if(**p == 'n') (*p)++; if(**p != ' ') return GameIsDrawn; oldp = ++*p; if(Word("agreed", p)) return GameIsDrawn; if(Match("by ", p) && (Word("repetition", p) || Word("agreement", p)) ) return GameIsDrawn; *p = oldp; if(*(*p)++ == '(') { while(**p != '\n') if(*(*p)++ == ')') break; if((*p)[-1] == ')') return GameIsDrawn; } *p = oldp - 1; return GameIsDrawn; } // ********* Numeric annotation glyph ********************************** if(**p == '$') { (*p)++; if(Number(p) != BADNUMBER) return NAG; return Nothing; } // ********** by now we are getting down to the silly stuff ************ if(Word("gnu", p) || Match("GNU", p)) { if(**p == ' ') (*p)++; if(Word("chess", p) || Match("CHESS", p)) { char *q; if((q = strstr(*p, "game")) || (q = strstr(*p, "GAME")) || (q = strstr(*p, "Game"))) { (*p) = q + 4; return GNUChessGame; } } return Nothing; } if(lastChar == '\n' && (Match("# ", p) || Match("; ", p) || Match("% ", p))) { while(**p != '\n' && **p != ' ') (*p)++; if(**p == ' ' && (Match(" game file", p) || Match(" position file", p))) { while(**p != '\n') (*p)++; // skip to EOLN return XBoardGame; } *p = oldp; // we might need to re-match the skipped stuff } if(Match("@@@@", p) || Match("--", p) || Match("Z0", p) || Match("pass", p) || Match("null", p)) { strncpy(currentMoveString, "@@@@", 5); return yyboardindex & F_WHITE_ON_MOVE ? WhiteDrop : BlackDrop; } // ********* Efficient skipping of (mostly) alphabetic chatter ********** while(isdigit(**p) || isalpha(**p) || **p == '-') (*p)++; if(*p != oldp) { if(**p == '\'') { while(isdigit(**p) || isalpha(**p) || **p == '-' || **p == '\'') (*p)++; return Nothing; // random word } if(lastChar == '\n' && Match(": ", p)) { // mail header, skip indented lines do { while(**p != '\n') (*p)++; if(!ReadLine()) return Nothing; // append next line if not EOF } while(Match("\n ", p) || Match("\n\t", p)); } return Nothing; } // ********* Prevent 00 in unprotected time stamps to be mistaken for castling ******* if(Match(":00", p)) return Nothing; // ********* Could not match to anything. Return offending character **** (*p)++; return Nothing; } /* Return offset of next pattern in the current file. */ int yyoffset () { return ftell(inputFile) - (inPtr - parsePtr); // subtract what is read but not yet parsed } void yynewfile (FILE *f) { // prepare parse buffer for reading file inputFile = f; inPtr = parsePtr = inputBuf; fromString = 0; lastChar = '\n'; *inPtr = NULLCHAR; // make sure we will start by reading a line } void yynewstr P((char *s)) { parsePtr = s; inputFile = NULL; fromString = 1; } int yylex () { // this replaces the flex-generated parser int result = NextUnit(&parsePtr); char *p = parseStart, *q = yytext; while(p < parsePtr) *q++ = *p++; // copy the matched text to yytext[] *q = NULLCHAR; lastChar = q[-1]; return result; } int Myylex () { // [HGM] wrapper for yylex, which treats nesting of parentheses int symbol, nestingLevel = 0, i=0; char *p; static char buf[256*MSG_SIZ]; buf[0] = NULLCHAR; do { // eat away anything not at level 0 symbol = yylex(); if(symbol == Open) nestingLevel++; if(nestingLevel) { // save all parsed text between (and including) the () for(p=yytext; *p && i<256*MSG_SIZ-2;) buf[i++] = *p++; buf[i] = NULLCHAR; } if(symbol == 0) break; // ran into EOF if(symbol == Close) symbol = Comment, nestingLevel--; } while(nestingLevel || symbol == Nothing); yy_text = buf[0] ? buf : (char*)yytext; return symbol; } ChessMove yylexstr (int boardIndex, char *s, char *buf, int buflen) { ChessMove ret; char *savPP = parsePtr; fromString = 1; yyboardindex = boardIndex; parsePtr = s; ret = (ChessMove) Myylex(); strncpy(buf, yy_text, buflen-1); buf[buflen-1] = NULLCHAR; parsePtr = savPP; fromString = 0; return ret; } xboard-4.7.3/xboard.info0000644000175000001440000105140012262562300012054 00000000000000This is xboard.info, produced by makeinfo version 4.13 from xboard.texi. INFO-DIR-SECTION Games START-INFO-DIR-ENTRY * xboard: (xboard). An X Window System graphical chessboard. END-INFO-DIR-ENTRY  File: xboard.info, Node: Top, Next: Major modes, Up: (dir) Introduction ************ XBoard is a graphical chessboard that can serve as a user interface to chess engines (such as GNU Chess), the Internet Chess Servers, electronic mail correspondence chess, or your own collection of saved games. This manual documents version 4.7.3 of XBoard. * Menu: * Major modes:: The main things XBoard can do. * Basic operation:: Mouse and keyboard functions. * Menus:: Menus, buttons, and keys. * Options:: Command options supported by XBoard. * Chess Servers:: Using XBoard with an Internet Chess Server (ICS). * Firewalls:: Connecting to a chess server through a firewall. * Environment:: Environment variables. * Limitations:: Known limitations and/or bugs. * Problems:: How and where to report any problems you run into. * Contributors:: People who have helped developing XBoard. * CMail:: Using XBoard for electronic correspondence chess. * Other programs:: Other programs you can use with XBoard. * Copyright:: Copyright notice for this manual. * Copying:: The GNU General Public License. * Index:: Index of concepts and symbol names.  File: xboard.info, Node: Major modes, Next: Basic operation, Prev: Top, Up: Top 1 Major modes ************* XBoard always runs in one of four major modes. You select the major mode from the command line when you start up XBoard. xboard [options] As an interface to GNU Chess or another chess engine running on your machine, XBoard lets you play a game against the machine, set up arbitrary positions, force variations, watch a game between two chess engines, interactively analyze your stored games or set up and analyze arbitrary positions. (Note: Not all chess engines support analysis.) xboard -ics -icshost hostname [options] As Internet Chess Server (ICS) interface, XBoard lets you play against other ICS users, observe games they are playing, or review games that have recently finished. Most of the ICS "wild" chess variants are supported, including bughouse. xboard -ncp [options] XBoard can also be used simply as an electronic chessboard to play through games. It will read and write game files and allow you to play through variations manually. You can use it to browse games off the net or review games you have saved. These features are also available in the other modes. |pxboard If you want to pipe games into XBoard, use the supplied shell script `pxboard'. For example, from the news reader `xrn', find a message with one or more games in it, click the Save button, and type `|pxboard' as the file name. cmail [options] As an interface to electronic mail correspondence chess, XBoard works with the cmail program. See *note CMail:: below for instructions.  File: xboard.info, Node: Basic operation, Next: Menus, Prev: Major modes, Up: Top 2 Basic operation ***************** To move a piece, you can drag it with the left mouse button, or you can click the left mouse button once on the piece, then once more on the destination square. In crazyhouse, bughouse or shogi you can drag and drop pieces to the board from the holdings squares displayed next to the board. Old behavior, where right-clicking a square brings up a menu where you can select what piece to drop on it can still be selected through the `Drop Menu' option. Only in Edit Position mode right and middle clicking a square is still used to put a piece on it, and the piece to drop is selected by sweeping the mouse vertically with the button held down. The default function of the right mouse button in other modes is to display the position the chess program thinks it will end up in. While moving the mouse vertically with this button pressed XBoard will step through the principal variation to show how this position will be reached. Lines of play displayed in the engine-output window, or PGN variations in the comment window can similarly be played out on the board, by right-clicking on them. Only in Analysis mode, when you walk along a PV, releasing the mouse button will forward the game upto that point, like you entered all previous PV moves. As the display of the PV in that case starts after the first move a simple right-click will play the move the engine indicates. In Analysis mode you can also make a move by grabbing the piece with a double-click of the left mouse button (or while keeping the Ctrl key pressed). In this case the move you enter will not be played, but will be excluded from the analysis of the current position. (Or included if it was already excluded; it is a toggle.) This only works for engines that support this feature. When connected to an ICS, it is possible to call up a graphical representation of players seeking a game in stead of the chess board, when the latter is not in use (i.e. when you are not playing or observing). Left-clicking the display area will switch between this 'seek graph' and the chess board. Hovering the mouse pointer over a dot will show the details of the seek ad in the message field above the board. Left-clicking the dot will challenge that player. Right-clicking a dot will 'push it to the back', to reveal any dots that were hidden behind it. Right-clicking off dots will refresh the graph. Most other XBoard commands are available from the menu bar. The most frequently used commands also have shortcut keys or on-screen buttons. These shortcut keystrokes are mostly non-printable characters. Typing a letter or digit while the board window has focus will bring up a type-in box with the typed letter already in it. You can use that to type a move in siuations where it is your turn to enter a move, type a move number to call up the position after that move in the display, or, in Edit Position mode, type a FEN. Some rarely used parameters can only be set through options on the command line used to invoke XBoard. XBoard uses a settings file, in which it can remember any changes to the settings that are made through menus or command-line options, so they will still apply when you restart XBoard for another session. The settings can be saved into this file automatically when XBoard exits, or on explicit request of the user. The default name for the settings file is /etc/xboard/xboard.conf, but in a standard install this file is only used as a master settings file that determines the system-wide default settings, and defers reading and writing of user settings to a user-specific file like ~/.xboardrc in the user's home directory. When XBoard is iconized, its graphical icon is a white knight if it is White's turn to move, a black knight if it is Black's turn.  File: xboard.info, Node: Menus, Next: Options, Prev: Basic operation, Up: Top 3 Menus, buttons, and keys ************************** * Menu: * File Menu:: Accessing external games and positions. * Edit Menu:: Altering games, positions, PGN tags or comments. * View Menu:: Controlling XBoard's shape and looks. * Mode Menu:: Selecting XBoard's mode. * Action Menu:: Talking to the chess engine or ICS opponents. * Engine Menu:: Controlling settings and actions of the engine(s). * Options Menu:: User preferences. * Help Menu:: Getting help. * Keys:: Other shortcut keys.  File: xboard.info, Node: File Menu, Next: Edit Menu, Up: Menus 3.1 File Menu ============= New Game Resets XBoard and the chess engine to the beginning of a new chess game. The `Ctrl-N' key is a keyboard equivalent. In Internet Chess Server mode, clears the current state of XBoard, then resynchronizes with the ICS by sending a refresh command. If you want to stop playing, observing, or examining an ICS game, use an appropriate command from the Action menu, not `New Game'. *Note Action Menu::. New Shuffle Game Similar to `New Game', but allows you to specify a particular initial position (according to a standardized numbering system) in chess variants which use randomized opening positions (e.g. Chess960). You can also press the `Pick Fixed' button to let XBoard generate a random number for you. The thus selected opening position will then persistently be chosen on any following New Game command until you use this menu to select another. Selecting position number -1 (or pushing the `Randomize' button) will produce a newly randomized position on any new game. Using this menu item in variants that normally do not shuffle their opening position does cause these variants to become shuffle variants until you use the `New Shuffle Game' menu to explicitly switch the randomization off, or select a new variant. New Variant Allows you to select a new chess variant in non-ICS mode. (In ICS play, the ICS is responsible for deciding which variant will be played, and XBoard adapts automatically.) The shifted `Alt+V' key is a keyboard equivalent. If you play with an engine, the engine must be able to play the selected variant, or the command will be ignored. XBoard supports all major variants, such as xiangqi, shogi, chess, chess960, Capablanca Chess, shatranj, crazyhouse, bughouse. But not every board size has built-in bitmaps for un-orthodox pieces! Only sizes bulky (72) and middling (49) have all pieces, while size petite (33) has most. These sizes would have to be set at startup through the `size' command-line option when you start up XBoard for such variants to be playable. You can overrule the default board format of the selected variant, (e.g. to play suicide chess on a 6 x 6 board), in this dialog, but normally you would not do that, and leave them at '-1', which means 'default'. Load Game Plays a game from a record file. The `Ctrl-O' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the file contains more than one game, a second pop-up dialog displays a list of games (with information drawn from their PGN tags, if any), and you can select the one you want. Alternatively, you can load the Nth game in the file directly, by typing the number `N' after the file name, separated by a space. The game file parser will accept PGN (portable game notation), or in fact almost any file that contains moves in algebraic notation. Notation of the form `P@f7' is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. If the file includes a PGN position (FEN tag), or an old-style XBoard position diagram bracketed by `[--' and `--]' before the first move, the game starts from that position. Text enclosed in parentheses, square brackets, or curly braces is assumed to be commentary and is displayed in a pop-up window. Any other text in the file is ignored. PGN variations (enclosed in parentheses) also are treated as comments; however, if you rights-click them in the comment window, XBoard will shelve the current line, and load the the selected variation, so you can step through it. You can later revert to the previous line with the `Revert' command. This way you can walk quite complex varation trees with XBoard. The nonstandard PGN tag [Variant "varname"] functions similarly to the -variant command-line option (see below), allowing games in certain chess variants to be loaded. Note that it must appear before any FEN tag for XBoard to recognize variant FENs appropriately. There is also a heuristic to recognize chess variants from the Event tag, by looking for the strings that the Internet Chess Servers put there when saving variant ("wild") games. Load Position Sets up a position from a position file. A pop-up dialog prompts you for the file name. The shifted `Ctrl-O' key is a keyboard equivalent. If the file contains more than one saved position, and you want to load the Nth one, type the number N after the file name, separated by a space. Position files must be in FEN (Forsythe-Edwards notation), or in the format that the Save Position command writes when oldSaveStyle is turned on. Load Next Position Loads the next position from the last position file you loaded. The shifted `PgDn' key is a keyboard equivalent. Load Previous Position Loads the previous position from the last position file you loaded. The shifted `PgUp' key is a keyboard equivalent. Not available if the last position was loaded from a pipe. Save Game Appends a record of the current game to a file. The `Ctrl-S' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the game did not begin with the standard starting position, the game file includes the starting position used. Games are saved in the PGN (portable game notation) format, unless the oldSaveStyle option is true, in which case they are saved in an older format that is specific to XBoard. Both formats are human-readable, and both can be read back by the `Load Game' command. Notation of the form `P@f7' is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. Save Position Appends a diagram of the current position to a file. The shifted `Ctrl+S' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. Positions are saved in FEN (Forsythe-Edwards notation) format unless the `oldSaveStyle' option is true, in which case they are saved in an older, human-readable format that is specific to XBoard. Both formats can be read back by the `Load Position' command. Save Games as Book Creates an opening book from the currently loaded game file. The book will be saved on the file specified in the `Common Engine' options dialog. The value of `Book Depth' specified in that same dialog will be used to determine how many moves of each game will be added to the internal book buffer. This command can take a long time to process, and the size of the buffer is currently limited. At the end the buffer will be saved as a Polyglot book, but the buffer will ot be cleared, so that you can continue adding games from other game files. Mail Move Reload CMail Message See *note CMail::. Exit Exits from XBoard. The `Ctrl-Q' key is a keyboard equivalent.  File: xboard.info, Node: Edit Menu, Next: View Menu, Prev: File Menu, Up: Menus 3.2 Edit Menu ============= Copy Game Copies a record of the current game to an internal clipboard in PGN format and sets the X selection to the game text. The `Ctrl-C' key is a keyboard equivalent. The game can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Game command. Copy Position Copies the current position to an internal clipboard in FEN format and sets the X selection to the position text. The shifted `Ctrl-C' key is a keyboard equivalent. The position can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Position command. Copy Game List Copies the current game list to the clipboard, and sets the X selection to this text. A format of comma-separated double-quoted strings is used, including all tags, so it can be easily imported into spread-sheet programs. Paste Game Interprets the current X selection as a game record and loads it, as with Load Game. The `Ctrl-V' key is a keyboard equivalent. Paste Position Interprets the current X selection as a FEN position and loads it, as with Load Position. The shifted `Ctrl-V' key is a keyboard equivalent. Edit Game Allows you to make moves for both Black and White, and to change moves after backing up with the `Backward' command. The clocks do not run. The `Ctrl-E' key is a keyboard equivalent. In chess engine mode, the chess engine continues to check moves for legality but does not participate in the game. You can bring the chess engine into the game by selecting `Machine White', `Machine Black', or `Two Machines'. In ICS mode, the moves are not sent to the ICS: `Edit Game' takes XBoard out of ICS Client mode and lets you edit games locally. If you want to edit games on ICS in a way that other ICS users can see, use the ICS `examine' command or start an ICS match against yourself. Edit Position Lets you set up an arbitrary board position. The shifted `Ctrl-E' key is a keyboard equivalent. Use mouse button 1 to drag pieces to new squares, or to delete a piece by dragging it off the board or dragging an empty square on top of it. To drop a new piece on a square, press mouse button 2 or 3 over the square. This puts a white or black pawn in the square, respectively, but you can change that to any other piece type by dragging the mouse down before you release the button. You will then see the piece on the originally clicked square cycle through the available pieces (including those of opposite color), and can release the button when you see the piece you want. To alter the side to move, you can click the clock (the words White and Black above the board) of the side you want to give the move to. To clear the board you can click the clock of the side that alread has the move (which is highlighted in black). The old behavior with a piece menu can still be configured with the aid of the `pieceMenu' option. Selecting `Edit Position' causes XBoard to discard all remembered moves in the current game. In ICS mode, changes made to the position by `Edit Position' are not sent to the ICS: `Edit Position' takes XBoard out of `ICS Client' mode and lets you edit positions locally. If you want to edit positions on ICS in a way that other ICS users can see, use the ICS `examine' command, or start an ICS match against yourself. (See also the ICS Client topic above.) Edit Tags Lets you edit the PGN (portable game notation) tags for the current game. After editing, the tags must still conform to the PGN tag syntax: ::= ::= [ ] ::= ::= See the PGN Standard for full details. Here is an example: [Event "Portoroz Interzonal"] [Site "Portoroz, Yugoslavia"] [Date "1958.08.16"] [Round "8"] [White "Robert J. Fischer"] [Black "Bent Larsen"] [Result "1-0"] Any characters that do not match this syntax are silently ignored. Note that the PGN standard requires all games to have at least the seven tags shown above. Any that you omit will be filled in by XBoard with `?' (unknown value), or `-' (inapplicable value). Edit Comment Adds or modifies a comment on the current position. Comments are saved by `Save Game' and are displayed by `Load Game', PGN variations will also be printed in this window, and can be promoted to main line by right-clicking them. `Forward', and `Backward'. Edit Book Pops up a window listing the moves available in the GUI book (specified in the `Common Engine Settings' dialog) from the currently displayed position, together with their weights and (optionally in braces) learn info. You can then edit this list, and the new list will be stored back into the book when you press OK. Note that the listed percentages are neither used, nor updated when you change the weights; they are just there as an optical aid. Revert Annotate If you are examining an ICS game and Pause mode is off, Revert issues the ICS command `revert'. In local mode, when you were editing or analyzing a game, and the `-variations' command-line option is switched on, you can start a new variation by holding the Shift key down while entering a move not at the end of the game. Variations can also become the currently displayed line by clicking a PGN variation displayed in the Comment window. This can be applied recursively, so that you can analyze variations on variations; each time you create a new variation by entering an alternative move with Shift pressed, or select a new one from the Comment window, the current variation will be shelved. `Revert' allows you to return to the most recently shelved variation. The difference between `Revert' and `Annotate' is that with the latter, the variation you are now abandoning will be added as a comment (in PGN variation syntax, i.e. between parentheses) to the original move where you deviated, for later recalling. The `Home' key is a keyboard equivalent to `Revert'. Truncate Game Discards all remembered moves of the game beyond the current position. Puts XBoard into `Edit Game' mode if it was not there already. The `End' key is a keyboard equivalent. Backward Steps backward through a series of remembered moves. The `[<]' button and the `Alt+LeftArrow' key are equivalents, as is turning the mouse wheel towards you. In addition, pressing the Control key steps back one move, and releasing it steps forward again. In most modes, `Backward' only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on an ICS, or loading a game. If you select `Backward' in any of these situations, you will not be allowed to make a different move. Use `Retract Move' or `Edit Game' if you want to change past moves. If you are examining an ICS game, the behavior of `Backward' depends on whether XBoard is in Pause mode. If Pause mode is off, `Backward' issues the ICS backward command, which backs up everyone's view of the game and allows you to make a different move. If Pause mode is on, `Backward' only backs up your local view. Forward Steps forward through a series of remembered moves (undoing the effect of `Backward') or forward through a game file. The `[>]' button and the `Alt+RightArrow' key are equivalents, as is turning the mouse wheel away from you. If you are examining an ICS game, the behavior of Forward depends on whether XBoard is in Pause mode. If Pause mode is off, `Forward' issues the ICS forward command, which moves everyone's view of the game forward along the current line. If Pause mode is on, `Forward' only moves your local view forward, and it will not go past the position that the game was in when you paused. Back to Start Jumps backward to the first remembered position in the game. The `[<<]' button and the `Alt+Home' key are equivalents. In most modes, Back to Start only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a local chess engine, playing or observing a game on a chess server, or loading a game. If you select `Back to Start' in any of these situations, you will not be allowed to make different moves. Use `Retract Move' or `Edit Game' if you want to change past moves; or use Reset to start a new game. If you are examining an ICS game, the behavior of `Back to Start' depends on whether XBoard is in Pause mode. If Pause mode is off, `Back to Start' issues the ICS `backward 999999' command, which backs up everyone's view of the game to the start and allows you to make different moves. If Pause mode is on, `Back to Start' only backs up your local view. Forward to End Jumps forward to the last remembered position in the game. The `[>>]' button and the `Alt+End' key are equivalents. If you are examining an ICS game, the behavior of `Forward to End' depends on whether XBoard is in Pause mode. If Pause mode is off, `Forward to End' issues the ICS `forward 999999' command, which moves everyone's view of the game forward to the end of the current line. If Pause mode is on, `Forward to End' only moves your local view forward, and it will not go past the position that the game was in when you paused.  File: xboard.info, Node: View Menu, Next: Mode Menu, Prev: Edit Menu, Up: Menus 3.3 View Menu ============= Flip View Inverts your view of the chess board for the duration of the current game. Starting a new game returns the board to normal. The `F2' key is a keyboard equivalent. Show Engine Output Shows or hides a window in which the thinking output of any loaded engines is displayed. The shifted `Alt+O' key is a keyboard equivalent. XBoard will display lines of thinking output of the same depth ordered by score, (highest score on top), rather than in the order the engine produced them. Usually this amounts to the same, as a normal engine search will only find new PV (and emit it as thinking output) when it searches a move with a higher score than the previous variation. But when the engine is in multi-variation mode this needs not always be true, and it is more convenient for someone analyzing games to see the moves sorted by score. The order in which the engine found them is only of interest to the engine author, and can still be deduced from the time or node count printed with the line. Right-clicking a line in this window, and then moving the mouse vertically with the right button kept down, will make XBoard play through the PV listed there. The use of the board window as 'variation board' will normally end when you release the right button, or when the opponent plays a move. But beware: in Analysis mode, moves thus played out will be added to the game. The Engine-Output pane for each engine will contain a header displaying the multi-PV status and a list of excluded moves in Analysis mode, which are also responsive to right-clicking. Show Move History Shows or hides a list of moves of the current game. The shifted `Alt+H' key is a keyboard equivalent. This list allows you to move the display to any earlier position in the game by clicking on the corresponding move. Show Evaluation Graph Shows or hides a window which displays a graph of how the engine score(s) evolved as a function of the move number. The shifted `Alt+E' key is a keyboard equivalent. Clicking on the graph will bring the corresponding position in the board display. Show Game List Shows or hides the list of games generated by the last `Load Game' command. The shifted `Alt+G' key is a keyboard equivalent. Tags Pops up a window which shows the PGN (portable game notation) tags for the current game. For now this is a duplicate of the `Edit Tags' item in the `Edit' menu. Comments Pops up a window which shows any comments to or variations on the current move. For now this is a duplicate of the `Edit Comment' item in the `Edit' menu. ICS Input Box If this option is set in ICS mode, XBoard creates an extra window that you can use for typing in ICS commands. The input box is especially useful if you want to type in something long or do some editing on your input, because output from ICS doesn't get mixed in with your typing as it would in the main terminal window. Open Chat Window This menu item opens a window in which you can conduct upto 5 chats with other ICS users (or channels). To use the window, write the name of your chat partner, the channel number, or the words 'shouts', 'whispers', 'cshouts' in the upper field (closing with ). Everything you type in the lowest field will then automatically be sent to the mentioned party, while everything that party sends to you will appear in the central text box, rather than appear in the ICS console. The row of buttons allow you to choose between chat; to start a new chat, just select an empty button, and complete the `Chat partner' field. Board Summons a dialog where you can customize the look of the chess board. Here you can specify the directory from which piece images should be taken, when you don't want to use the built-in piece images (see `pieceImageDirectory' option), external images to be used for the board squares (`liteBackTextureFile' and `darkBackTextureFile' options), and square and piece colors for the default pieces. Game List Tags a duplicate of the Game List dialog in the Options menu.  File: xboard.info, Node: Mode Menu, Next: Action Menu, Prev: View Menu, Up: Menus 3.4 Mode Menu ============= Machine White Tells the chess engine to play White. The `Ctrl-W' key is a keyboard equivalent. Machine Black Tells the chess engine to play Black. The `Ctrl-B' key is a keyboard equivalent. Two Machines Plays a game between two chess engines. The `Ctrl-T' key is a keyboard equivalent. Analysis Mode XBoard tells the chess engine to start analyzing the current game/position and shows you the analysis as you move pieces around. The `Ctrl-A' key is a keyboard equivalent. Note: Some chess engines do not support Analysis mode. To set up a position to analyze, you do the following: 1. Select Edit Position from the Mode Menu 2. Set up the position. Use the middle and right buttons to bring up the white and black piece menus. 3. When you are finished, click on either the Black or White clock to tell XBoard which side moves first. 4. Select Analysis Mode from the Mode Menu to start the analysis. You can now play legal moves to create follow-up positions for the engine to analyze, while the moves will be remembered as a stored game, and then step backward through this game to take the moves back. Note that you can also click on the clocks to set the opposite side to move (adding a so-called `null move' to the game). You can also tell the engine to exclude some moves from analysis. (Engines that do not support the exclude-moves feature will ignore this, however.) The general way to do this is to play the move you want to exclude starting with a double click on the piece. When you use drag-drop moving, the piece you grab with a double click will also remain on its square, to show you that you are not really making the move, but just forbid it from the current position. Playing a thus excluded move a second time will include it again. Excluded moves will be listed as text in a header line in the Engine Output window, and you can also re-include them by right-clicking them there. This header line will also contain the words 'best' and 'tail'; right-clicking those will exclude the currently best move, or all moves not explicitly listed in the header line. Once you leave the current position all memory of excluded moves will be lost when you return there. Selecting this menu item while already in `Analysis Mode' will toggle the participation of the second engine in the analysis. The output of this engine will then be shown in the lower pane of the Engine Output window. The analysis function can also be used when observing games on an ICS with an engine loaded (zippy mode); the engine then will analyse the positions as they occur in the observed game. Analyze Game This option subjects the currently loaded game to automatic analysis by the loaded engine. The `Ctrl-G' key is a keyboard equivalent. XBoard will start auto-playing the game from the currently displayed position, while the engine is analyzing the current position. The game will be annotated with the results of these analyses. In particlar, the score and depth will be added as a comment, and the PV will be added as a variation. Normally the analysis would stop after reaching the end of the game. But when a game is loaded from a multi-game file while `Analyze Game' was already switched on, the analysis will continue with the next game in the file until the end of the file is reached (or you switch to another mode). The time the engine spends on analyzing each move can be controlled through the command-line option `-timeDelay', which can also be set from the `Load Game Options' menu dialog. Note: Some chess engines do not support Analysis mode. Edit Game Duplicate of the item in the Edit menu. Note that `Edit Game' is the idle mode of XBoard, and can be used to get you out of other modes. E.g. to stop analyzing, stop a game between two engines or stop editing a position. Edit Position Duplicate of the item in the Edit menu. Training Training mode lets you interactively guess the moves of a game for one of the players. You guess the next move of the game by playing the move on the board. If the move played matches the next move of the game, the move is accepted and the opponent's response is auto-played. If the move played is incorrect, an error message is displayed. You can select this mode only while loading a game (that is, after selecting `Load Game' from the File menu). While XBoard is in `Training' mode, the navigation buttons are disabled. ICS Client This is the normal mode when XBoard is connected to a chess server. If you have moved into Edit Game or Edit Position mode, you can select this option to get out. To use xboard in ICS mode, run it in the foreground with the -ics option, and use the terminal you started it from to type commands and receive text responses from the chess server. See *note Chess Servers:: below for more information. XBoard activates some special position/game editing features when you use the `examine' or `bsetup' commands on ICS and you have `ICS Client' selected on the Mode menu. First, you can issue the ICS position-editing commands with the mouse. Move pieces by dragging with mouse button 1. To drop a new piece on a square, press mouse button 2 or 3 over the square. This brings up a menu of white pieces (button 2) or black pieces (button 3). Additional menu choices let you empty the square or clear the board. Click on the White or Black clock to set the side to play. You cannot set the side to play or drag pieces to arbitrary squares while examining on ICC, but you can do so in `bsetup' mode on FICS. In addition, the menu commands `Forward', `Backward', `Pause', and `Stop Examining' have special functions in this mode; see below. Machine Match Starts a match between two chess programs, with a number of games and other parameters set through the `Match Options' menu dialog. When a match is already running, selecting this item will make XBoard drop out of match mode after the current game finishes. Pause Pauses updates to the board, and if you are playing against a chess engine, also pauses your clock. To continue, select `Pause' again, and the display will automatically update to the latest position. The `P' button and keyboard `Pause' key are equivalents. If you select Pause when you are playing against a chess engine and it is not your move, the chess engine's clock will continue to run and it will eventually make a move, at which point both clocks will stop. Since board updates are paused, however, you will not see the move until you exit from Pause mode (or select Forward). This behavior is meant to simulate adjournment with a sealed move. If you select Pause while you are observing or examining a game on a chess server, you can step backward and forward in the current history of the examined game without affecting the other observers and examiners, and without having your display jump forward to the latest position each time a move is made. Select Pause again to reconnect yourself to the current state of the game on ICS. If you select `Pause' while you are loading a game, the game stops loading. You can load more moves manually by selecting `Forward', or resume automatic loading by selecting `Pause' again.  File: xboard.info, Node: Action Menu, Next: Engine Menu, Prev: Mode Menu, Up: Menus 3.5 Action Menu =============== Accept Accepts a pending match offer. The `F3' key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. Decline Declines a pending offer (match, draw, adjourn, etc.). The `F4' key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. Call Flag Calls your opponent's flag, claiming a win on time, or claiming a draw if you are both out of time. The `F5' key is a keyboard equivalent. You can also call your opponent's flag by clicking on his clock. Draw Offers a draw to your opponent, accepts a pending draw offer from your opponent, or claims a draw by repetition or the 50-move rule, as appropriate. The `F6' key is a keyboard equivalent. Adjourn Asks your opponent to agree to adjourning the current game, or agrees to a pending adjournment offer from your opponent. The `F7' key is a keyboard equivalent. Abort Asks your opponent to agree to aborting the current game, or agrees to a pending abort offer from your opponent. The `F8' key is a keyboard equivalent. An aborted game ends immediately without affecting either player's rating. Resign Resigns the game to your opponent. The `F9' key is a keyboard equivalent. Stop Observing Ends your participation in observing a game, by issuing the ICS observe command with no arguments. ICS mode only. The `F10' key is a keyboard equivalent. Stop Examining Ends your participation in examining a game, by issuing the ICS unexamine command. ICS mode only. The `F11' key is a keyboard equivalent. Upload to Examine Create an examined game of the proper variant on the ICS, and send the game there that is currenty loaded in XBoard (e.g. through pasting or loading from file). You must be connected to an ICS for this to work. Adjudicate to White Adjudicate to Black Adjudicate Draw Terminate an ongoing game in Two-Machines mode (including match mode), with as result a win for white, for black, or a draw, respectively. The PGN file of the game will accompany the result string by the comment "user adjudication".  File: xboard.info, Node: Engine Menu, Next: Options Menu, Prev: Action Menu, Up: Menus 3.6 Engine Menu =============== Load Engine Pops up a dialog where you can select or specify an engine to be loaded. You will always have to indicate whether you want to load the engine as first or second engine, through the ‘Load menitioned engine as’ drop-down list at the bottom of the dialog. You can even replace engines during a game, without disturbing that game. (Beware that after loading an engine, XBoard will always be in Edit Game mode, so you will have to tell the new engine what to do before it does anything!) When you select an already installed engine from the ‘Select Engine from List’ drop-down list, all other fields of the dialog will be ignored. In other cases, you have to specify the engine executable, possible arguments on the engine command line (if the engine docs say the engine needs any), and the directory where the engine should look for its files (if this cannot be deduced automatically from the specification of the engine executable). You will also have to specify (with the aid of checkboxes) if the engine is UCI. If ‘Add this engine to the list’ is ticked (which it is by default), the engine will be added to the list of installed engines in your settings file, (provided you save the settings!), so that next time you can select it from the drop-down list. You can also specify a ‘nickname’, under which the engine will then appear in that drop-down list, and even choose to use that nickname for it in PGN files for engine-engine games. The info you supply with the checkboxes whether the engine should use GUI book, or (for variant engines) automatically switch to the current variant when loaded, will also be included in the list. For obsolete XBoard engines, which would normally take a long delay to load because XBoard is waiting for a response they will not give, you can tick ‘WB protocol v1’ to speed up the loading process. Engine #N Settings Pop up a menu dialog to alter the settings specific to the applicable engine. (The second engine is only accessible once it has been used in Two-Machines mode.) For each parameter the engine allows to be set, a control element will appear in this dialog that can be used to alter the value. Depending on the type of parameter (text string, number, multiple choice, on/off switch, instantaneous signal) the appropriate control will appear, with a description next to it. XBoard has no idea what these values mean; it just passes them on to the engine. How this dialog looks is completely determined by the engine, and XBoard just passes it on to the user. Many engines do not have any parameters that can be set by the user, and in that case the dialog will be empty (except for the OK and cancel buttons). UCI engines usually have many parameters. (But these are only visible with a sufficiently modern version of the Polyglot adapter needed to run UCI engines, e.g. Polyglot 1.4.55b.) For native XBoard engines this is less common. Hint Displays a move hint from the chess engine. Book Displays a list of possible moves from the chess engine's opening book. The exact format depends on what chess engine you are using. With GNU Chess 4, the first column gives moves, the second column gives one possible response for each move, and the third column shows the number of lines in the book that include the move from the first column. If you select this option and nothing happens, the chess engine is out of its book or does not support this feature. Move Now Forces the chess engine to move immediately. Chess engine mode only. The `Ctrl-M' key is a keyboard equivalent. Retract Move Retracts your last move. In chess engine mode, you can do this only after the chess engine has replied to your move; if the chess engine is still thinking, use `Move Now' first. In ICS mode, `Retract Move' issues the command `takeback 1' or `takeback 2' depending on whether it is your opponent's move or yours. The `Ctrl-X' key is a keyboard equivalent. Recently Used Engines At the bottom of the engine menu there can be a list of names of engines that you recently loaded through the Load Engine menu dialog in previous sessions. Clicking on such a name will load that engine as first engine, so you won't have to search for it in your list of installed engines, if that is very long. The maximum number of displayed engine names is set by the `recentEngines'command-line option.  File: xboard.info, Node: Options Menu, Next: Help Menu, Prev: Engine Menu, Up: Menus 3.7 Options Menu ================ 3.7.1 General Options --------------------- The following items to set option values appear in the dialog summoned by the general Options menu item. Absolute Analysis Scores Controls if scores on the Engine Output window during analysis will be printed from the white or the side-to-move point-of-view. Almost Always Queen If this option is on, 7th-rank pawns automatically change into Queens when you pick them up, and when you drag them to the promotion square and release them there, they will promote to that. But when you drag such a pawn backwards first, its identity will start to cycle through the other available pieces. This will continue until you start to move it forward; at which point the identity of the piece will be fixed, so that you can safely put it down on the promotion square. If this option is off, what happens depends on the option `alwaysPromoteToQueen', which would force promotion to Queen when true. Otherwise XBoard would bring up a dialog box whenever you move a pawn to the last rank, asking what piece you want to promote to. Animate Dragging If Animate Dragging is on, while you are dragging a piece with the mouse, an image of the piece follows the mouse cursor. If Animate Dragging is off, there is no visual feedback while you are dragging a piece, but if Animate Moving is on, the move will be animated when it is complete. Animate Moving If Animate Moving is on, all piece moves are animated. An image of the piece is shown moving from the old square to the new square when the move is completed (unless the move was already animated by Animate Dragging). If Animate Moving is off, a moved piece instantly disappears from its old square and reappears on its new square when the move is complete. The shifted `Ctrl-A' key is a keyboard equivalent. Auto Flag If this option is on and one player runs out of time before the other, XBoard will automatically call his flag, claiming a win on time. The shifted `Ctrl-F' key is a keyboard equivalent. In ICS mode, Auto Flag will only call your opponent's flag, not yours, and the ICS may award you a draw instead of a win if you have insufficient mating material. In local chess engine mode, XBoard may call either player's flag and will not take material into account (?). Auto Flip View If the Auto Flip View option is on when you start a game, the board will be automatically oriented so that your pawns move from the bottom of the window towards the top. If you are playing a game on an ICS, the board is always oriented at the start of the game so that your pawns move from the bottom of the window towards the top. Otherwise, the starting orientation is determined by the `flipView' command line option; if it is false (the default), White's pawns move from bottom to top at the start of each game; if it is true, Black's pawns move from bottom to top. *Note User interface options::. Blindfold If this option is on, XBoard displays the board as usual but does not display pieces or move highlights. You can still move in the usual way (with the mouse or by typing moves in ICS mode), even though the pieces are invisible. Drop Menu Controls if right-clicking the board in crazyhouse / bughouse will pop up a menu to drop a piece on the clicked square (old, deprecated behavior) or allow you to step through an engine PV (new, recommended behavior). Enable Variation Trees If this option is on, playing a move in Edit Game or Analyze mode while keeping the Shift key pressed will start a new variation. You can then recall the previous line through the `Revert' menu item. When off, playing a move will truncate the game and append the move irreversibly. Hide Thinking If this option is off, the chess engine's notion of the score and best line of play from the current position is displayed as it is thinking. The score indicates how many pawns ahead (or if negative, behind) the chess engine thinks it is. In matches between two machines, the score is prefixed by `W' or `B' to indicate whether it is showing White's thinking or Black's, and only the thinking of the engine that is on move is shown. The shifted `Ctrl-H' key is a keyboard equivalent. Highlight Last Move If Highlight Last Move is on, after a move is made, the starting and ending squares remain highlighted. In addition, after you use Backward or Back to Start, the starting and ending squares of the last move to be unmade are highlighted. Highlight with Arrow Causes the highlighting described in Highlight Last Move to be done by drawing an arrow between the highlighted squares, so that it is visible even when the width of the grid lines is set to zero. Move Sound Enables the sounding of an audible signal when the computer performs a move. For the selection of the sound, see `Sound Options'. If you turn on this option when using XBoard with the Internet Chess Server, you will probably want to give the `set bell 0' command to the ICS, since otherwise the ICS will ring the terminal bell after every move (not just yours). (The `.icsrc' file is a good place for this; see *note ICS options::.) One-Click Moving If this option is on, XBoard does not wait for you to click both the from- and the to-square, or drag the piece, but performs a move as soon as it is uniqely specified. This applies to clicking an own piece that only has a single legal move, clicking an empty square or opponent piece where only one of your pieces can move (or capture) to. Furthermore, a double-click on a piece that can only make a single capture will cause that capture to be made. Promoting a Pawn by clicking its to-square will suppress the promotion popup or other methods for selecting an under-promotion, and make it promote to Queen. Periodic Updates If this option is off (or if you are using a chess engine that does not support periodic updates), the analysis window will only be updated when the analysis changes. If this option is on, the Analysis Window will be updated every two seconds. Play Move(s) of Clicked PV If this option is on, right-clicking a PV in the Engine Output window during Analyze mode will cause the first move of that PV to be played. You could also play more than one (or no) PV move by moving the mouse to engage in the PV walk such a right-click will start, to seek out another position along the PV where you want to continue the analysis, before releasing the mouse button. Ponder Next Move If this option is off, the chess engine will think only when it is on move. If the option is on, the engine will also think while waiting for you to make your move. The shifted `Ctrl-P' key is a keyboard equivalent. Popup Exit Message If this option is on, when XBoard wants to display a message just before exiting, it brings up a modal dialog box and waits for you to click OK before exiting. If the option is off, XBoard prints the message to standard error (the terminal) and exits immediately. Popup Move Errors If this option is off, when you make an error in moving (such as attempting an illegal move or moving the wrong color piece), the error message is displayed in the message area. If the option is on, move errors are displayed in small pop-up windows like other errors. You can dismiss an error pop-up either by clicking its OK button or by clicking anywhere on the board, including down-clicking to start a move. Scores in Move List If this option is on, XBoard will display the depth and score of engine moves in the Move List, in the format of a PGN comment. Show Coords If this option is on, XBoard displays algebraic coordinates along the board's left and bottom edges. Show Target Squares If this option is on, all squares a piece that is 'picked up' with the mouse can legally move to are highighted with a fat colored dot in the highlightColor (non-captures) or premoveHighlightColor (captures). Legality testing must be on for XBoard to know how the piece moves. Test Legality If this option is on, XBoard tests whether the moves you try to make with the mouse are legal and refuses to let you make an illegal move. The shifted `Ctrl-L' key is a keyboard equivalent. Moves loaded from a file with `Load Game' are also checked. If the option is off, all moves are accepted, but if a local chess engine or the ICS is active, they will still reject illegal moves. Turning off this option is useful if you are playing a chess variant with rules that XBoard does not understand. (Bughouse, suicide, and wild variants where the king may castle after starting on the d file are generally supported with Test Legality on.) Flash Moves Flash Rate If this option is non-zero, whenever a move is completed, the moved piece flashes the specified number of times. The flash-rate setting determines how rapidly this flashing occurs. Animation Speed Determines the duration (in msec) of an animation step, when `Animate Moving' is swiched on. Zoom factor in Evaluation Graph Sets the valueof the `evalZoom' option, indicating the factor by which the score interval (-1,1) should be blown up on the vertical axis of the Evaluation Graph. 3.7.2 Time Control ------------------ Pops up a sub-menu where you can set the time-control parameters interactively. Allows you to select classical or incremental time controls, set the moves per session, session duration, and time increment. Also allows specification of time-odds factors for one or both engines. If an engine is given a time-odds factor N, all time quota it gets, be it at the beginning of a session or through the time increment or fixed time per move, will be divided by N. The shifted `Alt+T' key is a keyboard equivalent. 3.7.3 Common Engine ------------------- Pops up a sub-menu where you can set some engine parameters common to most engines, such as hash-table size, tablebase cache size, maximum number of processors that SMP engines can use, and where to find the Polyglot adapter needed to run UCI engines under XBoard. The feature that allows setting of these parameters on engines is new since XBoard 4.3.15, so not many XBoard/WinBoard engines respond to it yet, but UCI engines should. It is also possible to specify a GUI opening book here, i.e. an opening book that XBoard consults for any position a playing engine gets in. It then forces the engine to play the book move, rather than to think up its own, if that position is found in the book. The book can switched on and off independently for either engine. The way book moves are chosen can be influenced through the settings of book depth and variety. After both sides have played more moves than the specified depth, the book will no longer be consulted. When the variety is set to 50, moves will be played with the probability specified in the book. When set to 0, only the move(s) with the highest probability will be played. When set to 100, all listed moves will be played with equal pobability. Other settings interpolate between that. The shifted `Alt+U' key is a keyboard equivalent. 3.7.4 Adjudications ------------------- Pops up a sub-menu where you can enable or disable various adjudications that XBoard can perform in engine-engine games. The shifted `Alt+J' key is a keyboard equivalent. You can instruct XBoard to detect and terminate the game on checkmate or stalemate, even if the engines would not do so, to verify engine result claims (forfeiting engines that make false claims), rather than naively following the engine, to declare draw on positions which can never be won for lack of mating material, (e.g. KBK), or which are impossible to win unless the opponent seeks its own demise (e.g. KBKN). For these adjudications to work, `Test Legality' should be switched on. It is also possible to instruct XBoard to enforce a 50-move or 3-fold-repeat rule and automatically declare draw (after a user-adjustable number of moves or repeats) even if the engines are prepared to go on. It is also possible to have XBoard declare draw on games that seem to drag on forever, or adjudicate a loss if both engines agree (for 3 consecutive moves) that one of them is behind more than a user-adjustable score threshold. For the latter adjudication to work, XBoard should be able to properly understand the engine's scores. To facilitate the latter, you can inform xboard here if the engines report scores from the viewpoint of white, or from that of their own color. 3.7.5 ICS Options ----------------- The following options occur in a dialog summoned by the ICS Options menu item. Auto Kibitz Setting this option when playing with or aginst a chess program on an ICS will cause the last line of thinking output of the engine before its move to be sent to the ICS in a kibitz command. In addition, any kibitz message received through the ICS from an opponent chess program will be diverted to the engine-output window, (and suppressed in the console), where you can play through its PV by right-clicking it. Auto Comment If this option is on, any remarks made on ICS while you are observing or playing a game are recorded as a comment on the current move. This includes remarks made with the ICS commands `say', `tell', `whisper', and `kibitz'. Limitation: remarks that you type yourself are not recognized; XBoard scans only the output from ICS, not the input you type to it. Auto Observe If this option is on and you add a player to your `gnotify' list on ICS, XBoard will automatically observe all of that player's games, unless you are doing something else (such as observing or playing a game of your own) when one starts. The games are displayed from the point of view of the player on your gnotify list; that is, his pawns move from the bottom of the window towards the top. Exceptions: If both players in a game are on your gnotify list, if your ICS `highlight' variable is set to 0, or if the ICS you are using does not properly support observing from Black's point of view, you will see the game from White's point of view. Auto Raise Board If this option is on, whenever a new game begins, the chessboard window is deiconized (if necessary) and raised to the top of the stack of windows. Auto Save If this option is true, at the end of every game XBoard prompts you for a file name and appends a record of the game to the file you specify. Disabled if the `saveGameFile' command-line option is set, as in that case all games are saved to the specified file. *Note Load and Save options::. Background Observe Setting this option will make XBoard suppress display of any boards from observed games while you are playing. In stead the last such board will be remembered, and shown to you when you right-click the board. This allows you to peek at your bughouse partner's game when you want, without disturbing your own game too much. Dual Board Setting this option in combination with `Background Observe' will display boards of observed games while you are playing on a second board next to that of your own game. Get Move List If this option is on, whenever XBoard receives the first board of a new ICS game (or a different game from the one it is currently displaying), it retrieves the list of past moves from the ICS. You can then review the moves with the `Forward' and `Backward' commands or save them with `Save Game'. You might want to turn off this option if you are observing several blitz games at once, to keep from wasting time and network bandwidth fetching the move lists over and over. When you turn this option on from the menu, XBoard immediately fetches the move list of the current game (if any). Quiet Play If this option is on, XBoard will automatically issue an ICS `set shout 0' command whenever you start a game and a `set shout 1' command whenever you finish one. Thus, you will not be distracted by shouts from other ICS users while playing. Seek Graph Setting this option will cause XBoard to display an graph of currently active seek ads when you left-click the board while idle and logged on to an ICS. Auto-Refresh Seek Graph In combination with the `Seek Graph' option this will cause automatic update of the seek graph while it is up. This only works on FICS and ICC, and requires a lot of bandwidth on a busy server. Premove Premove White Premove Black First White Move First Black Move If this option is on while playing a game on an ICS, you can register your next planned move before it is your turn. Move the piece with the mouse in the ordinary way, and the starting and ending squares will be highlighted with a special color (red by default). When it is your turn, if your registered move is legal, XBoard will send it to ICS immediately; if not, it will be ignored and you can make a different move. If you change your mind about your premove, either make a different move, or double-click on any piece to cancel the move entirely. You can also enter premoves for the first white and black moves of the game. ICS Alarm ICS Alarm Time When this option is on, an alarm sound is played when your clock counts down to the icsAlarmTime in an ICS game. (By default, the time is 5 seconds, but you can pecify other values with the Alarm Time spin control.) For games with time controls that include an increment, the alarm will sound each time the clock counts down to the icsAlarmTime. By default, the alarm sound is the terminal bell, but on some systems you can change it to a sound file using the soundIcsAlarm option; see below. Colorize Messages Ticking this options causes various types of ICS messages do be displayed with different foreground or background colors in the console. The colors can be individually selected for each type, through the accompanying text edits. 3.7.6 Match Options ------------------- Summons a dialog where you can set options important for playing automatic matches between two chess programs (e.g. by using the `Machine Match' menu item in the `Mode' menu). Tournament file To run a tournament, XBoard needs a file to record its progress, so it can resume the tourney when it is interrupted. When you want to conduct anything more complex than a simple two-player match with the currently loaded engines, (i.e. when you select a list of participants), you must not leave this field blank. When you enter the name of an existing tournament file, XBoard will ignore all other input specified in the dialog, and will take them from that tournament file. This resumes an interrupted tournament, or adds another XBoard agent playing games for it to those that are already doing so. Specifying a not-yet-existing file will cause XBoard to create it, according to the tournament parameters specified in the rest of the dialog, before it starts the tournament on ‘OK’. Provided that you specify participants; without participants no tournament file will be made, but other entered values (e.g. for the file with opening positions) will take effect. Default: configured by the `defaultTourneyName' option. Sync after round Sync after cycle The sync options, when on, will cause WinBoard to refrain from starting games of the next round or cycle before all games of the previous round or cycle are finished. This guarantees correct ordering in the games file, even when multiple XBoard instances are concurrently playing games for the same tourney. Default: sync after cycle, but not after round. Select Engine Tourney participants With the Select Engine drop-down list you can pick an engine from your list of installed engines in the settings file, to be added to the tournament. The engines selected so far will be listed in the ‘Tourney participants’ memo. The latter is a normal text edit, so you can use normal text-editing functions to delete engines you selected by accident, or change their order. Do not type names yourself there, because names that do not exactly match one of the names from the drop-down list will lead to undefined behavior. Tourney type Here you can specify the type of tournament you want. XBoard’s intrinsic tournament manager support round-robins (type = 0), where each participant plays every other participant, and (multi-)gauntlets, where one (or a few) so-called ‘gauntlet engines’ play an independent set of opponents. In the latter case, you specify the number of gauntlet engines. E.g. if you specified 10 engines, and tourney type = 2, the first 2 engines each play the remaining 8. A value of -1 instructs XBoard to play Swiss; for this to work an external pairing engine must be specified through the `pairingEngine' option. Each Swiss round will be considered a tourney cycle in that case. Default:0 Number of tourney cycles Default number of Games You can specify tourneys where every two opponents play each other multiple times. Such multiple games can be played in a row, as specified by the ‘number of games per pairing’, or by repeating the entire tournament schedule a number of times (specified by the ‘number of tourney cycles’). The total number of times two engine meet will be the product of these two. Default is 1 cycle; the number of games per pairing is the same as the default number of match games, stored in your settings file through the `defaultMatchGames' option. Save Tourney Games File where the tournament games are saved (duplicate of the item in the `Save Game Options'). Game File with Opening Lines File with Start Positions Game Number Position Number Rewind Index after These items optionally specify the file with move sequences or board positions the tourney games should start from. The corresponding numbers specify the number of the game or position in the file. Here a value -1 means automatic stepping through all games on the file, -2 automatic stepping every two games. The Rewind-Index parameter causes a stepping index to reset to one after reaching a specified value. A setting of -2 for the game number will also be effective in a tournament without specifying a game file, but playing from the GUI book instead. In this case the first (odd) games will randomly select from the book, but the second (even) games will select the same moves from the book as the previous game. (Note this leads to the same opening only if both engines use the GUI book!) Default: No game or position file will be used. The default index if such a file is used is 1. Disable own engine bools be default Setting this option reverses the default situation for use of the GUI opening book in tournaments from what it normally is, namely not using it. So unless the engine is installed with an option to explicitly specify it should not use the GUI book (i.e. `-firstHasOwnBookUCI true'), it will be made to use the GUI book. Replace Engine Upgrade Engine With these two buttons you can alter the participants of an already running tournament. After opening the Match Options dialog on an XBoard that is playing for the tourney, you will see all the tourney parameters in the dialog fields. You can then replace the name of one engine by that of another by editing the `participants' field. (But preserve the order of the others!) Pressing the button after that will cause the substitution. With the `Upgrade Engine' button the substitution will only affect future games. With `Replace Engine' all games the substituted engine has already played will be invalidated, and they will be replayed with the substitute engine. In this latter case the engine must not be playing when you do this, but otherwise there is no need to pause the tournament play for making a substitution. Clone Tourney Pressing this button after you have specified an existing tournament file will copy the contents of the latter to the dialog, and then puts the originally proposed name for the tourney file back. You can then run a tourney with the same parameters (possibly after changing the proposed name of the tourney file for the new tourney) by pressing 'OK'. 3.7.7 Load Game Options ----------------------- Summons a dialog where you can set the `autoDisplayComment' and `autoDisplayTags' options, (which control popups when viewing loaded games), and specify the rate at which loaded games are auto-played, in seconds per move (which can be a fractional number, like 1.6). You can also set search criteria for determining which games will be displayed in the Game List for a multi-game file, and thus be eligible for loading: Elo of strongest player Elo of weakest player year These numeric fields set thresholds (lower limits) on the Elo rating of the mentioned player, or the date the game was played. Defaults: 0 Search mode This setting determines which positions in a game will be considered a match to the position currently displayed in the board window when you press the `find position' button in the Game List. You can search for an exact match, a position that has all shown material in the same place, but might contain additional material, a position that has all Pawns in the same place, but can have the shown material anywhere, a position that can have all shown material anywhere, or a position that has material between certain limits anywhere. For the latter you have to place the material that must be present in the four lowest ranks of the board, and optional additional material in the four highest ranks of the board. You can request the optional material to be balanced. The `narrow' button is similar in fuction to the `find position' button, but only searches in the already selected games, rather than the complete game file, and can thus be used to refine a search based on multiple criteria. number of consecutive positions When you are searching by material, rather than for an exact match, this parameter indicates forhowmany consecutive game positions the same amount of material must be on the board before it is considered a match. Also match reversed colors Also match left-right flipped position When looking for matching positions rather than by material, these settings determine whether mirror images (in case of a vertical flip in combination with color reversal) will be also considered a match. The left-right flipping is only useful after all castling rights have expired (or in Xiangqi). 3.7.8 Save Game Options ----------------------- Summons a dialog where you can specify the files on which XBoard should automatically save any played or entered games, (the `saveGameFile' option), or the final position of such games (the `savePositionfile' option). You can also select 'auto-save' without a file name, in which case XBoard will prompt the user for a file name after each game. In ICS mode you can limit the auto-saving to your own games (i.e. suppress saving of observed games). You can also set the default value for the PGN Event tag that will be used for each new game you start. Various options for the format of the game can be specified as well, such as whether scores and depths of engine games should be saved as comments, and if a tag with info about the score with which the engine came out of book should be included. For Chess, always set the format to PGN, rather than "old save stye"! 3.7.9 Game List --------------- Pops up a dialog where you can select the PGN tags that should appear on the lines in the game list, and their order. 3.7.10 Sound Options -------------------- Summons a dialog where you can specify the sounds that should accompany various events that can occur XBoard. Most events are only relevant to ICS play, but the move sound is an important exception. For each event listed in the dialog, you can select a standard sound from a menu. You can also select a user-supplied sound file, by typing its name into the designated text-edit field first, and then selecting "Above WAV File" from the menu for the event. A dummy event has been provided for trying out the sounds with the "play" button next to it. The directory with standard sounds, and the external program for playing the sounds can be specified too, but normally you would not touch these once XBoard is properly installed. When a move sound other than 'None' is selected, XBoard alerts you by playing that sound after each of your opponent's moves (or after every move if you are observing a game on the Internet Chess Server). The sound is not played after moves you make or moves read from a saved game file. 3.7.11 Save Settings Now ------------------------ Selecting this menu item causes the current XBoard settings to be written to the settings file, so they will also apply in future sessions. Note that some settings are 'volatile', and are not saved, because XBoard considers it too unlikely that you want those to apply next time. In particular this applies to the Chess program names, and all options giving information on those Chess programs (such as their directory, if they have their own opening book, if they are UCI or native XBoard), or the variant you are playing. Such options would still be understood when they appear in the settings file in case they were put there with the aid of a text editor, but they would disappear from the file as soon as you save the settings. Note that XBoard no longer pays attention to options values specified in the .Xresources file. (Specifying key bindings there will still work, though.) To alter the default of volatile options, you can use the following method: Rename your ~/.xboardrc settings file (to ~/.yboardrc, say), and create a new file ~/.xboardrc, which only contains the options -settingsFile ~/.yboardrc -saveSettingsFile ~/.yboardrc This will cause your settings to be saved on ~/.yboardrc in the future, so that ~/.xboardrc is no longer overwritten. You can then safely specify volatile options in ~/.xboardrc, either before or after the settingsFile options. Note that when you specify persistent options after the settingsFile options in ~/.xboardrc, you will essentially turn them into volatile options with the specified value as default, because that value will overrule the value loaded from the settings file (being read later). 3.7.12 Save Settings on Exit ---------------------------- Setting this option has no immediate effect, but causes the settings to be saved when you quit XBoard. What happens then is otherwise identical to what happens when you use select "Save Settings Now", see there.  File: xboard.info, Node: Help Menu, Next: Keys, Prev: Options Menu, Up: Menus 3.8 Help Menu ============= Info XBoard Displays the XBoard documentation in info format. For this feature to work, you must have the GNU info program installed on your system, and the file `xboard.info' must either be present in the current working directory, or have been installed by the `make install' command when you built XBoard. Man XBoard Displays the XBoard documentation in man page format. The `F1' key is a keyboard equivalent. For this feature to work, the file `xboard.6' must have been installed by the `make install' command when you built XBoard, and the directory it was placed in must be on the search path for your system's `man' command. About XBoard Shows the current XBoard version number.  File: xboard.info, Node: Keys, Prev: Help Menu, Up: Menus 3.9 Other Shortcut Keys ======================= Show Last Move By hitting `Enter' the last move will be re-animated. Load Next Game Loads the next game from the last game record file you loaded. The `Alt+PgDn' key triggers this action. Load Previous Game Loads the previous game from the last game record file you loaded. The `Alt+PgUp' key triggers this action. Not available if the last game was loaded from a pipe. Reload Same Game Reloads the last game you loaded. Not available if the last game was loaded from a pipe. Currently no keystroke is assigned to this ReloadGameProc. Reload Same Position Reloads the last position you loaded. Not available if the last position was loaded from a pipe. Currently no keystroke is assigned to this ReloadPositionProc. You can add or remove shortcut keys using the X resources `form.translations'. Here is an example of what would go in your `.Xresources' file: XBoard*form.translations: \ Shift?: AboutGameProc() \n\ y: AcceptProc() \n\ n: DeclineProc() \n\ i: NothingProc() Binding a key to `NothingProc' makes it do nothing, thus removing it as a shortcut key. The XBoard commands that can be bound to keys are: AbortProc, AboutGameProc, AboutProc, AcceptProc, AdjournProc, AlwaysQueenProc, AnalysisModeProc, AnalyzeFileProc, AnimateDraggingProc, AnimateMovingProc, AutobsProc, AutoflagProc, AutoflipProc, AutoraiseProc, AutosaveProc, BackwardProc, BlindfoldProc, BookProc, CallFlagProc, CopyGameProc, CopyPositionProc, DebugProc, DeclineProc, DrawProc, EditCommentProc, EditGameProc, EditPositionProc, EditTagsProc, EnterKeyProc, FlashMovesProc, FlipViewProc, ForwardProc, GetMoveListProc, HighlightLastMoveProc, HintProc, IcsAlarmProc, IcsClientProc, IcsInputBoxProc, InfoProc, LoadGameProc, LoadNextGameProc, LoadNextPositionProc, LoadPositionProc, LoadPrevGameProc, LoadPrevPositionProc, LoadSelectedProc, MachineBlackProc, MachineWhiteProc, MailMoveProc, ManProc, MoveNowProc, MoveSoundProc, NothingProc, OldSaveStyleProc, PasteGameProc, PastePositionProc, PauseProc, PeriodicUpdatesProc, PonderNextMoveProc, PopupExitMessageProc, PopupMoveErrorsProc, PremoveProc, QuietPlayProc, QuitProc, ReloadCmailMsgProc, ReloadGameProc, ReloadPositionProc, RematchProc, ResetProc, ResignProc, RetractMoveProc, RevertProc, SaveGameProc, SavePositionProc, ShowCoordsProc, ShowGameListProc, ShowThinkingProc, StopExaminingProc, StopObservingProc, TestLegalityProc, ToEndProc, ToStartProc, TrainingProc, TruncateGameProc, and TwoMachinesProc.  File: xboard.info, Node: Options, Next: Chess Servers, Prev: Menus, Up: Top 4 Options ********* This section documents the command-line options to XBoard. You can set these options in two ways: by typing them on the shell command line you use to start XBoard, or by editing the settings file (usually ~/.xboardrc) to alter the value of the setting that was saved there. Some of the options cannot be changed while XBoard is running; others set the initial state of items that can be changed with the *note Options:: menu. Most of the options have both a long name and a short name. To turn a boolean option on or off from the command line, either give its long name followed by the value true or false (`-longOptionName true'), or give just the short name to turn the option on (`-opt'), or the short name preceded by `x' to turn the option off (`-xopt'). For options that take strings or numbers as values, you can use the long or short option names interchangeably. * Menu: * Chess engine options:: Controlling the chess engine. * UCI + WB Engine Settings:: Setting some very common engine parameters * Tournament options:: Running tournaments and matches between engines. * ICS options:: Connecting to and using ICS. * Load and Save options:: Input/output options. * User interface options:: Look and feel options. * Adjudication Options:: Control adjudication of engine-engine games. * Other options:: Miscellaneous.  File: xboard.info, Node: Chess engine options, Next: UCI + WB Engine Settings, Up: Options 4.1 Chess Engine Options ======================== -tc or -timeControl minutes[:seconds] Each player begins with his clock set to the `timeControl' period. Default: 5 minutes. The additional options `movesPerSession' and `timeIncrement' are mutually exclusive. -mps or -movesPerSession moves When both players have made `movesPerSession' moves, a new `timeControl' period is added to both clocks. Default: 40 moves. -inc or -timeIncrement seconds If this option is specified, `movesPerSession' is ignored. Instead, after each player's move, `timeIncrement' seconds are added to his clock. Use `-inc 0' if you want to require the entire game to be played in one `timeControl' period, with no increment. Default: -1, which specifies `movesPerSession' mode. -clock/-xclock or -clockMode true/false Determines whether or not to display the chess clocks. If clockMode is false, the clocks are not shown, but the side that is to play next is still highlighted. Also, unless `searchTime' is set, the chess engine still keeps track of the clock time and uses it to determine how fast to make its moves. -st or -searchTime minutes[:seconds] Tells the chess engine to spend at most the given amount of time searching for each of its moves. Without this option, the chess engine chooses its search time based on the number of moves and amount of time remaining until the next time control. Setting this option also sets clockMode to false. -depth or -searchDepth number Tells the chess engine to look ahead at most the given number of moves when searching for a move to make. Without this option, the chess engine chooses its search depth based on the number of moves and amount of time remaining until the next time control. With the option, the engine will cut off its search early if it reaches the specified depth. -firstNPS number -secondNPS number Tells the chess engine to use an internal time standard based on its node count, rather then wall-clock time, to make its timing decisions. The time in virtual seconds should be obtained by dividing the node count through the given number, like the number was a rate in nodes per second. Xboard will manage the clocks in accordance with this, relying on the number of nodes reported by the engine in its thinking output. If the given number equals zero, it can obviously not be used to convert nodes to seconds, and the time reported by the engine is used to decrement the XBoard clock in stead. The engine is supposed to report in CPU time it uses, rather than wall-clock time, in this mode. This option can provide fairer conditions for engine-engine matches on heavily loaded machines, or with very fast games (where the wall clock is too inaccurate). `showThinking' must be on for this option to work. Default: -1 (off). Not many engines might support this yet! -firstTimeOdds factor -secondTimeOdds factor Reduces the time given to the mentioned engine by the given factor. If pondering is off, the effect is indistinguishable from what would happen if the engine was running on an n-times slower machine. Default: 1. -timeOddsMode mode This option determines how the case is handled where both engines have a time-odds handicap. If mode=1, the engine that gets the most time will always get the nominal time, as specified by the time-control options, and its opponent's time is renormalized accordingly. If mode=0, both play with reduced time. Default: 0. -hideThinkingFromHuman true/false Controls the Hide Thinking option. *Note Options Menu::. Default: true. (Replaces the Show-Thinking option of older xboard versions.) -thinking/-xthinking or -showThinking true/false Forces the engine to send thinking output to xboard. Used to be the only way to control if thinking output was displayed in older xboard versions, but as the thinking output in xboard 4.3 is also used for several other purposes (adjudication, storing in PGN file) the display of it is now controlled by the new option Hide Thinking. *Note Options Menu::. Default: false. (But if xboard needs the thinking output for some purpose, it makes the engine send it despite the setting of this option.) -ponder/-xponder or -ponderNextMove true/false Sets the Ponder Next Move menu option. *Note Options Menu::. Default: true. -smpCores number Specifies the maximum number of CPUs an SMP engine is allowed to use. Only works for engines that support the XBoard/WinBoard-protocol cores feature. -mg or -matchGames n Automatically runs an n-game match between two chess engines, with alternating colors. If the `loadGameFile' or `loadPositionFile' option is set, XBoard starts each game with the given opening moves or the given position; otherwise, the games start with the standard initial chess position. If the `saveGameFile' option is set, a move record for the match is appended to the specified file. If the `savePositionFile' option is set, the final position reached in each game of the match is appended to the specified file. When the match is over, XBoard displays the match score and exits. Default: 0 (do not run a match). -mm/-xmm or -matchMode true/false Setting `matchMode' to true is equivalent to setting `matchGames' to 1. -sameColorGames n Automatically runs an n-game match between two chess engines, without alternating colors. Otherwise the same applies as for the `-matchGames' option, over which it takes precedence if both are specified. (See there.) Default: 0 (do not run a match). -fcp or -firstChessProgram program Name of first chess engine. Default: `Fairy-Max'. -scp or -secondChessProgram program Name of second chess engine, if needed. A second chess engine is started only in Two Machines (match) mode. Default: `Fairy-Max'. -fe or -firstEngine nickname This is an alternative to the `fcp' option for specifying the first engine, for engines that were already configured (using the `Load Engine' dialog) in XBoard's settings file. It will not only retrieve the real name of the engine, but also all options configured with it. (E.g. if it is UCI, whether it should use book.) -se or -secondEngine nickname As `fe', but for the second engine. -fb/-xfb or -firstPlaysBlack true/false In games between two chess engines, firstChessProgram normally plays white. If this option is true, firstChessProgram plays black. In a multi-game match, this option affects the colors only for the first game; they still alternate in subsequent games. -fh or -firstHost host -sh or -secondHost host Hosts on which the chess engines are to run. The default for each is `localhost'. If you specify another host, XBoard uses `rsh' to run the chess engine there. (You can substitute a different remote shell program for rsh using the `remoteShell' option described below.) -fd or -firstDirectory dir -sd or -secondDirectory dir Working directories in which the chess engines are to be run. The default is "", which means to run the chess engine in the same working directory as XBoard itself. (See the CHESSDIR environment variable.) This option is effective only when the chess engine is being run on the local host; it does not work if the engine is run remotely using the -fh or -sh option. -initString string or -firstInitString -secondInitString string The string that is sent to initialize each chess engine for a new game. Default: new random Setting this option from the command line is tricky, because you must type in real newline characters, including one at the very end. In most shells you can do this by entering a `\' character followed by a newline. Using the character sequence `\n' in the string should work too, though. If you change this option, don't remove the `new' command; it is required by all chess engines to start a new game. You can remove the `random' command if you like; including it causes GNU Chess 4 to randomize its move selection slightly so that it doesn't play the same moves in every game. Even without `random', GNU Chess 4 randomizes its choice of moves from its opening book. Many other chess engines ignore this command entirely and always (or never) randomize. You can also try adding other commands to the initString; see the documentation of the chess engine you are using for details. -firstComputerString string -secondComputerString string The string that is sent to the chess engine if its opponent is another computer chess engine. The default is `computer\n'. Probably the only useful alternative is the empty string (`'), which keeps the engine from knowing that it is playing another computer. -reuse/-xreuse or -reuseFirst true/false -reuse2/-xreuse2 or -reuseSecond true/false If the option is false, XBoard kills off the chess engine after every game and starts it again for the next game. If the option is true (the default), XBoard starts the chess engine only once and uses it repeatedly to play multiple games. Some old chess engines may not work properly when reuse is turned on, but otherwise games will start faster if it is left on. -firstProtocolVersion version-number -secondProtocolVersion version-number This option specifies which version of the chess engine communication protocol to use. By default, version-number is 2. In version 1, the "protover" command is not sent to the engine; since version 1 is a subset of version 2, nothing else changes. Other values for version-number are not supported. -firstScoreAbs true/false -secondScoreAbs true/false If this option is set, the score reported by the engine is taken to be that in favor of white, even when the engine plays black. Important when XBoard uses the score for adjudications, or in PGN reporting. -niceEngines priority This option allows you to lower the priority of the engine processes, so that the generally insatiable hunger for CPU time of chess engines does not interfere so much with smooth operation of XBoard (or the rest of your system). Negative values could increase the engine priority, which is not recommended. -firstOptions string -secondOptions string The given string is a comma-separated list of (option name=option value) pairs, like the following example: "style=Karpov,blunder rate=0". If an option announced by the engine at startup through the feature commands of the XBoard/WinBoard protocol matches one of the option names (i.e. "style" or "blunder rate"), it would be set to the given value (i.e. "Karpov" or 0) through a corresponding option command to the engine. This provided that the type of the value (text or numeric) matches as well. -firstNeedsNoncompliantFEN string -secondNeedsNoncompliantFEN string The castling rights and e.p. fields of the FEN sent to the mentioned engine with the setboard command will be replaced by the given string. This can for instance be used to run engines that do not understand Chess960 FENs in variant fischerandom, to make them at least understand the opening position, through setting the string to "KQkq -". (Note you also have to give the e.p. field!) Other possible applications are to provide work-arounds for engines that want to see castling and e.p. fields in variants that do not have castling or e.p. (shatranj, courier, xiangqi, shogi) so that XBoard would normally omit them (string = "- -"), or to add variant-specific fields that are not yet supported by XBoard (e.g. to indicate the number of checks in 3check). -shuffleOpenings Forces shuffling of the opening setup in variants that normally have a fixed initial position. Shufflings are symmetric for black and white, and exempt King and Rooks in variants with normal castling. Remains in force until a new variant is selected.  File: xboard.info, Node: UCI + WB Engine Settings, Next: Tournament options, Prev: Chess engine options, Up: Options 4.2 UCI + WB Engine Settings ============================ -fUCI or -firstIsUCI true/false -sUCI or -secondIsUCI true/false Indicates if the mentioned engine executable file is an UCI engine, and should be run with the aid of the Polyglot adapter rather than directly. Xboard will then pass the other UCI options and engine name to Polyglot on its command line, according to the option `adapterCommand'. -fUCCI -sUCCI -fUSI -sUSI Options similar to `fUCI' and `sUCI', except that they use the indicated engine with the protocol adapter specified in the `uxiAdapter' option. This can then be configured for running an UCCI or USI adapter, as the need arises. -adapterCommand string The string conatins the command that should be issued by XBoard to start an engine that is accompanied by the `fUCI' option. Any identifier following a percent sign in the command (e.g. %fcp) will be considered the name of an XBoard option, and be replaced by the value of that option at the time the engine is started. For starting the second engine, any leading "f" or "first" in the option name will first be replaced by "s" or "second", before finding its value. Default: 'polyglot -noini -ec "%fcp" -ed "%fd"' -uxiAdapter string Similar to `adapterCommand', but used for engines accompanied by the `fUCCI' or `fUSI' option, so you can configure XBoard to be ready to handle more than one flavor of non-native protocols. Default: "" -polyglotDir filename Gives the name of the directory in which the Polyglot adapter for UCI engines resides. Default: "". -usePolyglotBook true/false Specifies if the Polyglot book should be used as GUI book. -polyglotBook filename Gives the filename of the opening book. The book is only used when the `usePolyglotBook' option is set to true, and the option `firstHasOwnBookUCI' or `secondHasOwnBookUCI' applying to the engine is set to false. The engine will be kept in force mode as long as the current position is in book, and XBoard will select the book moves for it. Default: "". -fNoOwnBookUCI or -firstXBook or -firstHasOwnBookUCI true/false -sNoOwnBookUCI or -secondXBook or -secondHasOwnBookUCI true/false Indicates if the mentioned engine has its own opening book it should play from, rather than using the external book through XBoard. Default: depends on setting of the option `discourageOwnBooks'. -discourageOwnBooks true/false When set, newly loaded engines will be assumed to use the GUI book, unless they explicitly specify differently. Otherwise they will be assumed to not use the GUI book, unless the specify differently (e.g. with `firstXBook'). Default: false. -bookDepth n Limits the use of the GUI book to the first n moves of each side. Default: 12. -bookVariation n A value n from 0 to 100 tunes the choice of moves from the GUI books from totally random to best-only. Default: 50 -mcBookMode When this volatile option is specified, the probing algorithm of the GUI book is altered to always select the move that is most under-represented based on its performance. When all moves are played in approximately the right proportion, a book miss will be reported, to give the engine opportunity to explore a new move. In addition score of the moves will be kept track of during the session in a book buffer. By playing an match in this mode, a book will be built from scratch. The only output are the saved games, which can be converted to an actual book later, with the `Save Games as Book' command. This command can also be used to pre-fill the book buffer before adding new games based on the probing algorithm. -fn string or -firstPgnName string -sn string or -secondPgnName string Indicates the name that should be used for the engine in PGN tags of engine-engine games. Intended to allow you to install verions of the same engine with different settings, and still distinguish them. Default: "". -defaultHashSize n Sets the size of the hash table to n MegaBytes. Together with the EGTB cache size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 64. -defaultCacheSizeEGTB n Sets the size of the EGTB cache to n MegaBytes. Together with the hash-table size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 4. -defaultPathEGTB filename Gives the name of the directory where the end-game tablebases are installed, for UCI engines. Default: "/usr/local/share/egtb". -egtFormats string Specifies which end-game tables are installed on the computer, and where. The argument is a comma-separated list of format specifications, each specification consisting of a format name, a colon, and a directory path name, e.g. "nalimov:/usr/local/share/egtb". If the name part matches that of a format that the engine requests through a feature command, xboard will relay the path name for this format to the engine through an egtpath command. One egtpath command for each matching format will be sent. Popular formats are "nalimov" DTM tablebases and "scorpio" bitbases. Default: "". -firstChessProgramNames={names} This option lets you customize the drop-down list of chess engine names that appears in the `Load Engine' and `Match Options' dialog. It consists of a list of strings, one per line. When an engine is loaded, the corresponding line is prefixed with "-fcp ", and processed like it appeared on the command line. That means that apart from the engine command, it can contain any list of XBoard options you want to use with this engine. (Commonly used options here are -fd, -firstXBook, -fUCI, -variant.) The value of this option is gradually built as you load new engines through the `Load Engine' menu dialog, with `Add to list' ticked. To change it, edit your settings file with a plain text editor.  File: xboard.info, Node: Tournament options, Next: ICS options, Prev: UCI + WB Engine Settings, Up: Options 4.3 Tournament options ====================== -defaultMatchGames n Sets the number of games that will be used for a match between two engines started from the menu to n. Also used as games per pairing in other tournament formats. Default: 10. -matchPause n Specifies the duration of the pause between two games of a match or tournament between engines as n milliseconds. Especially engines that do not support ping need this option, to prevent that the move they are thinking on when an opponent unexpectedly resigns will be counted for the next game, (leading to illegal moves there). Default: 10000. -tf filename or -tourneyFile filename Specifies the name of the tournament file used in match mode to conduct a multi-player tournament. This file is a special settings file, which stores the description of the tournament (including progress info), through normal options (e.g. for time control, load and save files), and through some special-purpose options listed below. -tt number or -tourneyType number Specifies the type of tourney: 0 = round-robin, N>0 = (multi-)gauntlet with N gauntlet engines, -1 = Swiss through external pairing engine. Volatile option, but stored in tourney file. -cy number or -tourneyCycles number Specifies the number of cycles in a tourney. Volatile option, but stored in tourney file. -participants list The list is a multi-line text string that specifies engines occurring in the `firstChesProgramNames' list in the settings file by their (implied or explicitly given) nicknames, one engine per line. The mentioned engines will play in the tourney. Volatile option, but stored in tourney file. -results string The string of +=- characters lists the result of all played games in a toruney. Games currently playing are listed as *, while a space indicates a game that is not yet played or playing . Volatile option, but stored in tourney file. -defaultTourneyName string Specifies the name of the tournament file XBoard should propose when the `Match Options' dialog is opened. Any %y, %M, %d, %h, %m, %s in the string are replaced by the current year, month, day of the month, hours, minutes, seconds of the current time, respectively, as two-digit number. A %Y would be replaced by the year as 4-digit number. Default: empty string. -pairingEngine filename Specifies the external program to be used to pair the participants in Swiss tourneys. XBoard communicates with this engine in the same way as it communicates with Chess engines. The only commands sent to the pairing engine are “results N string”, (where N is the number of participants, and string the results so far in the format of the results option), and “pairing N”, (where N is the number of the tourney game). To the latter the pairing engine should answer with “A-B”, where A and B are participant numbers (in the range 1-N). (There should be no reply to the results command.) Default: empty string. -afterGame string -afterTourney string When non-empty, the given string will be executed as a system command after each tournament game, orafterthe tourney completes, respectively. This can be used, for example, to autmatically run a cross-table generator on the PGN file where games are saved, to update the tourney standings. Default: "" -syncAfterRound true/false -syncAfterCycle true/false Controls whether different instances of XBoard concurrently running the same tournament will wait for each other. Defaults: sync after cycle, but not after round. -seedBase number Used to store the seed of the pseudo-random-number generator in the tourneyFile, so that separate instances of XBoard working on the same tourney can take coherent 'random' decisions, such as picking an opening for a given game number.  File: xboard.info, Node: ICS options, Next: Load and Save options, Prev: Tournament options, Up: Options 4.4 ICS options =============== -ics/-xics or -internetChessServerMode true/false Connect with an Internet Chess Server to play chess against its other users, observe games they are playing, or review games that have recently finished. Default: false. -icshost or -internetChessServerHost host The Internet host name or address of the chess server to connect to when in ICS mode. Default: `chessclub.com'. Another popular chess server to try is `freechess.org'. If your site doesn't have a working Internet name server, try specifying the host address in numeric form. You may also need to specify the numeric address when using the icshelper option with timestamp or timeseal (see below). -icsport or -internetChessServerPort port-number The port number to use when connecting to a chess server in ICS mode. Default: 5000. -icshelper or -internetChessServerHelper prog-name An external helper program used to communicate with the chess server. You would set it to "timestamp" for ICC (chessclub.com) or "timeseal" for FICS (freechess.org), after obtaining the correct version of timestamp or timeseal for your computer. See "help timestamp" on ICC and "help timeseal" on FICS. This option is shorthand for `-useTelnet -telnetProgram program'. -telnet/-xtelnet or -useTelnet true/false This option is poorly named; it should be called useHelper. If set to true, it instructs XBoard to run an external program to communicate with the Internet Chess Server. The program to use is given by the telnetProgram option. If the option is false (the default), XBoard opens a TCP socket and uses its own internal implementation of the telnet protocol to communicate with the ICS. *Note Firewalls::. -telnetProgram prog-name This option is poorly named; it should be called helperProgram. It gives the name of the telnet program to be used with the `gateway' and `useTelnet' options. The default is `telnet'. The telnet program is invoked with the value of `internetChessServerHost' as its first argument and the value of `internetChessServerPort' as its second argument. *Note Firewalls::. -gateway host-name If this option is set to a host name, XBoard communicates with the Internet Chess Server by using `rsh' to run the `telnetProgram' on the given host, instead of using its own internal implementation of the telnet protocol. You can substitute a different remote shell program for `rsh' using the `remoteShell' option described below. *Note Firewalls::. -internetChessServerCommPort or -icscomm dev-name If this option is set, XBoard communicates with the ICS through the given character I/O device instead of opening a TCP connection. Use this option if your system does not have any kind of Internet connection itself (not even a SLIP or PPP connection), but you do have dial-up access (or a hardwired terminal line) to an Internet service provider from which you can telnet to the ICS. The support for this option in XBoard is minimal. You need to set all communication parameters and tty modes before you enter XBoard. Use a script something like this: stty raw -echo 9600 > /dev/tty00 xboard -ics -icscomm /dev/tty00 Here replace `/dev/tty00' with the name of the device that your modem is connected to. You might have to add several more options to these stty commands. See the man pages for `stty' and `tty' if you run into problems. Also, on many systems stty works on its standard input instead of standard output, so you have to use `<' instead of `>'. If you are using linux, try starting with the script below. Change it as necessary for your installation. #!/bin/sh -f # configure modem and fire up XBoard # configure modem ( stty 2400 ; stty raw ; stty hupcl ; stty -clocal stty ignbrk ; stty ignpar ; stty ixon ; stty ixoff stty -iexten ; stty -echo ) < /dev/modem xboard -ics -icscomm /dev/modem After you start XBoard in this way, type whatever commands are necessary to dial out to your Internet provider and log in. Then telnet to ICS, using a command like `telnet chessclub.com 5000'. Important: See the paragraph below about extra echoes, in *note Limitations::. -icslogon or -internetChessServerLogonScript file-name Whenever XBoard connects to the Internet Chess Server, if it finds a file with the name given in this option, it feeds the file's contents to the ICS as commands. The default file name is `.icsrc'. Usually the first two lines of the file should be your ICS user name and password. The file can be either in $CHESSDIR, in XBoard's working directory if CHESSDIR is not set, or in your home directory. -msLoginDelay delay If you experience trouble logging on to an ICS when using the `-icslogon' option, inserting some delay between characters of the logon script may help. This option adds `delay' milliseconds of delay between characters. Good values to try are 100 and 250. -icsinput/-xicsinput or -internetChessServerInputBox true/false Sets the ICS Input Box menu option. *Note Mode Menu::. Default: false. -autocomm/-xautocomm or -autoComment true/false Sets the Auto Comment menu option. *Note Options Menu::. Default: false. -autoflag/-xautoflag or -autoCallFlag true/false Sets the Auto Flag menu option. *Note Options Menu::. Default: false. -autobs/-xautobs or -autoObserve true/false Sets the Auto Observe menu option. *Note Options Menu::. Default: false. -autoKibitz Enables kibitzing of the engines last thinking output (depth, score, time, speed, PV) before it moved to the ICS, in zippy mode. The option `showThinking' must be switched on for this option to work. Also diverts similar kibitz information of an opponent engine that is playing you through the ICS to the engine-output window, as if the engine was playing locally. -seekGraph true/false or -sg Enables displaying of the seek graph by left-clicking the board when you are logged on to an ICS and currently idle. The seek graph show all players currently seeking games on the ICS, plotted according to their rating and the time control of the game they seek, in three different colors (for rated, unrated and wild games). Computer ads are displayed as squares, human ads are dots. Default: false. -autoRefresh true/false Enables automatic updating of the seek graph, by having the ICS send a running update of all newly placed and removed seek ads. This consumes a substantial amount of communication bandwidth, and is only supported for FICS and ICC. Default: false. -backgroundObserve true/false When true, boards sent to you by the ICS from other games while you are playing (e.g. because you are observing them) will not be automatically displayed. Only a summary of time left and material of both players will appear in the message field above the board. XBoard will remember the last board it has received this way, and will display it in stead of the position in your own game when you press the right mouse button. No other information is stored on such games observed in the background; you cannot save such a game later, or step through its moves. This feature is provided solely for the benefit of bughouse players, to enable them to peek at their partner's game without the need to logon twice. Default: false. -dualBoard true/false In combination with -backgroundObserve true, this option will display the board of the background game side by side with that of your own game, so you can have it in view permanently. Any board or holdings info coming in will be displayed on the secondary board immediately. This feature is still experimental and largely unfinished. There is no animation or highlighting of moves on the secondary board. Default: false. -disguisePromotedPieces true/false When set promoted Pawns in crazyhouse/bughouse are displayed identical to primordial pieces of the same type, rather than distinguishable. Default: true. -moves/-xmoves or -getMoveList true/false Sets the Get Move List menu option. *Note Options Menu::. Default: true. -alarm/-xalarm or -icsAlarm true/false Sets the ICS Alarm menu option. *Note Options Menu::. Default: true. -icsAlarmTime ms Sets the time in milliseconds for the ICS Alarm menu option. *Note Options Menu::. Default: 5000. lowTimeWarning true/false Controls a color change of the board as a warning your time is running out. *Note Options Menu::. Default: false. -pre/-xpre \fRor\fB -premove true/false Sets the Premove menu option. *Note Options Menu::. Default: true. -prewhite/-xprewhite or -premoveWhite -preblack/-xpreblack or -premoveBlack -premoveWhiteText string -premoveBlackText string Set the menu options for specifying the first move for either color. *Note Options Menu::. Defaults: false and empty strings, so no pre-moves. -quiet/-xquiet or -quietPlay true/false Sets the Quiet Play menu option. *Note Options Menu::. Default: false. -colorizeMessages or -colorize/-xcolorize Setting colorizeMessages to true tells XBoard to colorize the messages received from the ICS. Colorization works only if your xterm supports ISO 6429 escape sequences for changing text colors. Default: true. -colorShout foreground,background,bold -colorSShout foreground,background,bold -colorCShout foreground,background,bold -colorChannel1 foreground,background,bold -colorChannel foreground,background,bold -colorKibitz foreground,background,bold -colorTell foreground,background,bold -colorChallege foreground,background,bold -colorRequest foreground,background,bold -colorSeek foreground,background,bold -colorNormal foreground,background,bold These options set the colors used when colorizing ICS messages. All ICS messages are grouped into one of these categories: shout, sshout, channel 1, other channel, kibitz, tell, challenge, request (including abort, adjourn, draw, pause, and takeback), or normal (all other messages). Each foreground or background argument can be one of the following: black, red, green, yellow, blue, magenta, cyan, white, or default. Here "default" means the default foreground or background color of your xterm. Bold can be 1 or 0. If background is omitted, "default" is assumed; if bold is omitted, 0 is assumed. -soundProgram progname If this option is set to a sound-playing program that is installed and working on your system, XBoard can play sound files when certain events occur, listed below. The default program name is "play". If any of the sound options is set to "$", the event rings the terminal bell by sending a ^G character to standard output, instead of playing a sound file. If an option is set to the empty string "", no sound is played for that event. -soundDirectory directoryname This option specifies where XBoard will look for sound files, when these are not given as an absolute path name. -soundShout filename -soundSShout filename -soundCShout filename -soundChannel filename -soundChannel1 filename -soundKibitz filename -soundTell filename -soundChallenge filename -soundRequest filename -soundSeek filename These sounds are triggered in the same way as the colorization events described above. They all default to "", no sound. They are played only if the colorizeMessages is on. CShout is synonymous with SShout. -soundMove filename This sound is used by the Move Sound menu option. Default: "$". -soundIcsAlarm filename This sound is used by the ICS Alarm menu option. Default: "$". -soundIcsWin filename This sound is played when you win an ICS game. Default: "" (no sound). -soundIcsLoss filename This sound is played when you lose an ICS game. Default: "" (no sound). -soundIcsDraw filename This sound is played when you draw an ICS game. Default: "" (no sound). -soundIcsUnfinished filename This sound is played when an ICS game that you are participating in is aborted, adjourned, or otherwise ends inconclusively. Default: "" (no sound).  File: xboard.info, Node: Load and Save options, Next: User interface options, Prev: ICS options, Up: Options 4.5 Load and Save options ========================= -lgf or -loadGameFile file -lgi or -loadGameIndex index If the `loadGameFile' option is set, XBoard loads the specified game file at startup. The file name `-' specifies the standard input. If there is more than one game in the file, XBoard pops up a menu of the available games, with entries based on their PGN (Portable Game Notation) tags. If the `loadGameIndex' option is set to `N', the menu is suppressed and the N th game found in the file is loaded immediately. The menu is also suppressed if `matchMode' is enabled or if the game file is a pipe; in these cases the first game in the file is loaded immediately. Use the `pxboard' shell script provided with XBoard if you want to pipe in files containing multiple games and still see the menu. If the loadGameIndex specifies an index -1, this triggers auto-increment of the index in `matchMode', which means that after every game the index is incremented by one, causing each game of the match to be played from the next game in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each game in the file is used twice (with reversed colors). The `rewindIndex' option causes the index to be reset to the first game of the file when it has reached a specified value. -rewindIndex n Causes a position file or game file to be rewound to its beginning after n positions or games in auto-increment `matchMode'. See `loadPositionIndex' and `loadGameIndex'. default: 0 (no rewind). -td or -timeDelay seconds Time delay between moves during `Load Game' or `Analyze File'. Fractional seconds are allowed; try `-td 0.4'. A time delay value of -1 tells XBoard not to step through game files automatically. Default: 1 second. -sgf or -saveGameFile file If this option is set, XBoard appends a record of every game played to the specified file. The file name `-' specifies the standard output. -autosave/-xautosave or -autoSaveGames true/false Sets the Auto Save menu option. *Note Options Menu::. Default: false. Ignored if `saveGameFile' is set. -onlyOwnGames true/false Suppresses auto-saving of ICS observed games. Default: false. -lpf or -loadPositionFile file -lpi or -loadPositionIndex index If the `loadPositionFile' option is set, XBoard loads the specified position file at startup. The file name `-' specifies the standard input. If the `loadPositionIndex' option is set to N, the Nth position found in the file is loaded; otherwise the first position is loaded. If the loadPositionIndex specifies an index -1, this triggers auto-increment of the index in `matchMode', which means that after every game the index is incremented by one, causing each game of the match to be played from the next position in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each position in the file is used twice (with the engines playing opposite colors). The `rewindIndex' option causes the index to be reset to the first position of the file when it has reached a specified value. -spf or -savePositionFile file If this option is set, XBoard appends the final position reached in every game played to the specified file. The file name `-' specifies the standard output. -pgnExtendedInfo true/false If this option is set, XBoard saves depth, score and time used for each move that the engine found as a comment in the PGN file. Default: false. -pgnEventHeader string Sets the name used in the PGN event tag to string. Default: "Computer Chess Game". -pgnNumberTag true/false Include the (unique) sequence number of a tournament game into the saved PGN file as a 'number' tag. Default: false. -saveOutOfBookInfo true/false Include the information on how the engine(s) game out of its opening book in a special 'annotator' tag with the PGN file. Default: true. -oldsave/-xoldsave or -oldSaveStyle true/false Sets the Old Save Style menu option. *Note Options Menu::. Default: false. -gameListTags string The character string lists the PGN tags that should be printed in the Game List, and their order. The meaning of the codes is e=event, s=site, d=date, o=round, p=players, r=result, w=white Elo, b=black Elo, t=time control, v=variant, a=out-of-book info, c=result comment. Default: "eprd" -ini or -settingsFile filename -saveSettingsFile filename @filename When XBoard encounters an option -settingsFile (or -ini for short), or @filename, it tries to read the mentioned file, and substitutes the contents of it (presumaby more command-line options) in place of the option. In the case of -ini or -settingsFile, the name of a successfully read settings file is also remembered as the file to use for saving settings (automatically on exit, or on user command). An option of the form @filename does not affect saving. The option -saveSettingsFile does specify a name of the file to use for saving, without reading any options from it, and is thus also effective when the file did not exist yet. So the settings will be saved to the file specified in the last -saveSettingsFile or succesfull -settingsFile / -ini command, if any, and in /etc/xboard/xboard.conf otherwise. Usualy the latter is only accessible for the system administrator, though, and will be used to contain system-wide default setings, amongst which a -saveSettingsFile and -settingsFile options to specify a settings file accessible to the individual user, such as ~/.xboardrc in the user's home directory. -saveSettingsOnExit true/false Controls saving of options on the settings file. *Note Options Menu::. Default: true.  File: xboard.info, Node: User interface options, Next: Adjudication Options, Prev: Load and Save options, Up: Options 4.6 User interface options ========================== -display -geometry -iconic -name These and most other standard Xt options are accepted. -noGUI Suppresses all GUI functions of XBoard (to speed up automated ultra-fast engine-engine games, which you don't want to watch). There will be no board or clock updates, no printing of moves, and no update of the icon on the task bar in this mode. -logoSize N This option controls the drawing of player logos next to the clocks. The integer N specifies the width of the logo in pixels; the logo height will always be half the width. When N = 0, no logos will be diplayed. Default: 0. -firstLogo imagefile -secondLogo imagefile Specify the images to be used as player logos when `logoSize' is non-zero, next to the white and black clocks, respectively. -autoLogo true/false -logoDir filename When `autoLogo' is set, XBoard will search for a PNG image file with the name of the engine or ICS in the directory specified by `logoDir'. -recentEngines number -recentEngineList list When the number is larger than zero, it determines how many recently used engines will be appended at the bottom of the `Engines' menu. The engines will be saved in your settings file as the option `recentEngineList', by their nicknames, and the most recently used one will always be sorted to the top. If the list after that is longer than the specified number, the last one is discarded. Changes in the list will only become visible the next session, provided you saved the settings. Default: 6. -oneClickMove true/false When set, this option allows you to enter moves by only clicking the to- or from-square, when only a single legal move to or from that square is possible. Double-clicking a piece (or clicking an already selected piece) will instruct that piece to make the only capture it can legally do. Default: false. -movesound/-xmovesound or -ringBellAfterMoves true/false Sets the Move Sound menu option. *Note Options Menu::. Default: false. For compatibility with old XBoard versions, -bell/-xbell are also accepted as abbreviations for this option. -exit/-xexit or -popupExitMessage true/false Sets the Popup Exit Message menu option. *Note Options Menu::. Default: true. -popup/-xpopup or -popupMoveErrors true/false Sets the Popup Move Errors menu option. *Note Options Menu::. Default: false. -queen/-xqueen or -alwaysPromoteToQueen true/false Sets the Always Queen menu option. *Note Options Menu::. Default: false. -sweepPromotions true/false Sets the `Almost Always Promote to Queen' menu option. *Note Options Menu::. Default: false. -legal/-xlegal or -testLegality true/false Sets the Test Legality menu option. *Note Options Menu::. Default: true. -size or -boardSize (sizeName | n1,n2,n3,n4,n5,n6,n7) Determines how large the board will be, by selecting the pixel size of the pieces and setting a few related parameters. The sizeName can be one of: Titanic, giving 129x129 pixel pieces, Colossal 116x116, Giant 108x108, Huge 95x95, Big 87x87, Large 80x80, Bulky 72x72, Medium 64x64, Moderate 58x58, Average 54x54, Middling 49x49, Mediocre 45x45, Small 40x40, Slim 37x37, Petite 33x33, Dinky 29x29, Teeny 25x25, or Tiny 21x21. Xboard installs with a set of scalable (svg) piece images, which it scales to any of the requested sizes. The square size can further be continuously scaled by sizing the board window, but this only adapts the size of the pieces, and has no effect on the width of the grid lines or the font choice (both of which would depend on he selected boardSize). The default depends on the size of your screen; it is approximately the largest size that will fit without clipping. You can select other sizes or vary other layout parameters by providing a list of comma-separated values (with no spaces) as the argument. You do not need to provide all the values; for any you omit from the end of the list, defaults are taken from the nearest built-in size. The value `n1' gives the piece size, `n2' the width of the black border between squares, `n3' the desired size for the clockFont, `n4' the desired size for the coordFont, `n5' the desired size for the messageFont, `n6' the smallLayout flag (0 or 1), and `n7' the tinyLayout flag (0 or 1). All dimensions are in pixels. If the border between squares is eliminated (0 width), the various highlight options will not work, as there is nowhere to draw the highlight. If smallLayout is 1 and `titleInWindow' is true, the window layout is rearranged to make more room for the title. If tinyLayout is 1, the labels on the menu bar are abbreviated to one character each and the buttons in the button bar are made narrower. -overrideLineGap n When n >= 0, this forces the width of the black border between squares to n pixels for any board size. Mostly used to suppress the grid entirely by setting n = 0, e.g. in xiangqi or just getting a prettier picture. When n < 0 this the size-dependent width of the grid lines is used. Default: -1. -coords/-xcoords or -showCoords true/false Sets the Show Coords menu option. *Note Options Menu::. Default: false. The `coordFont' option specifies what font to use. -autoraise/-xautoraise or -autoRaiseBoard true/false Sets the Auto Raise Board menu option. *Note Options Menu::. Default: true. -autoflip/-xautoflip or -autoFlipView true/false Sets the Auto Flip View menu option. *Note Options Menu::. Default: true. -flip/-xflip or -flipView true/false If Auto Flip View is not set, or if you are observing but not participating in a game, then the positioning of the board at the start of each game depends on the flipView option. If flipView is false (the default), the board is positioned so that the white pawns move from the bottom to the top; if true, the black pawns move from the bottom to the top. In any case, the Flip menu option (see *note Options Menu::) can be used to flip the board after the game starts. -title/-xtitle or -titleInWindow true/false If this option is true, XBoard displays player names (for ICS games) and game file names (for `Load Game') inside its main window. If the option is false (the default), this information is displayed only in the window banner. You probably won't want to set this option unless the information is not showing up in the banner, as happens with a few X window managers. -buttons/-xbuttons or -showButtonBar True/False If this option is False, xboard omits the [<<] [<] [P] [>] [>>] button bar from the window, allowing the message line to be wider. You can still get the functions of these buttons using the menus or their keyboard shortcuts. Default: true. -evalZoom factor The score interval (-1,1) is blown up on the vertical axis of the Evaluation Graph by the given factor. Default: 1 -evalThreshold n Score below n (centiPawn) are plotted as 0 in the Evaluation Graph. Default: 25 -mono/-xmono or -monoMode true/false Determines whether XBoard displays its pieces and squares with two colors (true) or four (false). You shouldn't have to specify `monoMode'; XBoard will determine if it is necessary. -showTargetSquares true/false Determines whether XBoard can highlight the squares a piece has legal moves to, when you grab that piece with the mouse. Default: false. -flashCount count -flashRate rate -flash/-xflash These options enable flashing of pieces when they land on their destination square. `flashCount' tells XBoard how many times to flash a piece after it lands on its destination square. `flashRate' controls the rate of flashing (flashes/sec). Abbreviations: `flash' sets flashCount to 3. `xflash' sets flashCount to 0. Defaults: flashCount=0 (no flashing), flashRate=5. -highlight/-xhighlight or -highlightLastMove true/false Sets the Highlight Last Move menu option. *Note Options Menu::. Default: false. -highlightMoveWithArrow true/false Sets the Highlight with Arrow menu option. *Note Options Menu::. Default: false. -blind/-xblind or -blindfold true/false Sets the Blindfold menu option. *Note Options Menu::. Default: false. -periodic/-xperiodic or -periodicUpdates true/false Controls updating of current move andnode counts in analysis mode. Default: true. -fSAN -sSAN Causes the PV in thinking output of the mentioned engine to be converted to SAN before it is further processed. Warning: this might lose engine output not understood by the parser, and uses a lot of CPU power. Default: the PV is displayed exactly as the engine produced it. -showEvalInMoveHistory true/false Controls whether the evaluation scores and search depth of engine moves are displayed with the move in the move-history window. Default: true. -clockFont font The font used for the clocks. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal-*-*-*-*-*-*-*-*. -coordFont font The font used for rank and file coordinate labels if `showCoords' is true. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal-*-*-*-*-*-*-*-*. -messageFont font The font used for popup dialogs, menus, comments, etc. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-medium-r-normal-*-*-*-*-*-*-*-*. -fontSizeTolerance tol In the font selection algorithm, a nonscalable font will be preferred over a scalable font if the nonscalable font's size differs by `tol' pixels or less from the desired size. A value of -1 will force a scalable font to always be used if available; a value of 0 will use a nonscalable font only if it is exactly the right size; a large value (say 1000) will force a nonscalable font to always be used if available. Default: 4. -pid or -pieceImageDirectory dir This options control what piece images xboard uses. XBoard will look in the specified directory for an image in png or svg format for every piece type, with names like BlackQueen.svg, WhiteKnight.svg etc. When neither of these is found (or no valid directory is specified) XBoard will use the svg piece that was installed with it (from the source-tree directory `svg'). Both svg and png images will be scaled by XBoard to the required size, but the png pieces lose much in quality when scaled too much. -whitePieceColor color -blackPieceColor color -lightSquareColor color -darkSquareColor color -highlightSquareColor color -preoveHighlightColor color -lowTimeWarningColor color Colors to use for the pieces, squares, and square highlights. Defaults: -whitePieceColor #FFFFCC -blackPieceColor #202020 -lightSquareColor #C8C365 -darkSquareColor #77A26D -highlightSquareColor #FFFF00 -premoveHighlightColor #FF0000 -lowTimeWarningColor #FF0000 On a grayscale monitor you might prefer: -whitePieceColor gray100 -blackPieceColor gray0 -lightSquareColor gray80 -darkSquareColor gray60 -highlightSquareColor gray100 -premoveHighlightColor gray70 -lowTimeWarningColor gray70 The PieceColor options only work properly if the image files defining the pieces were pure black & white (possibly anti-aliased to produce gray scales and semi-transparancy), like the pieces images that come with the install. Their effect on colored pieces is undefined. The SquareColor option only have an effect when no board textures are used. -trueColors true/false When set, this option suppresses the effect of the PieceColor options mentioned above. This is recommended for images that are already colored. -useBoardTexture true/false -liteBackTextureFile filename -darkBackTextureFile filename Indicate the png image files to be used for drawing the board squares, and if they should be used rather than using simple colors. The algorithm for cutting squares out of a given bitmap is such that the picture is perfectly reproduced when a bitmap the size of the complete board is given. Default: false and "" -drag/-xdrag or -animateDragging true/false Sets the Animate Dragging menu option. *Note Options Menu::. Default: true. -animate/-xanimate or -animateMoving true/false Sets the Animate Moving menu option. *Note Options Menu::. Default: true. -animateSpeed n Number of milliseconds delay between each animation frame when Animate Moves is on. -autoDisplayComment true/false -autoDisplayTags true/false If set to true, these options cause the window with the move comments, and the window with PGN tags, respectively, to pop up automatically when such tags or comments are encountered during the replaying a stored or loaded game. Default: true. -pasteSelection true/false If this option is set to true, the Paste Position and Paste Game options paste from the currently selected text. If false, they paste from the clipboard. Default: false. -autoCopyPV true|false When this option is set, the position displayed on the board when you terminate a PV walk (initiated by a right-click on board or engine-output window) will be automatically put on the clipboard as FEN. Default: false. -dropMenu true|false This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) drop menu rather than displaying the position at the end of the principal variation. Default: False. -pieceMenu true|false This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) piece menu in Edit Position mode. From this menu you can select the piece to put on the square you clicked to bring up the menu, or select items such as `clear board'. You can also `promote' or `demote' a clicked piece to convert it into an unorthodox piece that is not directly in the menu, or give the move to `black' or `white'. -variations true|false When this option is on, you can start new variations in Edit Game or Analyze mode by holding the Shift key down while entering a move. When it is off, the Shift key will be ignored. Default: False. -appendPV true|false When this option is on, right-clicking a PV in the Engine Output window will play the first move of that PV in Analyze mode, or as many moves as you walk through by moving the mouse. Default: False. -absoluteAnalysisScores true|false When true, scores on the Engine Output window during analysis will be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False. -scoreWhite true|false When true, scores will always be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False.  File: xboard.info, Node: Adjudication Options, Next: Other options, Prev: User interface options, Up: Options 4.7 Adjudication Options ======================== -adjudicateLossThreshold n If the given value is non-zero, XBoard adjudicates the game as a loss if both engines agree for a duration of 6 consecutive ply that the score is below the given score threshold for that engine. Make sure the score is interpreted properly by XBoard, using `-firstScoreAbs' and `-secondScoreAbs' if needed. Default: 0 (no adjudication) -adjudicateDrawMoves n If the given value is non-zero, XBoard adjudicates the game as a draw if after the given number of moves it was not yet decided. Default: 0 (no adjudication) -checkMates true/false If this option is set, XBoard detects all checkmates and stalemates, and ends the game as soon as they occur. Legality-testing must be switched on for this option to work. Default: true -testClaims true/false If this option is set, XBoard verifies all result claims made by engines, and those who send false claims will forfeit the game because of it. Legality-testing must be switched on for this option to work. Default: true -materialDraws true/false If this option is set, XBoard adjudicates games as draws when there is no sufficient material left to inflict a checkmate. This applies to KBKB with like bishops (any number, actually), and to KBK, KNK and KK. Legality-testing must be switched on for this option to work. Default: true -trivialDraws true/false If this option is set, XBoard adjudicates games as draws that cannot be usually won without opponent cooperation. This applies to KBKB with unlike bishops, and to KBKN, KNKN, KNNK, KRKR and KQKQ. The draw is called after 6 ply into these end-games, to allow quick mates that can occur in some exceptional positions to be found by the engines. KQKQ does not really belong in this category, and might be taken out in the future. (When bitbase-based adjudications are implemented.) Legality-testing must be on for this option to work. Default: false -ruleMoves n If the given value is non-zero, XBoard adjudicates the game as a draw after the given number of consecutive reversible moves. Engine draw claims are always accepted after 50 moves, irrespective of the given value of n. -repeatsToDraw n If the given value is non-zero, xboard adjudicates the game as a draw if a position is repeated the given number of times. Engines draw claims are always accepted after 3 repeats, (on the 3rd occurrence, actually), irrespective of the value of n. Beware that positions that have different castling or en-passant rights do not count as repeats, XBoard is fully e.p. and castling aware!  File: xboard.info, Node: Other options, Prev: Adjudication Options, Up: Options 4.8 Other options ================= -ncp/-xncp or -noChessProgram true/false If this option is true, XBoard acts as a passive chessboard; it does not start a chess engine at all. Turning on this option also turns off clockMode. Default: false. -viewer -viewerOptions string Presence of the volatile option `viewer' on the command line will cause the value of the persistent option `viewerOptions' as stored in the settings file to be appended to the command line. The `view' option will be used by desktop associations with game or position file types, so that `viewerOptions' can be used to configure the exact mode XBoard will start in when it should act on such a file (e.g. in -ncp mode, or analyzing with your favorite engine). The options are also automatically appended when Board is invoked with a single argument not being an option name, which is then assumed to be the name of a `loadGameFile' or (when the name ends in .fen) a `loadPositionFile'. Default: "-ncp -engineOutputUp false -saveSettingsOnExit false". -tourneyOptions string When XBoard is invoked with a single argument that is a file with .trn extension, it will assume this argument to be the value of a `tourneyFile' option, and apped the value of the persistent option `tourneyOptions' as stored in the settings file to the command line. Thus the value of `tourneyOptions' can be used to configure XBoard to automatically start running a tournament when it should act on such a file. Default: "-ncp -mm -saveSettingsOnExit false". -mode or -initialMode modename If this option is given, XBoard selects the given modename from the Mode menu after starting and (if applicable) processing the loadGameFile or loadPositionFile option. Default: "" (no selection). Other supported values are MachineWhite, MachineBlack, TwoMachines, Analysis, AnalyzeFile, EditGame, EditPosition, and Training. -variant varname Activates preliminary, partial support for playing chess variants against a local engine or editing variant games. This flag is not needed in ICS mode. Recognized variant names are: normal Normal chess wildcastle Shuffle chess, king can castle from d file nocastle Shuffle chess, no castling allowed fischerandom Fischer Random shuffle chess bughouse Bughouse, ICC/FICS rules crazyhouse Crazyhouse, ICC/FICS rules losers Lose all pieces or get mated (ICC wild 17) suicide Lose all pieces including king (FICS) giveaway Try to have no legal moves (ICC wild 26) twokings Weird ICC wild 9 kriegspiel Opponent's pieces are invisible atomic Capturing piece explodes (ICC wild 27) 3check Win by giving check 3 times (ICC wild 25) shatranj An ancient precursor of chess (ICC wild 28) xiangqi Chinese Chess (on a 9x10 board) shogi Japanese Chess (on a 9x9 board & piece drops) capablanca Capablanca Chess (10x8 board, with Archbishop and Chancellor pieces) gothic similar, with a better initial position caparandom An FRC-like version of Capablanca Chess (10x8) janus A game with two Archbishops (10x8 board) courier Medieval intermediate between shatranj and modern Chess (on 12x8 board) falcon Patented 10x8 variant with two Falcon pieces berolina Pawns capture straight ahead, and move diagonal cylinder Pieces wrap around the board edge knightmate King moves as Knight, and vice versa super Superchess (shuffle variant with 4 exo-pieces) makruk Thai Chess (shatranj-like, P promotes on 6th rank) spartan Spartan Chess (black has unorthodox pieces) fairy A catchall variant in which all piece types known to XBoard can participate (8x8) unknown Catchall for other unknown variants NOT ALL BOARDSIZES PROVIDE A COMPLETE SET OF BUILT-IN BITMAPS FOR ALL UN-ORTHODOX PIECES, though. Only in `boardSize' middling and bulky all 22 piece types are provided, while -boardSize petite has most of them. Archbishop, Chancellor and Amazon are supported in every size from petite to bulky. Kings or Amazons are substituted for missing bitmaps. You can still play variants needing un-orthodox pieces in other board sizes providing your own bitmaps through the `bitmapDirectory' or `pixmapDirectory' options. In the shuffle variants, XBoard now does shuffle the pieces, although you can still do it by hand using Edit Position. Some variants are supported only in ICS mode, including bughouse, and kriegspiel. The winning/drawing conditions in crazyhouse (off-board interposition on mate) are not fully understood, but losers, suicide, giveaway, atomic, and 3check should be OK. Berolina and cylinder chess can only be played with legality testing off. In crazyhouse, XBoard now does keep track of off-board pieces. In shatranj it does implement the baring rule when mate detection is switched on. -boardHeight N Allows you to set a non-standard number of board ranks in any variant. If the height is given as -1, the default height for the variant is used. Default: -1 -boardWidth N Allows you to set a non-standard number of board files in any variant. If the width is given as -1, the default width for the variant is used. With a non-standard width, the initial position will always be an empty board, as the usual opening array will not fit. Default: -1 -holdingsSize N Allows you to set a non-standard size for the holdings in any variant. If the size is given as -1, the default holdings size for the variant is used. The first N piece types will go into the holdings on capture, and you will be able to drop them on the board in stead of making a normal move. If size equals 0, there will be no holdings. Default: -1 -defaultFrcPosition N Specifies the number of the opening position in shuffle games like Chess960. A value of -1 means the position is randomly generated by XBoard at the beginning of every game. Default: -1 -pieceToCharTable string The characters that are used to represent the piece types XBoard knows in FEN diagrams and SAN moves. The string argument has to have an even length (or it will be ignored), as white and black pieces have to be given separately (in that order). The last letter for each color will be the King. The letters before that will be PNBRQ and then a whole host of fairy pieces in an order that has not fully crystallized yet (currently FEACWMOHIJGDVSLU, F=Ferz, Elephant, A=Archbishop, C=Chancellor, W=Wazir, M=Commoner, O=Cannon, H=Nightrider). You should list at least all pieces that occur in the variant you are playing. If you have less than 44 characters in the string, the pieces not mentioned will get assigned a period, and you will not be able to distinguish them in FENs. You can also explicitly assign pieces a period, in which case they will not be counted in deciding which captured pieces can go into the holdings. A tilde '~' as a piece name does mean this piece is used to represent a promoted Pawn in crazyhouse-like games, i.e. on capture it turns back onto a Pawn. A '+' similarly indicates the piece is a shogi-style promoted piece, that should revert to its non-promoted version on capture (rather than to a Pawn). Note that promoted pieces are represented by pieces 11 further in the list. You should not have to use this option often: each variant has its own default setting for the piece representation in FEN, which should be sufficient in normal use. Default: "" -pieceNickNames string The characters in the string are interpreted the same way as in the `pieceToCharTable' option. But on input, piece-ID letters are first looked up in the nicknames, and only if not defined there, in the normal pieceToCharTable. This allows you to have two letters designate the same piece, (e.g. N as an alternative to H for Horse in Xiangqi), to make reading of non-compliant notations easier. Default: "" -colorNickNames string The side-to-move field in a FEN will be first matched against the letters in the string (first character for white, second for black), before it is matched to the regular 'w' and 'b'. This makes it easier to read non-compliant FENs, which, say, use 'r' for white. Default: "" -debug/-xdebug or -debugMode true/false Turns on debugging printout. -debugFile filename or -nameOfDebugFile filename Sets the name of the file to which XBoard saves debug information (including all communication to and from the engines). A `%d' in the given file name (e.g. game%d.debug) will be replaced by the unique sequence number of a tournament game, so that the debug output of each game will be written on a separate file. -engineDebugOutput number Specifies how XBoard should handle unsolicited output from the engine, with respect to saving it in the debug file. The output is further (hopefully) ignored. If number=0, XBoard refrains from writing such spurious output to the debug file. If number=1, all engine output is written faithfully to the debug file. If number=2, any protocol-violating line is prefixed with a '#' character, as the engine itself should have done if it wanted to submit info for inclusion in the debug file. This option is provided for the benefit of applications that use the debug file as a source of information, such as the broadcaster of live games TLCV / TLCS. Such applications can be protected from spurious engine output that might otherwise confuse them. -rsh or -remoteShell shell-name Name of the command used to run programs remotely. The default is `rsh' or `remsh', determined when XBoard is configured and compiled. -ruser or -remoteUser user-name User name on the remote system when running programs with the `remoteShell'. The default is your local user name. -userName username Name under which the Human player will be listed in the PGN file. Default is the login name on your local computer. -delayBeforeQuit number -delayAfterQuit number These options specify how long XBoard has to wait before sending a termination signal to rogue engine processes, that do not want to react to the 'quit' command. The second one determines the pause after killing the engine, to make sure it dies. -searchMode n The integer n encodes the mode for the `find position' function. Default: 1 (= Exact position match) -eloThresholdBoth elo -eloThresholdAny elo Defines a lower limit for the Elo rating, which has to be surpassed before a game will be considered when searching for a board position. Default: 0 -dateThreshold year Only games not played before the given year will be considered when searching for a board position  File: xboard.info, Node: Chess Servers, Next: Firewalls, Prev: Options, Up: Top 5 Chess Servers *************** An "Internet Chess Server", or "ICS", is a place on the Internet where people can get together to play chess, watch other people's games, or just chat. You can use either `telnet' or a client program like XBoard to connect to the server. There are thousands of registered users on the different ICS hosts, and it is not unusual to meet 200 on both chessclub.com and freechess.org. Most people can just type `xboard -ics' to start XBoard as an ICS client. Invoking XBoard in this way connects you to the Internet Chess Club (ICC), a commercial ICS. You can log in there as a guest even if you do not have a paid account. To connect to the largest Free ICS (FICS), use the command `xboard -ics -icshost freechess.org' instead, or substitute a different host name to connect to your favorite ICS. For a full description of command-line options that control the connection to ICS and change the default values of ICS options, see *note ICS options::. While you are running XBoard as an ICS client, you use the terminal window that you started XBoard from as a place to type in commands and read information that is not available on the chessboard. The first time you need to use the terminal is to enter your login name and password, if you are a registered player. (You don't need to do this manually; the `icsLogon' option can do it for you. *note ICS options::.) If you are not registered, enter `g' as your name, and the server will pick a unique guest name for you. Some useful ICS commands include `help ' to get help on the given . To get a list of possible topics type "help" without topic. Try the help command before you ask other people on the server for help. For example `help register' tells you how to become a registered ICS player. `who ' to see a list of people who are logged on. Administrators (people you should talk to if you have a problem) are marked with the character `*', an asterisk. The allow you to display only selected players: For example, `who of' shows a list of players who are interested in playing but do not have an opponent. `games' to see what games are being played `match [] []' to challenge another player to a game. Both opponents get minutes for the game, and seconds will be added after each move. If another player challenges you, the server asks if you want to accept the challenge; use the `accept' or `decline' commands to answer. `accept' `decline' to accept or decline another player's offer. The offer may be to start a new game, or to agree to a `draw', `adjourn' or `abort' the current game. *Note Action Menu::. If you have more than one pending offer (for example, if more than one player is challenging you, or if your opponent offers both a draw and to adjourn the game), you have to supply additional information, by typing something like `accept ', `accept draw', or `draw'. `draw' `adjourn' `abort' asks your opponent to terminate a game by mutual agreement. Adjourned games can be continued later. Your opponent can either `decline' your offer or accept it (by typing the same command or typing `accept'). In some cases these commands work immediately, without asking your opponent to agree. For example, you can abort the game unilaterally if your opponent is out of time, and you can claim a draw by repetition or the 50-move rule if available simply by typing `draw'. `finger ' to get information about the given . (Default: yourself.) `vars' to get a list of personal settings `set ' to modify these settings `observe ' to observe an ongoing game of the given . `examine' `oldmoves' to review a recently completed game Some special XBoard features are activated when you are in examine mode on ICS. See the descriptions of the menu commands `Forward', `Backward', `Pause', `ICS Client', and `Stop Examining' on the *note Edit Menu::, *note Mode Menu::, and *note Action Menu::.  File: xboard.info, Node: Firewalls, Next: Environment, Prev: Chess Servers, Up: Top 6 Firewalls *********** By default, XBoard communicates with an Internet Chess Server by opening a TCP socket directly from the machine it is running on to the ICS. If there is a firewall between your machine and the ICS, this won't work. Here are some recipes for getting around common kinds of firewalls using special options to XBoard. Important: See the paragraph in the below about extra echoes, in *note Limitations::. Suppose that you can't telnet directly to ICS, but you can telnet to a firewall host, log in, and then telnet from there to ICS. Let's say the firewall is called `firewall.example.com'. Set command-line options as follows: xboard -ics -icshost firewall.example.com -icsport 23 Then when you run XBoard in ICS mode, you will be prompted to log in to the firewall host. This works because port 23 is the standard telnet login service. Do so, then telnet to ICS, using a command like `telnet chessclub.com 5000', or whatever command the firewall provides for telnetting to port 5000. If your firewall lets you telnet (or rlogin) to remote hosts but doesn't let you telnet to port 5000, you may be able to connect to the chess server on port 23 instead, which is the port the telnet program uses by default. Some chess servers support this (including chessclub.com and freechess.org), while some do not. If your chess server does not allow connections on port 23 and your firewall does not allow you to connect to other ports, you may be able to connect by hopping through another host outside the firewall that you have an account on. For instance, suppose you have a shell account at `foo.edu'. Follow the recipe above, but instead of typing `telnet chessclub.com 5000' to the firewall, type `telnet foo.edu' (or `rlogin foo.edu'), log in there, and then type `telnet chessclub.com 5000'. Suppose that you can't telnet directly to ICS, but you can use rsh to run programs on a firewall host, and that host can telnet to ICS. Let's say the firewall is called `rsh.example.com'. Set command-line options as follows: xboard -ics -gateway rsh.example.com -icshost chessclub.com Then when you run XBoard in ICS mode, it will connect to the ICS by using `rsh' to run the command `telnet chessclub.com 5000' on host `rsh.example.com'. Suppose that you can telnet anywhere you want, but you have to run a special program called `ptelnet' to do so. First, we'll consider the easy case, in which `ptelnet chessclub.com 5000' gets you to the chess server. In this case set command line options as follows: xboard -ics -telnet -telnetProgram ptelnet Then when you run XBoard in ICS mode, it will issue the command `ptelnet chessclub.com 5000' to connect to the ICS. Next, suppose that `ptelnet chessclub.com 5000' doesn't work; that is, your `ptelnet' program doesn't let you connect to alternative ports. As noted above, your chess server may allow you to connect on port 23 instead. In that case, just add the option `-icsport ""' to the above command. But if your chess server doesn't let you connect on port 23, you will have to find some other host outside the firewall and hop through it. For instance, suppose you have a shell account at `foo.edu'. Set command line options as follows: xboard -ics -telnet -telnetProgram ptelnet -icshost foo.edu -icsport "" Then when you run XBoard in ICS mode, it will issue the command `ptelnet foo.edu' to connect to your account at `foo.edu'. Log in there, then type `telnet chessclub.com 5000'. ICC timestamp and FICS timeseal do not work through some firewalls. You can use them only if your firewall gives a clean TCP connection with a full 8-bit wide path. If your firewall allows you to get out only by running a special telnet program, you can't use timestamp or timeseal across it. But if you have access to a computer just outside your firewall, and you have much lower netlag when talking to that computer than to the ICS, it might be worthwhile running timestamp there. Follow the instructions above for hopping through a host outside the firewall (foo.edu in the example), but run timestamp or timeseal on that host instead of telnet. Suppose that you have a SOCKS firewall that will give you a clean 8-bit wide TCP connection to the chess server, but only after you authenticate yourself via the SOCKS protocol. In that case, you could make a socksified version of XBoard and run that. If you are using timestamp or timeseal, you will to socksify it, not XBoard; this may be difficult seeing that ICC and FICS do not provide source code for these programs. Socksification is beyond the scope of this document, but see the SOCKS Web site at http://www.socks.permeo.com/. If you are missing SOCKS, try http://www.funbureau.com/.  File: xboard.info, Node: Environment, Next: Limitations, Prev: Firewalls, Up: Top 7 Environment variables *********************** Game and position files are found in a directory named by the `CHESSDIR' environment variable. If this variable is not set, the current working directory is used. If `CHESSDIR' is set, XBoard actually changes its working directory to `$CHESSDIR', so any files written by the chess engine will be placed there too.  File: xboard.info, Node: Limitations, Next: Problems, Prev: Environment, Up: Top 8 Limitations and known bugs **************************** There is no way for two people running copies of XBoard to play each other without going through an Internet Chess Server. Under some circumstances, your ICS password may be echoed when you log on. If you are connecting to the ICS by running telnet on an Internet provider or firewall host, you may find that each line you type is echoed back an extra time after you hit . If your Internet provider is a Unix system, you can probably turn its echo off by typing `stty -echo' after you log in, and/or typing <^E> (Ctrl+E followed by the Enter key) to the telnet program after you have logged into ICS. It is a good idea to do this if you can, because the extra echo can occasionally confuse XBoard's parsing routines. The game parser recognizes only algebraic notation. Many of the following points used to be limitations in XBoard 4.2.7 and earlier, but are now fixed: The internal move legality tester in XBoard 4.3.xx does look at the game history, and is fully aware of castling or en-passant-capture rights. It permits castling with the king on the d file because this is possible in some "wild 1" games on ICS. The piece-drop menu does not check piece drops in bughouse to see if you actually hold the piece you are trying to drop. But this way of dropping pieces should be considered an obsolete feature, now that pieces can be dropped by dragging them from the holdings to the board. Anyway, if you would attempt an illegal move when using a chess engine or the ICS, XBoard will accept the error message that comes back, undo the move, and let you try another. FEN positions saved by XBoard do include correct information about whether castling or en passant are legal, and also handle the 50-move counter. The mate detector does not understand that non-contact mate is not really mate in bughouse. The only problem this causes while playing is minor: a "#" (mate indicator) character will show up after a non-contact mating move in the move list. XBoard will not assume the game is over at that point, not even when the option Detect Mates is on. Edit Game mode always uses the rules of the selected variant, which can be a variant that uses piece drops. You can load and edit games that contain piece drops. The (obsolete) piece menus are not active, but you can perform piece drops by dragging pieces from the holdings. Fischer Random castling is fully understood. You can enter castlings by dragging the King on top of your Rook. You can probably also play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window. The menus may not work if your keyboard is in Caps Lock or Num Lock mode. This seems to be a problem with the Athena menu widget, not an XBoard bug. Also see the ToDo file included with the distribution for many other possible bugs, limitations, and ideas for improvement that have been suggested.  File: xboard.info, Node: Problems, Next: Contributors, Prev: Limitations, Up: Top 9 Reporting problems ******************** You can report bugs and problems with XBoard using the bug tracker at `https://savannah.gnu.org/projects/xboard/' or by sending mail to `'. It can also be useful to report or discuss bugs in the WinBoard Forum at `http://www.open-aurec.com/wbforum/', WinBoard development section. Please use the `script' program to start a typescript, run XBoard with the `-debug' option, and include the typescript output in your message. Also tell us what kind of machine and what operating system version you are using. The command `uname -a' will often tell you this. If you improve XBoard, please send a message about your changes, and we will get in touch with you about merging them in to the main line of development.  File: xboard.info, Node: Contributors, Next: CMail, Prev: Problems, Up: Top 10 Authors and contributors *************************** Chris Sears and Dan Sears wrote the original XBoard. They were responsible for versions 1.0 through 1.2. The color scheme was taken from Wayne Christopher's `XChess' program. Tim Mann was primarily responsible for XBoard versions 1.3 through 4.2.7, and for WinBoard (a port of XBoard to Microsoft Win32) from its inception through version 4.2.7. John Chanak contributed the initial implementation of ICS mode. Evan Welsh wrote `CMail', and Patrick Surry helped in designing, testing, and documenting it. Elmar Bartel contributed the new piece bitmaps introduced in version 3.2. Jochen Wiedmann converted the documentation to texinfo. Frank McIngvale added click/click moving, the Analysis modes, piece flashing, ZIICS import, and ICS text colorization to XBoard. Hugh Fisher added animated piece movement to XBoard, and Henrik Gram added it to WinBoard. Mark Williams contributed the initial (WinBoard-only) implementation of many new features added to both XBoard and WinBoard in version 4.1.0, including copy/paste, premove, icsAlarm, autoFlipView, training mode, auto raise, and blindfold. Ben Nye contributed X copy/paste code for XBoard. In a fork from version 4.2.7, Alessandro Scotti added many elements to the user interface of WinBoard, including the board textures and font-based rendering, the evaluation-graph, move-history and engine-output window. He was also responsible for adding the UCI support. H. G. Muller continued this fork of the project, producing version 4.3. He made WinBoard castling- and e.p.-aware, added variant support with adjustable board sizes, the crazyhouse holdings, and the fairy pieces. In addition he added most of the adjudication options, made WinBoard more robust in dealing with buggy and crashing engines, and extended time control with a time-odds and node-count-based modes. Most of the options that initially were WinBoard only have now been back-ported to XBoard. Michel van den Bergh provided the code for reading Polyglot opening books. Meanwhile, some work continued on the GNU XBoard project maintained at savannah.gnu.org, but version 4.2.8 was never released. Daniel Mehrmann was responsible for much of this work. Most recently, Arun Persaud worked with H. G. Muller to merge all the features of the never-released XBoard/WinBoard 4.2.8 of the GNU XBoard project and the never-released 4.3.16 from H. G.'s fork into a unified XBoard/WinBoard 4.4, which is now available both from the savannah.gnu.org web site and the WinBoard forum.  File: xboard.info, Node: CMail, Next: Other programs, Prev: Contributors, Up: Top 11 CMail ******** The `cmail' program can help you play chess by email with opponents of your choice using XBoard as an interface. You will usually run `cmail' without giving any options. * Menu: * CMail options:: Invoking CMail. * CMail game:: Starting a CMail game. * CMail answer:: Answering a move. * CMail multi:: Multiple games in one message. * CMail completion:: Completing a game. * CMail trouble:: Known CMail problems.  File: xboard.info, Node: CMail options, Next: CMail game, Up: CMail 11.1 CMail options ================== -h Displays `cmail' usage information. -c Shows the conditions of the GNU General Public License. *Note Copying::. -w Shows the warranty notice of the GNU General Public License. *Note Copying::. -v -xv Provides or inhibits verbose output from `cmail' and XBoard, useful for debugging. The `-xv' form also inhibits the cmail introduction message. -mail -xmail Invokes or inhibits the sending of a mail message containing the move. -xboard -xxboard Invokes or inhibits the running of XBoard on the game file. -reuse -xreuse Invokes or inhibits the reuse of an existing XBoard to display the current game. -remail Resends the last mail message for that game. This inhibits running XBoard. -game The name of the game to be processed. -wgames -bgames -games Number of games to start as White, as Black or in total. Default is 1 as white and none as black. If only one color is specified then none of the other color is assumed. If no color is specified then equal numbers of White and Black games are started, with the extra game being as White if an odd number of total games is specified. -me -opp A one-word alias for yourself or your opponent. -wname -bname -myname -oppname The full name of White, Black, yourself or your opponent. -wna -bna -na -oppna The email address of White, Black, yourself or your opponent. -dir The directory in which `cmail' keeps its files. This defaults to the environment variable `$CMAIL_DIR' or failing that, `$CHESSDIR', `$HOME/Chess' or `~/Chess'. It will be created if it does not exist. -arcdir The directory in which `cmail' archives completed games. Defaults to the environment variable `$CMAIL_ARCDIR' or, in its absence, the same directory as cmail keeps its working files (above). -mailprog The program used by cmail to send email messages. This defaults to the environment variable `$CMAIL_MAILPROG' or failing that `/usr/ucb/Mail', `/usr/ucb/mail' or `Mail'. You will need to set this variable if none of the above paths fit your system. -logFile A file in which to dump verbose debugging messages that are invoked with the `-v' option. -event The PGN Event tag (default `Email correspondence game'). -site The PGN Site tag (default `NET'). -round The PGN Round tag (default `-', not applicable). -mode The PGN Mode tag (default `EM', Electronic Mail). Other options Any option flags not listed above are passed through to XBoard. Invoking XBoard through CMail changes the default values of two XBoard options: The default value for `-noChessProgram' is changed to true; that is, by default no chess engine is started. The default value for `-timeDelay' is changed to 0; that is, by default XBoard immediately goes to the end of the game as played so far, rather than stepping through the moves one by one. You can still set these options to whatever values you prefer by supplying them on CMail's command line. *Note Options::.  File: xboard.info, Node: CMail game, Next: CMail answer, Prev: CMail options, Up: CMail 11.2 Starting a CMail Game ========================== Type `cmail' from a shell to start a game as white. After an opening message, you will be prompted for a game name, which is optional--if you simply press , the game name will take the form `you-VS-opponent'. You will next be prompted for the short name of your opponent. If you haven't played this person before, you will also be prompted for his/her email address. `cmail' will then invoke XBoard in the background. Make your first move and select `Mail Move' from the `File' menu. *Note File Menu::. If all is well, `cmail' will mail a copy of the move to your opponent. If you select `Exit' without having selected `Mail Move' then no move will be made.  File: xboard.info, Node: CMail answer, Next: CMail multi, Prev: CMail game, Up: CMail 11.3 Answering a Move ===================== When you receive a message from an opponent containing a move in one of your games, simply pipe the message through `cmail'. In some mailers this is as simple as typing `| cmail' when viewing the message, while in others you may have to save the message to a file and do `cmail < file' at the command line. In either case `cmail' will display the game using XBoard. If you didn't exit XBoard when you made your first move then `cmail' will do its best to use the existing XBoard instead of starting a new one. As before, simply make a move and select `Mail Move' from the `File' menu. *Note File Menu::. `cmail' will try to use the XBoard that was most recently used to display the current game. This means that many games can be in progress simultaneously, each with its own active XBoard. If you want to look at the history or explore a variation, go ahead, but you must return to the current position before XBoard will allow you to mail a move. If you edit the game's history you must select `Reload Same Game' from the `File' menu to get back to the original position, then make the move you want and select `Mail Move'. As before, if you decide you aren't ready to make a move just yet you can either select `Exit' without sending a move or just leave XBoard running until you are ready.  File: xboard.info, Node: CMail multi, Next: CMail completion, Prev: CMail answer, Up: CMail 11.4 Multi-Game Messages ======================== It is possible to have a `cmail' message carry more than one game. This feature was implemented to handle IECG (International Email Chess Group) matches, where a match consists of one game as white and one as black, with moves transmitted simultaneously. In case there are more general uses, `cmail' itself places no limit on the number of black/white games contained in a message; however, XBoard does.  File: xboard.info, Node: CMail completion, Next: CMail trouble, Prev: CMail multi, Up: CMail 11.5 Completing a Game ====================== Because XBoard can detect checkmate and stalemate, `cmail' handles game termination sensibly. As well as resignation, the `Action' menu allows draws to be offered and accepted for `cmail' games. For multi-game messages, only unfinished and just-finished games will be included in email messages. When all the games are finished, they are archived in the user's archive directory, and similarly in the opponent's when he or she pipes the final message through `cmail'. The archive file name includes the date the game was started.  File: xboard.info, Node: CMail trouble, Prev: CMail completion, Up: CMail 11.6 Known CMail Problems ========================= It's possible that a strange conjunction of conditions may occasionally mean that `cmail' has trouble reactivating an existing XBoard. If this should happen, simply trying it again should work. If not, remove the file that stores the XBoard's PID (`game.pid') or use the `-xreuse' option to force `cmail' to start a new XBoard. Versions of `cmail' after 2.16 no longer understand the old file format that XBoard used to use and so cannot be used to correspond with anyone using an older version. Versions of `cmail' older than 2.11 do not handle multi-game messages, so multi-game correspondence is not possible with opponents using an older version.  File: xboard.info, Node: Other programs, Next: Copyright, Prev: CMail, Up: Top 12 Other programs you can use with XBoard ***************************************** Here are some other programs you can use with XBoard * Menu: * GNU Chess:: The GNU Chess engine. * Fairy-Max:: The Fairy-Max chess engine. * HoiChess:: The HoiChess chess engine. * Crafty:: The Crafty chess engine. * zic2xpm:: The program used to import chess sets from ZIICS.  File: xboard.info, Node: GNU Chess, Next: Fairy-Max, Up: Other programs 12.1 GNU Chess ============== The GNU Chess engine is available from: ftp://ftp.gnu.org/gnu/gnuchess/ You can use XBoard to play a game against GNU Chess, or to interface GNU Chess to an ICS.  File: xboard.info, Node: Fairy-Max, Next: HoiChess, Prev: GNU Chess, Up: Other programs 12.2 Fairy-Max ============== Fairy-Max is a derivative from the once World's smallest Chess program micro-Max, which measures only about 100 lines of source code. The main difference with micro-Max is that Fairy-Max loads its move-generator tables from a file, so that the rules for piece movement can be easily configured to implement unorthodox pieces. Fairy-Max can therefore play a large number of variants, normal Chess being one of those. In addition it plays Knightmate, Capablanca and Gothic Chess, Shatranj, Courier Chess, Cylinder chess, Berolina Chess, while the user can easily define new variants. It can be obtained from: http://home.hccnet.nl/h.g.muller/dwnldpage.html  File: xboard.info, Node: HoiChess, Next: Crafty, Prev: Fairy-Max, Up: Other programs 12.3 HoiChess ============= HoiChess is a not-so-very-strong Chess engine, which comes with a derivative HoiXiangqi, able to play Chinese Chess. It can be obtained from the standard Linux repositories through: sudo apt-get install hoichess  File: xboard.info, Node: Crafty, Next: zic2xpm, Prev: HoiChess, Up: Other programs 12.4 Crafty =========== Crafty is a chess engine written by Bob Hyatt. You can use XBoard to play a game against Crafty, hook Crafty up to an ICS, or use Crafty to interactively analyze games and positions for you. Crafty is a strong, rapidly evolving chess program. This rapid pace of development is good, because it means Crafty is always getting better. This can sometimes cause problems with backwards compatibility, but usually the latest version of Crafty will work well with the latest version of XBoard. Crafty can be obtained from its author's FTP site: ftp://ftp.cis.uab.edu/hyatt/. To use Crafty with XBoard, give the -fcp and -fd options as follows, where is the directory in which you installed Crafty and placed its book and other support files.  File: xboard.info, Node: zic2xpm, Prev: Crafty, Up: Other programs 12.5 zic2xpm ============ The "zic2xpm" program is used to import chess sets from the ZIICS(*) program into XBoard. "zic2xpm" is part of the XBoard distribution. ZIICS is available from: ftp://ftp.freechess.org/pub/chess/DOS/ziics131.exe To import ZIICS pieces, do this: 1. Unzip ziics131.exe into a directory: unzip -L ziics131.exe -d ~/ziics 2. Use zic2xpm to convert a set of pieces to XBoard format. For example, let's say you want to use the FRITZ4 set. These files are named "fritz4.*" in the ZIICS distribution. mkdir ~/fritz4 cd ~/fritz4 zic2xpm ~/ziics/fritz4.* 3. Give XBoard the "-pixmap" option when starting up, e.g.: xboard -pixmap ~/fritz4 (*) ZIICS is a separate copyrighted work of Andy McFarland. The "ZIICS pieces" are copyrighted works of their respective creators. Files produced by "zic2xpm" are for PERSONAL USE ONLY and may NOT be redistributed without explicit permission from the original creator(s) of the pieces.  File: xboard.info, Node: Copyright, Next: Copying, Prev: Other programs, Up: Top Copyright ********* Copyright (C) 1991 Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Digital disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Digital be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. Enhancements copyright (C) 1992-2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. Published by the Free Software Foundation 59 Temple Place - Suite 330 Boston, MA 02111-1307 USA Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License," is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License," and this permission notice, may be included in translations approved by the Free Software Foundation instead of in the original English.  File: xboard.info, Node: Copying, Next: Index, Prev: Copyright, Up: Top GNU GENERAL PUBLIC LICENSE ************************** Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS ==================== 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a. The work must carry prominent notices stating that you modified it, and giving a relevant date. b. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d. Limiting the use for publicity purposes of names of licensors or authors of the material; or e. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS =========================== How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see `http://www.gnu.org/licenses/'. Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see `http://www.gnu.org/licenses/'. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.  File: xboard.info, Node: Index, Prev: Copying, Up: Top Index ***** [index] * Menu: * -animateSpeed, option: User interface options. (line 309) * -autoDisplayComment, option: User interface options. (line 314) * -autoDisplayTags, option: User interface options. (line 314) * -pasteSelection, option: User interface options. (line 320) * .icsrc: ICS options. (line 101) * <, Button: Edit Menu. (line 150) * <<, Button: Edit Menu. (line 183) * >, Button: Edit Menu. (line 170) * >>, Button: Edit Menu. (line 202) * abort, ICS command: Chess Servers. (line 74) * Abort, Menu Item: Action Menu. (line 35) * About XBoard, Menu Item: Help Menu. (line 21) * Absolute Analysis Scores, Menu Item: Options Menu. (line 12) * absoluteAnalysisScores, option: User interface options. (line 358) * accept, ICS command: Chess Servers. (line 61) * Accept, Menu Item: Action Menu. (line 7) * Action, Menu: Action Menu. (line 6) * adapterCommand, option: UCI + WB Engine Settings. (line 24) * adjourn, ICS command: Chess Servers. (line 74) * Adjourn, Menu Item: Action Menu. (line 30) * Adjudicate Draw, Menu Item: Action Menu. (line 63) * Adjudicate to Black, Menu Item: Action Menu. (line 63) * Adjudicate to White, Menu Item: Action Menu. (line 63) * adjudicateDrawMoves, option: Adjudication Options. (line 15) * adjudicateLossThreshold, option: Adjudication Options. (line 7) * Adjudications, Menu Item: Options Menu. (line 247) * afterGame, option: Tournament options. (line 72) * afterTourney, option: Tournament options. (line 72) * alarm, option: ICS options. (line 187) * Almost Always Queen, Menu Item: Options Menu. (line 16) * Also match left-right flipped position, Menu Item: Options Menu. (line 560) * Also match reversed colors, Menu Item: Options Menu. (line 560) * alwaysPromoteToQueen, option: User interface options. (line 68) * Analysis Mode, Menu Item: Mode Menu. (line 19) * Analyze Game, Menu Item: Mode Menu. (line 67) * Animate Dragging, Menu Item: Options Menu. (line 30) * Animate Moving, Menu Item: Options Menu. (line 37) * animate, option: User interface options. (line 305) * animateDragging, option: User interface options. (line 301) * animateMoving, option: User interface options. (line 305) * Animation Speed, Menu Item: Options Menu. (line 199) * Annotate, Menu Item: Edit Menu. (line 126) * appendPV, option: User interface options. (line 352) * at sign, option: Load and Save options. (line 104) * Authors: Contributors. (line 6) * Auto Comment, Menu Item: Options Menu. (line 283) * Auto Flag, Menu Item: Options Menu. (line 46) * Auto Flip View, Menu Item: Options Menu. (line 56) * Auto Kibitz, Menu Item: Options Menu. (line 274) * Auto Observe, Menu Item: Options Menu. (line 291) * Auto Raise Board, Menu Item: Options Menu. (line 304) * Auto Save, Menu Item: Options Menu. (line 309) * Auto-Refresh Seek Graph, Menu Item: Options Menu. (line 351) * autobs, option: ICS options. (line 128) * autoCallFlag, option: ICS options. (line 124) * autocomm, option: ICS options. (line 120) * autoComment, option: ICS options. (line 120) * autoCopyPV, option: User interface options. (line 325) * autoflag, option: ICS options. (line 124) * autoflip, option: User interface options. (line 128) * autoFlipView, option: User interface options. (line 128) * autoKibitz, option: ICS options. (line 132) * autoLogo, option: User interface options. (line 32) * autoObserve, option: ICS options. (line 128) * autoraise, option: User interface options. (line 124) * autoRaiseBoard, option: User interface options. (line 124) * autoRefresh, option: ICS options. (line 149) * autosave, option: Load and Save options. (line 45) * autoSaveGames, option: Load and Save options. (line 45) * Back to Start, Menu Item: Edit Menu. (line 183) * Background Observe, Menu Item: Options Menu. (line 316) * backgroundObserve, option: ICS options. (line 155) * Backward, Menu Item: Edit Menu. (line 150) * Basic operation: Basic operation. (line 6) * bell, option: User interface options. (line 55) * blackPieceColor, option: User interface options. (line 258) * blind, option: User interface options. (line 193) * Blindfold, Menu Item: Options Menu. (line 69) * blindfold, option: User interface options. (line 193) * board size: User interface options. (line 80) * Board, Menu Item: View Menu. (line 81) * boardHeight, option: Other options. (line 103) * boardSize, option: User interface options. (line 80) * boardWidth, option: Other options. (line 108) * Book, Menu Item: Engine Menu. (line 60) * bookDepth, option: UCI + WB Engine Settings. (line 68) * bookVariation, option: UCI + WB Engine Settings. (line 72) * Bug reports: Problems. (line 6) * Bugs <1>: Problems. (line 6) * Bugs: Limitations. (line 6) * buttons, option: User interface options. (line 150) * Call Flag, Menu Item: Action Menu. (line 19) * checkMates, option: Adjudication Options. (line 20) * Chess engine options: Chess engine options. (line 6) * CHESSDIR: Environment. (line 6) * clock, option: Chess engine options. (line 23) * clockFont, option: User interface options. (line 214) * clockMode, option: Chess engine options. (line 23) * CloneTourney, Menu Item: Options Menu. (line 510) * cmail: CMail. (line 6) * colorChallenge, option: ICS options. (line 230) * colorChannel, option: ICS options. (line 230) * colorChannel1, option: ICS options. (line 230) * colorCShout, option: ICS options. (line 230) * Colorize Messages, Menu Item: Options Menu. (line 386) * colorize, option: ICS options. (line 214) * colorizeMessages, option: ICS options. (line 214) * colorKibitz, option: ICS options. (line 230) * colorNickNames, option: Other options. (line 163) * colorNormal, option: ICS options. (line 230) * colorRequest, option: ICS options. (line 230) * Colors <1>: User interface options. (line 258) * Colors: ICS options. (line 214) * colorSeek, option: ICS options. (line 230) * colorShout, option: ICS options. (line 230) * colorSShout, option: ICS options. (line 230) * colorTell, option: ICS options. (line 230) * Comments, Menu Item: View Menu. (line 57) * Common Engine, Menu Item: Options Menu. (line 222) * Contributors: Contributors. (line 6) * coordFont, option: User interface options. (line 220) * coords, option: User interface options. (line 120) * Copy Game List, Menu Item: Edit Menu. (line 26) * Copy Game, Menu Item: Edit Menu. (line 7) * Copy Position, Menu Item: Edit Menu. (line 16) * cy, option: Tournament options. (line 34) * darkBackTextureFile, option: User interface options. (line 294) * darkSquareColor, option: User interface options. (line 258) * dateThreshold, option: Other options. (line 224) * debug, option: Other options. (line 170) * debugFile, option: Other options. (line 173) * debugMode, option: Other options. (line 170) * decline, ICS command: Chess Servers. (line 61) * Decline, Menu Item: Action Menu. (line 13) * Default number of Games, Menu Item: Options Menu. (line 452) * defaultCacheSizeEGTB, option: UCI + WB Engine Settings. (line 103) * defaultFrcPosition, option: Other options. (line 123) * defaultHashSize, option: UCI + WB Engine Settings. (line 97) * defaultMatchGames, option: Tournament options. (line 7) * defaultPathEGTB, option: UCI + WB Engine Settings. (line 109) * defaultTourneyName, option: Tournament options. (line 51) * delayAfterQuit, option: Other options. (line 208) * delayBeforeQuit, option: Other options. (line 208) * Disable own engine bools be default, Menu Item: Options Menu. (line 487) * discourageOwnBooks, option: UCI + WB Engine Settings. (line 62) * disguisePromotedPieces, option: ICS options. (line 178) * display, option: User interface options. (line 10) * drag, option: User interface options. (line 301) * draw, ICS command: Chess Servers. (line 74) * Draw, Menu Item: Action Menu. (line 25) * Drop Menu, Menu Item: Options Menu. (line 75) * dropMenu, option: User interface options. (line 331) * Dual Board, Menu Item: Options Menu. (line 323) * dualBoard, option: ICS options. (line 169) * Edit Book, Menu Item: Edit Menu. (line 115) * Edit Comment, Menu Item: Edit Menu. (line 108) * Edit Game, Menu Item: Edit Menu. (line 41) * Edit Menu: Edit Menu. (line 6) * Edit Position, Menu Item: Edit Menu. (line 57) * Edit Tags, Menu Item: Edit Menu. (line 84) * egtFormats, option: UCI + WB Engine Settings. (line 113) * Elo of strongest player, Menu Item: Options Menu. (line 530) * Elo of weakest player, Menu Item: Options Menu. (line 530) * eloThresholdAny, option: Other options. (line 219) * eloThresholdBoth, option: Other options. (line 219) * Enable Variation Trees, Menu Item: Options Menu. (line 81) * Engine #1 Settings, Menu Item: Engine Menu. (line 38) * Engine #2 Settings, Menu Item: Engine Menu. (line 38) * Engine Menu: Engine Menu. (line 6) * Engine Settings: UCI + WB Engine Settings. (line 6) * Engine Settings, Menu Item: Engine Menu. (line 38) * engineDebugOutput, option: Other options. (line 180) * Environment variables: Environment. (line 6) * evalThreshold, option: User interface options. (line 160) * evalZoom, option: User interface options. (line 156) * examine, ICS command: Chess Servers. (line 97) * Exit, Menu Item: File Menu. (line 137) * exit, option: User interface options. (line 60) * fb, option: Chess engine options. (line 141) * fcp, option: Chess engine options. (line 123) * fd, option: Chess engine options. (line 156) * fe, option: Chess engine options. (line 130) * fh, option: Chess engine options. (line 148) * File Menu: File Menu. (line 6) * File with Start Positions, Menu Item: Options Menu. (line 471) * find position, Menu Item: Options Menu. (line 535) * finger, ICS command: Chess Servers. (line 84) * First Black Move, Menu Item: Options Menu. (line 361) * First White Move, Menu Item: Options Menu. (line 361) * firstChessProgram, option: Chess engine options. (line 123) * firstComputerString, option: Chess engine options. (line 191) * firstDirectory, option: Chess engine options. (line 156) * firstEngine, option: Chess engine options. (line 130) * firstHasOwnBookUCI, option: UCI + WB Engine Settings. (line 56) * firstHost, option: Chess engine options. (line 148) * firstInitString, option: Chess engine options. (line 165) * firstIsUCI, option: UCI + WB Engine Settings. (line 8) * firstLogo, option: User interface options. (line 26) * firstNeedsNoncompliantFEN, option: Chess engine options. (line 241) * firstNPS, option: Chess engine options. (line 46) * firstOptions, option: Chess engine options. (line 230) * firstPgnName, option: UCI + WB Engine Settings. (line 91) * firstPlaysBlack, option: Chess engine options. (line 141) * firstProtocolVersion, option: Chess engine options. (line 208) * firstScoreAbs, option: Chess engine options. (line 216) * firstTimeOdds, option: Chess engine options. (line 64) * firstXBook, option: UCI + WB Engine Settings. (line 56) * Flash Moves, Menu Item: Options Menu. (line 194) * Flash Rate, Menu Item: Options Menu. (line 194) * flash, option: User interface options. (line 176) * flashCount, option: User interface options. (line 176) * flashRate, option: User interface options. (line 176) * Flip View, Menu Item: View Menu. (line 7) * flip, option: User interface options. (line 132) * flipView, option: User interface options. (line 132) * fn, option: UCI + WB Engine Settings. (line 91) * fNoOwnBookUCI, option: UCI + WB Engine Settings. (line 56) * Font, clock: User interface options. (line 214) * Font, coordinates: User interface options. (line 220) * Font, message: User interface options. (line 227) * fontSizeTolerance, option: User interface options. (line 233) * Forward to End, Menu Item: Edit Menu. (line 202) * Forward, Menu Item: Edit Menu. (line 170) * fSAN, option: User interface options. (line 202) * fUCCI, option: UCI + WB Engine Settings. (line 18) * fUCI, option: UCI + WB Engine Settings. (line 8) * fUSI, option: UCI + WB Engine Settings. (line 18) * Game File with Opening Lines, Menu Item: Options Menu. (line 471) * Game List Tags, Menu Item <1>: Options Menu. (line 586) * Game List Tags, Menu Item: View Menu. (line 90) * Game Number, Menu Item: Options Menu. (line 471) * gameListTags, option: Load and Save options. (line 95) * games, ICS command: Chess Servers. (line 50) * gateway, option: ICS options. (line 51) * General Options, Menu Item: Options Menu. (line 9) * geometry, option: User interface options. (line 10) * Get Move List, Menu Item: Options Menu. (line 328) * getMoveList, option: ICS options. (line 183) * Help Menu: Help Menu. (line 6) * help, ICS command: Chess Servers. (line 35) * Hide Thinking, Menu Item: Options Menu. (line 88) * highlight Arrow, option: User interface options. (line 189) * Highlight Last Move, Menu Item: Options Menu. (line 98) * Highlight with Arrow, Menu Item: Options Menu. (line 104) * highlight, option: User interface options. (line 185) * highlightLastMove, option: User interface options. (line 185) * highlightMoveWithArrow, option: User interface options. (line 189) * highlightSquareColor, option: User interface options. (line 258) * Hint, Menu Item: Engine Menu. (line 57) * holdingsSize, option: Other options. (line 115) * iconic, option: User interface options. (line 10) * ICS: Chess Servers. (line 6) * ICS Alarm Time, Menu Item: Options Menu. (line 376) * ICS Alarm, Menu Item: Options Menu. (line 376) * ICS Client, Menu Item: Mode Menu. (line 106) * ICS Input Box, Menu Item: View Menu. (line 62) * ICS options: ICS options. (line 6) * ICS Options, Menu Item: Options Menu. (line 271) * ICS, addresses: Chess Servers. (line 6) * ics, option: ICS options. (line 7) * icsAlarm, option: ICS options. (line 187) * icsAlarmTime, option: ICS options. (line 191) * icscomm, option: ICS options. (line 59) * icshelper, option: ICS options. (line 25) * icshost, option: ICS options. (line 12) * icsinput, option: ICS options. (line 116) * icslogon, option: ICS options. (line 101) * icsport, option: ICS options. (line 21) * inc, option: Chess engine options. (line 16) * Info XBoard, Menu Item: Help Menu. (line 7) * init, option: Load and Save options. (line 104) * initalMode, option: Other options. (line 36) * initString, option: Chess engine options. (line 165) * Internet Chess Server: Chess Servers. (line 6) * internetChessServerCommPort, option: ICS options. (line 59) * internetChessServerHelper, option: ICS options. (line 25) * internetChessServerHost, option: ICS options. (line 12) * internetChessServerInputBox, option: ICS options. (line 116) * internetChessServerLogonScript, option: ICS options. (line 101) * internetChessServerMode, option: ICS options. (line 7) * internetChessServerPort, option: ICS options. (line 21) * introduction: Top. (line 6) * Keys: Keys. (line 6) * legal, option: User interface options. (line 76) * lgf, option: Load and Save options. (line 8) * lgi, option: Load and Save options. (line 8) * lightSquareColor, option: User interface options. (line 258) * Limitations: Limitations. (line 6) * liteBackTextureFile, option: User interface options. (line 294) * Load and Save options: Load and Save options. (line 6) * Load Engine, Menu Item: Engine Menu. (line 7) * Load Game Options, Menu Item: Options Menu. (line 520) * Load Game, Menu Item: File Menu. (line 50) * Load Next Game, Menu Item: Keys. (line 10) * Load Next Position, Menu Item: File Menu. (line 92) * Load Position, Menu Item: File Menu. (line 83) * Load Previous Game, Menu Item: Keys. (line 14) * Load Previous Position, Menu Item: File Menu. (line 96) * loadGameFile, option: Load and Save options. (line 8) * loadGameIndex, option: Load and Save options. (line 8) * loadPositionFile, option: Load and Save options. (line 53) * loadPositionIndex, option: Load and Save options. (line 53) * logoDir, option: User interface options. (line 32) * logoSize, option: User interface options. (line 19) * lowTimeWarning, option: ICS options. (line 195) * lowTimeWarningColor, option: User interface options. (line 258) * lpf, option: Load and Save options. (line 53) * lpi, option: Load and Save options. (line 53) * Machine Black, Menu Item: Mode Menu. (line 11) * Machine match, Menu Item: Mode Menu. (line 130) * Machine White, Menu Item: Mode Menu. (line 7) * Mail Move, Menu Item: File Menu. (line 134) * Major modes: Major modes. (line 6) * Man XBoard, Menu Item: Help Menu. (line 14) * Match Options, Menu Item: Options Menu. (line 394) * matchGames, option: Chess engine options. (line 101) * matchMode, option: Chess engine options. (line 113) * matchPause, option: Tournament options. (line 12) * materialDraws, option: Adjudication Options. (line 32) * mcBookMode, option: UCI + WB Engine Settings. (line 76) * Menu, Action: Action Menu. (line 6) * Menu, Edit: Edit Menu. (line 6) * Menu, Engine: Engine Menu. (line 6) * Menu, File: File Menu. (line 6) * Menu, Help: Help Menu. (line 6) * Menu, Mode: Mode Menu. (line 6) * Menu, Options: Options Menu. (line 6) * Menu, View: View Menu. (line 6) * Menus: Menus. (line 6) * messageFont, option: User interface options. (line 227) * mg, option: Chess engine options. (line 101) * mm, option: Chess engine options. (line 113) * Mode Menu: Mode Menu. (line 6) * mode, option: Other options. (line 36) * mono, option: User interface options. (line 164) * monoMode, option: User interface options. (line 164) * Move Now, Menu Item: Engine Menu. (line 70) * Move Sound, Menu Item: Options Menu. (line 109) * moves, option: ICS options. (line 183) * movesound, option: User interface options. (line 55) * movesPerSession, option: Chess engine options. (line 12) * mps, option: Chess engine options. (line 12) * msLoginDelay, option: ICS options. (line 110) * nameOfDebugFile, option: Other options. (line 173) * narrow, Menu Item: Options Menu. (line 535) * ncp, option: Other options. (line 7) * New Game, Menu Item: File Menu. (line 7) * New Shuffle Game, Menu Item: File Menu. (line 16) * New variant, Menu Item: File Menu. (line 31) * niceEngines, option: Chess engine options. (line 222) * noChessProgram, option: Other options. (line 7) * noGUI, option: User interface options. (line 13) * null move: Mode Menu. (line 19) * number of consecutive positions, Menu Item: Options Menu. (line 553) * Number of tourney cycles, Menu Item: Options Menu. (line 452) * observe, ICS command: Chess Servers. (line 93) * oldmoves, ICS command: Chess Servers. (line 97) * oldsave, option: Load and Save options. (line 91) * oldSaveStyle, option: Load and Save options. (line 91) * One-Click Moving, Menu Item: Options Menu. (line 118) * oneClickMove, option: User interface options. (line 48) * onlyOwnGames, option: Load and Save options. (line 49) * Open Chat Window, Menu Item: View Menu. (line 69) * Options: Options. (line 6) * Options Menu: Options Menu. (line 6) * Options, adjudication: Adjudication Options. (line 6) * options, Chess engine: Chess engine options. (line 6) * Options, ICS: ICS options. (line 6) * Options, Load and Save: Load and Save options. (line 6) * Options, miscellaneous: Other options. (line 6) * Options, Tournament: Tournament options. (line 6) * Options, User interface: User interface options. (line 6) * Other programs: Other programs. (line 6) * overrideLineGap, option: User interface options. (line 113) * pairingEngine, option: Tournament options. (line 59) * participants, option: Tournament options. (line 38) * Paste Game, Menu Item: Edit Menu. (line 32) * Paste Position, Menu Item: Edit Menu. (line 36) * Pause, Menu Item: Mode Menu. (line 136) * Periodic Updates, Menu Item: Options Menu. (line 130) * periodic, option: User interface options. (line 197) * periodicUpdates, option: User interface options. (line 197) * pgnEventHeader, option: Load and Save options. (line 78) * pgnExtendedInfo, option: Load and Save options. (line 73) * pgnNumberTag, option: Load and Save options. (line 82) * pid, option: User interface options. (line 242) * pieceImageDirectory, option: User interface options. (line 242) * pieceMenu, option: User interface options. (line 337) * pieceNickNames, option: Other options. (line 154) * pieceToCharTable, option: Other options. (line 128) * Play Move(s) of Clicked PV, Menu Item: Options Menu. (line 136) * polyglotBook, option: UCI + WB Engine Settings. (line 47) * polyglotDir, option: UCI + WB Engine Settings. (line 40) * Ponder Next Move, Menu Item: Options Menu. (line 144) * ponder, option: Chess engine options. (line 92) * ponderNextMove, option: Chess engine options. (line 92) * Popup Exit Message, Menu Item: Options Menu. (line 150) * Popup Move Errors, Menu Item: Options Menu. (line 156) * popup, option: User interface options. (line 64) * popupExitMessage, option: User interface options. (line 60) * popupMoveErrors, option: User interface options. (line 64) * Position Number, Menu Item: Options Menu. (line 471) * pre, option: ICS options. (line 199) * preblack, option: ICS options. (line 205) * Premove Black, Menu Item: Options Menu. (line 361) * Premove White, Menu Item: Options Menu. (line 361) * Premove, Menu Item: Options Menu. (line 361) * premove, option: ICS options. (line 199) * premoveBlack, option: ICS options. (line 205) * premoveBlackText, option: ICS options. (line 205) * premoveHighlightColor, option: User interface options. (line 258) * premoveWhite, option: ICS options. (line 205) * premoveWhiteText, option: ICS options. (line 205) * prewhite, option: ICS options. (line 205) * Problems: Problems. (line 6) * queen, option: User interface options. (line 68) * Quiet Play, Menu Item: Options Menu. (line 340) * quiet, option: ICS options. (line 210) * quietPlay, option: ICS options. (line 210) * recentEngineList, option: User interface options. (line 38) * recentEngines, option: User interface options. (line 38) * Recently Used Engines, In Menu: Engine Menu. (line 82) * Reload CMail Message, Menu Item: File Menu. (line 134) * Reload Same Game, Menu Item: Keys. (line 19) * Reload Same Position, Menu Item: Keys. (line 24) * remoteShell, option: Other options. (line 194) * remoteUser, option: Other options. (line 199) * Replace Engine, Menu Item: Options Menu. (line 495) * Reporting bugs: Problems. (line 6) * Reporting problems: Problems. (line 6) * Resign, Menu Item: Action Menu. (line 41) * resource name, option: User interface options. (line 10) * results, option: Tournament options. (line 45) * Retract Move, Menu Item: Engine Menu. (line 74) * reuse, option: Chess engine options. (line 199) * reuse2, option: Chess engine options. (line 199) * reuseFirst, option: Chess engine options. (line 199) * reuseSecond, option: Chess engine options. (line 199) * Revert, Menu Item: Edit Menu. (line 126) * Rewind Index after, Menu Item: Options Menu. (line 471) * ringBellAfterMoves, option: User interface options. (line 55) * rsh, option: Other options. (line 194) * ruleMoves, option: Adjudication Options. (line 50) * ruser, option: Other options. (line 199) * sameColorGames, option: Chess engine options. (line 117) * Save Game Options, Menu Item: Options Menu. (line 569) * Save Game, Menu Item: File Menu. (line 101) * Save Games as Book, Menu Item: File Menu. (line 122) * Save Position, Menu Item: File Menu. (line 113) * Save Settings Now, Menu Item: Options Menu. (line 611) * Save Settings on Exit, Menu Item: Options Menu. (line 645) * Save Tourney Games, Menu Item: Options Menu. (line 463) * saveGameFile, option: Load and Save options. (line 40) * saveOutOfBookInfo, option: Load and Save options. (line 86) * savePositionFile, option: Load and Save options. (line 68) * saveSettingsFile, option: Load and Save options. (line 104) * saveSettingsOnExit, option: Load and Save options. (line 124) * Scores in Move List, Menu Item: Options Menu. (line 165) * scoreWhite, option: User interface options. (line 363) * scp, option: Chess engine options. (line 126) * sd, option: Chess engine options. (line 37) * se, option: Chess engine options. (line 138) * Search mode, Menu Item: Options Menu. (line 535) * searchDepth, option: Chess engine options. (line 37) * searchMode, option: Other options. (line 214) * searchTime, option: Chess engine options. (line 30) * secondChessProgram, option: Chess engine options. (line 126) * secondComputerString, option: Chess engine options. (line 191) * secondDirectory, option: Chess engine options. (line 156) * secondEngine, option: Chess engine options. (line 138) * secondHasOwnBookUCI, option: UCI + WB Engine Settings. (line 56) * secondHost, option: Chess engine options. (line 148) * secondInitString, option: Chess engine options. (line 165) * secondIsUCI, option: UCI + WB Engine Settings. (line 8) * secondLogo, option: User interface options. (line 26) * secondNeedsNoncompliantFEN, option: Chess engine options. (line 241) * secondNPS, option: Chess engine options. (line 46) * secondOptions, option: Chess engine options. (line 230) * secondPgnName, option: UCI + WB Engine Settings. (line 91) * secondProtocolVersion, option: Chess engine options. (line 208) * secondScoreAbs, option: Chess engine options. (line 216) * secondTimeOdds, option: Chess engine options. (line 64) * secondXBook, option: UCI + WB Engine Settings. (line 56) * seedBase, option: Tournament options. (line 85) * Seek Graph, Menu Item: Options Menu. (line 346) * seekGraph, option: ICS options. (line 140) * Select Engine, Menu Item: Options Menu. (line 427) * set, ICS command: Chess Servers. (line 90) * Settings, Engine: UCI + WB Engine Settings. (line 6) * SettingsFile, option: Load and Save options. (line 104) * sg, option: ICS options. (line 140) * sgf, option: Load and Save options. (line 40) * sh, option: Chess engine options. (line 148) * Shortcut keys: Keys. (line 6) * Show Coords, Menu Item: Options Menu. (line 169) * Show Engine Output, Menu Item: View Menu. (line 12) * Show Evaluation Graph, Menu Item: View Menu. (line 42) * Show Game List, Menu Item: View Menu. (line 48) * Show Last Move, Shortcut Key: Keys. (line 7) * Show Move History, Menu Item: View Menu. (line 36) * Show Target Squares, Menu Item: Options Menu. (line 173) * showButtonBar, option: User interface options. (line 150) * showCoords, option: User interface options. (line 120) * showEvalInMoveHistory, option: User interface options. (line 209) * showTargetSquares, option: User interface options. (line 169) * showThinking, option: Chess engine options. (line 82) * shuffleOpenings, option: Chess engine options. (line 255) * size, option: User interface options. (line 80) * sn, option: UCI + WB Engine Settings. (line 91) * sNoOwnBookUCI, option: UCI + WB Engine Settings. (line 56) * Sound Options, Menu Item: Options Menu. (line 592) * soundChallenge, option: ICS options. (line 265) * soundChannel, option: ICS options. (line 265) * soundChannel1, option: ICS options. (line 265) * soundCShout, option: ICS options. (line 265) * soundDirectory, option: ICS options. (line 252) * soundIcsAlarm, option: ICS options. (line 274) * soundIcsDraw, option: ICS options. (line 285) * soundIcsLoss, option: ICS options. (line 281) * soundIcsUnfinished, option: ICS options. (line 289) * soundIcsWin, option: ICS options. (line 277) * soundKibitz, option: ICS options. (line 265) * soundMove, option: ICS options. (line 271) * soundProgram, option: ICS options. (line 243) * soundRequest, option: ICS options. (line 265) * Sounds: ICS options. (line 243) * soundSeek, option: ICS options. (line 265) * soundShout, option: ICS options. (line 265) * soundSShout, option: ICS options. (line 265) * soundTell, option: ICS options. (line 265) * spf, option: Load and Save options. (line 68) * sSAN, option: User interface options. (line 202) * st, option: Chess engine options. (line 30) * Stop Examining, Menu Item: Action Menu. (line 50) * Stop Observing, Menu Item: Action Menu. (line 45) * sUCCI, option: UCI + WB Engine Settings. (line 18) * sUCI, option: UCI + WB Engine Settings. (line 8) * sUSI, option: UCI + WB Engine Settings. (line 18) * sweepPromotion, option: User interface options. (line 72) * Sync after cycle, Menu Item: Options Menu. (line 418) * Sync after round, Menu Item: Options Menu. (line 418) * syncAfterCycle, option: Tournament options. (line 80) * syncAfterRound, option: Tournament options. (line 80) * Tags, Menu Item: View Menu. (line 52) * tc, option: Chess engine options. (line 7) * td, option: Load and Save options. (line 34) * telnet, option: ICS options. (line 33) * telnetProgram, option: ICS options. (line 42) * Test Legality, Menu Item: Options Menu. (line 180) * testClaims, option: Adjudication Options. (line 26) * testLegality, option: User interface options. (line 76) * tf, option: Tournament options. (line 20) * thinking, option: Chess engine options. (line 82) * Time Control, Menu Item: Options Menu. (line 210) * timeControl, option: Chess engine options. (line 7) * timeDelay, option: Load and Save options. (line 34) * timeIncrement, option: Chess engine options. (line 16) * timeOddsMode, option: Chess engine options. (line 70) * title, option: User interface options. (line 142) * titleInWindow, option: User interface options. (line 142) * Tournament file, Menu item: Options Menu. (line 398) * Tournament Options: Tournament options. (line 6) * Tourney participants, Menu Item: Options Menu. (line 427) * Tourney type, Menu Item: Options Menu. (line 438) * tourneyCycles, option: Tournament options. (line 34) * tourneyFile, option: Tournament options. (line 20) * tourneyOptions, option: Other options. (line 27) * tourneyType, option: Tournament options. (line 28) * Training, Menu Item: Mode Menu. (line 96) * trivialDraws, option: Adjudication Options. (line 39) * trueColors, option: User interface options. (line 287) * Truncate Game, Menu Item: Edit Menu. (line 145) * tt, option: Tournament options. (line 28) * Two Machines, Menu Item: Mode Menu. (line 15) * Upgrade Engine, Menu Item: Options Menu. (line 495) * Upload to Examine, Menu Item: Action Menu. (line 55) * useBoardTexture, option: User interface options. (line 294) * usePolyglotBook, option: UCI + WB Engine Settings. (line 44) * User interface options: User interface options. (line 6) * userName, option: Other options. (line 203) * useTelnet, option: ICS options. (line 33) * uxiAdapter, option: UCI + WB Engine Settings. (line 34) * variant, option: Other options. (line 44) * variations, option: User interface options. (line 346) * vars, ICS command: Chess Servers. (line 87) * View Menu: View Menu. (line 6) * viewer, option: Other options. (line 13) * viewerOptions, option: Other options. (line 13) * whitePieceColor, option: User interface options. (line 258) * who, ICS command: Chess Servers. (line 43) * xflash, option: User interface options. (line 176) * year, Menu Item: Options Menu. (line 530) * Zoom factor in Evaluation Graph, Menu Item: Options Menu. (line 203)  Tag Table: Node: Top207 Node: Major modes1436 Node: Basic operation3139 Node: Menus7054 Node: File Menu7686 Node: Edit Menu14939 Node: View Menu25472 Node: Mode Menu29922 Node: Action Menu37799 Node: Engine Menu40293 Node: Options Menu45151 Node: Help Menu77330 Node: Keys78191 Node: Options80974 Node: Chess engine options82478 Node: UCI + WB Engine Settings95067 Node: Tournament options101564 Node: ICS options105724 Node: Load and Save options118582 Node: User interface options124767 Node: Adjudication Options140812 Node: Other options143713 Node: Chess Servers155390 Node: Firewalls159700 Node: Environment164568 Node: Limitations165021 Node: Problems168078 Node: Contributors168952 Node: CMail171625 Node: CMail options172173 Node: CMail game175679 Node: CMail answer176495 Node: CMail multi177933 Node: CMail completion178488 Node: CMail trouble179170 Node: Other programs179964 Node: GNU Chess180456 Node: Fairy-Max180736 Node: HoiChess181526 Node: Crafty181864 Node: zic2xpm182748 Node: Copyright183840 Node: Copying186060 Node: Index223595  End Tag Table xboard-4.7.3/xboard.png0000644000175000001440000000327612262415351011717 00000000000000PNG  IHDR00 1 bKGD̿ pHYs&s&slu IDATXõilTU3wN;RXQiE+5FhTPQܢF&*p!*` H@YTD-AH5BKfLg36Ν>w\&"QT'Z9ONUmbPM+yҽB"5N]q${m D率ҦQT\CMU/uۓb4?e )b뫍Y!R>~O U,Cg=__czaOT6w! 9K+K"#a~{\@,r )a r }fڙw*NkvA\#g"/73FLZ'@3#@e8(>J;4VI\|"%, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ptexslash \fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi \codex } } \def\codex #1{\tclose{#1}\endgroup} \def\normaldash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % ctrl is no longer a Texinfo command, but leave this definition for fun. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = ectt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. Also revert - to its normal character, in % case the active - from code has slipped in. % {@catcode`- = @active @gdef@normalturnoffactive{% @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore xboard-4.7.3/engineoutput.c0000644000175000001440000004230712262415351012622 00000000000000/* * engineoutput.c - split-off backe-end from Engine output (PV) by HGM * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define SHOW_PONDERING #include "config.h" #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #include "common.h" #include "frontend.h" #include "backend.h" #include "moves.h" #include "engineoutput.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # ifdef WIN32 # define _(s) T_(s) # undef ngettext # define ngettext(s,p,n) T_(p) # else # define _(s) (s) # endif # define N_(s) s #endif typedef struct { char * name; int which; int depth; u64 nodes; int score; int time; char * pv; char * hint; int an_move_index; int an_move_count; int moveKey; } EngineOutputData; // called by other front-end void EngineOutputUpdate( FrontEndProgramStats * stats ); void OutputKibitz(int window, char *text); // module back-end routines static void VerifyDisplayMode(); static void UpdateControls( EngineOutputData * ed ); static int lastDepth[2] = { -1, -1 }; static int lastForwardMostMove[2] = { -1, -1 }; static int engineState[2] = { -1, -1 }; static char lastLine[2][MSG_SIZ]; static char header[2][MSG_SIZ]; #define MAX_VAR 400 static int scores[MAX_VAR], textEnd[MAX_VAR], keys[MAX_VAR], curDepth[2], nrVariations[2]; extern int initialRulePlies; void MakeEngineOutputTitle () { static char buf[MSG_SIZ]; static char oldTitle[MSG_SIZ]; char title[MSG_SIZ]; int count, rule = 2*appData.ruleMoves; snprintf(title, MSG_SIZ, _("Engine Output") ); if(!EngineOutputIsUp()) return; // figure out value of 50-move counter count = currentMove; while( (signed char)boards[count][EP_STATUS] <= EP_NONE && count > backwardMostMove ) count--; if( count == backwardMostMove ) count -= initialRulePlies; count = currentMove - count; if(!rule) rule = 100; if(count >= rule - 40 && (!appData.icsActive || gameMode == IcsObserving || appData.zippyPlay)) { snprintf(buf, MSG_SIZ, ngettext("%s (%d reversible ply)", "%s (%d reversible plies)", count), title, count); safeStrCpy(title, buf, MSG_SIZ); } if(!strcmp(oldTitle, title)) return; safeStrCpy(oldTitle, title, MSG_SIZ); SetEngineOutputTitle(title); } // back end, due to front-end wrapper for SetWindowText, and new SetIcon arguments void SetEngineState (int which, enum ENGINE_STATE state, char * state_data) { int x_which = 1 - which; if( engineState[ which ] != state ) { engineState[ which ] = state; switch( state ) { case STATE_THINKING: SetIcon( which, nStateIcon, nThinking ); if( engineState[ x_which ] == STATE_THINKING ) { SetEngineState( x_which, STATE_IDLE, "" ); } break; case STATE_PONDERING: SetIcon( which, nStateIcon, nPondering ); break; case STATE_ANALYZING: SetIcon( which, nStateIcon, nAnalyzing ); break; default: SetIcon( which, nStateIcon, nClear ); break; } } if( state_data != 0 ) { DoSetWindowText( which, nStateData, state_data ); } } // back end, now the front-end wrapper ClearMemo is used, and ed no longer contains handles. void SetProgramStats (FrontEndProgramStats * stats) // now directly called by back-end { EngineOutputData ed; int clearMemo = FALSE; int which, depth, multi; ChessMove moveType; int ff, ft, rf, rt; char pc; if( stats == 0 ) { SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); return; } if(gameMode == IcsObserving && !appData.icsEngineAnalyze) return; // [HGM] kibitz: shut up engine if we are observing an ICS game which = stats->which; depth = stats->depth; if( which < 0 || which > 1 || depth < 0 || stats->time < 0 || stats->pv == 0 ) { return; } if( !EngineOutputDialogExists() ) { return; } VerifyDisplayMode(); ed.which = which; ed.depth = depth; ed.nodes = stats->nodes; ed.score = stats->score; ed.time = stats->time; ed.pv = stats->pv; ed.hint = stats->hint; ed.an_move_index = stats->an_move_index; ed.an_move_count = stats->an_move_count; /* Get target control. [HGM] this is moved to front end, which get them from a table */ if( which == 0 ) { ed.name = first.tidy; } else { ed.name = second.tidy; } if( ed.pv != 0 && ed.pv[0] == ' ' ) { if( strncmp( ed.pv, " no PV", 6 ) == 0 ) { /* Hack on hack! :-O */ ed.pv = ""; } } /* Clear memo if needed */ if( lastDepth[which] > depth || (lastDepth[which] == depth && depth <= 1 && ed.pv[0]) ) { // no reason to clear if we won't add line clearMemo = TRUE; } if( lastForwardMostMove[which] != forwardMostMove ) { clearMemo = TRUE; } if( clearMemo ) { DoClearMemo(which); nrVariations[which] = 0; header[which][0] = NULLCHAR; if(gameMode == AnalyzeMode) { ChessProgramState *cps = (which ? &second : &first); if((multi = MultiPV(cps)) >= 0) { snprintf(header[which], MSG_SIZ, "\t%s viewpoint\t\tfewer / Multi-PV setting = %d / more\n", appData.whitePOV || appData.scoreWhite ? "white" : "mover", cps->option[multi].value); } if(!which) snprintf(header[which]+strlen(header[which]), MSG_SIZ-strlen(header[which]), "%s", exclusionHeader); InsertIntoMemo( which, header[which], 0); } else if(appData.ponderNextMove && lastLine[which][0]) { InsertIntoMemo( which, lastLine[which], 0 ); InsertIntoMemo( which, "\n", 0 ); } } if(ed.pv && ed.pv[0] && ParseOneMove(ed.pv, currentMove, &moveType, &ff, &rf, &ft, &rt, &pc)) ed.moveKey = (ff<<24 | rf << 16 | ft << 8 | rt) ^ pc*87161; else ed.moveKey = ed.nodes; // kludge to get unique key unlikely to match any move /* Update */ lastDepth[which] = depth == 1 && ed.nodes == 0 ? 0 : depth; // [HGM] info-line kudge lastForwardMostMove[which] = forwardMostMove; UpdateControls( &ed ); } #define ENGINE_COLOR_WHITE 'w' #define ENGINE_COLOR_BLACK 'b' #define ENGINE_COLOR_UNKNOWN ' ' // pure back end static char GetEngineColor (int which) { char result = ENGINE_COLOR_UNKNOWN; if( which == 0 || which == 1 ) { ChessProgramState * cps; switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: result = ENGINE_COLOR_BLACK; break; case MachinePlaysWhite: case IcsPlayingWhite: result = ENGINE_COLOR_WHITE; break; case AnalyzeMode: case AnalyzeFile: result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; break; case TwoMachinesPlay: cps = (which == 0) ? &first : &second; result = cps->twoMachinesColor[0]; result = result == 'w' ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; break; default: ; // does not happen, but suppresses pedantic warnings } } return result; } // pure back end static char GetActiveEngineColor () { char result = ENGINE_COLOR_UNKNOWN; if( gameMode == TwoMachinesPlay ) { result = WhiteOnMove(forwardMostMove) ? ENGINE_COLOR_WHITE : ENGINE_COLOR_BLACK; } return result; } // pure back end static int IsEnginePondering (int which) { int result = FALSE; switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: if( WhiteOnMove(forwardMostMove) ) result = TRUE; break; case MachinePlaysWhite: case IcsPlayingWhite: if( ! WhiteOnMove(forwardMostMove) ) result = TRUE; break; case TwoMachinesPlay: if( GetActiveEngineColor() != ENGINE_COLOR_UNKNOWN ) { if( GetEngineColor( which ) != GetActiveEngineColor() ) result = TRUE; } break; default: ; // does not happen, but suppresses pedantic warnings } return result; } // back end static void SetDisplayMode (int mode) { if( windowMode != mode ) { windowMode = mode; ResizeWindowControls( mode ); } } // pure back end static void VerifyDisplayMode () { int mode; /* Get proper mode for current game */ switch( gameMode ) { case IcsObserving: // [HGM] ICS analyze if(!appData.icsEngineAnalyze) return; case AnalyzeFile: case MachinePlaysWhite: case MachinePlaysBlack: mode = 0; break; case AnalyzeMode: mode = second.analyzing; break; case IcsPlayingWhite: case IcsPlayingBlack: mode = appData.zippyPlay && opponentKibitzes; // [HGM] kibitz break; case TwoMachinesPlay: mode = 1; break; default: /* Do not change */ return; } SetDisplayMode( mode ); } // back end. Determine what icon to set in the color-icon field, and print it void SetEngineColorIcon (int which) { char color = GetEngineColor(which); int nicon = 0; if( color == ENGINE_COLOR_BLACK ) nicon = nColorBlack; else if( color == ENGINE_COLOR_WHITE ) nicon = nColorWhite; else nicon = nColorUnknown; SetIcon( which, nColorIcon, nicon ); } #define MAX_NAME_LENGTH 32 // [HGM] multivar: sort Thinking Output within one depth on score static int InsertionPoint (int len, EngineOutputData *ed) { int i, offs = 0, newScore = ed->score, n = ed->which; if(ed->nodes == 0 && ed->score == 0 && ed->time == 0) newScore = 1e6; // info lines inserted on top if(ed->depth != curDepth[n]) { // depth has changed curDepth[n] = ed->depth; nrVariations[n] = 0; // throw away everything we had } // loop through all lines. Note even / odd used for different panes for(i=nrVariations[n]-2; i>=0; i-=2) { // put new item behind those we haven't looked at offs = textEnd[i+n]; textEnd[i+n+2] = offs + len; scores[i+n+2] = newScore; keys[i+n+2] = ed->moveKey; if(ed->moveKey != keys[i+n] && // same move always tops previous one (as a higher score must be a fail low) newScore < scores[i+n]) break; // if it had higher score as previous, move previous in stead scores[i+n+2] = ed->moveKey == keys[i+n] ? newScore : scores[i+n]; // correct scores of fail-low/high searches textEnd[i+n+2] = textEnd[i+n] + len; keys[i+n+2] = keys[i+n]; } if(i<0) { offs = 0; textEnd[n] = offs + len; scores[n] = newScore; } nrVariations[n] += 2; return offs + (gameMode == AnalyzeMode)*strlen(header[ed->which]); } // pure back end, now SetWindowText is called via wrapper DoSetWindowText static void UpdateControls (EngineOutputData *ed) { // int isPondering = FALSE; char s_label[MAX_NAME_LENGTH + 32]; int h; char * name = ed->name; /* Label */ if( name == 0 || *name == '\0' ) { name = "?"; } strncpy( s_label, name, MAX_NAME_LENGTH ); s_label[ MAX_NAME_LENGTH-1 ] = '\0'; #ifdef SHOW_PONDERING if( IsEnginePondering( ed->which ) ) { char buf[8]; buf[0] = '\0'; if( ed->hint != 0 && *ed->hint != '\0' ) { strncpy( buf, ed->hint, sizeof(buf) ); buf[sizeof(buf)-1] = '\0'; } else if( ed->pv != 0 && *ed->pv != '\0' ) { char * sep = strchr( ed->pv, ' ' ); int buflen = sizeof(buf); if( sep != NULL ) { buflen = sep - ed->pv + 1; if( buflen > sizeof(buf) ) buflen = sizeof(buf); } strncpy( buf, ed->pv, buflen ); buf[ buflen-1 ] = '\0'; } SetEngineState( ed->which, STATE_PONDERING, buf ); } else if( gameMode == TwoMachinesPlay ) { SetEngineState( ed->which, STATE_THINKING, "" ); } else if( gameMode == AnalyzeMode || gameMode == AnalyzeFile || (gameMode == IcsObserving && appData.icsEngineAnalyze)) { // [HGM] ICS-analyze char buf[64]; int time_secs = ed->time / 100; int time_mins = time_secs / 60; buf[0] = '\0'; if( ed->an_move_index != 0 && ed->an_move_count != 0 && *ed->hint != '\0' ) { char mov[16]; strncpy( mov, ed->hint, sizeof(mov) ); mov[ sizeof(mov)-1 ] = '\0'; snprintf( buf, sizeof(buf)/sizeof(buf[0]), "[%d] %d/%d: %s [%02d:%02d:%02d]", ed->depth, ed->an_move_index, ed->an_move_count, mov, time_mins / 60, time_mins % 60, time_secs % 60 ); } SetEngineState( ed->which, STATE_ANALYZING, buf ); } else { SetEngineState( ed->which, STATE_IDLE, "" ); } #endif DoSetWindowText( ed->which, nLabel, s_label ); s_label[0] = '\0'; if( ed->time > 0 && ed->nodes > 0 ) { unsigned long nps_100 = ed->nodes / ed->time; if( nps_100 < 100000 ) { snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %lu", _("NPS"), nps_100 * 100 ); } else { snprintf( s_label, sizeof(s_label)/sizeof(s_label[0]), "%s: %.1fk", _("NPS"), nps_100 / 10.0 ); } } DoSetWindowText( ed->which, nLabelNPS, s_label ); /* Memo */ if( ed->pv != 0 && *ed->pv != '\0' ) { char s_nodes[24]; char s_score[16]; char s_time[24]; char buf[256]; int buflen; int time_secs = ed->time / 100; int time_cent = ed->time % 100; /* Nodes */ if( ed->nodes < 1000000 ) { snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), u64Display, ed->nodes ); } else { snprintf( s_nodes, sizeof(s_nodes)/sizeof(s_nodes[0]), "%.1fM", u64ToDouble(ed->nodes) / 1000000.0 ); } /* Score */ h = ((gameMode == AnalyzeMode && appData.whitePOV || appData.scoreWhite) && !WhiteOnMove(currentMove) ? -1 : 1) * ed->score; if( h > 0 ) { snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), "+%.2f", h / 100.0 ); } else { snprintf( s_score, sizeof(s_score)/sizeof(s_score[0]), "%.2f", h / 100.0 ); } /* Time */ snprintf( s_time, sizeof(s_time)/sizeof(s_time[0]), "%d:%02d.%02d", time_secs / 60, time_secs % 60, time_cent ); /* Put all together... */ if(ed->nodes == 0 && ed->score == 0 && ed->time == 0) snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%3d\t", ed->depth ); else snprintf( buf, sizeof(buf)/sizeof(buf[0]), "%3d\t%s\t%s\t%s\t", ed->depth, s_score, s_nodes, s_time ); /* Add PV */ buflen = strlen(buf); strncpy( buf + buflen, ed->pv, sizeof(buf) - buflen ); buf[ sizeof(buf) - 3 ] = '\0'; strcat( buf + buflen, "\r\n" ); /* Update memo */ InsertIntoMemo( ed->which, buf, InsertionPoint(strlen(buf), ed) ); strncpy(lastLine[ed->which], buf, MSG_SIZ); } /* Colors */ SetEngineColorIcon( ed->which ); } // [HGM] kibitz: write kibitz line; split window for it if necessary void OutputKibitz (int window, char *text) { static int currentLineEnd[2]; int where = 0; if(!EngineOutputIsUp()) return; if(!opponentKibitzes) { // on first kibitz of game, clear memos DoClearMemo(1); currentLineEnd[1] = 0; if(gameMode == IcsObserving) { DoClearMemo(0); currentLineEnd[0] = 0; } } opponentKibitzes = TRUE; // this causes split window DisplayMode in ICS modes. VerifyDisplayMode(); strncpy(text+strlen(text)-1, "\r\n",sizeof(text+strlen(text)-1)); // to not lose line breaks on copying if(gameMode == IcsObserving) { DoSetWindowText(0, nLabel, gameInfo.white); SetIcon( 0, nColorIcon, nColorWhite); SetIcon( 0, nStateIcon, nClear); } DoSetWindowText(1, nLabel, gameMode == IcsPlayingBlack ? gameInfo.white : gameInfo.black); // opponent name SetIcon( 1, nColorIcon, gameMode == IcsPlayingBlack ? nColorWhite : nColorBlack); SetIcon( 1, nStateIcon, nClear); if(strstr(text, "\\ ") == text) where = currentLineEnd[window-1]; // continuation line //if(appData.debugMode) fprintf(debugFP, "insert '%s' at %d (end = %d,%d)\n", text, where, currentLineEnd[0], currentLineEnd[1]); InsertIntoMemo(window-1, text, where); // [HGM] multivar: always at top currentLineEnd[window-1] = where + strlen(text); } xboard-4.7.3/frontend.h0000644000175000001440000002141512262562252011720 00000000000000/* * frontend.h -- Interface exported by all XBoard front ends * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef XB_FRONTEND #define XB_FRONTEND #include char *T_ P((char *s)); void ModeHighlight P((void)); void SetICSMode P((void)); void SetGNUMode P((void)); void SetNCPMode P((void)); void SetCmailMode P((void)); void SetTrainingModeOn P((void)); void SetTrainingModeOff P((void)); void SetUserThinkingEnables P((void)); void SetMachineThinkingEnables P((void)); void DisplayTitle P((String title)); void DisplayMessage P((String message, String extMessage)); void DisplayMoveError P((String message)); void DisplayNote P((String message)); void DisplayInformation P((String message)); void AskQuestion P((String title, String question, String replyPrefix, ProcRef pr)); void DisplayIcsInteractionTitle P((String title)); void ParseArgsFromString P((char *p)); void ParseArgsFromFile P((FILE *f)); void DrawPosition P((int fullRedraw, Board board)); void ResetFrontEnd P((void)); void NotifyFrontendLogin P((void)); void CommentPopUp P((String title, String comment)); void CommentPopDown P((void)); void EditCommentPopUp P((int index, String title, String text)); void ErrorPopDown P((void)); int EventToSquare P((int x, int limit)); void DrawSeekAxis P(( int x, int y, int xTo, int yTo )); void DrawSeekBackground P(( int left, int top, int right, int bottom )); void DrawSeekText P((char *buf, int x, int y)); void DrawSeekDot P((int x, int y, int color)); void PopUpMoveDialog P((char first)); void RingBell P((void)); void PlayIcsWinSound P((void)); void PlayIcsLossSound P((void)); void PlayIcsDrawSound P((void)); void PlayIcsUnfinishedSound P((void)); void PlayAlarmSound P((void)); void PlayTellSound P((void)); void PlaySoundFile P((char *name)); void PlaySoundByColor P((void)); void EchoOn P((void)); void EchoOff P((void)); void Raw P((void)); void Colorize P((ColorClass cc, int continuation)); char *InterpretFileName P((char *name, char *dir)); void DoSleep P((int n)); char *UserName P((void)); char *HostName P((void)); int ClockTimerRunning P((void)); int StopClockTimer P((void)); void StartClockTimer P((long millisec)); void DisplayWhiteClock P((long timeRemaining, int highlight)); void DisplayBlackClock P((long timeRemaining, int highlight)); void UpdateLogos P((int display)); int LoadGameTimerRunning P((void)); int StopLoadGameTimer P((void)); void StartLoadGameTimer P((long millisec)); void AutoSaveGame P((void)); void ScheduleDelayedEvent P((DelayedEventCallback cb, long millisec)); DelayedEventCallback GetDelayedEvent P((void)); void CancelDelayedEvent P((void)); // [HGM] mouse: next six used by mouse handler, which was moved to backend extern int fromX, fromY, toX, toY; void PromotionPopUp P((void)); void DragPieceBegin P((int x, int y, Boolean instantly)); void DragPieceEnd P((int x, int y)); void DragPieceMove P((int x, int y)); void LeftClick P((ClickType c, int x, int y)); int RightClick P((ClickType c, int x, int y, int *col, int *row)); int StartChildProcess P((char *cmdLine, char *dir, ProcRef *pr)); void DestroyChildProcess P((ProcRef pr, int/*boolean*/ signal)); void InterruptChildProcess P((ProcRef pr)); void RunCommand P((char *buf)); int OpenTelnet P((char *host, char *port, ProcRef *pr)); int OpenTCP P((char *host, char *port, ProcRef *pr)); int OpenCommPort P((char *name, ProcRef *pr)); int OpenLoopback P((ProcRef *pr)); int OpenRcmd P((char *host, char *user, char *cmd, ProcRef *pr)); typedef void (*InputCallback) P((InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error)); /* pr == NoProc means the local keyboard */ InputSourceRef AddInputSource P((ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure)); void RemoveInputSource P((InputSourceRef isr)); /* pr == NoProc means the local display */ int OutputToProcess P((ProcRef pr, char *message, int count, int *outError)); int OutputToProcessDelayed P((ProcRef pr, char *message, int count, int *outError, long msdelay)); void CmailSigHandlerCallBack P((InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error)); extern ProcRef cmailPR; extern int shiftKey, controlKey; /* in xgamelist.c or winboard.c */ void GLT_ClearList(); void GLT_DeSelectList(); void GLT_AddToList( char *name ); Boolean GLT_GetFromList( int index, char *name ); extern char lpUserGLT[]; extern char *homeDir; /* these are in wgamelist.c */ void GameListPopUp P((FILE *fp, char *filename)); void GameListPopDown P((void)); void GameListHighlight P((int index)); void GameListDestroy P((void)); FILE *GameFile P((void)); /* these are in wedittags.c */ void EditTagsPopUp P((char *tags, char **dest)); void TagsPopUp P((char *tags, char *msg)); void TagsPopDown P((void)); void ParseIcsTextColors P((void)); int ICSInitScript P((void)); void StartAnalysisClock P((void)); void EngineOutputPopUp P((void)); void EgineOutputPopDown P((void)); void SetHighlights P((int fromX, int fromY, int toX, int toY)); void ClearHighlights P((void)); void SetPremoveHighlights P((int fromX, int fromY, int toX, int toY)); void ClearPremoveHighlights P((void)); void AnimateAtomicCapture P((Board board, int fromX, int fromY, int toX, int toY)); void ShutDownFrontEnd P((void)); void BoardToTop P((void)); void AnimateMove P((Board board, int fromX, int fromY, int toX, int toY)); void HistorySet P((char movelist[][2*MOVE_LEN], int first, int last, int current)); void FreezeUI P((void)); void ThawUI P((void)); void ChangeDragPiece P((ChessSquare piece)); void CopyFENToClipboard P((void)); extern char *programName; extern int commentUp; extern char *firstChessProgramNames; void GreyRevert P((Boolean grey)); void EnableNamedMenuItem P((char *menuRef, int state)); typedef struct FrontEndProgramStats_TAG { int which; int depth; u64 nodes; int score; int time; char * pv; char * hint; int an_move_index; int an_move_count; } FrontEndProgramStats; void SetProgramStats P(( FrontEndProgramStats * stats )); /* [AS] */ void EngineOutputPopUp P((void)); void EngineOutputPopDown P((void)); int EngineOutputIsUp P((void)); int EngineOutputDialogExists P((void)); void EvalGraphPopUp P((void)); Boolean EvalGraphIsUp P((void)); int EvalGraphDialogExists P((void)); void SlavePopUp P((void)); void ActivateTheme P((int new)); char *Col2Text P((int n)); /* these are in xhistory.c */ Boolean MoveHistoryIsUp P((void)); void HistoryPopUp P((void)); void FindMoveByCharIndex P(( int char_index )); #endif /* XB_FRONTEND */ xboard-4.7.3/dialogs.h0000644000175000001440000002114512262415351011520 00000000000000/* * dialogs.h -- shared variables for generic dialog popup of XBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // [HGM] Some remarks about the generic dialog creator of XBoard: // GenericPopUp is needed to create a dialog from the lists of options supplied by the engines. // But once it is there, it provides a very easy way for creating other settings dialogs as well, // by letting XBoard provide its own, compiled-in lists of XBoard options (located in dialogs.c). // The Option struct uses the following fields (E = for engine options, X = for XBoard options): // Option types | XBoard-only -> // TYPE NAME spin check string combo button box label list graph menu break end // int value E E (h) X/E [w] (h) (h) // int min X/E (2) (3) (1) (1) (1) (1) (3) (1) (4) // int max X/E (w) (w) (w) (w) (w) (w) (w) (w) // void* handle X/E X/E X/E X/E X/E X X X X X // void* target X X X X/C C X X C C // char* textValue E X/E * // char ** choice X/E * X // enum type X/E X/E X/E X/E X X X X X X X X // char[] name X/E X/E X/E X/E X X X X X // File and Path options are like String (but get a browse button added in the dialog), and Slider // is like Spin. Menu can be PopUp or PopDown; both need the COMBO_CALLBACK bit (3) set! // (h) or (w) means the field optionally (when non-null) specifies the height or width of the main // control element (excluding accompanying description texts). [w] means the width is written there. // C specifies the 'target' is a user-supplied callback function, which will be executed when the // option is exercised. /* Flags Option.min used (2) for TextBox (-string): */ #define T_VSCRL (1 << 0) #define T_HSCRL (1 << 1) #define T_FILL (1 << 2) #define T_WRAP (1 << 3) #define T_TOP (1 << 4) /* Flags Option.min used (3) for ComboBox (-combo) and menus (PopUp, PopDown): */ #define COMBO_CALLBACK (1 << 0) #define NO_GETTEXT (1 << 2) /* Flags for Option.min used (1) for Button, SaveButton, ListBox, Label: */ #define SAME_ROW (1 << 0) /* also in Break & EndMark */ #define BORDER (1 << 1) /* Label */ #define FIX_H (1 << 1) /* in other, this bit specifies top and botom of the control chain to same window edge */ #define B2B (1 << 2) /* chain bottom to bottom (by default, no chaining is done) */ #define T2T (1 << 3) #define R2R (1 << 4) #define L2R (1 << 5) #define R2L (1 << 6) #define L2L (1 << 7) #define TT (T2T|FIX_H) /* useful combinations: 0xA = entirely to top */ #define BB (B2B|FIX_H) /* 6 = entirely to bottom */ #define TB (B2B|T2T) /* 0xC = absorb all vertical size change */ #define LL (L2L|R2L) /* 0xC0 = entirely to left */ #define RR (L2R|R2R) /* 0x30 = entirely to right */ #define LR (L2L|R2R) /* 0x90 = absorb all horizontal size change */ /* Flags for Option.min used (4) for EndMark: */ #define NO_OK (1 << 1) #define NO_CANCEL (1 << 2) #define MODAL 1 #define NONMODAL 0 /* Board widget numbers, MUST correspond to mainOptions array */ #define W_MENU 0 // main menu bar #define W_ENGIN 6 // engine menu #define W_TITLE 10 #define W_WHITE 12 #define W_BLACK 13 #define W_SMALL 15 // title in small layout #define W_MESSG 16 #define W_BUTTON 17 // button bar #define W_PAUSE 20 #define W_BOARD 24 #define W_MENUW 25 #define W_MENUB 26 #define W_DROP 27 // drop (popup) menu typedef enum { // identifier of dialogs done by GenericPopup TransientDlg=0, // transient: grabs mouse events and is destroyed at pop-down (so other dialog can use this ID next time) CommentDlg, TagsDlg, TextMenuDlg, InputBoxDlg, ChatDlg, DummyDlg, HistoryDlg, // persistent: no grab and reused GameListDlg, EngOutDlg, EvalGraphDlg, PromoDlg, // this and beyond are destroyed at pop-down ErrorDlg, AskDlg, // this and beyond do grab mouse events (and are destroyed) FatalDlg, BoardWindow, BrowserDlg, NrOfDialogs // dummy for total } DialogClass; typedef int MemoCallback (Option *opt, int n, int x, int y, char *text, int index); typedef Option *PointerCallback(int n, int x, int y); typedef void ListBoxCallback(int n, int selected); typedef void ButtonCallback(int n); typedef int OKCallback(int n); extern char commentTranslations[]; extern char historyTranslations[]; //extern Pixel timerBackgroundPixel; extern int values[]; extern ChessProgramState *currentCps; extern int dialogError; extern ButtonCallback *comboCallback; extern void *userLogo; extern WindowPlacement wpComment, wpTags, wpMoveHistory, wpMain, wpDualBoard; extern char *marked[]; extern Boolean shellUp[]; extern Option textOptions[], typeOptions[], dualOptions[], mainOptions[]; int DialogExists P((DialogClass n)); int GenericPopUp P((Option *option, char *title, DialogClass dlgNr, DialogClass parent, int modal, int topLevel)); int GenericReadout P((Option *currentOption, int selected)); int PopDown P((DialogClass n)); void MarkMenu P((char *item, int dlgNr)); int AppendText P((Option *opt, char *s)); void HighlightText P((Option *opt, int from, int to, Boolean highlight)); void SetColor P((char *colorName, Option *box)); //void ColorChanged P((Widget w, XtPointer data, XEvent *event, Boolean *b)); void SetInsertPos P((Option *opt, int pos)); void HardSetFocus P((Option *opt)); void CursorAtEnd P((Option *opt)); void GetWidgetText P((Option *opt, char **buf)); void SetWidgetText P((Option *opt, char *buf, int n)); void GetWidgetState P((Option *opt, int *state)); void SetWidgetState P((Option *opt, int state)); void SetWidgetLabel P((Option *opt, char *buf)); void SetDialogTitle P((DialogClass dlg, char *title)); void LoadListBox P((Option *opt, char *emptyText, int n1, int n2)); void HighlightListBoxItem P((Option *opt, int nr)); void HighlightWithScroll P((Option *opt, int sel, int max)); void ScrollToCursor P((Option *opt, int pos)); int SelectedListBoxItem P((Option *opt)); void BoardFocus P((void)); void FocusOnWidget P((Option *opt, DialogClass dlg)); void UnCaret P((void)); void SetIconName P((DialogClass dlg, char *name)); int ReadScroll P((Option *opt, float *top, float *bottom)); void SetScroll P((Option *opt, float f)); void AddHandler P((Option *opt, DialogClass dlg, int nr)); void SendText P((int n)); void DisplayLogos P((Option *left, Option *right)); void Browse P((DialogClass dlg, char *label, char *proposed, char *ext, Boolean pathFlag, char *mode, char **name, FILE **fp)); void FileNamePopUpWrapper P((char *label, char *def, char *filter, FileProc proc, Boolean pathFlag, char *openMode, char **openName, FILE **openFP)); void InitDrawingParams P((int reload)); // in draw.c void InitDrawingHandle P((Option *opt)); void ExposeRedraw P((Option *opt, int x, int y, int w, int h)); void DrawLogo P((Option *opt, void *logo)); void ErrorPopUp P((char *title, char *text, int modal)); int ShiftKeys P((void)); void SetClockIcon P((int color)); void DelayedLoad P((void)); void DisplayTimerLabel P((Option *opt, char *color, long timer, int highlight)); void SetWindowTitle P((char *text, char *title, char *icon)); void SetupDropMenu P((void)); Option *BoardPopUp P((int squareSize, int lineGap, void *clockFontThingy)); void SlaveResize P((Option *opt)); int SetCurrentComboSelection P((Option *opt)); void BoxAutoPopUp P((char *buf)); void IcsKey P((int n)); void ICSInputBoxPopUp P((void)); void LoadOptionsPopUp P((DialogClass parent)); void GameListOptionsPopUp P((DialogClass parent)); void RefreshColor P((int source, int n)); void SendString P((char *p)); // in ngamelist.c int GameListClicks P((int direction)); void SetFilter P((void)); xboard-4.7.3/xboard.desktop0000644000175000001440000001050012262415351012570 00000000000000[Desktop Entry] Name=Xboard Name[af]=X-bord Name[ar]=Xboard Name[bg]=Xboard Name[bn]=এক্সবোর্ড Name[cs]=Xboard Name[da]=Xboard Name[de]=Xboard Name[el]=Xboard Name[es]=Xboard Name[et]=Xboard Name[fi]=XBoard Name[fr]=XBoard Name[gl]=Xboard Name[hi]=एक्सबोर्ड Name[hr]=Xboard Name[hu]=XBoard Name[it]=XBoard Name[ja]=Xboard Name[km]=XBoard Name[ko]=X보드 Name[lt]=Xboard Name[mr]=Xबोर्ड Name[nb]=Xboard Name[nl]=Xboard Name[pa]=Xboard Name[pl]=Xboard Name[pt]=Xboard Name[pt_BR]=Xboard Name[ru]=Xboard Name[sk]=Xboard Name[sv]=Xboard Name[ta]=பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): எக்ஸ்போர்ட் Name[th]=Xboard Name[tr]=XBoard Name[uk]=Xboard Name[vi]=XBoard Name[xh]=Ibhodi ye-X Name[zh_CN]=X 国际象棋 Name[zh_TW]=Xboard 國際象棋 Name[zu]=I-Xboard Comment=Chess Game Comment[af]=Skaak Speletjie Comment[ar]=لعبة الشطرنج Comment[bg]=Шах Comment[bn]=দাবা Comment[bs]=Igra šaha Comment[ca]=Joc d'escacs Comment[cs]=Šachy Comment[cy]=Gêm Gwyddbwyll Comment[da]=Skakspil Comment[de]=Schachspiel Comment[el]=Παιχνίδι Σκάκι Comment[es]=Juego de ajedrez Comment[et]=Male Comment[fi]=Shakkipeli Comment[fr]=Jeu d'échecs Comment[gl]=Xogo de Xadrez Comment[he]=משחק שחמט Comment[hi]=शतरंज का खेल Comment[hr]=Šah Comment[hu]=sakk Comment[id]=Permainan Catur Comment[it]=Gioco di scacchi Comment[ja]=チェスゲーム Comment[ka]=ჭადრაკი Comment[km]=ល្បែង​អុក Comment[ko]=체스 게임 Comment[lo]=ເກມຫມາກລຸກ Comment[lt]=Šachmatai Comment[mk]=Шаховска игра Comment[mr]=बुद्धिबळाचा खेळ Comment[nb]=Sjakkspill Comment[nl]=Schaakspel Comment[pa]=ਸਤਰੰਜ਼ ਖੇਡ Comment[pl]=Szachy Comment[pt]=Jogo de Xadrez Comment[pt_BR]=Jogo de Xadrez Comment[ro]=Un joc de șah Comment[ru]=Шахматы Comment[sk]=Šach Comment[sl]=Igra šaha Comment[sr]=Шах Comment[sr@Latn]=Шах Comment[sv]=Schackspel Comment[ta]=இனப்பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): சதுரங்க விளையாட்டு Comment[th]=เกมหมากรุก Comment[tr]=Satranç oyunu Comment[uk]=Шахи Comment[vi]=Cờ Comment[wa]=Djeu d' echeks Comment[xh]=Umdlalo we Chess Comment[zh_CN]=国际象棋游戏 Comment[zh_TW]=棋類遊戲 Comment[zu]=Umdlalo we-Chess GenericName=Chess Game GenericName[af]=Skaak Speletjie GenericName[ar]=لعبة الشطرنج GenericName[bg]=Шах GenericName[bn]=দাবা GenericName[bs]=Igra šaha GenericName[ca]=Joc d'escacs GenericName[cs]=Šachy GenericName[cy]=Gêm Gwyddbwyll GenericName[da]=Skakspil GenericName[de]=Schachspiel GenericName[el]=Παιχνίδι Σκάκι GenericName[es]=Juego de ajedrez GenericName[et]=Male GenericName[fi]=Shakkipeli GenericName[fr]=Jeu d'échecs GenericName[gl]=Xogo de Xadrez GenericName[he]=משחק שחמט GenericName[hi]=शतरंज का खेल GenericName[hr]=Šah GenericName[hu]=sakk GenericName[id]=Permainan Catur GenericName[it]=Gioco di scacchi GenericName[ja]=チェスゲーム GenericName[ka]=ჭადრაკი GenericName[km]=ល្បែង​អុក GenericName[ko]=체스 게임 GenericName[lo]=ເກມຫມາກລຸກ GenericName[lt]=Šachmatai GenericName[mk]=Шаховска игра GenericName[mr]=बुद्धिबळाचा खेळ GenericName[nb]=Sjakkspill GenericName[nl]=Schaakspel GenericName[pa]=ਸਤਰੰਜ਼ ਖੇਡ GenericName[pl]=Szachy GenericName[pt]=Jogo de Xadrez GenericName[pt_BR]=Jogo de Xadrez GenericName[ro]=Un joc de șah GenericName[ru]=Шахматы GenericName[sk]=Šach GenericName[sl]=Igra šaha GenericName[sr]=Шах GenericName[sr@Latn]=Шах GenericName[sv]=Schackspel GenericName[ta]=இனப்பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): சதுரங்க விளையாட்டு GenericName[th]=เกมหมากรุก GenericName[tr]=Satranç oyunu GenericName[uk]=Шахи GenericName[vi]=Cờ GenericName[wa]=Djeu d' echeks GenericName[xh]=Umdlalo we Chess GenericName[zh_CN]=国际象棋游戏 GenericName[zh_TW]=棋類遊戲 GenericName[zu]=Umdlalo we-Chess Type=Application Categories=Game;BoardGame; Exec=xboard Icon=xboard xboard-4.7.3/gpl.texinfo0000644000175000001440000010441312262415351012105 00000000000000@c The GNU General Public License. @center Version 3, 29 June 2007 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program---to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. @heading TERMS AND CONDITIONS @enumerate 0 @item Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. @item Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. @item Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. @item Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. @item Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. @item Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. @item You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. @item If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. @end enumerate A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. @item Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @enumerate a @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. @item Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. @item Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. @item Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. @end enumerate A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. @item Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or @item Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. @end enumerate All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. @item Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. @item Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. @item Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. @item Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. @item No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. @item Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. @item Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. @item Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @item Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. @end enumerate @heading END OF TERMS AND CONDITIONS @heading How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see @url{http://www.gnu.org/licenses/}. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. xboard-4.7.3/args.h0000644000175000001440000023401312262562252011035 00000000000000/* * args.c -- Option parsing and saving for X and Windows versions of XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // Note: this file is not a normal header, but contains executable code // for #inclusion in winboard.c and xboard.c, rather than separate compilation, // so that it can make use of the proper context of #defined symbols and // declarations in those files. typedef enum { ArgString, ArgInt, ArgFloat, ArgBoolean, ArgTrue, ArgFalse, ArgNone, ArgColor, ArgAttribs, ArgFilename, ArgBoardSize, ArgFont, ArgCommSettings, ArgSettingsFilename, ArgBackupSettingsFile, ArgTwo, ArgX, ArgY, ArgZ // [HGM] placement: for window-placement options stored relative to main window } ArgType; typedef void *ArgIniType; #define INVALID (ArgIniType) 6915 /* Some number unlikely to be needed as default for anything */ #define MAX_ARG_LEN 128*1024 /* [AS] For Roger Brown's very long list! */ typedef struct { char *argName; ArgType argType; /*** union { String *pString; // ArgString int *pInt; // ArgInt float *pFloat; // ArgFloat Boolean *pBoolean; // ArgBoolean COLORREF *pColor; // ArgColor ColorClass cc; // ArgAttribs String *pFilename; // ArgFilename BoardSize *pBoardSize; // ArgBoardSize int whichFont; // ArgFont DCB *pDCB; // ArgCommSettings String *pFilename; // ArgSettingsFilename } argLoc; ***/ void *argLoc; Boolean save; ArgIniType defaultValue; } ArgDescriptor; typedef struct { char *item; char *command; Boolean getname; Boolean immediate; } IcsTextMenuEntry; IcsTextMenuEntry icsTextMenuEntry[ICS_TEXT_MENU_SIZE]; int junk; Boolean singleList; char *homeDir; char *firstEngineLine; char *secondEngineLine; char *icsNick; char *theme; void EnsureOnScreen(int *x, int *y, int minX, int minY); char StringGet(void *getClosure); void ParseFont(char *name, int number); void SetFontDefaults(); void CreateFonts(); void ParseColor(int n, char *name); void ParseTextAttribs(ColorClass cc, char *s); void ParseBoardSize(void * addr, char *name); void ParseCommPortSettings(char *name); void LoadAllSounds(); void SetCommPortDefaults(); void SaveFontArg(FILE *f, ArgDescriptor *ad); void ExportSounds(); void SaveAttribsArg(FILE *f, ArgDescriptor *ad); void SaveColor(FILE *f, ArgDescriptor *ad); void SaveBoardSize(FILE *f, char *name, void *addr); void PrintCommPortSettings(FILE *f, char *name); void GetWindowCoords(); int MainWindowUp(); void PopUpStartupDialog(); typedef char GetFunc(void *getClosure); void ParseArgs(GetFunc get, void *cl); // [HGM] this is an exact duplicate of something in winboard.c. Move to backend.c? char *defaultTextAttribs[] = { COLOR_SHOUT, COLOR_SSHOUT, COLOR_CHANNEL1, COLOR_CHANNEL, COLOR_KIBITZ, COLOR_TELL, COLOR_CHALLENGE, COLOR_REQUEST, COLOR_SEEK, COLOR_NORMAL, "#000000" }; ArgDescriptor argDescriptors[] = { /* positional arguments */ { "opt", ArgSettingsFilename, (void *) NULL, FALSE, INVALID }, { "loadPositionFile", ArgFilename, (void *) &appData.loadPositionFile, FALSE, INVALID }, { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, INVALID }, { "is", ArgString, (void *) &icsNick, FALSE, INVALID }, { "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID }, { "", ArgNone, NULL, FALSE, INVALID }, /* keyword arguments */ JAWS_ARGS { "whitePieceColor", ArgColor, (void *) 0, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "wpc", ArgColor, (void *) 0, FALSE, INVALID }, { "blackPieceColor", ArgColor, (void *) 1, TRUE, (ArgIniType) BLACK_PIECE_COLOR }, { "bpc", ArgColor, (void *) 1, FALSE, INVALID }, { "lightSquareColor", ArgColor, (void *) 2, TRUE, (ArgIniType) LIGHT_SQUARE_COLOR }, { "lsc", ArgColor, (void *) 2, FALSE, INVALID }, { "darkSquareColor", ArgColor, (void *) 3, TRUE, (ArgIniType) DARK_SQUARE_COLOR }, { "dsc", ArgColor, (void *) 3, FALSE, INVALID }, { "highlightSquareColor", ArgColor, (void *) 4, TRUE, (ArgIniType) HIGHLIGHT_SQUARE_COLOR }, { "hsc", ArgColor, (void *) 4, FALSE, INVALID }, { "premoveHighlightColor", ArgColor, (void *) 5, TRUE, (ArgIniType) PREMOVE_HIGHLIGHT_COLOR }, { "phc", ArgColor, (void *) 5, FALSE, INVALID }, { "movesPerSession", ArgInt, (void *) &appData.movesPerSession, TRUE, (ArgIniType) MOVES_PER_SESSION }, { "mps", ArgInt, (void *) &appData.movesPerSession, FALSE, INVALID }, { "initString", ArgString, (void *) &appData.firstInitString, FALSE, INVALID }, { "firstInitString", ArgString, (void *) &appData.firstInitString, FALSE, (ArgIniType) INIT_STRING }, { "secondInitString", ArgString, (void *) &appData.secondInitString, FALSE, (ArgIniType) INIT_STRING }, { "firstComputerString", ArgString, (void *) &appData.firstComputerString, FALSE, (ArgIniType) COMPUTER_STRING }, { "secondComputerString", ArgString, (void *) &appData.secondComputerString, FALSE, (ArgIniType) COMPUTER_STRING }, { "firstChessProgram", ArgFilename, (void *) &appData.firstChessProgram, FALSE, (ArgIniType) FIRST_CHESS_PROGRAM }, { "fcp", ArgFilename, (void *) &appData.firstChessProgram, FALSE, INVALID }, { "secondChessProgram", ArgFilename, (void *) &appData.secondChessProgram, FALSE, (ArgIniType) SECOND_CHESS_PROGRAM }, { "scp", ArgFilename, (void *) &appData.secondChessProgram, FALSE, INVALID }, { "fe", ArgString, (void *) &firstEngineLine, FALSE, "" }, { "se", ArgString, (void *) &secondEngineLine, FALSE, "" }, { "firstPlaysBlack", ArgBoolean, (void *) &appData.firstPlaysBlack, FALSE, FALSE }, { "fb", ArgTrue, (void *) &appData.firstPlaysBlack, FALSE, FALSE }, { "xfb", ArgFalse, (void *) &appData.firstPlaysBlack, FALSE, INVALID }, { "-fb", ArgFalse, (void *) &appData.firstPlaysBlack, FALSE, INVALID }, { "noChessProgram", ArgBoolean, (void *) &appData.noChessProgram, FALSE, FALSE }, { "ncp", ArgTrue, (void *) &appData.noChessProgram, FALSE, INVALID }, { "xncp", ArgFalse, (void *) &appData.noChessProgram, FALSE, INVALID }, { "-ncp", ArgFalse, (void *) &appData.noChessProgram, FALSE, INVALID }, { "firstHost", ArgString, (void *) &appData.firstHost, FALSE, (ArgIniType) FIRST_HOST }, { "fh", ArgString, (void *) &appData.firstHost, FALSE, INVALID }, { "secondHost", ArgString, (void *) &appData.secondHost, FALSE, (ArgIniType) SECOND_HOST }, { "sh", ArgString, (void *) &appData.secondHost, FALSE, INVALID }, { "firstDirectory", ArgFilename, (void *) &appData.firstDirectory, FALSE, (ArgIniType) FIRST_DIRECTORY }, { "fd", ArgFilename, (void *) &appData.firstDirectory, FALSE, INVALID }, { "secondDirectory", ArgFilename, (void *) &appData.secondDirectory, FALSE, (ArgIniType) SECOND_DIRECTORY }, { "sd", ArgFilename, (void *) &appData.secondDirectory, FALSE, INVALID }, { "variations", ArgBoolean, (void *) &appData.variations, TRUE, (ArgIniType) FALSE }, { "appendPV", ArgBoolean, (void *) &appData.autoExtend, TRUE, (ArgIniType) FALSE }, { "theme", ArgString, (void *) &theme, FALSE, (ArgIniType) "" }, /* some options only used by the XBoard front end, and ignored in WinBoard */ /* Their saving is controlled by XBOARD, which in WinBoard is defined as FALSE */ { "internetChessServerInputBox", ArgBoolean, (void *) &appData.icsInputBox, XBOARD, (ArgIniType) FALSE }, { "icsinput", ArgTrue, (void *) &appData.icsInputBox, FALSE, INVALID }, { "xicsinput", ArgFalse, (void *) &appData.icsInputBox, FALSE, INVALID }, { "cmail", ArgString, (void *) &appData.cmailGameName, FALSE, (ArgIniType) "" }, { "soundProgram", ArgFilename, (void *) &appData.soundProgram, XBOARD, (ArgIniType) "play" }, { "fontSizeTolerance", ArgInt, (void *) &appData.fontSizeTolerance, XBOARD, (ArgIniType) 4 }, { "lowTimeWarningColor", ArgColor, (void *) 6, XBOARD, (ArgIniType) LOWTIMEWARNING_COLOR }, { "lowTimeWarning", ArgBoolean, (void *) &appData.lowTimeWarning, XBOARD, (ArgIniType) FALSE }, { "titleInWindow", ArgBoolean, (void *) &appData.titleInWindow, XBOARD, (ArgIniType) FALSE }, { "title", ArgTrue, (void *) &appData.titleInWindow, FALSE, INVALID }, { "xtitle", ArgFalse, (void *) &appData.titleInWindow, FALSE, INVALID }, { "flashCount", ArgInt, (void *) &appData.flashCount, XBOARD, INVALID }, // let X handle this { "flashRate", ArgInt, (void *) &appData.flashRate, XBOARD, (ArgIniType) FLASH_RATE }, { "pieceImageDirectory", ArgFilename, (void *) &appData.pieceDirectory, TRUE, (ArgIniType) "" }, { "pid", ArgFilename, (void *) &appData.pieceDirectory, FALSE, INVALID }, { "trueColors", ArgBoolean, (void *) &appData.trueColors, TRUE, (ArgIniType) FALSE }, { "soundDirectory", ArgFilename, (void *) &appData.soundDirectory, XBOARD, (ArgIniType) "" }, { "msLoginDelay", ArgInt, (void *) &appData.msLoginDelay, XBOARD, (ArgIniType) MS_LOGIN_DELAY }, { "pasteSelection", ArgBoolean, (void *) &appData.pasteSelection, XBOARD, (ArgIniType) FALSE }, { "dropMenu", ArgBoolean, (void *) &appData.dropMenu, TRUE, (ArgIniType) FALSE }, { "pieceMenu", ArgBoolean, (void *) &appData.pieceMenu, TRUE, (ArgIniType) TRUE }, { "sweepPromotions", ArgBoolean, (void *) &appData.sweepSelect, TRUE, (ArgIniType) FALSE }, { "remoteShell", ArgFilename, (void *) &appData.remoteShell, FALSE, (ArgIniType) REMOTE_SHELL }, { "rsh", ArgFilename, (void *) &appData.remoteShell, FALSE, INVALID }, { "remoteUser", ArgString, (void *) &appData.remoteUser, FALSE, (ArgIniType) "" }, { "ruser", ArgString, (void *) &appData.remoteUser, FALSE, INVALID }, { "timeDelay", ArgFloat, (void *) &appData.timeDelay, TRUE, INVALID }, { "td", ArgFloat, (void *) &appData.timeDelay, FALSE, INVALID }, { "timeControl", ArgString, (void *) &appData.timeControl, TRUE, (ArgIniType) TIME_CONTROL }, { "tc", ArgString, (void *) &appData.timeControl, FALSE, INVALID }, { "timeIncrement", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID }, { "inc", ArgFloat, (void *) &appData.timeIncrement, FALSE, INVALID }, { "internetChessServerMode", ArgBoolean, (void *) &appData.icsActive, FALSE, INVALID }, { "ics", ArgTrue, (void *) &appData.icsActive, FALSE, (ArgIniType) FALSE }, { "xics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID }, { "-ics", ArgFalse, (void *) &appData.icsActive, FALSE, INVALID }, { "is", ArgString, (void *) &icsNick, FALSE, "" }, { "internetChessServerHost", ArgString, (void *) &appData.icsHost, FALSE, (ArgIniType) "" }, { "icshost", ArgString, (void *) &appData.icsHost, FALSE, INVALID }, { "internetChessServerPort", ArgString, (void *) &appData.icsPort, FALSE, (ArgIniType) ICS_PORT }, { "icsport", ArgString, (void *) &appData.icsPort, FALSE, INVALID }, { "internetChessServerCommPort", ArgString, (void *) &appData.icsCommPort, FALSE, (ArgIniType) ICS_COMM_PORT }, { "icscomm", ArgString, (void *) &appData.icsCommPort, FALSE, INVALID }, { "internetChessServerComPort", ArgString, (void *) &appData.icsCommPort, FALSE, INVALID }, { "icscom", ArgString, (void *) &appData.icsCommPort, FALSE, INVALID }, { "internetChessServerLogonScript", ArgFilename, (void *) &appData.icsLogon, FALSE, (ArgIniType) ICS_LOGON }, { "icslogon", ArgFilename, (void *) &appData.icsLogon, FALSE, INVALID }, { "useTelnet", ArgBoolean, (void *) &appData.useTelnet, FALSE, INVALID }, { "telnet", ArgTrue, (void *) &appData.useTelnet, FALSE, INVALID }, { "xtelnet", ArgFalse, (void *) &appData.useTelnet, FALSE, INVALID }, { "-telnet", ArgFalse, (void *) &appData.useTelnet, FALSE, INVALID }, { "telnetProgram", ArgFilename, (void *) &appData.telnetProgram, FALSE, (ArgIniType) TELNET_PROGRAM }, { "internetChessserverHelper", ArgFilename, (void *) &appData.icsHelper, FALSE, INVALID }, // for XB { "icshelper", ArgFilename, (void *) &appData.icsHelper, FALSE, (ArgIniType) "" }, { "seekGraph", ArgBoolean, (void *) &appData.seekGraph, TRUE, (ArgIniType) FALSE }, { "sg", ArgTrue, (void *) &appData.seekGraph, FALSE, INVALID }, { "autoRefresh", ArgBoolean, (void *) &appData.autoRefresh, TRUE, (ArgIniType) FALSE }, { "autoBox", ArgBoolean, (void *) &appData.autoBox, XBOARD, (ArgIniType) TRUE }, { "gateway", ArgString, (void *) &appData.gateway, FALSE, (ArgIniType) "" }, { "loadGameFile", ArgFilename, (void *) &appData.loadGameFile, FALSE, (ArgIniType) "" }, { "lgf", ArgFilename, (void *) &appData.loadGameFile, FALSE, INVALID }, { "loadGameIndex", ArgInt, (void *) &appData.loadGameIndex, FALSE, (ArgIniType) 0 }, { "lgi", ArgInt, (void *) &appData.loadGameIndex, FALSE, INVALID }, { "saveGameFile", ArgFilename, (void *) &appData.saveGameFile, TRUE, (ArgIniType) "" }, { "sgf", ArgFilename, (void *) &appData.saveGameFile, FALSE, INVALID }, { "autoSaveGames", ArgBoolean, (void *) &appData.autoSaveGames, TRUE, (ArgIniType) FALSE }, { "autosave", ArgTrue, (void *) &appData.autoSaveGames, FALSE, INVALID }, { "xautosave", ArgFalse, (void *) &appData.autoSaveGames, FALSE, INVALID }, { "-autosave", ArgFalse, (void *) &appData.autoSaveGames, FALSE, INVALID }, { "onlyOwnGames", ArgBoolean, (void *) &appData.onlyOwn, TRUE, (ArgIniType) FALSE }, { "loadPositionFile", ArgFilename, (void *) &appData.loadPositionFile, FALSE, (ArgIniType) "" }, { "lpf", ArgFilename, (void *) &appData.loadPositionFile, FALSE, INVALID }, { "loadPositionIndex", ArgInt, (void *) &appData.loadPositionIndex, FALSE, (ArgIniType) 1 }, { "lpi", ArgInt, (void *) &appData.loadPositionIndex, FALSE, INVALID }, { "savePositionFile", ArgFilename, (void *) &appData.savePositionFile, FALSE, (ArgIniType) "" }, { "spf", ArgFilename, (void *) &appData.savePositionFile, FALSE, INVALID }, { "matchMode", ArgBoolean, (void *) &appData.matchMode, FALSE, (ArgIniType) FALSE }, { "mm", ArgTrue, (void *) &appData.matchMode, FALSE, INVALID }, { "xmm", ArgFalse, (void *) &appData.matchMode, FALSE, INVALID }, { "-mm", ArgFalse, (void *) &appData.matchMode, FALSE, INVALID }, { "matchGames", ArgInt, (void *) &appData.matchGames, FALSE, (ArgIniType) 0 }, { "mg", ArgInt, (void *) &appData.matchGames, FALSE, INVALID }, { "monoMode", ArgBoolean, (void *) &appData.monoMode, TRUE, (ArgIniType) FALSE }, { "mono", ArgTrue, (void *) &appData.monoMode, FALSE, INVALID }, { "xmono", ArgFalse, (void *) &appData.monoMode, FALSE, INVALID }, { "-mono", ArgFalse, (void *) &appData.monoMode, FALSE, INVALID }, { "debugMode", ArgBoolean, (void *) &appData.debugMode, FALSE, (ArgIniType) FALSE }, { "debug", ArgTrue, (void *) &appData.debugMode, FALSE, INVALID }, { "xdebug", ArgFalse, (void *) &appData.debugMode, FALSE, INVALID }, { "-debug", ArgFalse, (void *) &appData.debugMode, FALSE, INVALID }, { "clockMode", ArgBoolean, (void *) &appData.clockMode, FALSE, (ArgIniType) TRUE }, { "clock", ArgTrue, (void *) &appData.clockMode, FALSE, INVALID }, { "xclock", ArgFalse, (void *) &appData.clockMode, FALSE, INVALID }, { "-clock", ArgFalse, (void *) &appData.clockMode, FALSE, INVALID }, { "searchTime", ArgString, (void *) &appData.searchTime, FALSE, (ArgIniType) "" }, { "st", ArgString, (void *) &appData.searchTime, FALSE, INVALID }, { "searchDepth", ArgInt, (void *) &appData.searchDepth, FALSE, (ArgIniType) 0 }, { "depth", ArgInt, (void *) &appData.searchDepth, FALSE, INVALID }, { "showCoords", ArgBoolean, (void *) &appData.showCoords, TRUE, (ArgIniType) FALSE }, { "coords", ArgTrue, (void *) &appData.showCoords, FALSE, INVALID }, { "xcoords", ArgFalse, (void *) &appData.showCoords, FALSE, INVALID }, { "-coords", ArgFalse, (void *) &appData.showCoords, FALSE, INVALID }, { "showThinking", ArgBoolean, (void *) &appData.showThinking, TRUE, (ArgIniType) FALSE }, { "thinking", ArgTrue, (void *) &appData.showThinking, FALSE, INVALID }, { "xthinking", ArgFalse, (void *) &appData.showThinking, FALSE, INVALID }, { "-thinking", ArgFalse, (void *) &appData.showThinking, FALSE, INVALID }, { "ponderNextMove", ArgBoolean, (void *) &appData.ponderNextMove, TRUE, (ArgIniType) TRUE }, { "ponder", ArgTrue, (void *) &appData.ponderNextMove, FALSE, INVALID }, { "xponder", ArgFalse, (void *) &appData.ponderNextMove, FALSE, INVALID }, { "-ponder", ArgFalse, (void *) &appData.ponderNextMove, FALSE, INVALID }, { "periodicUpdates", ArgBoolean, (void *) &appData.periodicUpdates, TRUE, (ArgIniType) TRUE }, { "periodic", ArgTrue, (void *) &appData.periodicUpdates, FALSE, INVALID }, { "xperiodic", ArgFalse, (void *) &appData.periodicUpdates, FALSE, INVALID }, { "-periodic", ArgFalse, (void *) &appData.periodicUpdates, FALSE, INVALID }, { "popupExitMessage", ArgBoolean, (void *) &appData.popupExitMessage, TRUE, (ArgIniType) TRUE }, { "exit", ArgTrue, (void *) &appData.popupExitMessage, FALSE, INVALID }, { "xexit", ArgFalse, (void *) &appData.popupExitMessage, FALSE, INVALID }, { "-exit", ArgFalse, (void *) &appData.popupExitMessage, FALSE, INVALID }, { "popupMoveErrors", ArgBoolean, (void *) &appData.popupMoveErrors, TRUE, (ArgIniType) FALSE }, { "popup", ArgTrue, (void *) &appData.popupMoveErrors, FALSE, INVALID }, { "xpopup", ArgFalse, (void *) &appData.popupMoveErrors, FALSE, INVALID }, { "-popup", ArgFalse, (void *) &appData.popupMoveErrors, FALSE, INVALID }, { "popUpErrors", ArgBoolean, (void *) &appData.popupMoveErrors, FALSE, INVALID }, /* only so that old WinBoard.ini files from betas can be read */ { "clockFont", ArgFont, (void *) CLOCK_FONT, TRUE, INVALID }, { "messageFont", ArgFont, (void *) MESSAGE_FONT, TRUE, INVALID }, { "font", ArgFont, (void *) MESSAGE_FONT, FALSE, INVALID }, /* only so that old .xboardrc files will parse. -font does not work from the command line because it is captured by the X libraries. */ { "coordFont", ArgFont, (void *) COORD_FONT, TRUE, INVALID }, { "tagsFont", ArgFont, (void *) EDITTAGS_FONT, TRUE, INVALID }, { "commentFont", ArgFont, (void *) COMMENT_FONT, TRUE, INVALID }, { "icsFont", ArgFont, (void *) CONSOLE_FONT, TRUE, INVALID }, { "moveHistoryFont", ArgFont, (void *) MOVEHISTORY_FONT, TRUE, INVALID }, /* [AS] */ { "gameListFont", ArgFont, (void *) GAMELIST_FONT, TRUE, INVALID }, /* [HGM] */ { "boardSize", ArgBoardSize, (void *) &boardSize, TRUE, (ArgIniType) -1 }, /* must come after all fonts */ { "size", ArgBoardSize, (void *) &boardSize, FALSE, INVALID }, { "ringBellAfterMoves", ArgBoolean, (void *) &appData.ringBellAfterMoves, FALSE, (ArgIniType) TRUE }, /* historical; kept only so old winboard.ini files will parse */ { "bell", ArgTrue, (void *) &appData.ringBellAfterMoves, FALSE, INVALID }, // for XB { "xbell", ArgFalse, (void *) &appData.ringBellAfterMoves, FALSE, INVALID }, // for XB { "movesound", ArgTrue, (void *) &appData.ringBellAfterMoves, FALSE, INVALID }, // for XB { "xmovesound", ArgFalse, (void *) &appData.ringBellAfterMoves, FALSE, INVALID }, // for XB { "alwaysOnTop", ArgBoolean, (void *) &alwaysOnTop, TRUE, INVALID }, { "top", ArgTrue, (void *) &alwaysOnTop, FALSE, INVALID }, { "xtop", ArgFalse, (void *) &alwaysOnTop, FALSE, INVALID }, { "-top", ArgFalse, (void *) &alwaysOnTop, FALSE, INVALID }, { "autoCallFlag", ArgBoolean, (void *) &appData.autoCallFlag, TRUE, (ArgIniType) FALSE }, { "autoflag", ArgTrue, (void *) &appData.autoCallFlag, FALSE, INVALID }, { "xautoflag", ArgFalse, (void *) &appData.autoCallFlag, FALSE, INVALID }, { "-autoflag", ArgFalse, (void *) &appData.autoCallFlag, FALSE, INVALID }, { "autoComment", ArgBoolean, (void *) &appData.autoComment, TRUE, (ArgIniType) FALSE }, { "autocomm", ArgTrue, (void *) &appData.autoComment, FALSE, INVALID }, { "xautocomm", ArgFalse, (void *) &appData.autoComment, FALSE, INVALID }, { "-autocomm", ArgFalse, (void *) &appData.autoComment, FALSE, INVALID }, { "autoCreateLogon", ArgBoolean, (void *) &appData.autoCreateLogon, TRUE, (ArgIniType) FALSE }, { "autoObserve", ArgBoolean, (void *) &appData.autoObserve, TRUE, (ArgIniType) FALSE }, { "autobs", ArgTrue, (void *) &appData.autoObserve, FALSE, INVALID }, { "xautobs", ArgFalse, (void *) &appData.autoObserve, FALSE, INVALID }, { "-autobs", ArgFalse, (void *) &appData.autoObserve, FALSE, INVALID }, { "flipView", ArgBoolean, (void *) &appData.flipView, FALSE, (ArgIniType) FALSE }, { "flip", ArgTrue, (void *) &appData.flipView, FALSE, INVALID }, { "xflip", ArgFalse, (void *) &appData.flipView, FALSE, INVALID }, { "-flip", ArgFalse, (void *) &appData.flipView, FALSE, INVALID }, { "autoFlipView", ArgBoolean, (void *) &appData.autoFlipView, TRUE, (ArgIniType) TRUE }, { "autoflip", ArgTrue, (void *) &appData.autoFlipView, FALSE, INVALID }, { "xautoflip", ArgFalse, (void *) &appData.autoFlipView, FALSE, INVALID }, { "-autoflip", ArgFalse, (void *) &appData.autoFlipView, FALSE, INVALID }, { "autoRaiseBoard", ArgBoolean, (void *) &appData.autoRaiseBoard, TRUE, (ArgIniType) TRUE }, { "autoraise", ArgTrue, (void *) &appData.autoRaiseBoard, FALSE, INVALID }, { "xautoraise", ArgFalse, (void *) &appData.autoRaiseBoard, FALSE, INVALID }, { "-autoraise", ArgFalse, (void *) &appData.autoRaiseBoard, FALSE, INVALID }, { "alwaysPromoteToQueen", ArgBoolean, (void *) &appData.alwaysPromoteToQueen, TRUE, (ArgIniType) FALSE }, { "queen", ArgTrue, (void *) &appData.alwaysPromoteToQueen, FALSE, INVALID }, { "xqueen", ArgFalse, (void *) &appData.alwaysPromoteToQueen, FALSE, INVALID }, { "-queen", ArgFalse, (void *) &appData.alwaysPromoteToQueen, FALSE, INVALID }, { "oldSaveStyle", ArgBoolean, (void *) &appData.oldSaveStyle, TRUE, (ArgIniType) FALSE }, { "oldsave", ArgTrue, (void *) &appData.oldSaveStyle, FALSE, INVALID }, { "xoldsave", ArgFalse, (void *) &appData.oldSaveStyle, FALSE, INVALID }, { "-oldsave", ArgFalse, (void *) &appData.oldSaveStyle, FALSE, INVALID }, { "quietPlay", ArgBoolean, (void *) &appData.quietPlay, TRUE, (ArgIniType) FALSE }, { "quiet", ArgTrue, (void *) &appData.quietPlay, FALSE, INVALID }, { "xquiet", ArgFalse, (void *) &appData.quietPlay, FALSE, INVALID }, { "-quiet", ArgFalse, (void *) &appData.quietPlay, FALSE, INVALID }, { "getMoveList", ArgBoolean, (void *) &appData.getMoveList, TRUE, (ArgIniType) TRUE }, { "moves", ArgTrue, (void *) &appData.getMoveList, FALSE, INVALID }, { "xmoves", ArgFalse, (void *) &appData.getMoveList, FALSE, INVALID }, { "-moves", ArgFalse, (void *) &appData.getMoveList, FALSE, INVALID }, { "testLegality", ArgBoolean, (void *) &appData.testLegality, TRUE, (ArgIniType) TRUE }, { "legal", ArgTrue, (void *) &appData.testLegality, FALSE, INVALID }, { "xlegal", ArgFalse, (void *) &appData.testLegality, FALSE, INVALID }, { "-legal", ArgFalse, (void *) &appData.testLegality, FALSE, INVALID }, { "premove", ArgBoolean, (void *) &appData.premove, TRUE, (ArgIniType) TRUE }, { "pre", ArgTrue, (void *) &appData.premove, FALSE, INVALID }, { "xpre", ArgFalse, (void *) &appData.premove, FALSE, INVALID }, { "-pre", ArgFalse, (void *) &appData.premove, FALSE, INVALID }, { "premoveWhite", ArgBoolean, (void *) &appData.premoveWhite, TRUE, (ArgIniType) FALSE }, { "prewhite", ArgTrue, (void *) &appData.premoveWhite, FALSE, INVALID }, { "xprewhite", ArgFalse, (void *) &appData.premoveWhite, FALSE, INVALID }, { "-prewhite", ArgFalse, (void *) &appData.premoveWhite, FALSE, INVALID }, { "premoveWhiteText", ArgString, (void *) &appData.premoveWhiteText, TRUE, (ArgIniType) "" }, { "premoveBlack", ArgBoolean, (void *) &appData.premoveBlack, TRUE, (ArgIniType) FALSE }, { "preblack", ArgTrue, (void *) &appData.premoveBlack, FALSE, INVALID }, { "xpreblack", ArgFalse, (void *) &appData.premoveBlack, FALSE, INVALID }, { "-preblack", ArgFalse, (void *) &appData.premoveBlack, FALSE, INVALID }, { "premoveBlackText", ArgString, (void *) &appData.premoveBlackText, TRUE, (ArgIniType) "" }, { "icsAlarm", ArgBoolean, (void *) &appData.icsAlarm, TRUE, (ArgIniType) TRUE}, { "alarm", ArgTrue, (void *) &appData.icsAlarm, FALSE}, { "xalarm", ArgFalse, (void *) &appData.icsAlarm, FALSE}, { "-alarm", ArgFalse, (void *) &appData.icsAlarm, FALSE}, { "icsAlarmTime", ArgInt, (void *) &appData.icsAlarmTime, TRUE, (ArgIniType) 5000}, { "localLineEditing", ArgBoolean, (void *) &appData.localLineEditing, FALSE, (ArgIniType) TRUE}, { "edit", ArgTrue, (void *) &appData.localLineEditing, FALSE, INVALID }, { "xedit", ArgFalse, (void *) &appData.localLineEditing, FALSE, INVALID }, { "-edit", ArgFalse, (void *) &appData.localLineEditing, FALSE, INVALID }, { "animateMoving", ArgBoolean, (void *) &appData.animate, TRUE, (ArgIniType) TRUE }, { "animate", ArgTrue, (void *) &appData.animate, FALSE, INVALID }, { "xanimate", ArgFalse, (void *) &appData.animate, FALSE, INVALID }, { "-animate", ArgFalse, (void *) &appData.animate, FALSE, INVALID }, { "animateSpeed", ArgInt, (void *) &appData.animSpeed, TRUE, (ArgIniType) 10 }, { "animateDragging", ArgBoolean, (void *) &appData.animateDragging, TRUE, (ArgIniType) TRUE }, { "drag", ArgTrue, (void *) &appData.animateDragging, FALSE, INVALID }, { "xdrag", ArgFalse, (void *) &appData.animateDragging, FALSE, INVALID }, { "-drag", ArgFalse, (void *) &appData.animateDragging, FALSE, INVALID }, { "blindfold", ArgBoolean, (void *) &appData.blindfold, TRUE, (ArgIniType) FALSE }, { "blind", ArgTrue, (void *) &appData.blindfold, FALSE, INVALID }, { "xblind", ArgFalse, (void *) &appData.blindfold, FALSE, INVALID }, { "-blind", ArgFalse, (void *) &appData.blindfold, FALSE, INVALID }, { "highlightLastMove", ArgBoolean, (void *) &appData.highlightLastMove, TRUE, (ArgIniType) TRUE }, { "highlight", ArgTrue, (void *) &appData.highlightLastMove, FALSE, INVALID }, { "xhighlight", ArgFalse, (void *) &appData.highlightLastMove, FALSE, INVALID }, { "-highlight", ArgFalse, (void *) &appData.highlightLastMove, FALSE, INVALID }, { "highlightDragging", ArgBoolean, (void *) &appData.highlightDragging, !XBOARD, (ArgIniType) TRUE }, { "highdrag", ArgTrue, (void *) &appData.highlightDragging, FALSE, INVALID }, { "xhighdrag", ArgFalse, (void *) &appData.highlightDragging, FALSE, INVALID }, { "-highdrag", ArgFalse, (void *) &appData.highlightDragging, FALSE, INVALID }, { "colorizeMessages", ArgBoolean, (void *) &appData.colorize, TRUE, (ArgIniType) TRUE }, { "colorize", ArgTrue, (void *) &appData.colorize, FALSE, INVALID }, { "xcolorize", ArgFalse, (void *) &appData.colorize, FALSE, INVALID }, { "-colorize", ArgFalse, (void *) &appData.colorize, FALSE, INVALID }, { "colorShout", ArgAttribs, (void *) ColorShout, TRUE, INVALID }, { "colorSShout", ArgAttribs, (void *) ColorSShout, TRUE, INVALID }, { "colorCShout", ArgAttribs, (void *) ColorSShout, FALSE, INVALID }, // for XB { "colorChannel1", ArgAttribs, (void *) ColorChannel1, TRUE, INVALID }, { "colorChannel", ArgAttribs, (void *) ColorChannel, TRUE, INVALID }, { "colorKibitz", ArgAttribs, (void *) ColorKibitz, TRUE, INVALID }, { "colorTell", ArgAttribs, (void *) ColorTell, TRUE, INVALID }, { "colorChallenge", ArgAttribs, (void *) ColorChallenge, TRUE, INVALID }, { "colorRequest", ArgAttribs, (void *) ColorRequest, TRUE, INVALID }, { "colorSeek", ArgAttribs, (void *) ColorSeek, TRUE, INVALID }, { "colorNormal", ArgAttribs, (void *) ColorNormal, TRUE, INVALID }, { "colorBackground", ArgColor, (void *) 7, TRUE, COLOR_BKGD }, { "soundShout", ArgFilename, (void *) &appData.soundShout, TRUE, (ArgIniType) "" }, { "soundSShout", ArgFilename, (void *) &appData.soundSShout, TRUE, (ArgIniType) "" }, { "soundCShout", ArgFilename, (void *) &appData.soundSShout, FALSE, (ArgIniType) "" }, // for XB { "soundChannel1", ArgFilename, (void *) &appData.soundChannel1, TRUE, (ArgIniType) "" }, { "soundChannel", ArgFilename, (void *) &appData.soundChannel, TRUE, (ArgIniType) "" }, { "soundKibitz", ArgFilename, (void *) &appData.soundKibitz, TRUE, (ArgIniType) "" }, { "soundTell", ArgFilename, (void *) &appData.soundTell, TRUE, (ArgIniType) "" }, { "soundChallenge", ArgFilename, (void *) &appData.soundChallenge, TRUE, (ArgIniType) "" }, { "soundRequest", ArgFilename, (void *) &appData.soundRequest, TRUE, (ArgIniType) "" }, { "soundSeek", ArgFilename, (void *) &appData.soundSeek, TRUE, (ArgIniType) "" }, { "soundMove", ArgFilename, (void *) &appData.soundMove, TRUE, (ArgIniType) "" }, { "soundBell", ArgFilename, (void *) &appData.soundBell, TRUE, (ArgIniType) SOUND_BELL }, { "soundIcsWin", ArgFilename, (void *) &appData.soundIcsWin, TRUE, (ArgIniType) "" }, { "soundIcsLoss", ArgFilename, (void *) &appData.soundIcsLoss, TRUE, (ArgIniType) "" }, { "soundIcsDraw", ArgFilename, (void *) &appData.soundIcsDraw, TRUE, (ArgIniType) "" }, { "soundIcsUnfinished", ArgFilename, (void *) &appData.soundIcsUnfinished, TRUE, (ArgIniType) "" }, { "soundIcsAlarm", ArgFilename, (void *) &appData.soundIcsAlarm, TRUE, (ArgIniType) "" }, { "disguisePromotedPieces", ArgBoolean, (void *) &appData.disguise, TRUE, (ArgIniType) TRUE }, { "reuseFirst", ArgBoolean, (void *) &appData.reuseFirst, FALSE, (ArgIniType) TRUE }, { "reuse", ArgTrue, (void *) &appData.reuseFirst, FALSE, INVALID }, { "xreuse", ArgFalse, (void *) &appData.reuseFirst, FALSE, INVALID }, { "-reuse", ArgFalse, (void *) &appData.reuseFirst, FALSE, INVALID }, { "reuseChessPrograms", ArgBoolean, (void *) &appData.reuseFirst, FALSE, INVALID }, /* backward compat only */ { "reuseSecond", ArgBoolean, (void *) &appData.reuseSecond, FALSE, (ArgIniType) TRUE }, { "reuse2", ArgTrue, (void *) &appData.reuseSecond, FALSE, INVALID }, { "xreuse2", ArgFalse, (void *) &appData.reuseSecond, FALSE, INVALID }, { "-reuse2", ArgFalse, (void *) &appData.reuseSecond, FALSE, INVALID }, { "comPortSettings", ArgCommSettings, (void *) /*&dcb*/ 0, TRUE, INVALID }, { "settingsFile", ArgSettingsFilename, (void *) &settingsFileName, FALSE, (ArgIniType) SETTINGS_FILE }, { "ini", ArgSettingsFilename, (void *) &settingsFileName, FALSE, INVALID }, { "at", ArgSettingsFilename, (void *) NULL, FALSE, INVALID }, { "opt", ArgSettingsFilename, (void *) NULL, FALSE, INVALID }, { "saveSettingsFile", ArgFilename, (void *) &settingsFileName, FALSE, INVALID }, { "backupSettingsFile", ArgBackupSettingsFile, (void *) &settingsFileName, FALSE, INVALID }, { "saveSettingsOnExit", ArgBoolean, (void *) &saveSettingsOnExit, TRUE, (ArgIniType) TRUE }, { "chessProgram", ArgBoolean, (void *) &chessProgram, FALSE, (ArgIniType) FALSE }, { "cp", ArgTrue, (void *) &chessProgram, FALSE, INVALID }, { "xcp", ArgFalse, (void *) &chessProgram, FALSE, INVALID }, { "-cp", ArgFalse, (void *) &chessProgram, FALSE, INVALID }, { "icsMenu", ArgString, (void *) &icsTextMenuString, TRUE, (ArgIniType) ICS_TEXT_MENU_DEFAULT }, { "icsNames", ArgString, (void *) &icsNames, TRUE, (ArgIniType) ICS_NAMES }, { "singleEngineList", ArgBoolean, (void *) &singleList, !XBOARD, (ArgIniType) FALSE }, { "recentEngines", ArgInt, (void *) &appData.recentEngines, TRUE, (ArgIniType) 6 }, { "recentEngineList", ArgString, (void *) &appData.recentEngineList, TRUE, (ArgIniType) "" }, { "firstChessProgramNames", ArgString, (void *) &firstChessProgramNames, TRUE, (ArgIniType) FCP_NAMES }, { "secondChessProgramNames", ArgString, (void *) &secondChessProgramNames, !XBOARD, (ArgIniType) SCP_NAMES }, { "themeNames", ArgString, (void *) &appData.themeNames, !XBOARD, (ArgIniType) "native -upf false -ub false -ubt false -pid \"\"\n" }, { "initialMode", ArgString, (void *) &appData.initialMode, FALSE, (ArgIniType) "" }, { "mode", ArgString, (void *) &appData.initialMode, FALSE, INVALID }, { "variant", ArgString, (void *) &appData.variant, FALSE, (ArgIniType) "normal" }, { "firstProtocolVersion", ArgInt, (void *) &appData.firstProtocolVersion, FALSE, (ArgIniType) PROTOVER }, { "secondProtocolVersion", ArgInt, (void *) &appData.secondProtocolVersion,FALSE, (ArgIniType) PROTOVER }, { "showButtonBar", ArgBoolean, (void *) &appData.showButtonBar, TRUE, (ArgIniType) TRUE }, { "buttons", ArgTrue, (void *) &appData.showButtonBar, FALSE, INVALID }, { "xbuttons", ArgFalse, (void *) &appData.showButtonBar, FALSE, INVALID }, { "-buttons", ArgFalse, (void *) &appData.showButtonBar, FALSE, INVALID }, /* [AS] New features */ { "firstScoreAbs", ArgBoolean, (void *) &appData.firstScoreIsAbsolute, FALSE, (ArgIniType) FALSE }, { "secondScoreAbs", ArgBoolean, (void *) &appData.secondScoreIsAbsolute, FALSE, (ArgIniType) FALSE }, { "pgnExtendedInfo", ArgBoolean, (void *) &appData.saveExtendedInfoInPGN, TRUE, (ArgIniType) FALSE }, { "hideThinkingFromHuman", ArgBoolean, (void *) &appData.hideThinkingFromHuman, TRUE, (ArgIniType) FALSE }, { "liteBackTextureFile", ArgFilename, (void *) &appData.liteBackTextureFile, TRUE, (ArgIniType) "" }, { "lbtf", ArgFilename, (void *) &appData.liteBackTextureFile, FALSE, INVALID }, { "darkBackTextureFile", ArgFilename, (void *) &appData.darkBackTextureFile, TRUE, (ArgIniType) "" }, { "dbtf", ArgFilename, (void *) &appData.darkBackTextureFile, FALSE, INVALID }, { "liteBackTextureMode", ArgInt, (void *) &appData.liteBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN }, { "lbtm", ArgInt, (void *) &appData.liteBackTextureMode, FALSE, INVALID }, { "darkBackTextureMode", ArgInt, (void *) &appData.darkBackTextureMode, TRUE, (ArgIniType) BACK_TEXTURE_MODE_PLAIN }, { "dbtm", ArgInt, (void *) &appData.darkBackTextureMode, FALSE, INVALID }, { "renderPiecesWithFont", ArgString, (void *) &appData.renderPiecesWithFont, TRUE, (ArgIniType) "" }, { "pf", ArgString, (void *) &appData.renderPiecesWithFont, FALSE, INVALID }, { "fontPieceToCharTable", ArgString, (void *) &appData.fontToPieceTable, TRUE, (ArgIniType) "" }, { "fptc", ArgString, (void *) &appData.fontToPieceTable, FALSE, INVALID }, { "fontPieceBackColorWhite", ArgColor, (void *) 8, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "fontPieceForeColorWhite", ArgColor, (void *) 9, TRUE, (ArgIniType) WHITE_PIECE_COLOR }, { "fontPieceBackColorBlack", ArgColor, (void *) 10, TRUE, (ArgIniType) BLACK_PIECE_COLOR }, { "fontPieceForeColorBlack", ArgColor, (void *) 11, TRUE, (ArgIniType) BLACK_PIECE_COLOR }, { "fpfcw", ArgColor, (void *) 9, FALSE, INVALID }, { "fpbcb", ArgColor, (void *) 10, FALSE, INVALID }, { "fontPieceSize", ArgInt, (void *) &appData.fontPieceSize, TRUE, (ArgIniType) 80 }, { "overrideLineGap", ArgInt, (void *) &appData.overrideLineGap, TRUE, (ArgIniType) 1 }, { "adjudicateLossThreshold", ArgInt, (void *) &appData.adjudicateLossThreshold, TRUE, (ArgIniType) 0 }, { "delayBeforeQuit", ArgInt, (void *) &appData.delayBeforeQuit, TRUE, (ArgIniType) 0 }, { "delayAfterQuit", ArgInt, (void *) &appData.delayAfterQuit, TRUE, (ArgIniType) 0 }, { "nameOfDebugFile", ArgFilename, (void *) &appData.nameOfDebugFile, FALSE, (ArgIniType) DEBUG_FILE }, { "debugfile", ArgFilename, (void *) &appData.nameOfDebugFile, FALSE, INVALID }, { "pgnEventHeader", ArgString, (void *) &appData.pgnEventHeader, TRUE, (ArgIniType) "Computer Chess Game" }, { "defaultFrcPosition", ArgInt, (void *) &appData.defaultFrcPosition, TRUE, (ArgIniType) -1 }, { "shuffleOpenings", ArgTrue, (void *) &shuffleOpenings, FALSE, INVALID }, { "gameListTags", ArgString, (void *) &appData.gameListTags, TRUE, (ArgIniType) GLT_DEFAULT_TAGS }, { "saveOutOfBookInfo", ArgBoolean, (void *) &appData.saveOutOfBookInfo, TRUE, (ArgIniType) TRUE }, { "showEvalInMoveHistory", ArgBoolean, (void *) &appData.showEvalInMoveHistory, TRUE, (ArgIniType) TRUE }, { "evalHistColorWhite", ArgColor, (void *) 12, TRUE, (ArgIniType) "#FFFFB0" }, { "evalHistColorBlack", ArgColor, (void *) 13, TRUE, (ArgIniType) "#AD5D3D" }, { "highlightMoveWithArrow", ArgBoolean, (void *) &appData.highlightMoveWithArrow, TRUE, (ArgIniType) FALSE }, { "highlightArrowColor", ArgColor, (void *) 14, TRUE, (ArgIniType) "#FFFF80" }, { "stickyWindows", ArgBoolean, (void *) &appData.useStickyWindows, TRUE, (ArgIniType) TRUE }, { "adjudicateDrawMoves", ArgInt, (void *) &appData.adjudicateDrawMoves, TRUE, (ArgIniType) 0 }, { "autoDisplayComment", ArgBoolean, (void *) &appData.autoDisplayComment, TRUE, (ArgIniType) TRUE }, { "autoDisplayTags", ArgBoolean, (void *) &appData.autoDisplayTags, TRUE, (ArgIniType) TRUE }, { "firstIsUCI", ArgBoolean, (void *) &appData.firstIsUCI, FALSE, (ArgIniType) FALSE }, { "fUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "firstUCI", ArgTrue, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "secondIsUCI", ArgBoolean, (void *) &appData.secondIsUCI, FALSE, (ArgIniType) FALSE }, { "secondUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "sUCI", ArgTrue, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "fUCCI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "sUCCI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "fUSI", ArgTwo, (void *) &appData.firstIsUCI, FALSE, INVALID }, { "sUSI", ArgTwo, (void *) &appData.secondIsUCI, FALSE, INVALID }, { "firstHasOwnBookUCI", ArgBoolean, (void *) &appData.firstHasOwnBookUCI, FALSE, (ArgIniType) TRUE }, { "fNoOwnBookUCI", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, { "firstXBook", ArgFalse, (void *) &appData.firstHasOwnBookUCI, FALSE, INVALID }, { "secondHasOwnBookUCI", ArgBoolean, (void *) &appData.secondHasOwnBookUCI, FALSE, (ArgIniType) TRUE }, { "sNoOwnBookUCI", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, { "secondXBook", ArgFalse, (void *) &appData.secondHasOwnBookUCI, FALSE, INVALID }, { "adapterCommand", ArgFilename, (void *) &appData.adapterCommand, TRUE, (ArgIniType) "polyglot -noini -ec \"%fcp\" -ed \"%fd\"" }, { "uxiAdapter", ArgFilename, (void *) &appData.ucciAdapter, TRUE, (ArgIniType) "" }, { "polyglotDir", ArgFilename, (void *) &appData.polyglotDir, TRUE, (ArgIniType) "" }, { "usePolyglotBook", ArgBoolean, (void *) &appData.usePolyglotBook, TRUE, (ArgIniType) FALSE }, { "polyglotBook", ArgFilename, (void *) &appData.polyglotBook, TRUE, (ArgIniType) "" }, { "bookDepth", ArgInt, (void *) &appData.bookDepth, TRUE, (ArgIniType) 12 }, { "bookVariation", ArgInt, (void *) &appData.bookStrength, TRUE, (ArgIniType) 50 }, { "discourageOwnBooks", ArgBoolean, (void *) &appData.defNoBook, TRUE, (ArgIniType) FALSE }, { "mcBookMode", ArgTrue, (void *) &mcMode, FALSE, (ArgIniType) FALSE }, { "defaultHashSize", ArgInt, (void *) &appData.defaultHashSize, TRUE, (ArgIniType) 64 }, { "defaultCacheSizeEGTB", ArgInt, (void *) &appData.defaultCacheSizeEGTB, TRUE, (ArgIniType) 4 }, { "defaultPathEGTB", ArgFilename, (void *) &appData.defaultPathEGTB, TRUE, (ArgIniType) "c:\\egtb" }, { "language", ArgFilename, (void *) &appData.language, TRUE, (ArgIniType) "" }, { "userFileDirectory", ArgFilename, (void *) &homeDir, FALSE, (ArgIniType) installDir }, { "usePieceFont", ArgBoolean, (void *) &appData.useFont, TRUE, (ArgIniType) FALSE }, { "upf", ArgBoolean, (void *) &appData.useFont, FALSE, INVALID }, { "useBoardTexture", ArgBoolean, (void *) &appData.useBitmaps, TRUE, (ArgIniType) FALSE }, { "ubt", ArgBoolean, (void *) &appData.useBitmaps, FALSE, INVALID }, { "useBorder", ArgBoolean, (void *) &appData.useBorder, TRUE, (ArgIniType) FALSE }, { "ub", ArgBoolean, (void *) &appData.useBorder, FALSE, INVALID }, { "border", ArgFilename, (void *) &appData.border, TRUE, (ArgIniType) "" }, // [HGM] tournament options { "tourneyFile", ArgFilename, (void *) &appData.tourneyFile, FALSE, (ArgIniType) "" }, { "tf", ArgFilename, (void *) &appData.tourneyFile, FALSE, INVALID }, { "participants", ArgString, (void *) &appData.participants, FALSE, (ArgIniType) "" }, { "tourneyType", ArgInt, (void *) &appData.tourneyType, FALSE, (ArgIniType) 0 }, { "tt", ArgInt, (void *) &appData.tourneyType, FALSE, INVALID }, { "tourneyCycles", ArgInt, (void *) &appData.tourneyCycles, FALSE, (ArgIniType) 1 }, { "cy", ArgInt, (void *) &appData.tourneyCycles, FALSE, INVALID }, { "results", ArgString, (void *) &appData.results, FALSE, (ArgIniType) "" }, { "syncAfterRound", ArgBoolean, (void *) &appData.roundSync, FALSE, (ArgIniType) FALSE }, { "syncAfterCycle", ArgBoolean, (void *) &appData.cycleSync, FALSE, (ArgIniType) TRUE }, { "seedBase", ArgInt, (void *) &appData.seedBase, FALSE, (ArgIniType) 1 }, { "pgnNumberTag", ArgBoolean, (void *) &appData.numberTag, TRUE, (ArgIniType) FALSE }, { "afterGame", ArgString, (void *) &appData.afterGame, FALSE, INVALID }, { "afterTourney", ArgString, (void *) &appData.afterTourney, FALSE, INVALID }, /* [HGM] board-size, adjudication and misc. options */ { "oneClickMove", ArgBoolean, (void *) &appData.oneClick, TRUE, (ArgIniType) FALSE }, { "boardWidth", ArgInt, (void *) &appData.NrFiles, FALSE, (ArgIniType) -1 }, { "boardHeight", ArgInt, (void *) &appData.NrRanks, FALSE, (ArgIniType) -1 }, { "holdingsSize", ArgInt, (void *) &appData.holdingsSize, FALSE, (ArgIniType) -1 }, { "defaultMatchGames", ArgInt, (void *) &appData.defaultMatchGames, TRUE, (ArgIniType) 10 }, { "matchPause", ArgInt, (void *) &appData.matchPause, TRUE, (ArgIniType) 10000 }, { "pieceToCharTable", ArgString, (void *) &appData.pieceToCharTable, FALSE, INVALID }, { "pieceNickNames", ArgString, (void *) &appData.pieceNickNames, FALSE, INVALID }, { "colorNickNames", ArgString, (void *) &appData.colorNickNames, FALSE, INVALID }, { "flipBlack", ArgBoolean, (void *) &appData.upsideDown, FALSE, (ArgIniType) FALSE }, { "allWhite", ArgBoolean, (void *) &appData.allWhite, FALSE, (ArgIniType) FALSE }, { "alphaRank", ArgBoolean, (void *) &appData.alphaRank, FALSE, (ArgIniType) FALSE }, { "firstAlphaRank", ArgBoolean, (void *) &first.alphaRank, FALSE, (ArgIniType) FALSE }, { "secondAlphaRank", ArgBoolean, (void *) &second.alphaRank, FALSE, (ArgIniType) FALSE }, { "testClaims", ArgBoolean, (void *) &appData.testClaims, TRUE, (ArgIniType) FALSE }, { "checkMates", ArgBoolean, (void *) &appData.checkMates, TRUE, (ArgIniType) FALSE }, { "materialDraws", ArgBoolean, (void *) &appData.materialDraws, TRUE, (ArgIniType) FALSE }, { "trivialDraws", ArgBoolean, (void *) &appData.trivialDraws, TRUE, (ArgIniType) FALSE }, { "ruleMoves", ArgInt, (void *) &appData.ruleMoves, TRUE, (ArgIniType) 51 }, { "repeatsToDraw", ArgInt, (void *) &appData.drawRepeats, TRUE, (ArgIniType) 6 }, { "backgroundObserve", ArgBoolean, (void *) &appData.bgObserve, TRUE, (ArgIniType) FALSE }, { "dualBoard", ArgBoolean, (void *) &appData.dualBoard, TRUE, (ArgIniType) FALSE }, { "autoKibitz", ArgTrue, (void *) &appData.autoKibitz, FALSE, INVALID }, { "engineDebugOutput", ArgInt, (void *) &appData.engineComments, FALSE, (ArgIniType) 1 }, { "userName", ArgString, (void *) &appData.userName, FALSE, INVALID }, { "rewindIndex", ArgInt, (void *) &appData.rewindIndex, FALSE, INVALID }, { "sameColorGames", ArgInt, (void *) &appData.sameColorGames, FALSE, INVALID }, { "smpCores", ArgInt, (void *) &appData.smpCores, TRUE, (ArgIniType) 1 }, { "egtFormats", ArgString, (void *) &appData.egtFormats, TRUE, (ArgIniType) "" }, { "niceEngines", ArgInt, (void *) &appData.niceEngines, TRUE, INVALID }, { "logoSize", ArgInt, (void *) &appData.logoSize, XBOARD, INVALID }, { "logoDir", ArgFilename, (void *) &appData.logoDir, XBOARD, (ArgIniType) "." }, { "firstLogo", ArgFilename, (void *) &appData.firstLogo, FALSE, (ArgIniType) "" }, { "secondLogo", ArgFilename, (void *) &appData.secondLogo, FALSE, (ArgIniType) "" }, { "autoLogo", ArgBoolean, (void *) &appData.autoLogo, TRUE, INVALID }, { "firstOptions", ArgString, (void *) &appData.firstOptions, FALSE, (ArgIniType) "" }, { "secondOptions", ArgString, (void *) &appData.secondOptions, FALSE, (ArgIniType) "" }, { "firstFeatures", ArgString, (void *) &appData.features[0], FALSE, (ArgIniType) "" }, { "secondFeatures", ArgString, (void *) &appData.features[1], FALSE, (ArgIniType) "" }, { "featureDefaults", ArgString, (void *) &appData.featureDefaults, TRUE, (ArgIniType) "" }, { "firstNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride1, FALSE, (ArgIniType) NULL }, { "secondNeedsNoncompliantFEN", ArgString, (void *) &appData.fenOverride2, FALSE, (ArgIniType) NULL }, { "keepAlive", ArgInt, (void *) &appData.keepAlive, FALSE, INVALID }, { "icstype", ArgInt, (void *) &ics_type, FALSE, INVALID }, { "forceIllegalMoves", ArgTrue, (void *) &appData.forceIllegal, FALSE, INVALID }, { "showTargetSquares", ArgBoolean, (void *) &appData.markers, TRUE, (ArgIniType) FALSE }, { "firstPgnName", ArgString, (void *) &appData.pgnName[0], FALSE, (ArgIniType) "" }, { "fn", ArgString, (void *) &appData.pgnName[0], FALSE, INVALID }, { "secondPgnName", ArgString, (void *) &appData.pgnName[1], FALSE, (ArgIniType) "" }, { "sn", ArgString, (void *) &appData.pgnName[1], FALSE, INVALID }, { "absoluteAnalysisScores", ArgBoolean, (void *) &appData.whitePOV, TRUE, FALSE }, { "scoreWhite", ArgBoolean, (void *) &appData.scoreWhite, TRUE, FALSE }, { "evalZoom", ArgInt, (void *) &appData.zoom, TRUE, (ArgIniType) 1 }, { "evalThreshold", ArgInt, (void *) &appData.evalThreshold, TRUE, (ArgIniType) 25 }, { "fSAN", ArgTrue, (void *) &appData.pvSAN[0], FALSE, FALSE }, { "sSAN", ArgTrue, (void *) &appData.pvSAN[1], FALSE, FALSE }, { "pairingEngine", ArgFilename, (void *) &appData.pairingEngine, TRUE, "" }, { "defaultTourneyName", ArgFilename, (void *) &appData.defName, TRUE, "" }, { "eloThresholdAny", ArgInt, (void *) &appData.eloThreshold1, FALSE, (ArgIniType) 0 }, { "eloThresholdBoth", ArgInt, (void *) &appData.eloThreshold2, FALSE, (ArgIniType) 0 }, { "dateThreshold", ArgInt, (void *) &appData.dateThreshold, FALSE, (ArgIniType) 0 }, { "searchMode", ArgInt, (void *) &appData.searchMode, FALSE, (ArgIniType) 1 }, { "stretch", ArgInt, (void *) &appData.stretch, FALSE, (ArgIniType) 1 }, { "ignoreColors", ArgBoolean, (void *) &appData.ignoreColors, FALSE, FALSE }, { "findMirrorImage", ArgBoolean, (void *) &appData.findMirror, FALSE, FALSE }, { "viewer", ArgTrue, (void *) &appData.viewer, FALSE, FALSE }, { "viewerOptions", ArgString, (void *) &appData.viewerOptions, TRUE, (ArgIniType) "-ncp -engineOutputUp false -saveSettingsOnExit false" }, { "tourneyOptions", ArgString, (void *) &appData.tourneyOptions, TRUE, (ArgIniType) "-ncp -mm -saveSettingsOnExit false" }, { "autoCopyPV", ArgBoolean, (void *) &appData.autoCopyPV, TRUE, FALSE }, { "topLevel", ArgBoolean, (void *) &appData.topLevel, XBOARD, (ArgIniType) TOPLEVEL }, { "dialogColor", ArgString, (void *) &appData.dialogColor, XBOARD, (ArgIniType) "" }, { "buttonColor", ArgString, (void *) &appData.buttonColor, XBOARD, (ArgIniType) "" }, #if ZIPPY { "zippyTalk", ArgBoolean, (void *) &appData.zippyTalk, FALSE, (ArgIniType) ZIPPY_TALK }, { "zt", ArgTrue, (void *) &appData.zippyTalk, FALSE, INVALID }, { "xzt", ArgFalse, (void *) &appData.zippyTalk, FALSE, INVALID }, { "-zt", ArgFalse, (void *) &appData.zippyTalk, FALSE, INVALID }, { "zippyPlay", ArgBoolean, (void *) &appData.zippyPlay, FALSE, (ArgIniType) ZIPPY_PLAY }, { "zp", ArgTrue, (void *) &appData.zippyPlay, FALSE, INVALID }, { "xzp", ArgFalse, (void *) &appData.zippyPlay, FALSE, INVALID }, { "-zp", ArgFalse, (void *) &appData.zippyPlay, FALSE, INVALID }, { "zippyLines", ArgFilename, (void *) &appData.zippyLines, FALSE, (ArgIniType) ZIPPY_LINES }, { "zippyPinhead", ArgString, (void *) &appData.zippyPinhead, FALSE, (ArgIniType) ZIPPY_PINHEAD }, { "zippyPassword", ArgString, (void *) &appData.zippyPassword, FALSE, (ArgIniType) ZIPPY_PASSWORD }, { "zippyPassword2", ArgString, (void *) &appData.zippyPassword2, FALSE, (ArgIniType) ZIPPY_PASSWORD2 }, { "zippyWrongPassword", ArgString, (void *) &appData.zippyWrongPassword, FALSE, (ArgIniType) ZIPPY_WRONG_PASSWORD }, { "zippyAcceptOnly", ArgString, (void *) &appData.zippyAcceptOnly, FALSE, (ArgIniType) ZIPPY_ACCEPT_ONLY }, { "zippyUseI", ArgBoolean, (void *) &appData.zippyUseI, FALSE, (ArgIniType) ZIPPY_USE_I }, { "zui", ArgTrue, (void *) &appData.zippyUseI, FALSE, INVALID }, { "xzui", ArgFalse, (void *) &appData.zippyUseI, FALSE, INVALID }, { "-zui", ArgFalse, (void *) &appData.zippyUseI, FALSE, INVALID }, { "zippyBughouse", ArgInt, (void *) &appData.zippyBughouse, FALSE, (ArgIniType) ZIPPY_BUGHOUSE }, { "zippyNoplayCrafty", ArgBoolean, (void *) &appData.zippyNoplayCrafty, FALSE, (ArgIniType) ZIPPY_NOPLAY_CRAFTY }, { "znc", ArgTrue, (void *) &appData.zippyNoplayCrafty, FALSE, INVALID }, { "xznc", ArgFalse, (void *) &appData.zippyNoplayCrafty, FALSE, INVALID }, { "-znc", ArgFalse, (void *) &appData.zippyNoplayCrafty, FALSE, INVALID }, { "zippyGameEnd", ArgString, (void *) &appData.zippyGameEnd, FALSE, (ArgIniType) ZIPPY_GAME_END }, { "zippyGameStart", ArgString, (void *) &appData.zippyGameStart, FALSE, (ArgIniType) ZIPPY_GAME_START }, { "zippyAdjourn", ArgBoolean, (void *) &appData.zippyAdjourn, FALSE, (ArgIniType) ZIPPY_ADJOURN }, { "zadj", ArgTrue, (void *) &appData.zippyAdjourn, FALSE, INVALID }, { "xzadj", ArgFalse, (void *) &appData.zippyAdjourn, FALSE, INVALID }, { "-zadj", ArgFalse, (void *) &appData.zippyAdjourn, FALSE, INVALID }, { "zippyAbort", ArgBoolean, (void *) &appData.zippyAbort, FALSE, (ArgIniType) ZIPPY_ABORT }, { "zab", ArgTrue, (void *) &appData.zippyAbort, FALSE, INVALID }, { "xzab", ArgFalse, (void *) &appData.zippyAbort, FALSE, INVALID }, { "-zab", ArgFalse, (void *) &appData.zippyAbort, FALSE, INVALID }, { "zippyVariants", ArgString, (void *) &appData.zippyVariants, FALSE, (ArgIniType) ZIPPY_VARIANTS }, { "zippyMaxGames", ArgInt, (void *)&appData.zippyMaxGames, FALSE, (ArgIniType) ZIPPY_MAX_GAMES}, { "zippyReplayTimeout", ArgInt, (void *)&appData.zippyReplayTimeout, FALSE, (ArgIniType) ZIPPY_REPLAY_TIMEOUT }, { "zippyShortGame", ArgInt, (void *)&appData.zippyShortGame, FALSE, INVALID }, /* Kludge to allow winboard.ini files from buggy 4.0.4 to be read: */ { "zippyReplyTimeout", ArgInt, (void *)&junk, FALSE, INVALID }, #endif /* [HGM] options for broadcasting and time odds */ { "chatBoxes", ArgString, (void *) &appData.chatBoxes, !XBOARD, (ArgIniType) NULL }, { "serverMoves", ArgString, (void *) &appData.serverMovesName, FALSE, (ArgIniType) NULL }, { "serverFile", ArgString, (void *) &appData.serverFileName, FALSE, (ArgIniType) NULL }, { "suppressLoadMoves", ArgBoolean, (void *) &appData.suppressLoadMoves, FALSE, (ArgIniType) FALSE }, { "serverPause", ArgInt, (void *) &appData.serverPause, FALSE, (ArgIniType) 15 }, { "firstTimeOdds", ArgInt, (void *) &appData.firstTimeOdds, FALSE, (ArgIniType) 1 }, { "secondTimeOdds", ArgInt, (void *) &appData.secondTimeOdds, FALSE, (ArgIniType) 1 }, { "timeOddsMode", ArgInt, (void *) &appData.timeOddsMode, TRUE, INVALID }, { "firstAccumulateTC", ArgInt, (void *) &appData.firstAccumulateTC, FALSE, (ArgIniType) 1 }, { "secondAccumulateTC", ArgInt, (void *) &appData.secondAccumulateTC, FALSE, (ArgIniType) 1 }, { "firstNPS", ArgInt, (void *) &appData.firstNPS, FALSE, (ArgIniType) -1 }, { "secondNPS", ArgInt, (void *) &appData.secondNPS, FALSE, (ArgIniType) -1 }, { "noGUI", ArgTrue, (void *) &appData.noGUI, FALSE, INVALID }, { "keepLineBreaksICS", ArgBoolean, (void *) &appData.noJoin, TRUE, INVALID }, { "wrapContinuationSequence", ArgString, (void *) &appData.wrapContSeq, FALSE, INVALID }, { "useInternalWrap", ArgTrue, (void *) &appData.useInternalWrap, FALSE, INVALID }, /* noJoin usurps this if set */ { "openCommand", ArgString, (void *) &appData.sysOpen, FALSE, "xdg-open" }, // [HGM] placement: put all window layouts last in ini file, but man X,Y before all others { "minX", ArgZ, (void *) &minX, FALSE, INVALID }, // [HGM] placement: to make sure auxiliary windows can be placed { "minY", ArgZ, (void *) &minY, FALSE, INVALID }, { "winWidth", ArgInt, (void *) &wpMain.width, TRUE, INVALID }, // [HGM] placement: dummies to remember right & bottom { "winHeight", ArgInt, (void *) &wpMain.height, TRUE, INVALID }, // for attaching auxiliary windows to them { "x", ArgInt, (void *) &wpMain.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "y", ArgInt, (void *) &wpMain.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "icsX", ArgX, (void *) &wpConsole.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "icsY", ArgY, (void *) &wpConsole.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "icsW", ArgInt, (void *) &wpConsole.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "icsH", ArgInt, (void *) &wpConsole.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { "commentX", ArgX, (void *) &wpComment.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "commentY", ArgY, (void *) &wpComment.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "commentW", ArgInt, (void *) &wpComment.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "commentH", ArgInt, (void *) &wpComment.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { "tagsX", ArgX, (void *) &wpTags.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "tagsY", ArgY, (void *) &wpTags.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "tagsW", ArgInt, (void *) &wpTags.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "tagsH", ArgInt, (void *) &wpTags.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListX", ArgX, (void *) &wpGameList.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListY", ArgY, (void *) &wpGameList.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListW", ArgInt, (void *) &wpGameList.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "gameListH", ArgInt, (void *) &wpGameList.height, TRUE, (ArgIniType) CW_USEDEFAULT }, #if XBOARD { "slaveX", ArgX, (void *) &wpDualBoard.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "slaveY", ArgY, (void *) &wpDualBoard.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "slaveW", ArgInt, (void *) &wpDualBoard.width, FALSE, (ArgIniType) CW_USEDEFAULT }, { "slaveH", ArgInt, (void *) &wpDualBoard.height, FALSE, (ArgIniType) CW_USEDEFAULT }, #endif /* [AS] Layout stuff */ { "moveHistoryUp", ArgBoolean, (void *) &wpMoveHistory.visible, TRUE, (ArgIniType) TRUE }, { "moveHistoryX", ArgX, (void *) &wpMoveHistory.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "moveHistoryY", ArgY, (void *) &wpMoveHistory.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "moveHistoryW", ArgInt, (void *) &wpMoveHistory.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "moveHistoryH", ArgInt, (void *) &wpMoveHistory.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { "evalGraphUp", ArgBoolean, (void *) &wpEvalGraph.visible, TRUE, (ArgIniType) TRUE }, { "evalGraphX", ArgX, (void *) &wpEvalGraph.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "evalGraphY", ArgY, (void *) &wpEvalGraph.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "evalGraphW", ArgInt, (void *) &wpEvalGraph.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "evalGraphH", ArgInt, (void *) &wpEvalGraph.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { "engineOutputUp", ArgBoolean, (void *) &wpEngineOutput.visible, TRUE, (ArgIniType) TRUE }, { "engineOutputX", ArgX, (void *) &wpEngineOutput.x, TRUE, (ArgIniType) CW_USEDEFAULT }, { "engineOutputY", ArgY, (void *) &wpEngineOutput.y, TRUE, (ArgIniType) CW_USEDEFAULT }, { "engineOutputW", ArgInt, (void *) &wpEngineOutput.width, TRUE, (ArgIniType) CW_USEDEFAULT }, { "engineOutputH", ArgInt, (void *) &wpEngineOutput.height, TRUE, (ArgIniType) CW_USEDEFAULT }, { NULL, ArgNone, NULL, FALSE, INVALID } }; /* Kludge for indirection files on command line */ char* lastIndirectionFilename; ArgDescriptor argDescriptorIndirection = { "", ArgSettingsFilename, (void *) NULL, FALSE }; void ExitArgError(char *msg, char *badArg, Boolean quit) { char buf[MSG_SIZ]; int len; len = snprintf(buf, MSG_SIZ, msg, badArg); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "ExitArgError: buffer truncated. Input: msg=%s badArg=%s\n", msg, badArg); if(!quit) { printf(_("%s in settings file\n"), buf); return; } // DisplayError does not work yet at this stage... DisplayFatalError(buf, 0, 2); exit(2); } int ValidateInt(char *s) { char *p = s; if(*p == '-' || *p == '+') p++; while(*p) if(!isdigit(*p++)) ExitArgError(_("Bad integer value %s"), s, TRUE); return atoi(s); } char StringGet(void *getClosure) { char **p = (char **) getClosure; return *((*p)++); } char FileGet(void *getClosure) { int c; FILE* f = (FILE*) getClosure; c = getc(f); if (c == '\r') c = getc(f); // work around DOS format files by bypassing the '\r' completely if (c == EOF) return NULLCHAR; else return (char) c; } /* Parse settings file named "name". If file found, return the full name in fullname and return TRUE; else return FALSE */ Boolean ParseSettingsFile(char *name, char **addr) { FILE *f; int ok,len; char buf[MSG_SIZ], fullname[MSG_SIZ]; ok = MySearchPath(installDir, name, fullname); if(!ok && strchr(name, '.') == NULL) { // append default file-name extension '.ini' when needed len = snprintf(buf,MSG_SIZ, "%s.ini", name); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "ParseSettingsFile: buffer truncated. Input: name=%s \n",name); ok = MySearchPath(installDir, buf, fullname); } if (ok) { f = fopen(fullname, "r"); if (f != NULL) { if (addr != NULL) { ASSIGN(*addr, fullname); } ParseArgs(FileGet, f); fclose(f); return TRUE; } } return FALSE; } void ParseArgs(GetFunc get, void *cl) { char argName[MAX_ARG_LEN]; char argValue[MAX_ARG_LEN]; ArgDescriptor *ad; char start; char *q; int i, octval; char ch; int posarg = 4; // default is game file ch = get(cl); for (;;) { int posflag = 0; while (ch == ' ' || ch == '\n' || ch == '\t') ch = get(cl); if (ch == NULLCHAR) break; if (ch == ';') { /* Comment to end of line */ ch = get(cl); while (ch != '\n' && ch != NULLCHAR) ch = get(cl); continue; } else if (ch == SLASH || ch == '-') { /* Switch */ q = argName; while (ch != ' ' && ch != '=' && ch != ':' && ch != NULLCHAR && ch != '\n' && ch != '\t') { *q++ = ch; ch = get(cl); } *q = NULLCHAR; for (ad = argDescriptors; ad->argName != NULL; ad++) if (strcmp(ad->argName, argName + 1) == 0) break; if (ad->argName == NULL) { char endChar = (ch && ch != '\n' && (ch = get(cl)) == '{' ? '}' : '\n'); ExitArgError(_("Unrecognized argument %s"), argName, get != &FileGet); // [HGM] make unknown argument non-fatal while (ch != endChar && ch != NULLCHAR) ch = get(cl); // but skip rest of line it is on (or until closing '}' ) if(ch == '}') ch = get(cl); continue; // so that when it is in a settings file, it is the only setting that will be purged from it } } else if (ch == '@') { /* Indirection file */ ad = &argDescriptorIndirection; ch = get(cl); } else { /* Positional argument */ ad = &argDescriptors[posarg++]; posflag++; strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0])); } if (ad->argType == ArgTwo) { // [HGM] kludgey arg type, not suitable for saving *(Boolean *) ad->argLoc = 2; continue; } if (ad->argType == ArgTrue) { *(Boolean *) ad->argLoc = TRUE; continue; } if (ad->argType == ArgFalse) { *(Boolean *) ad->argLoc = FALSE; continue; } while (ch == ' ' || ch == '=' || ch == ':' || ch == '\t') ch = get(cl); if (ch == NULLCHAR || ch == '\n') { ExitArgError(_("No value provided for argument %s"), argName, TRUE); } q = argValue; if (ch == '{') { // Quoting with { }. No characters have to (or can) be escaped. // Thus the string cannot contain a '}' character. start = ch; ch = get(cl); while (start) { switch (ch) { case NULLCHAR: start = NULLCHAR; break; case '}': ch = get(cl); start = NULLCHAR; break; default: *q++ = ch; ch = get(cl); break; } } } else if (ch == '\'' || ch == '"') { // Quoting with ' ' or " ", with \ as escape character. // Inconvenient for long strings that may contain Windows filenames. start = ch; ch = get(cl); while (start) { switch (ch) { case NULLCHAR: start = NULLCHAR; break; default: not_special: *q++ = ch; ch = get(cl); break; case '\'': case '\"': if (ch == start) { ch = get(cl); start = NULLCHAR; break; } else { goto not_special; } case '\\': if (ad->argType == ArgFilename || ad->argType == ArgSettingsFilename) { goto not_special; } ch = get(cl); switch (ch) { case NULLCHAR: ExitArgError(_("Incomplete \\ escape in value for %s"), argName, TRUE); break; case 'n': *q++ = '\n'; ch = get(cl); break; case 'r': *q++ = '\r'; ch = get(cl); break; case 't': *q++ = '\t'; ch = get(cl); break; case 'b': *q++ = '\b'; ch = get(cl); break; case 'f': *q++ = '\f'; ch = get(cl); break; default: octval = 0; for (i = 0; i < 3; i++) { if (ch >= '0' && ch <= '7') { octval = octval*8 + (ch - '0'); ch = get(cl); } else { break; } } if (i > 0) { *q++ = (char) octval; } else { *q++ = ch; ch = get(cl); } break; } break; } } } else { while ((ch != ' ' || posflag) && ch != NULLCHAR && ch != '\t' && ch != '\n') { // space allowed in positional arg *q++ = ch; ch = get(cl); } } *q = NULLCHAR; if(posflag) { // positional argument: the argName was implied, and per default set as -lgf int len = strlen(argValue) - 4; // start of filename extension if(len < 0) len = 0; if(!strcasecmp(argValue + len, ".trn")) { ad = &argDescriptors[2]; // correct implied type to -tf appData.tourney = TRUE; // let it parse -tourneyOptions later } else if(!strcasecmp(argValue + len, ".fen") || !strcasecmp(argValue + len, ".epd")) { ad = &argDescriptors[1]; // correct implied type to -lpf appData.viewer = TRUE; } else if(!strcasecmp(argValue + len, ".ini") || !strcasecmp(argValue + len, ".xop")) { ad = &argDescriptors[0]; // correct implied type to -opt } else if(GetEngineLine(argValue, 11)) { ad = &argDescriptors[3]; // correct implied type to -is } else { // keep default -lgf, but let it imply viewer mode as well appData.viewer = TRUE; } strncpy(argName, ad->argName,sizeof(argName)/sizeof(argName[0])); } switch (ad->argType) { case ArgInt: *(int *) ad->argLoc = ValidateInt(argValue); break; case ArgX: *(int *) ad->argLoc = ValidateInt(argValue) + wpMain.x; // [HGM] placement: translate stored relative to absolute break; case ArgY: *(int *) ad->argLoc = ValidateInt(argValue) + wpMain.y; // (this is really kludgey, it should be done where used...) break; case ArgZ: *(int *) ad->argLoc = ValidateInt(argValue); EnsureOnScreen(&wpMain.x, &wpMain.y, minX, minY); break; case ArgFloat: *(float *) ad->argLoc = (float) atof(argValue); break; case ArgString: case ArgFilename: if(argValue[0] == '~' && argValue[1] == '~') { char buf[4*MSG_SIZ]; // expand ~~ snprintf(buf, 4*MSG_SIZ, "%s%s", DATADIR, argValue+2); ASSIGN(*(char **) ad->argLoc, buf); break; } ASSIGN(*(char **) ad->argLoc, argValue); break; case ArgBackupSettingsFile: // no-op if non-default settings-file already successfully read if(strcmp(*(char**)ad->argLoc, SETTINGS_FILE)) break; case ArgSettingsFilename: { if (ParseSettingsFile(argValue, (char**)ad->argLoc)) { } else { if (ad->argLoc != NULL) { } else { ExitArgError(_("Failed to open indirection file %s"), argValue, TRUE); } } } break; case ArgBoolean: switch (argValue[0]) { case 't': case 'T': *(Boolean *) ad->argLoc = TRUE; break; case 'f': case 'F': *(Boolean *) ad->argLoc = FALSE; break; default: ExitArgError(_("Unrecognized boolean argument value %s"), argValue, TRUE); break; } break; case ArgColor: ParseColor((int)(intptr_t)ad->argLoc, argValue); break; case ArgAttribs: { ColorClass cc = (ColorClass)ad->argLoc; ParseTextAttribs(cc, argValue); // [HGM] wrapper for platform independency } break; case ArgBoardSize: ParseBoardSize(ad->argLoc, argValue); break; case ArgFont: ParseFont(argValue, (int)(intptr_t)ad->argLoc); break; case ArgCommSettings: ParseCommPortSettings(argValue); break; case ArgNone: ExitArgError(_("Unrecognized argument %s"), argValue, TRUE); break; case ArgTwo: case ArgTrue: case ArgFalse: ; } } } void ParseArgsFromString(char *p) { ParseArgs(StringGet, &p); } void ParseArgsFromFile(FILE *f) { ParseArgs(FileGet, f); } void ParseIcsTextMenu(char *icsTextMenuString) { // int flags = 0; IcsTextMenuEntry *e = icsTextMenuEntry; char *p = icsTextMenuString; while (e->item != NULL && e < icsTextMenuEntry + ICS_TEXT_MENU_SIZE) { free(e->item); e->item = NULL; if (e->command != NULL) { free(e->command); e->command = NULL; } e++; } e = icsTextMenuEntry; while (*p && e < icsTextMenuEntry + ICS_TEXT_MENU_SIZE) { if (*p == ';' || *p == '\n') { e->item = strdup("-"); e->command = NULL; p++; } else if (*p == '-') { e->item = strdup("-"); e->command = NULL; p++; if (*p) p++; } else { char *q, *r, *s, *t; char c; q = strchr(p, ','); if (q == NULL) break; *q = NULLCHAR; r = strchr(q + 1, ','); if (r == NULL) break; *r = NULLCHAR; s = strchr(r + 1, ','); if (s == NULL) break; *s = NULLCHAR; c = ';'; t = strchr(s + 1, c); if (t == NULL) { c = '\n'; t = strchr(s + 1, c); } if (t != NULL) *t = NULLCHAR; e->item = strdup(p); e->command = strdup(q + 1); e->getname = *(r + 1) != '0'; e->immediate = *(s + 1) != '0'; *q = ','; *r = ','; *s = ','; if (t == NULL) break; *t = c; p = t + 1; } e++; } } void SetDefaultTextAttribs() { ColorClass cc; for (cc = (ColorClass)0; cc < ColorNone; cc++) { ParseTextAttribs(cc, defaultTextAttribs[cc]); } } void SetDefaultsFromList() { // [HGM] ini: take defaults from argDescriptor list int i; for(i=0; argDescriptors[i].argName != NULL; i++) { if(argDescriptors[i].defaultValue != INVALID) switch(argDescriptors[i].argType) { case ArgBoolean: case ArgTwo: case ArgTrue: case ArgFalse: *(Boolean *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgInt: case ArgX: case ArgY: case ArgZ: *(int *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgString: case ArgFilename: case ArgSettingsFilename: if((char *)argDescriptors[i].defaultValue) *(char **) argDescriptors[i].argLoc = strdup((char *)argDescriptors[i].defaultValue); break; case ArgBoardSize: *(int *) argDescriptors[i].argLoc = (int)(intptr_t)argDescriptors[i].defaultValue; break; case ArgColor: ParseColor((int)(intptr_t)argDescriptors[i].argLoc, (char*)argDescriptors[i].defaultValue); break; case ArgFloat: // floats cannot be casted to int without precision loss default: ; // some arg types cannot be initialized through table } } } void InitAppData(char *lpCmdLine) { int i; char buf[MAX_ARG_LEN], currDir[MSG_SIZ]; char *p; /* Initialize to defaults */ SetDefaultsFromList(); // this sets most defaults // some parameters for which there are no options! appData.Iconic = FALSE; /*unused*/ appData.icsEngineAnalyze = FALSE; // float: casting to int is not harmless, so default cannot be contained in table appData.timeDelay = TIME_DELAY; appData.timeIncrement = -314159; // some complex, platform-dependent stuff that could not be handled from table SetDefaultTextAttribs(); SetFontDefaults(); SetCommPortDefaults(); /* Parse default settings file if any */ ParseSettingsFile(settingsFileName, &settingsFileName); /* Parse command line */ ParseArgs(StringGet, &lpCmdLine); if(appData.viewer && appData.viewerOptions[0]) ParseArgsFromString(appData.viewerOptions); if(appData.tourney && appData.tourneyOptions[0]) ParseArgsFromString(appData.tourneyOptions); chessProgram |= GetEngineLine(firstEngineLine, 0) || GetEngineLine(secondEngineLine, 1); appData.icsActive |= GetEngineLine(icsNick, 10); /* [HGM] make sure board size is acceptable */ if(appData.NrFiles > BOARD_FILES || appData.NrRanks > BOARD_RANKS ) DisplayFatalError("Recompile with BOARD_RANKS or BOARD_FILES, to support this size", 0, 2); /* [HGM] After parsing the options from the .ini file, and overruling them * with options from the command line, we now make an even higher priority * overrule by WB options attached to the engine command line. This so that * tournament managers can use WB options (such as /timeOdds) that follow * the engines. */ if(appData.firstChessProgram != NULL) { char *p = StrStr(appData.firstChessProgram, "WBopt"); static char *f = "first"; char buf[MSG_SIZ], *q = buf; int len; if(p != NULL) { // engine command line contains WinBoard options len = snprintf(buf, MSG_SIZ, p+6, f, f, f, f, f, f, f, f, f, f); // replace %s in them by "first" if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitAppData: buffer truncated.\n"); ParseArgs(StringGet, &q); p[-1] = 0; // cut them offengine command line } } // now do same for second chess program if(appData.secondChessProgram != NULL) { char *p = StrStr(appData.secondChessProgram, "WBopt"); static char *s = "second"; char buf[MSG_SIZ], *q = buf; int len; if(p != NULL) { // engine command line contains WinBoard options len = snprintf(buf,MSG_SIZ, p+6, s, s, s, s, s, s, s, s, s, s); // replace %s in them by "first" if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitAppData: buffer truncated.\n"); ParseArgs(StringGet, &q); p[-1] = 0; // cut them offengine command line } } /* Propagate options that affect others */ if (appData.matchMode || appData.matchGames) chessProgram = TRUE; if (appData.icsActive || appData.noChessProgram) { chessProgram = FALSE; /* not local chess program mode */ } if(appData.timeIncrement == -314159) { // new storage mechanism of (mps,inc) in use and no -inc on command line if(appData.movesPerSession <= 0) { // new encoding of incremental mode appData.timeIncrement = -appData.movesPerSession/1000.; } else appData.timeIncrement = -1; } if(appData.movesPerSession <= 0) appData.movesPerSession = MOVES_PER_SESSION; // mps <= 0 is invalid in any case /* Open startup dialog if needed */ if ((!appData.noChessProgram && !chessProgram && !appData.icsActive) || (appData.icsActive && *appData.icsHost == NULLCHAR) || (chessProgram && (*appData.firstChessProgram == NULLCHAR || *appData.secondChessProgram == NULLCHAR))) PopUpStartupDialog(); /* Make sure save files land in the right (?) directory */ if (MyGetFullPathName(appData.saveGameFile, buf)) { appData.saveGameFile = strdup(buf); } if (MyGetFullPathName(appData.savePositionFile, buf)) { appData.savePositionFile = strdup(buf); } /* Finish initialization for fonts and sounds */ CreateFonts(); GetCurrentDirectory(MSG_SIZ, currDir); SetCurrentDirectory(installDir); LoadAllSounds(); SetCurrentDirectory(currDir); p = icsTextMenuString; if (p[0] == '@') { FILE* f = fopen(p + 1, "r"); if (f == NULL) { DisplayFatalError(p + 1, errno, 2); return; } i = fread(buf, 1, sizeof(buf)-1, f); fclose(f); buf[i] = NULLCHAR; p = buf; } ParseIcsTextMenu(strdup(p)); } void SaveSettings(char* name) { FILE *f; ArgDescriptor *ad; char dir[MSG_SIZ], buf[MSG_SIZ]; int mps = appData.movesPerSession; if (!MainWindowUp()) return; GetCurrentDirectory(MSG_SIZ, dir); if(MySearchPath(installDir, name, buf)) { f = fopen(buf, "w"); } else { SetCurrentDirectory(installDir); f = fopen(name, "w"); SetCurrentDirectory(dir); } if (f == NULL) { DisplayError(name, errno); return; } fprintf(f, ";\n"); fprintf(f, "; %s Save Settings file\n", PACKAGE_STRING); fprintf(f, ";\n"); fprintf(f, "; You can edit the values of options that are already set in this file,\n"); fprintf(f, "; but if you add other options, the next Save Settings will not save them.\n"); fprintf(f, "; Use a shortcut, an @indirection file, or a .bat file instead.\n"); fprintf(f, ";\n"); GetWindowCoords(); /* [AS] Move history */ wpMoveHistory.visible = MoveHistoryIsUp(); /* [AS] Eval graph */ wpEvalGraph.visible = EvalGraphIsUp(); /* [AS] Engine output */ wpEngineOutput.visible = EngineOutputIsUp(); // [HGM] in WB we have to copy sound names to appData first ExportSounds(); if(appData.timeIncrement >= 0) appData.movesPerSession = -1000*appData.timeIncrement; // kludge to store mps & inc as one for (ad = argDescriptors; ad->argName != NULL; ad++) { if (!ad->save) continue; switch (ad->argType) { case ArgString: { char *p = *(char **)ad->argLoc; if(p == NULL) break; // just in case if ((strchr(p, '\\') || strchr(p, '\n')) && !strchr(p, '}')) { /* Quote multiline values or \-containing values with { } if possible */ fprintf(f, OPTCHAR "%s" SEPCHAR "{%s}\n", ad->argName, p); } else { /* Else quote with " " */ fprintf(f, OPTCHAR "%s" SEPCHAR "\"", ad->argName); while (*p) { if (*p == '\n') fprintf(f, "\n"); else if (*p == '\r') fprintf(f, "\\r"); else if (*p == '\t') fprintf(f, "\\t"); else if (*p == '\b') fprintf(f, "\\b"); else if (*p == '\f') fprintf(f, "\\f"); else if (*p < ' ') fprintf(f, "\\%03o", *p); else if (*p == '\"') fprintf(f, "\\\""); else if (*p == '\\') fprintf(f, "\\\\"); else putc(*p, f); p++; } fprintf(f, "\"\n"); } } break; case ArgInt: case ArgZ: fprintf(f, OPTCHAR "%s" SEPCHAR "%d\n", ad->argName, *(int *)ad->argLoc); break; case ArgX: fprintf(f, OPTCHAR "%s" SEPCHAR "%d\n", ad->argName, *(int *)ad->argLoc - wpMain.x); // [HGM] placement: store relative value break; case ArgY: fprintf(f, OPTCHAR "%s" SEPCHAR "%d\n", ad->argName, *(int *)ad->argLoc - wpMain.y); break; case ArgFloat: fprintf(f, OPTCHAR "%s" SEPCHAR "%g\n", ad->argName, *(float *)ad->argLoc); break; case ArgBoolean: fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (*(Boolean *)ad->argLoc) ? "true" : "false"); break; case ArgTrue: if (*(Boolean *)ad->argLoc) fprintf(f, OPTCHAR "%s\n", ad->argName); break; case ArgFalse: if (!*(Boolean *)ad->argLoc) fprintf(f, OPTCHAR "%s\n", ad->argName); break; case ArgColor: SaveColor(f, ad); break; case ArgAttribs: SaveAttribsArg(f, ad); break; case ArgFilename: if(*(char**)ad->argLoc == NULL) break; // just in case if (strchr(*(char **)ad->argLoc, '\"')) { fprintf(f, OPTCHAR "%s" SEPCHAR "'%s'\n", ad->argName, *(char **)ad->argLoc); } else { fprintf(f, OPTCHAR "%s" SEPCHAR "\"%s\"\n", ad->argName, *(char **)ad->argLoc); } break; case ArgBoardSize: SaveBoardSize(f, ad->argName, ad->argLoc); break; case ArgFont: SaveFontArg(f, ad); break; case ArgCommSettings: PrintCommPortSettings(f, ad->argName); case ArgTwo: case ArgNone: case ArgBackupSettingsFile: case ArgSettingsFilename: ; } } fclose(f); appData.movesPerSession = mps; } Boolean GetArgValue(char *name) { // retrieve (as text) current value of string or int argument given by name // (this is used for maing the values available in the adapter command) ArgDescriptor *ad; int len; for (ad = argDescriptors; ad->argName != NULL; ad++) if (strcmp(ad->argName, name) == 0) break; if (ad->argName == NULL) return FALSE; switch(ad->argType) { case ArgString: case ArgFilename: strncpy(name, *(char**) ad->argLoc, MSG_SIZ); return TRUE; case ArgInt: len = snprintf(name, MSG_SIZ, "%d", *(int*) ad->argLoc); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "GetArgValue: buffer truncated.\n"); return TRUE; case ArgBoolean: len = snprintf(name, MSG_SIZ, "%s", *(Boolean*) ad->argLoc ? "true" : "false"); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "GetArgValue: buffer truncated.\n"); return TRUE; default: ; } return FALSE; } xboard-4.7.3/xboard.svg0000644000175000001440000002101512262415351011721 00000000000000 image/svg+xml xboard-4.7.3/SHORTLOG0000644000175000001440000025627212262562252011127 00000000000000** Version 4.7.3 ** (git shortlog --no-merges v4.7.2..HEAD) Arun Persaud (6): cleanup some trailing whitespaces Updated copyright notice to 2014 removed .DS_Store file from git updated copyright to 2014 in menu.c new version number for release 4.7.3 updated po/pot files H.G. Muller (21): Fix buffer overflow in parser Fix adjudication of Giveaway stalemates Fix node count range WinBoard multi-monitor support Repair XBoard from node-count patch Repair FRC A-side castling legality testing Allow castling and e.p. to be edited in opening book Remove width limiting of shuffle checkbox Widen Xaw text entries for larger square sizes Fix Xaw file-browser New Directory Fix packing of FRC castlings Make filler variant button inactive Fix sorting of lines in Engine Output Cure weirdness when dragging outside of board Put some OSX code into gtk version Remove use of strndup Activate ManProc in GTK Expand ~~/ to bundle path (OSX) Use __APPLE__ compile switch for OS X Make building of Windows .hlp file optional Fix crash on use of dialog Browse buttons GTK ** Version 4.7.2 ** (git shortlog --no-merges v4.7.1..HEAD) H.G. Muller (8): Make PGN parser immune to unprotected time stamps Fix book creation Fix GUI book after setup position Allow drops / promotions/ deferrals to be edited into book Allow entry of negative numbers in spin control (WB) Fix grabbing of selected piece Fix initial board sizing WB Fix -zippyVariants option ** Version 4.7.1 ** (git shortlog --no-merges v4.7.0..HEAD) Arun Persaud (4): new version number for developer release updated po/pot files Updated Ukrainian translations Updated German translation Christoph Moench-Tegeder (1): fix bug #38401: xboard.texi doesn't build with texinfo-5.0 (tiny change) H.G. Muller (24): Work-around for Xt selection bug Repair WinBoard compile error Add -backupSettingsFile option Make skipping of unknown option smarter Let popping up of WinBoard chatbox for channel open it Fix of argument error Fix vertical sizing of GTK board Fix buffer overflow in feature parsing Accept setup command for non-standard board size Fix fatal error on unsupported board size Fix GTK box popup Let XBoard -autoBox option also affect move type-in Fix spurious popup after batch-mode Analyze Game Fix saving of analyzed game Provide compatibility with Alien Edition setup command Fix quoting of book name in tourney file Fix disappearence of pieces that were moved illegally Fix horrible bug in reading scores from PGN Print score of final position in Analyze Game Fix GTK SetInsertPos Fix scrolling of Chat Box Make Chat Box window obey -topLevel option Fix Xaw file browser Update zippy.README ** Version 4.7.0 ** (git log --pretty=short --cherry-pick --left-only v4.7.x...v4.6.2^ |git shortlog --no-merges) Arun Persaud (50): added some documentation about what's need to be done for a release and a bash-release script Merge branch 'v4.6.x' into tmp new version number for developer release updated po/pot files removed unused variables (-Wunused-variable) enable -Wall -Wno-parentheses for all compilers that understand them new version number for developer release Updated German translation fix bug #36228: reserved identifier violation bug #36229: changed PEN_* from define to enum bug #36229: changed STATE_* from define to enum bug #36229: changed ICS_* from define to enum new version number for developer release added SVGs added cairo and librsvg to configure process initial svg rendering added SVGs to dist files in automake added a black and white theme to replace the mono option we still need a few bitmaps, so the directory needs to be included in Makefile.am new version number for developer release update po/pot files updated some icons to SVG new version number for developer release fix configure script for --with-Xaw and --with-gtk updated po/pot files; added new frontend files don't define X_LIBS when using gtk-frontend new version number for developer release updated po/pot files Updated copyright notice to 2013 removed trailing whitespace Updated Ukrainian translations fix configure bug that showed up on OS X (couldn't find X11/Dialog.h) Updated German translation new version number for release of 4.7.0 updated Changelog, NEWS, etc. updated po files for new release (make distcheck) Merge remote-tracking branch 'origin/master' into v4.7.x add test for pkg-config Merge branch 'master' into v4.7.x added rotated shogi pieces for -flipback option and moved them to the themes directory keyboard accelerators for both front ends. add close buttons to gtk windows in debug mode also print the git-version if available during build add keyboard shortcuts back into Xaw version removed some translation calls for messages in the debug log fixed gtk-warning fixed segfault of g_markup_printf_escaped which needs utf-8 strings removed two more translations from debug output fix OK-response in gtk dialogs, see c7f8df124 Merge branch 'master' into v4.7.x Byrial Jensen (10): Fix typo (seach) in string. It is already fixed in branch v4.6.x Mark new text "Click clock to clear board" for translation Change some double literals to floats. Remove unused variable pdown from function UserMoveEvent Remove unused variable delayedKing from function QuickScan Remove unused variable tm from function SaveGamePGN Remove unused variable first_entry from function find_key Remove unused static function MenuBarSelect Remove unused static function ShowTC Remove 5 unused variables from zippy code Daniel Dugovic (1): Fix configure script for --enable-zippy (tiny change) Daniel Macks (1): bug #37210: Mishandling of X11 -I flags (tiny change) H.G. Muller (381): Fix suspected bug in Makefile Merge branch 'v4.6.x' of git.sv.gnu.org:/srv/git/xboard Fix fall-back on -ncp mode Inform user in EditPosition mode how to clear board More thorough switch to -ncp on engine failure Implement exclude moves Add exclude and setscore to protocol specs Fix focus of Game List Keep list of excluded moves in Engine Output header Let clicking on header line exclude moves Fix memory corruption through InitString and second-engine loading Silence unjust warning Implement Narrow button in WB Game List Switch to using listboxes for engine-selection in WinBoard Install engine within current group Remove some unused (exclude-moves) variables Refactor menu code, and move it to menu.c Switch to use of short menu references Move more back-endish menu-related stuff from xboard.c to menus.c Contract some awful code replication Split back-endish part off drawing code and move to board.c Declare some shared global variables in backend.h Split back-endish part off xoptions.c, and move to dialogs.c Move some back-endish routines from xboard.c to dialogs.c Cleanup of xboard.c Remove one level of indirection on ICSInputBoxPopUp Make routine to probe shift keys Split usounds.c and usystem.c from xboard.c Prevent double PopDowns Major refactoring of GenericPopUp Redo AskQuestion dialog with generic popup Redo PromotionPopUp with generic dialog Redo ErrorPopUp with generic dialog Add -topLevel option Add -dialogColor and -buttonColor options Redo Game List Options with generic popup Redo Game List with generic popup Redo Engine Output window with generic popup Redo Eval Graph with generic popup Split sync-after options in Match dialog into checkbox + label Remove unnecessary menu unmarking for Edit Tags Redo main board window with generic popup Switch back two two-part menu names Fix recent-engines menu Correct texi file for use of .Xresources Fix switching debug option during session. Move DisplayMessage to dialogs.c Move LoadGamePopUp to menus.c Add message about enabling in New Variant dialog Use ListBox in stead of ComboBox in Load Engine dialog Use ListBox in stead of ComboBox in Match-Options dialog New browser Fix default file types for browse buttons Port grouping to XBoard Load Engine Change default directory in Load Engine to "." Port engine grouping to Match Options dialog Give the dual-board option a separate board window Reorganize main() a bit Add 'Narrow' function to position search Fix bug in FRC castling for position search Use Ctrl key in EditPosition mode to copy pieces Fix Makefile EXTRA_DIST Update POTFILES.in new version number for developer release updated po/pot files Fix auto-play Fix vertical chaining of Buttons and browser ListBoxes Make reference to board widgets symbolic Fix internationalization Fix Engine Output icon heights in international versions Add New Directory button to file browser Add sound files to browser menu Fix 3 forgotten symbolic widget references Let clocks of secondary board count down Fix redraw of secondary board on flipping view Allow clearing of marker dots in any mode Fix promotion popup Fix double promotion popup Move clearing of target squares to after drag end Fix click-click sweep promotions to empty square Also do selective redraw with showTargetSquares on Improve arrow drawing Use in-place sweep-selection for click-click under-promotion Fix promotionPopDown on new move entry Fix some compile errors / warnings Implement automatic partner observe Fix ArrowDamage out-of-bounds access on drop moves Remove debug printf Fix clearing of ICS input box after send Fix click-click under-promotion animation save Fix MenuNameToItem Shuffle prototypes to correct header, or add them there Fix readout of numeric combobox Move FileNamePopUp to dialogs.c Move ManProc to xboard.c Fix warnings about character index Fix warning about signedness Add pixmap as file type known to browser Offer primitive paging in file browser Solve WinBoard name clashes, fix zippy-analyze menu graying Fix crash on time forfeit with -st option Add logo widgets in main board window Allow chaining of single-line text-edits to top Port chat boxes to XBoard Fix disabling of Load Engine menu Fix ICS Text Menu popup Fix key binding of DebugProc Fix WB Engine Settings window Keep track of virginity of back-rank pieces in variant seirawan Decapitalize promoChar in move parser Fix bug in Edit Position Round board size to one where piece images available (WB) Let windows stick to right display edge (WB) Pay attention to extension of 'positional' arguments Define XOP mime type for XBoard Workaround for FICS bug Implement variant seirawan in -serverMoves option Implement --help option Add check on validity of tourney participants Add options -fe, -se, -is to load installed engines/ics from list Allow second engine to analyze too Let second engine move in lockstep during dual analysis Allow Analyze Game to auto-step through entire game file Cure some sick behavior in XBoard Engine Output right-clicks Allow ICS nickname as positional argument Preconfigure -icsNames in xboard.conf Allow entry of fractional increment in WB time-control dialog Resolve conflict between -mps and -inc options Update texi file Fix broken -ics and -cp options Use Pause state in AnalyzeMode to imply move exclusion Fix browsing for path Fix non-NLS compile error for XFontStruct Fix WinBoard compile errors Reserve more space for button bar Fix button-border-width bug in monoMode Redo Eval Graph drawing with cairo Fix Eval Graph resolution problems Redo logos with cairo Redo seek graph with cairo Redo arrow highlighting with cairo Redo grid with cairo Make convenience routine SetPen globally available Redo highlights with cairo Redo marker dots with cairo Add mode to draw PNG piece images through cairo Add png pieces Allow back-texture files to be PNG, (drawn with cairo) Do animation with cairo Maintain in-memory copy of the board image Switch to using 64x64 png images Allow resizing of board window Specify proper condition for using cairo animation Cure flashing of piece on from-square Also use cairo on slave board Redo coordinate / piece-count printing ith cairo Fix DrawSeekText Make dragged piece for excluding moves transparent Let cairo also do evenly colored squares. Remove debug print Also render coordinates to backup board Fix clearing of markers dots with promo popup Implement variant-dependent png piece symbols Remove acceleration trick Fix highlight clearing Draw arrow also on backup image Cleanup CairoOverlayPiece Fix erasing dots in seek graph Separate off drawing routines from xboard.c Remove all bitmap & pixmap drawing Check in draw.c, draw.h Clean up drawing code Some cleanup Do coordinate text alignment with cairo Fall back on built-in pixmaps if png pieces unreadable Plug resource leak on rezising with pixmaps Make Piececolor options work on png pieces Fix bug in resize trigger Suppress redraw during sizing Reload piece images when pngDirectory is changed Make expose handler generic remove NewSurfaces Fix alignment of highlight expose Fix initial display of logos Let expose requests pay proper attenton to widget Make draw handle for board globally available Fix expose requests seek graph Adapt Eval Graph code to new drawing system Fix rsvg version in configure.ac Always render svg pieces anew on size change Add -trueColors option Solve odd lineGap problem Fix 1-pixel offset of grid lines on some cairo implementations Fix animation with textures off Fix exposure of atomic captures Add hatched board texture Install the wood textures as png Remove bitmaps from project Install svg pieces in themes/default Cache svg handles Implement proper fallback cascade Remove piece pixmaps from project Suppress anti-aliasing in -monoMode Fix segfault on faulty command-line option Increase drag delay too 200 msec Make fallbackPieceImageDirectory hardcoded Suppress warning for InitDrawingHandle Code cleanup: move expose redraw to draw.c Remove unnecessary Xt colors and call to MakeColors Move Shogi svg pieces to own directory Spontaeous changes in gettext stuff Adapt docs for svg/png in stead of bitmap/pixmap Trim board-window size Fix garbage pixels on the right of the board Print missing-pieces error message to console Prevent odd-width line shift in length direction Fix bug in resizing Remove some unused images from png directory Remove caveat on available pieces fromNew Variant dialog Fix variant-dependent pieces Get svg error message Fix bug in fallback mechanism Fix bug in resizing on variant switch Rename svg shogi pieces, so they become usable Fix re-rendering of svg on resize Remove the texture pixmaps from project Replace xiangqi board pixmaps by png images Replace marble texture pixmaps by png Fix variant-dependent pieces Fix crash on animation after resizing Fix message in New Variant dialog Fix crash in promotion popup Fix WinBoard compile error on enum PEN Fix image extension used for browsing to .pgn Fix initial enables in TC dialog Move X11 front-end to directory xaw Preserve copies of the X11 front-end in xboard directory Prepare xoptions.c for middle-end changes Add configure switches for Xaw vs GTK. Move ICS-engine analyze and AnalyzeGame code to shared back-end Remove some unnecessary header includes move testing for no options to back-end Move MarkMenuItem to xoptions.c Split xhistory.c in front-end and middle-end part Remove inclusion of frontend.h from backendz.h Remove xedittags.c, .h from project Cleanse back-end code of all references to X11 types Make xevalgraph.c backend Move timer functions to new file xtimer.c Remove all X11 code by #ifdeffing it out Give LoadListBox two extra parameters Transfer most available gtk-xt code to xoptions.c Attach expose handler and connect to mouse events Implement menu checkmarking and enabling Connect dialog Browse buttons to GTK browser Transfer more gtk-xt code, and add some new Append recent engines to engine menu Add text insertion in engine-output memos Better cleansing of xboard.c from X11 types Highlight Pause button Add key-handler for ICS Input Box Make generic memo-event handler, and connect history callback Add highlighting in move list Add scrolling of Move History Let engine-output memos use new generic callback Implement highlighting in engine output by through generic method Fix animation Connect CommentClick handler Fix ListBox, and add some support routines Add file browser Remove some unneeded low-level X11 code Add Shift detection Add type-in event to board for popping up box Add optional callback to Label Options Add game-list callbacks Add access routines to checkboxes and FocusOnWidget Close Move Type-in on Enter Deselect first char in Move Type-in and ICS Input Box Use different tables for different dialog columns Add hiding / showing second Engine Output pane Add listbox double-click callback Add BarBegin, BarEnd options Fix button bar Add displaying of icons Make some tall dialogs multi-column Add task-bar icon Some experimenting with sizing Add copy-paste Delete emptied front-end files, and move rest to gtk directory Fix warnings Make board sizing work through subtracting fixed height Add window positioning Fix logo placement Fix clock clicking with GtkEventBox Pay attention to NO_CANCEL dialog flag Fix Chat Box Fix clock highlighting Adapt lineGap during sizing Draw frames around memos and listboxes Load opponent logo based on handle in ICS play (WB) Add 'Continue Later' button in Tournament dialog (WB) Allow external piece bitmaps and board border (WB) Add Themes dialog (WB) Implement auto-creation of ICS logon file Use colors in Board-Options dialog also for font pieces (WB) Implement book-creation functions Start browsing in currently-selected folder (WB) Fix move highlighting with animation off Fix Loop-Chess promotions Implement use of pause / resume protocol commands Improve scaling of border bitmap (WB) Fix -fSAN in AnalyzeFile mode Do not clear PGN tags on Analyze File Fix min-Shogi promotion zone Update WinBoard translation template Prefer pause mode on pondering engine over 'easy' Fix rep-draw detection in drop games Implement insufficient mating material for Knightmate Use Ctrl key in AnalyzeMode to exclude entered move Do not move to forwadMostMove when unpausing AnalyzeMode Do not automatically save aborted games in tourney PGN Store some more tourney params in tourney file Implement aborting of games on engine request. Resend engine-defined options after reuse=0 reload Allow use of ~ in pieceToChar for shadow pieces in any variant Let tellothers command add comment to PGN in local mode Do delayed board draw also with -stickyWindows false Fix some warnings Update texi file Enforce -popupMoveErrors Fix engine timeout problem in match mode Stalemate is a win in Shogi Adjudicate perpetual checks as loss also in Shogi Adjudicate pawn-drop mate as loss in Shogi Catch unknown engine in tourney games Preserve mode on engine loading (sometimes) Preserve PGN tags when loading engine Fix library order Fix expose of to-square with grid off Fix warning in WinBoard Let WinBoard start in its installation folder Assign shortcut char to WB menu item Add some new strings to WB translation template Update Dutch WB translation Fix GTK error auto-raising board Fix warnings of build server Put GTK warning in about-box Let initial setting of Twice checkbox reflect current state Draw both coords in a1 Add boolean -autoBox option Update NEWS file Add desktop stuff for .xop MIME type. Remove empty-square SVG images from project Revive -flipBlack option Add Xiangqi piece images to project Fix Makefile for install of Xiangqi pieces Connect Ctrl key in WinBoard Better fix of feature timeout Unreserve tourney game on exit during engine load Only perform e.p. capture if there are rights Warn about experimental nature of dual board Make switching between board windows absolute Remove checkbox for 'Move Sound' Don't add PV moves on board clicking in AnalyzeMode Add new vertical pixel fudge Allow display of 50-move counter in zippy mode Add -onlyOwnGames option Fix graying of Revert menu item Cure GTK warning in top-level windows Fix title of top-level windows Print game-list timing messages only in debug mode Fix repairing of arrow damage Remember window params of slave board Fix repositioning of GTK windows Limit debug print to debug mode Better handling of undefined window parameters Fix sizing of slave board GTK Suppress printing of status line in dual-board mode Fix testing for valid window placement Xaw Fix -topLevel option Try to make life more bearable in Xaw menus ** Version 4.6.2 ** (git shortlog --no-merges v4.6.1..HEAD) Arun Persaud (1): new version number for release of 4.6.2 H.G. Muller (5): Fix second-engine variant test Add two new strings to WinBoard language file Define TOPLEVEL in winboard.c Fix faking of castling rights after editing position with holdings Suppress clear-board message after pasting FEN ** Version 4.6.1 ** (git shortlog --no-merges v4.6.0..HEAD) Arun Persaud (5): updated Changelog, etc. for developer release added m4 directory to search path for aclocal. As suggested by Michel Van den Bergh removed unused variables (-Wunused-variable) new version number for release of 4.6.1 updated Changelog, NEWS, etc. Byrial Jensen (2): New Danish translation (fixes a minor error in one string) Translate "NPS" also in engine output window H.G. Muller (30): Fix fall-back on -ncp mode Install engines as ./exefile in XBoard Inform user in EditPosition mode how to clear board Fix clock stop after dragging Fix taking effect of some option changes Fix bug in FRC castling for position search Fix bug on loading engine Fix browsing for save file in WB Fix parsing crazyhouse promotions with legality testing off Fix TOPLEVEL stuff Make variant-unsupported-by-second error non-fatal Let Game List scroll to keep highlighted item in view Extend smallLayout regime up to size Medium Fix switching of debug mode Correct texi file for use of .Xresources Fix texi bug Fix PV sorting during fail low Fix memory corruption through InitString Change default value for diretory to . in Load Engine dialog Swap all engine-related options during engine loading new version number for developer release updated po/pot files Don't strip path from engine name if directory given Updated Danish and Ukranian translations Suppress popup for fatal error after tellusererror Detect engine exit during startup Fix click-click sweep promotions to empty square Suppress testing for availability in bughouse drops Fix crash due to empty PV Fix Eval Graph scale in drop games ** Version 4.6.0 ** (git log --pretty=short --cherry-pick --left-only v4.6.x...v4.5.x^ |git shortlog --no-merges) Arun Persaud (79): removed parser.l from build process, also removed flex dependency from configure updated Changelog, NEWS, etc. new developer release added/fixed i18n support via gettext to xboard updated translation files marked more strings for gettext that were only marked with N_() updated list of files that include translation strings; updated pot-file updated po-files; updated german translation replaced hardcoded email address with generic PACKAGE_BUGREPORT updated German translation fixed access rights to winboard language files (644 instead of 655) lng2po.sh: added command line options, GPL header added translations generated via lng2po from all winboard languages deactivated new languages for the moment... updated ChangeLog, NEWS, etc. new developer release updated xboard.pot with released version translation: added new Ukrainian PO file from the TP translation: activated Ukrainian translation updated Changelog, NEWS, etc. new developer release fixed segfault in xengineoutput Revert "fixed segfault in xengineoutput", fixed in the backend now (from HGM) malloc.h is not needed updated Changelog, NEWS, etc. update po files new developer release updated pot file and send to translation project translationproject.org: updated Ukrainian translation added NEWS for release of 4.5.3 only require 0.17 of gettext updated Changelog, NEWS, etc. updated pot file and send to translation project new developer release translation: updated uk.po translation: updated uk.po Merge branch 'master' into v4.6.x translation: added danish translation marked more strings for translation added new files to po/POTFILES.in updated pot file Merge branch 'master' into v4.6.x new developer release updated version numnber in pot file fixed size of XBoard icon to 48x48 translation: updated uk.po marked an error messages for translation removed Iconify function. Should be handled by the window manager. replaced unicode character for "'" in xboard.texi change keybindings that don't use ctrl, make MoveTypeInProc ctrl aware; fixes #35000 fix translation for engine list; fixes #34991 make entries in CreateComboPopup not translateable; fixes #34991 also don't translate selection in ComboSelect; fixes #34991 only translate entries in CreateComboPopup if strlen>0; fixes #34991 Merge branch 'master' into v4.6.x Updated copyright notice to 2012 code cleanup: make function definition confirm to GNU coding style added desktop and mime-type association to autoconf install process added some autogenerated po files to .gitignore forgot to list new desktop files in EXTRA_DIST section in Makefile.am Merge branch 'master' into v4.6.x updated Changelog, NEWS, etc. updated po-filies new developer release Merge branch 'master' into v4.6.x; updated to correct version number for v4.6.0 branch fixed comments for translators: comments starting with TRANSLATORS: are now copied to the po file added some comments for translators translation: updated uk.po updated Changelog, NEWS, etc. updated po/pot files new developer release Merge branch 'master' into v4.6.x; updated to correct version number for v4.6.0 branch add configure test for xdg-programs to install mime types; can be disabled for building of e.g. rpms modified configure and makefile for handling mimedb update translation: updated uk.po Merge branch 'master' into v4.6.x fixed "make install-pdf": missing target for recursive make in po directory add information about our webpage and were to report bugs into the help menu Merge branch 'master' into v4.6.x Byrial Jensen (26): fix for repeating key issue, with this allissues this bug should be closed; fixes #35000 Add NO_GETTEXT flag for combobox. Fix bug #34991 Make GenericPopUp() more readable by using more named flags instead of numerals Fix crash when selecting user soundfile due to free() of not malloc()'ed memory Fix a memory leak in Sound Options Fix a possible crash in the file browser Fix possible crash on 64-bit systems when copying game or position Give numeric options the value 0 if a non-numeric text is entered. Before the value ended up undefined. Give numeric options the value 0 if a non-numeric text is entered (one more place). Before the value ended up undefined. Duh! Initialise the argument to sscanf() inside the loop, so it always gets a known value when sscanf() fails. Transfer a pointer to the promoChar from PromotionPopUp() to PromotionCallback(). Fixes #34980 Definition of TimeMark moved from 3 c files to backend.h Add #include "moves.h" to gamelist.c for def. of CopyBoard() Remove the last 2 compile warnings in gamelist.h Add 2 strings for translation Fix unportable memory initialisation Fix checking of return value from snprintf() One more string marked for translation Fix buffer possible overflow when writings tags Use ngettext() instead of gettext() for a string to allow better translation. Mark the strings "first" and "sencond" for translation. Add args.h to POTFILES.in and change the interface to ExitArgError() so msg is c format string Fix typo in translator comments explaning "first" and "second" Fix one more typo in the translator comments explaning "first" and "second" One missed translation of cps->which Updated Danish translation H.G. Muller (375): New parser, written in C Implement yynewstr entry point in new parser Fix o-o castling in new parser Implement Edit-Comment window through generic popup Redo Tags dialog Remember Tags and Comment dialog coordinates Implement sweep selection as alternative for the piece menu Implement sweep selection of promotion piece Fixes to sweep selection Make sweep-select promotions work in WinBoard Alternative sweep promotions Third method of sweep selection Implement Copy Game List menu item for XBoard Implement move type-in for XBoard Refactor move type-in code Fix crash copying game list when there is none Alter treatment of moves with empty squares Fix sweep-promotions patch Update texi file Describe -pieceMenu option in texi file Describe -sweepPromotions in texi file Describe Copy Game List menu item in texi file Describe move type-in in texi file Fix chaining of bottom-row dialog buttons Fix gettext macros in option dialogs Bring structure in appData engine options Put engine initialization code in per-engine function Add UnloadEngine routine Generalize WaitForSecond to WaitForEngine Make engine loadable during session Make engine startup error non-fatal Put gettext markers in generic dialog creator Create conversion tools for language files Fix some warnings and header-file improvement Silence more rpm warnings Fix zippy bughouse partner bug Delay loading of second engine until it is used Fix grayout XB Match Options in ICS mode Implement flock in WinBoard Remove building rule for parser.c from WB makefiles Lock game an position file during writing Add callback possibility to combobox selection Refactor code for loading games and positions in match Fix crash on empty Engine Settings dialog Display note in stead of empty engine-settings dialog XB Implement Tournament Manager Calculate and display tourney result Allow switching off match mode through menu Load new logo on engine change WinBoard Implement Load Engine dialog in WinBoard Fix error message on engine load Make option to draw second engine from first list Implement Tournament Options dialog WinBoard Lift limitation of text length in generic dialog XB Lift length-limit on text-edits in WB generic popup Fix PV walking in analysis mode Fix generic combobox bug Improve sizing of comment and tags dialogs Add default extension in file browser Fix stopping of match in tourney mode Fix exit popup in tourney mode Fix range of tourneyType spin WB Add partcipants at bottom in tourney dialog (WB) Add WB new popup prototypes Plug memory leak, filenames relative to installDir Put saveGameFile in tournament dialog Save time-control settings in tourney file Let XB generic popup define default file extensions Add -first/secondPgnName option Fix resetting engine options Make book-edit function WB Let Shift+RightClick on PV actually play the PV moves Import WinBoard language files into git Allow changing MultiPV setting from Engine-Output window Fix button sizing in generic popup Let ParsePV always generate SAN move Automatically play moves of clicked PV in analyze mode Add option -absoluteAnalysisScores Add -userFileDirectory option Make 'add to list' default in Load Engine dialog Improve WB Load Engine dialog texts Implement Edit Book in XBoard Recode some po files Adapt default directory of lng2po Include learn info in book edit Alow promotions and drops in book-editing Take account of holdings in book key Fix initialization of engine state Add secondry adapter command for UCCI or USI Make engine startup failure non-fatal in WinBoard Let mentioning completed tourney file add one cycle Fix CR in multi-line WinBoard text-edits Allow generic dialog to ignore OK Add Swiss tourneys through pairing engine Fix ArgTwo warnings Fix layout tournament Load Engine dialog WB Fix -matchGames option Improve Tournament dialog layout WB Let XBoard propose name of tourney file Print sensible window title during tourneys Improve quoting of engine name on install Fix interrupting tournament Fix round-robin schedule Fix clock mode in tourney starting from -ncp mode Give error popup when pairing engine fails Fix concurrency in Swiss tourneys Fix display of last move of last match game Clear Engine-Output pane when initializing engine Fix display of logos Fix crash at end of Swiss tourney Redo New Shuffle Game dialog with generic popup Some refactoring in xoptions.c to separate out front-end Redo Time Control dialog with generic popup Add icon to WB for tournament files Update WB docs for tourney manager Fix default of -remoteUser Change long form of -tf option to -tourneyFile Make non-existing opton in settings file non-fatal Remove stray else Redo Move History with generic popup in WinBoard style Make WB generic popup translatable Update window itle after last game of match Add Score in Move List option to general options dialog XB Use sound for ICS tells also with engine telluser popups Fix crash on clearing new Move List window Cure flicker in Move History window, fix highlighting Add -fSAN / -sSAN options Fix compile errors WinBoard Increase efficiency of SAN generation / disambiguation Fix some warnings Update texi file Modified po Fix texi file, and update it further Add Absolute Analysis Scores in Genral Options dialog XB Allow double-digit rank numbers Create some space in WB New Variant dialog Allow promotion to Pawn with legality testing off Implement Grand Chess Add tab stops in WB generic popup Reorder controls in Engine Setings dialog WB Fix drop moves on boards with more than 10 ranks Fix crash on making too-long FEN Fix coords display on large boards Fix resetting searchTime if other TC mode is chosen (XB) Fix writing searchTime in tourneyFile Fix parser.c line endings Let PGN parser accept lower-case piece in drop moves Improve -showTargetSquares on click-click moves Let -sweepPromotions also work for click-click moves Display score/depth in Eval Graph title Print 50-move counter in Engine-Output title Add -scoreWhite option Let WB eval graph react ot single left-click Print reversible plies done in stead of plies to go Improve Eval Graph with -evalZoom and -evalThreshold Write more labels on score axis of eval graph Put grab on sweep-selecting in Edit Position Disable -showTargetSquares in ICS mode Suppress some XBoard warnings Fix crash on OK after Save Changes in Tags and Comment popup. Give WinBoard Game List its own font Allow null move in analysis and edit-game mode Force Move History refresh after loading/reverting variation Allow entry of variations in PlayFromGameFile mode Implement searching games in Game List for a position Parse PGN tags without allocating memory Print progress during load / selection of game Debug position selection Add plain arrows as key binding for stepping forward/backward Better fix of crash on empty game list Fix paging Delay file loading to allow expose event first Speed up parser Allow deletion of last book move Add key bindings for loading next/previous game of list Fix up/down arrows in game list Allow substitution of engines during tournament Fix generic-popup failure after empty engine-settings dialog Fix crash on start without settings file Add -useBoardTexture and -usePieceFont options Translate search texts Fix use of random Allow two-games-per-opening to work with book Fix ICS move-list header mistaken for null moves Replace Analyze File by Analyz Game function Fix quoting in Load Engine dialog Fix treatment of PGN score/depth info with linefeeds in them Fix display state after failed analysis attempt Fix crash on typing non-existent enginein Load Engine dialog Extra buttons in WB Tournament dialog Slightly decrease sensitivity of sweep actions Auto-popup ICS Input Box Upgrade -serverMoves option Add -afterGame option Make DoSleep front-end wrapper for msec sleep Move HistorySet to back-end Fix write failures in concurrency Fix some warnings (prototypes) Clear fSAN option before new engine load Fix LoadGameOrPosition starting up engine Keep book file open Make too-long game non-fatal Fix resetting -fSAN on engine change Fix position loading in tourneys Make book-window update part of HistorySet Prevent Edit Book window from stealing focus (WB) Add Dutch WinBoard translation Remove paragraph about .Xresources from texi file Update texi file for position search Update texi file for new features Reactivate Falcon Chess Add Romanian lng file Reset initString and computerString on engine load Add option -discourageOwnBooks Add control to set -discourageOwnBooks WB Fix crash on loading garbage game file Fix invalid combobox entry WB Print message on wrong use of Clone Tourney Fix crash on adding items near book end Refine clock adjusting Fix PV walking with -fSAN Fix duplicate loading of second engine in tourneys Quickscan Translate search-mode strings profile Debug position search cache Implement flipped search Translate search strings Dynamically allocate move cache Speed up position search and consider side to move Put 'Load Next' button back in WB Game List Fix some warnings Fix Load Options dialog WB Update Dutch lng file Update language.txt file Incorporate variant type in book hash key Fix crash on loading garbage game file Use other interpretation of Asia rules for chase detection Add mechanism to translate variable messages in WinBoard Let perpetual-chase message mention square Change chase message in .lng files Don't adjust clock on right-click in EditGame mode WB Fix two warnings Clear board markers when moving to other position Change default sweep-promotion choicein queenless variants Set pieceToCharTable by setup command even when ignoring FEN Accept setup command in variant fairy even with legality testing on Fix handling of -secondOptions option Add feature-override options Fix WinBoard clock-click bug Ignore ICS game starts when already in game Show 50-move counter also when observing ICS games Fix parsing of O-O castling in variant janus Refrain from making unnecessary resize X request Put promo-suffix on ICS move in variant seirawan castlings Change encoding of seirawan ICS gating-castlings Add -afterTourney option Fix alignment of generic browse button XBoard Fix arrow highlighting in mono-mode XB Fix showTargetSquares in mono-mode XB Fix switching back from mono-mode XB Fix legality of Spartan promotion to king Fix out-of-bounds access in check test Allow setting of holdings with edit command Fix menu grayout after illegal move Fix sending of S-Chess gating moves to ICS Fix initial holdings ICS seirawan games Fix ICS castling rights Don't test drops as mate evasions in variant seirawan Fix format in temporary timing printf Clip texts on menu bar Next try for menu-bar sizing Use in stead of Ctrl+. for peeking last move Describe -overrideLineGap option in texi file Try to not confuse ICS rating adustments as shouts Fix parser for variant seirawan Fix parsing of faulty PGN tags Implement peeking previous position in WinBoard Abandon single-letter menus in tinyLayout Clear square markers on new game Add icons for PGN and tourney files Add xml file for defining mime types Add desktop files for PGN viewer and tournament player Fix crash at match end Fix crash in auto-comment Implement -viewerOptions Remove the direct commands to the engines Update texi file and remove duplicate control Install icons directly Install desktop files directly Install mime types directly Open WB startup chat boxes only after logged on Fix seek graph for VICS Add Ctrl-D as alternative to Ctrl+Alt+F12 in WinBoard Add control for overrideLineGap in WB Board dialog Exempt variant seirawan from -disguisePromoted inheritance Enable WB time-control dialog even when no clock mode Fix height board dialog Fix re-allocation of PGN-cache memory Add new translations to WB language file Use same translation of "vs." everywhere Fix 4 warnings Fix printing non-numeric kibitz with -autoKibitz Suppress empty lines when observing on VICS Fix seek-graph popup and popdown Give focus to board window after ICS login Reset protocol version before loading new engine Prevent unnecessary loading of engines Fix arrow damage with highlightDragging XB Implement GenericUpdate function Implement Clone Tourney button XBoard Incease size of WB array of translated items Make New Variant dialog visible in mono-mode Fix fix of switch to mono-mode Increase max nr of engines to 2000 Fix registering of EditTagsProg Put recently used engines in WB menu Fix TidyProgramName Allow grouping of engines in engine list Fix bug in WB combobox readout Create separate debug fil for each tourney game Implement -pgnNumberTag option Put move number in Eval Graph title Implement kludge to set options through Move Type-in Fix MAXENGINES in WinBoard Fix non-bug in WinBoard Add 5 missing strings to WinBoard translation template Create room in some WB dialogs for translations Update Dutch WinBoard translation Configure XBoard engines and textures Derive height of text-edits in dialogs from message widget Fix heights in Engine Output window XB Fix position of checkbox XB Fix crash on empty combobox menu XB Cosmetic: change 4.5 to 4.6 in xboard.conf comment Delete some unused WinBoard bitmaps Remove some of the most verbose debug output Fix unloading of first engine on tourney start Fix sleeping bug Fix warning Better solution to button-height problem Put front-end support for -recentEngines in XBoard Fix popdown seekgraph on forward-event XB Fix heigth of multi-line labels Configure some new features switched on Make -pgnNumberTag option setable from menu Fix button chaining and combo/textbox label height Configure wider game list Fix switching animation masks on variant switch Fix date in copyright notice about-box Also configure sweep selection Update texi file Fix OK button of error popup Leave height of row that only contains buttons free More updating of texi file Merge branch 'master' of git.sv.gnu.org:/srv/git/xboard Remove a debug printf Fix use of middle button for position setup Don't leave piece selected after piece menu Fix button grab for sweep selection Move change of debug file to before game load Delete some load-game debug printing Implement -autoCopyPV Implement -serverFile option Undo translation of cps->which = first/second Fix translation of EngineOutputTitle WB Use combobox line for recent engines when available Make frame width configurable in XB Use more reliable X-call for getting window position Implement -stickyWindows in XBoard Keep XBoard windows attached on resize Fix piece symbols on switch back to variant normal Fix two 64-bit warnings Fix 50-move counter in ICS mode Suppress recent-engines menu items in ICS mode Thomas Adam (1): (tiny change) Clarify "-name" option is Xt-only Tim Mann (9): Use getaddrinfo instead of gethostbyname. Hopefully this makes us compatible with IPv6 and with hosts that have more than one IP address. However, I don't know of any chess servers that have either of those properties, so I couldn't test that. I did test that xboard still works with freechess.org and chessclub.com and that it gives an error message for invalid host names. Fix a size mismatch in scanf. Untested, but the code could not have Move "hide thinking" option into alphabetical order. Fix display of international characters outside the ASCII range. Added "misc-fixed" as a fallback font to handle locales where Add a final wildcard default for fonts. This gives XCreateFontSet The empty string can't be translated and it causes the gettext Fixed small bugs in several .po files, enabling these translations to Internationalize the file browser. ** Version 4.5.3a ** (git shortlog --no-merges v4.5.3..HEAD) H.G. Muller (2): Fix compile errors WinBoard Let WB Makefile build non-JAWS version by default ** Version 4.5.3 ** (git shortlog --no-merges v4.5.2a..HEAD) Arun Persaud (2): new developer release better contrast for XBoard icon on a dark background H.G. Muller (43): Fix some warnings and header-file improvement Fix warnings XBoard file browser Fix zippy-partner bug Silence more rpm warnings Add tab stops in WB generic popup Reorder controls in Engine Setings dialog WB Fix Unfinished sound during ICS examining Fix JAWS reading of Engine Settings dialog Create some space in WB dialogs for translations Remove some duplicats from WB language template file Fix translatability of Spartan Chess menu item WB Fix translation of spoken composite messages Popdown Comment window on new game Force Move History refresh after loading/reverting variation Fix crash on empty Engine Settings dialog Display note in stead of empty engine-settings dialog XB Fix generic-popup failure after empty engine-settings dialog No clearing of Engine-Output memos on stat01 Fix button sizing in generic popup Fix vscrolling in XBoard Engine-Output window Obey san feature when sending book moves Fix display of last move of last match game Fix parameter handling in adapter command Fix type of shuffleOpenings Fix crash on switching sound in Vista Fix empty-string option values in XBoard Add -at and -opt options as alternative for @ Fix default of -remoteUser Make non-existing option in settings file non-fatal Remove stray else Restore echo after ^C in ICS password Don't one-click move when legality testing is off Update window title after last game of match Fix missing files in file browser Fix use of random in XBoard shuffle dialog Better fix of crash on empty game list Implement paging in XBoard Game List Clear Engine-Output pane when initializing engine Fix AppendComment Fix playing sounds when -soundProgram is empty Implement NVDA support in JAWS version Suppress playing of book moves with weight 0 Limit width of menu bar in XBoard ** Version 4.5.2a (Winboard only) ** (git shortlog --no-merges v4.5.2..HEAD) H.G. Muller (1): Fix Engine Settings button options in WinBoard ** Version 4.5.2 ** (git shortlog --no-merges v4.5.1..HEAD) Arun Persaud (13): Fix "make install" on Os X10.6.6 (removed a "/") fixed wrong default for polyglotDir mentioned in docs. Fix bug introduced in commit 89b4744: removed a "/" and forgot to add it in the config file check if malloc.h is present before including it removed check and #includes for malloc.h, since it's not needed fixed 64 bit warnings by casting integers to intptr_t before casting to int updated Changelog, NEWS, etc. new developer release configure: renamed bitmapdir to pixmapsdir, since it installed only pixmaps. also changed name of default dir configure: added install of sounds in .../games/xboard/sounds/default configure: added install directory for bitmaps files: .../games/xboard/bitmaps/default/ configure: enable silent rules by default new developer release H.G. Muller (57): Fix nps bug Fix unintended translation in debug file Improve repairing damage of arrow highlight XBoard Fix flipBlack option XBoard with board texture Fix two bugs in reading position diagram Fix parsing bug of FRC castling Fix bugs in FRC castling rights Fix display of promotion piece in ICS superchess Put insertion point at end of text on SetFocus Add file-browser option to just return name Make generic XBoard popup, and implement 2 dialogs Add browse button to generic popup Add board dialog XBoard Add ICS options dialog Make sounds dialog for XBoard Redo adjudications dialog through generic popup Redo common-engine dialog with generic popup Redo new-variant dialog with generic popup Create General-Options dialog Implement Machine Match menu item and options dialog Make generic dialog popup reentrant Merge SettingsPopUp into GenericPopUp Let generic popup generate Engine Settings dialog Activate -path and -file options Redo ICS input box with generic popup Make a kind of ICS text menu in XBoard as a dialog Fix linegap option in board dialog Fix animation masks on changing piece pixmaps Let file browser filter on extension Refinements to generic popup and color picker Fix crash on opening ICS Text Menu Fix path browsing in WinBoard Fix use of game/position file in first match game Fix saving of XBoard fonts with spaces in name Fix game-list highight error when filtered (WB) Fix startup focus of board window Fix crash on closing dialogs in wrong order Fix changing of float setting by generic popup Couple mouse wheel to v-scrolls in file browser Let double-click select file in file browser Block selection of a directory when file is needed Reorganize texi description Update texi file Remove outline-pieces option from board-options dialog Fix running of clock during hash allocation engine Fix switching between pixmap and bitmap pieces Fix size limit on 'save as diagram' Fix gamelist highlight Make user wav file available for try-out in sound dialog Change default sounds in Xboard menu Configure some default sounds Remove some bitmaps from install Limit install of sound files to those in menu Change texture-install directory to pixmaps/textures Fix crash on using Engine #1 Settings in ICS non-zippy mode Fix shogipixmaps Fix gettext macros in option dialogs Kamil Blank (1): Added missing fclose() ** Version 4.5.1 ** (git shortlog --no-merges v4.5.0..HEAD) Arun Persaud (9): add DIFFSTAT and SHORTLOG to tar-ball Revert "Implement -reset option feature in WinBoard" added history.c to the tar-ball. Needed for Winboard added missing header file for sprintf added missing #includes and missing prototypes to filebrowser fixed configure script to correctly detect Xaw3d library updated configure.ac to check for Xaw header files updated Changelog, NEWS, etc. new developer release H.G. Muller (14): Fix deselection of greyed-out variant button (WB) Fix MSVC compilability Fix 64-bit Windows compilability Put warning in HTML help Fix unmarked translation Fix Alfil bug Fix variant janus size prefix Fix Xiangqi King facing Fix showing of user move after adjudication Make language choice from menu persistent Fix ICS channel 0 Fix MSVC snprintf problem Fix some resource leaks Fix two typos in option names in texi file ** Version 4.5.0 ** (git shortlog --no-merges v4.4.4..HEAD, removed duplicated from earlier versions due to cherry-picking) Arun Persaud (38): fixed prototype for AppendComment clean-up fixed Makefile.am to handle config file correctly new developer release fixed hardcoded location of config file for xboard fixed compiler warning for file-browser code Revert "Repair settings-file name" removed some garbage from configure.ac that got added a while ago fixed internationalization for winboard security fix: replaced strcpy with safeStrCpy from backend.c security fix: replaced sprintf with snprintf sizedefaults has 9 members, the last line of the array (NULL) only set 7. cleaned up -Wall warnings (apart from settings some parentheses) added new case for (Chessmove) 0 in common.h bugfix: missing array index add option for silent builds security fix: replaced some strcat with strncat added warning if icsLogon file couldn't be opened adding gnu-readline support fixed some typos that were introduced during the sprintf->snprintf changes bugfix: fixed readline support with icslogon option fixed buffer size for snprintf Revert "bugfix: fixed readline support with icslogon option" Revert "adding gnu-readline support" added latest version of parser.c new developer release typo in date of developer release merged readme_HGM.txt into the NEWS file removed trailing whitespaces from NEWS added a desktop file fixed a typo in the configure script output replace hard coded paths with path from configure script added rlwrap tip to FAQ new developer release fixed automake process: xboard.conf couldn't be generated if $srcdir was not the current directory Updated copyright notice to 2011 release of version 4.5.0 updated parser.c form parser.l Eric Mullins (1): Changes needed to compile master branch. H.G. Muller (353): add fixed time per move to the WinBoard time-control menu dialog let the clocks run in -searchTime mode Some code refactoring and cleanup; one small bug fix Integrate castling and e.p. rights into board array; bugfix for EditPosition fix for new way of saving castling and e.p. information variation-support patch This patch gives a better handling of comments in PGN files, and adds the variation as comment to the main line on using Revert in local mode. fix castling rights when copying FEN to clipboard improve thinking-output for mulit-variant refactoring of engineoutput refactoring evalgraph code 1st step for moving option parsing from winboard to the backend 2nd step for moving option parsing from winboard to the backend same argDescriptor parsing for Xboard and Winbaord fix window positioning use linux style options for config file and add a system config file for XBoard restoring windows (EngineOutput and MoveHistory) on startup A better and more flexible way of invoking Polyglot improves the XBoard handling of the engine command line implements the eval-graph window for XBoard Suppress saving font settings. Correct XBoard default debug file name Delete old indirection settings-file code Make WinBoard defaults for -fd and -sd equal to "." rather than empty strings. Change format of -adapterCommand. Fix NoncompliantFEN defaults. Fix default castling rights on reading incomplete FEN Implement castling in -variant caparandom Fix castling rule assignment in shuffle games Let XBoard print version with argument --version or -v Improve layout of Engine #N Settings dialog Allow popup-less (fatal) exit of engine after tellusererror Allow Ctrl-C copying from EngineOutput window text to clipboard Harmonize declarations of XBoard and WinBoard Newly lexed winboard/parser.c Display PV on right-clicking board Display PV right-clicked from EngineOutput window Indicate squares a lifted piece can legally move to Allow editing of holdings in EditPosition mode Fix new args parsing of -lowTimeWarningColor Docs update for new features Fix omission in castling refactoring for ICS received boards Fix reading FEN castling rights for knightmate and twokings Fix parsing of O-O and O-O-O after FEN pasting in FRC Fix bug in XBoard PV display Add fixed-time/move button in XBoard time-control dialog Refactoring of move-history code Convert to DOS line endings Port game-list filtering to XBoard Move duplicat gamelist code to backend Allow to apply filter in XB GameList filter edit Use arrow keys in XBoard GameList for entry selection Refactoring of adjudication code Also adjudicate after user move Also allow user to claim by offering draw before his move Send FICS atomic claim to ICS if move creates draw after offer Use FICS atomic draw claim for sending move in zippy mode Fix width of filter field in XBoard GameList Save fonts in XBoard settings file per boardSize Fix bug in edit-position of holdings Fix of ancient WB bug: test integer option values for validity Refactoring of game-list-options dialog Game-List options dialog for XBoard Merge gamelistopt sources into gamelist source files Right-click refactoring, step I Right-click refactoring: step II Right-click refactoring: step III Remove stray dot from WinBoard makefiles Repair damage to -autoKibitz done by FICS atomic zippy claim Shorten autoKibitz confirmation on FICS Implement SeekGraph in XBoard Dynamic Seek Graph Use right mouse button to view seek ads Use squares for computer seek ads One-click moves Fix error that compiler does not notice Add promotions and e.p. to oneClickMove Let second click on piece make only capture, with -oneClickMove Observe a game in the background while playing Do not pop down Seek Graph on on-dot click Match handles with multiple titles for channel Chat Boxes Capture holdings of background observed gamer Allow recalling history in ICS input box with arrow keys Interface XBoard to GhostView file-browser dialog Fix right-edge spillover of Seek-Graph dots in WinBoard Allow ICS context menu to pop up a Chat Box on clicking handle Pop up ICS text menu with default item under mouse pointer Seek-Graph bugfix: disappearing output in ICS console Bugfix smart capture Handle display of PV that starts with other move than played Add upload of game to ICS for examining Make WB Chat Boxes wrap and handle URLs Allow arrow keys in WB Chat Box to access command history Make Chat Windows pseudo-tabbed Add -chatBoxes option to open Chat Boxes at startup Allow WB Chat Box to be dedicated to shouts and 'it' Let the sounds sound on receiving a message in a Chat Box Add option -shuffleOpenings Add Annotate item in Step menu Support playing through PGN variation comments Let yy_text determine progress of PV parsing Newly lexed parser in XBoard directory Don't disturb background observe when receiving new piece Insert autoKibitz continuation lines at end of line Allow walking a kibitzed PV Fix copying of kibitzed info in Engine-Output window Put newly opened Chat Box on top Repair settings-file name Repair background-observe patch Use side-by-side boards to display background game Create space in WinBoard ICS-options dialog Put new options in WB ICS-options dialog Group Chat Boxes with console in stead of board window Add option Display Logo in WB general-options menu Fix display of uninitialized boards in background observe Print seconds with 2 digits in backgroundObserve status line Redraw second board on expose events Mark non-compliant lines of engine in debug file Add kibitzes and c-shouts Chat Box Also capture (numeric) whispers of players for -autoKibitz Add -autokibitz checkbox to UCI-options menu dialog Display PV from Engine-Output window (XBoard) Fix handling username change during game Paint highlights on dual board (WB) Update XBoard docs Allow loading of PGN variations in XBoard Allow adjustment of clocks in any mode with shift+click Update WinBoard html help Update WinBoard RTF docs Change name of Global Settings menu item to Common Engine Settings Let WinBoard recognize ~ in settings file name as HOMEPATH Prevent closing chat box Fix disabling of Chat Box navigation buttons Let Chat Boxes pop up above console, rather than on top of it Fix crash on switching to ICS xiangqi game Suppress background observe for boards with own game number Allow any %ENVIRONMENTVAR% in WB settings file name rather than ~ Fix rep-draw recognition Allow escape sequences in telluser(error) messages Fix typos in html help file Update README file Alter XBoard key bindings to mimic WinBoard Fix engine stall on perpetual-check evasion Reverse mousewheel action Repair score printing with -serverMoves option Fix e.p. bug in xiangqi with -serverMoves option Ignore checks in 50-move count for Xiangqi Remove font settings from master settings file Adjudicate Xiangqi material draws with Advisor-less Cannons Remove misspelled prototype Remove duplicate testing for cores feature Fix oneClickMove bug Refactoring of material-draws adjudication code Add string option /pieceNickNames Define /firstUCI and /secondUCI as synonyms for /fUCI, /sUCI Suggest default file name in browser dialog Fix erors when compiling with --disable-zippy Add some book-control options Allow match to be started from WB menu Tricked by the grossnes Add -colorNickNames option Improved patch for expansion of WB settings-file name Fix some MSVC compile errors Update .dev files Trivial-draws recognition improved in Xiangqi Do not exit after match when match started from menu Mark XBoard result messages for internationalization Make the ID of all WB dialog items unique Internationalization for WinBoard Do not translate game-end messages in PGN Add some forgotten translation hooks Update docs Update WB translation template Make WB run-time language switch possible from menu Fix JAWS bug saying side to move in ICS play Prevent transmission of spurious promo char to other engine Allow parsing of upper-case machine moves Fix silent bug in drop moves Revert splitting of UserMoveEvent Extend legality testing to drop moves Extend mate test to drop games Strip DOS line endings from parser.l Make board-size overrule options volatile Make Shogi promotion zone board-size dependent Suppress spurious use of SAN castling in mini variants Pass promoChar to SendMoveToICS Remove promotion-piece encoding from ChessMove type Enhance multi-session TC clock handling Allow -timeIncrement to be a float Fix menu translation bug Fix uninitialized variable in book code Change evalgraph scale in drop games Limit multi-session clock handling to non-ICS games Inherit promoted-info that ICS does not give from previous board Adapt WinBoard to Shogi implementation on Variant ICS Fix WinBoard Lance bug Fix bug in ICS variant switch for Shogi Allow lower-case piece indicator in drop-move notation Allow full promotion suffixes on SAN piece moves Add option -variations to control variation-tree walking Disable some very verbose debug printing Implement -flipBlack in XBoard Add set of shogi pixmaps for XBoard Fix merging bug Make starting new variation dependent on shift key Complete WB (western) bitmaps for Shogi at size 33 Implement board textures in XBoard The -overrideLineGap option is made to work in XBoard Provide some sample board-texture pixmaps Make -flipBlack and -allWhite option volatile Let -oneClickMove also work in EditGame mode Make Knight hop first straight, then diagonal Suppress promotion popup if piece will explode Animate piece explosions in drag-drop moves and in XB Make deferral default in Shogi promotions Fix spurious promotions with legality testing off Bugfix for safeStrCpy patch for XBoard Bugfix safeStrCpy patch, WinBoard Augment moves of some fairy pieces Delete some stale promotion code Add the actual size-33 Shogi bitmaps Remove validity test on promochar from parser Make test for valid promotion piece color-dependent Remember values set by -firstOptions, -secondOptions Restrict use of a2a3 kludge Implement setup (engine-GUI) command Allow arbitrary nesting of sub-variations in PGN input Fix some warnings Use normal SAN for wildcard pieces Use SAN even on illegal moves Give Lance moves of Berolina Pawn Keep last PV while clearing engine-output display Fix bug in parsing illegal Pawn captures Newly lexed parser.c Let Engine #2 Settings start second engine Allow clicked name internal to the icsMenu command string Make safeStrCpy safe Restrict use of escape expansion List Hint with compliant commands List some undocumented commands as compliant Fix mouse-driver buglet Fix one-click bug Fix acceptance of null-move with legality testing off Add -variant seirawan to menu Implement variant seirawan Implement entering gating moves with mouse Use Falcon and Alfil as built-ins for Seirawan chess Accept Seirawan-style gating suffixes Fix one-click moving on up-click Fix home-dir crash Fix default holdings size for variant seirawan Fix safeStrCpy Fix safety crash when appending comments Define moves for Dragon Horse outside Shogi Make yyskipmoves also suppress examining of drop moves Change representation of Bede in variant fairy initial position Give Lance moves of Amazon in variant super Make Hoplite moves irreversible in Spartan Chess Reorganize WinBoard menus Reorganize XBoard menus Display error for wrong use of Machine Match Fix spurious scores in comments Revive Analyze File menu item in WB Let Analyze File annotate the loaded game Restrict drops in variant seirawan to back rank Bugfix XBoard menu translation Separate menu text from menu name in XBoard Adapt some XBoard menu texts Apply gettext macros to menu texts Fix Shogi promotion popup Let move-history window scroll to bottom after adding move Alter WinBoard menu text Divorce the Edit and Show Tags/Comment menu items Add XBoard key bindings for Revert and Truncate Update info on key bindings in texi file Update texi file for new menu organization Add description of Game List Options in texi file Alter descriptionof Analyze File menu item Improve drawing of highlight arrow Make WinBoard clocks translation-proof Configure -inc as volatile option in XBoard Configure XBoard to use wood board texture by default Write key bindings in XBoard menus Allow line-straddling result comments Peel PV out of comment Fix sub-variation display with negative score Correct the key bindings fo view menu in texi file Move Hint and Book items to Engine menu in XBoard Configure EGTB cache size in adapterCommand Also exempt variant seirawan from eval-scale doubling Fix fag-fell marker with logos on Let user decide if he wants highlights in blindfold mode Strip CR from xboard.c Port highlighting with arrow to XBoard Configure arrow highlighting as default in XBoard Provide menus for editing WinBoard engine and server lists Add XBoard menu items for arrow highlight and one-click move Fix Edit Game/Position checkmarking in WinBoard Use default logo for user Add handle for translator acknowledgement Create space in dialogs for translation Add one-click move control to WB general-options dialog Resize buttons in WB engine-settings dialog Update translation template Subject WB context menus to translation Fix duplicate menu character for Edit Comment Put OK/Cancel last in tab cycle of some WB dialogs Remove tab stops on first radio button of WB dialogs Change tabbing order in WB sounds dialog Fix order of elements in WB time-control dialog Reorganize order of WB New Variant dialog controls Fix ICS context menu for JAWS Translate menus after creation of JAWS menu Adapt JAWS menu to new menu organization Let JAWS SayString buffer full sentence Subject JAWS menu and spoken strings to translation Update WB language template file Put nr CPU earlier in tab cycle of WB Common Engine dialog Group engine-output memos with engine names Disable some accelerators in JAWS version Allow starting a variation from keyboard entry in WB-JAWS Define Ctrl-R as right-click in WB Comment dialog Fix bug in parsing variations Fix WB promotion popup Fix promotion of Pawn-like Lance Fix promotion suffixon disambiguated piece moves Fix mate test Add variant Spartan Chess Fix spurious reading of old game title by JAWS Fix chat window title Fix right-alignment pproblem in WB ICS window Fix WB font-based piece rendering on variant switch Fix Spartan promotion to King Show move that causes false illegal-move claim Reset win/loss counters before match Reset machine colors after match Fishy fix Fix time in PGN info Fix logo repainting Reset 50-move counter on all pawn-like Lance moves Fix legality testing for promotions Fix move type-in truncating game Fix type-in of drop moves Fix spurious mate test in Edit Game mode Remove superfluous copying of machine move Re-instate load next/prev position menu items Fix WB Sound Options greyout and remove some grossness Fix legality testing of drop moves Move clock-click code to back-end Greyout unavailable variants in New Variant dialog Update texi file Update RTF file Clean up fishy patch ** Version 4.4.4 ** (git shortlog --no-merges v4.4.3...HEAD) Arun Persaud (1): updated version number to indicate development on 4.4.4 Clint Adams (1): Remove unnecessary double equals from configure.ac. H.G. Muller (18): Let move parser return ImpossibleMove for off-board moves Prevent engine stall on perpetual-chase evasion Fix bug in sending "usermove" when forcing book moves Pop down old tags on loadng new game in WinBoard Fix game end during dragging Repair animate dragging Fix bug in sending cores command to engine Fix parsing of SAN shogi promotions Fix variant switch on PGN loading Cut board squares out of texture bitmap more cleverly Allow -flipBlack to work with font-based piece rendering Allow font-based piece rendering in board sizes below petite Fix WinBoard game-list title Fix deadlock in match-result display Fix regression in colorization of zippy-matched commands Fix zippy handling of draw offers from ICS Make some more zippy code obey the --disable-zippy flag Repair exit-popup deadlock patch ** Version 4.4.3 ** (git shortlog --no-merges v4.4.2...HEAD) Arun Persaud (11): updated to unstable version number added missing sounds files to be able to compile on windows new developer release update year in copyright info DOS line endings and 644 mode for woptions.c updated files (AUTHORS, Changelog, etc) for new release new developer release added logo files for xboard new developer release updated winboard/parser.c release of version 4.4.3 H.G. Muller (40): Implement castling for variant CRC Chmod 644 Bugfix legality null move in parsing with -testLegality off Fix bug for incommensurate time odds Make WinBoard makefiles use parser.c in XBoard directory Fix piece-to-char table -variant fairy Fix TwoKings ICS castling-rights bug Fix reading castling rights FEN in knightmate and twokings Fix OO-castling in FRC after pasting FEN Accept for changing chat partner Use -keepAlive option to determine connection health Fix of ancient WinBoard bug: check value of int options Fix bug in display of logos Remove stray dot from WinBoard makefiles Fix u64 format for cygwin Send continuation lines to chat box they belong to Fix highlighting bug in XBoard Extensive bugfix of -autoKibitz Remove race condition in clock switching Add variant Makruk Change opening array -variant fairy Match handles with multiple titles for channel Chat Boxes Bugfix stale first-click Start insertion point at end of text edits in XB dialogs Fix copying of WB Chat Window contents Bugfix of autoKibitz and Chat suppression in ICS window Fix XB crash on giving keyboard focus to non-text widget Bugfix copying from Chat Box, own lines Fix 'mamer bug' in Chat Boxes Make signedness of castling rights explicit in function arguments Fix copying of kibitzed lines from WB Engine-Output window Do not recognize non-ICS variants from PGN event tag Remake programVersion string after receiving engine features Set keyboard focus at startup to board window Fix window-position upset on failing engine start in WinBoard Fix info lines being used as normal thinking output Correct error in texi file Allow lower-case promochar in moves of type h8=Q Fix Alt+M JAWS command in Two-Machines mode Fix JAWS piece drop cursor, and streamline some sentences ** Version 4.4.2 ** (git shortlog --no-merges v4.4.1...HEAD) Arun Persaud (7): updated version number to unstable added missing library for build on OS X add Winboard source files into tar-ball removed files that should only be in the windboard directory fixed build on openbsd new developer release fix for bug #28077: xboard needs to link against x11 H.G. Muller (19): cleaned up some debug messages and typos fix crash on engine crash fix casting rights after FEN pasting the last move before the time control now gets its time listed in the PGN fix double start of zippy engine after switch to gothic fix declaration of engineOutputDialogUp fix engine-sync on move-number type-in bug removing some rather verbose debug messages that seem no longer needed. fix bug in bughouse drop menu use xtell for talking to handles, but tell for talking into a channel. fix the irritating wandering off of the MoveHistory window in XBoard on opening/closing. fixed some outstanding pixmaps Fix castling rights when copying FEN to clipboard (again) score sign in analysis mode correctly apply some check boxes from the option menu updates makefiles to include dependency on config.h fix problem with empty string in -firstNeedsNoncompliantFEN double buffer size to prevent overflow remove trailing \r in xboard output ** Version 4.4.1 ** (git shortlog --no-merges vold...vnew) Arun Persaud (24): get "make distcheck" to work reverted .texi file and fixed Makefile.am fixed a few more small bugs reported by Stanislav Brabec fixed some implicit declarations reported by Stanislav Brabec added some more files to be distributed via make dist another bug fix found by Stanislav Brabec more files for git to ignore updated cmail.in to adapt the CVS->git change wrong default value for engineDebugOutput updated version number to 4.4.1.pre getting ready for 4.4.1 release bugfix: segfault when invalid option argument was given (bug #27427) added some comments and formated code cleanup: removed "#if 0" from source cleanup: removed "#if 1" statements cleaned up an old #ifdef in zippy removed AnalysisPopUp. Use EngineOutputPopUp instead forgot to add these two lines to the last commit new alpha version; first one with new naming scheme fix for bug #10990: cmail does not seem to support .cmailgames or .cmailaliases new pre-release version; updated version numbers unguarded debug printf. added the appropiate if statement fixed a regression reformated html to be correctly validated Chris Rorvick (1): fix printing out help message (list of command line options) (tiny change) Eric Mullins (31): Swapped 'tell' and 'message' parsing order for colorization. Sometimes messages are relayed as tells and should be colorized as tells. Use of strcasecmp() broke Visual C++. Add resource ID for new Mute menu item. Previous fix for VC++/strcasecmp() was wrong-- use StrCaseCmp(). Added wchat.c to the project files we maintain. Fixed bug dereferencing garbage, causing crash. Simplified future version changes. removed _winmajor if not defined so that VC 2008 can compile the project Updated navigation accelerators, fixing ICS problems. Added URL detection into the console text window for ICS. reverted winboard.c beofre URL commit to correct whitespace conversion added URL detection and provided hotlinks in the ICS client Restructured URL code so it fits better with how winboard is set up. Cleaned up ConsoleWndProc (not complete, see below) added ics_printf() and ics_update_width() and utility functions Added width updates to ICS client on font and window size changes added code to handle initial width update vsnprintf() must be _vsnprintf() for MSVC Turned off wrap when possible on ICS servers. Added code to prevent unnecessary width updates. Adjusted alternative joining method to obey keepLineBreaksICS Maintainence to support all compilers. silence some compiler warnings Added server width adjustment based on client width changes neglected this for the auto-width updating in xboard Fixed joiner detection, allowing it to work with timeseal Adjustment to joining to work around server not always including space. Added internal wrapping ability. Moved SIGWINCH signal so it can be used... Changes to allow fonts with any charset (such as terminal) Updated compiling instructions. H.G. Muller (77): added a chat window to keep track of multiple conversations fixed the HAVE_LIBXPM-dependent compile errors allow the result comment as a display item in the game list fixed parse bug for pgn files fix for keepalive and chat window rewrote wevalgraph for better frontend/backend separation added the result comment to the game-list tags when the game list is exported to the clipboard Prepared a system to internationalize the WinBoard menus Made the beep sounds for JAWS board navigation configurable through command-line options Updated the RTF docs for the chat windows, engine-settings dialog, /keepAlive option and new game-list tag added a "Mute All Sounds" item in the WinBoard Options menu, on Eric's request Opening Engine #1 Settings crashed XBoard when there were no text-edit options in the dialog (to which to set keyboard focus) Engine did not start playing when out of GUI book on second move with white fix for edit-position "moves" being sent by XBoard to the engine bugfix for protocol extensions: egtbpath -> egtpath small fixes for the JAWS version fixed loading of saved games via command line worked on premove bug new forceIllegalMoves option updated to winboard internationalization scripts small improvement for JAWS version added forceIllegalMove to xboard fixed premove recapture problem;promotion popup appearing on obviously illegal moves; promotions in Superchess and Great Shatranj removed test for premove fix for bug #27642: Clock jumps strangely in engine mode fix joining of lines split by ICS Added a command-line option -keepLineBreaksICS true/false to control line joining. changed enable menus fix for bug #27666: naming of variants fix for bug #27668: e.p. field still not passed to engine Proper board and holdings size when switching to variants gothic, capablanca, great and super within an ICS game. new bitmap converter (including fill option) and new pixmaps fixed wrong number of arguments for EngineOutputPopUp moved bitmap to correct location fixed engingeoutput routine updated black fairy pieces new mousehandler to correct for premove and promotion popup fixed segfaul in convert.c used to convert pixmaps fix for bug #27751: negative holding counts displayed fixed bug reported in WB forum: second game of a match would not start when using the GUI book partly fix for bug #27715: scaling of menu bar fix for bug #27667: window should be reference to toplevel smarter analysis of the boards that XBoard receives from an ICS fix for bug #27760: debug printf in backend.c and additional check for variant fix for bug #27667: PV line missing in analysis window, part 3 fix for bug #27715: 2 (minor) graphic issues fixed bug when switching to variantsuper allowe parsing / disambiguation of SAN moves like Xe4 in certain situations fix for bug #27772: holdings not updated better init for random number generator fix for bug #8847: moving backward while examining on FICS not reported to engine improved mouse handler holdings update and regression fix NPS plays and pondering improved mouse handler fix to the minor graphics issue contained some typos, as was remarked in the bugs reports This patch adds to the characters that cause an automatic switch to the ICS console when typed to the board window. fixed some bitmaps removed bitmaps files that are not needed any more replaced defective bitmaps with copies from 4.2.7 removed unused v54?.bm bitmaps from resource file The book-probe code forgot to close the book file after opening it. fix for bug #27799: fix for nested-nested-nested variations fix for two compiler warnings fixed bug related to unsigned char in convert.c fix for bug #27790 and 277772. force full redraw in winboard more work on variant switch another bug in VriantSwitch: an unitialized board was printed. removing empty lines from ICS play changed stderr to debug output, since stderr is closed in winboard quick fix for "White Mates" in parser.l fixed jaws version fix for bug #27826: ported two options to xboard fix for bug #27826: fixed autoDisplayComment switch focus to the board after loading a game prevent buffer overflow Tim Mann (6): Fix some issues in the XBoard man page Fix up man page some more Silence warnings when compiling 64-bit xboard Drop an obsolete script that was only used to update my personal web site Make copy/paste position and game use clipboard, bug #27810 Further copy/paste fixes xboard-4.7.3/TODO0000644000175000001440000020071412262415351010416 00000000000000Possible improvements **=somewhat higher priority --------------------------------------------------- 20. Some way to back up, explore variations, then return to the main line and restore moves we backed out. Should also support exploring side branches while loading a game file. Push/pop buttons? Button to fork another xboard in same state as current one? 20a. Allow side branches to be remembered in game files (and understood on LoadGame). Use PGN variation notation. **62a. Support series of time controls as in later gnuchess 4.0.x versions (and real tournaments!). Needs a protocol extension to "level"; this is now planned for protover 3. 62b. Perhaps we could also support the kind of clock where you get K seconds per move, plus a reserve of J seconds per game that is used when a move takes more than K seconds. The degenerate form of this with J=0 is desirable in itself. Needs a protocol extension. 68. WinBoard has some features not in xboard. Among others: 68a. LoadGameOptions dialog (good to add) 68b. SaveGameOptions dialog (good to add) 68c. TimeControl dialog (good to add) 68g. Font dialog. (leave out) 68h. Colors dialog. (leave out) 68i. Board size on Options menu (good to add) 68j. Resize with mouse 68k. Highlight dragging 68m. Move typein from keyboard. (good to add) 69. xboard has some features not in WinBoard. Among others: 69c. Font size selection by pattern fill-in. (leave out) 69d. Alternate bitmaps specified at runtime. (good to add, often requested) 69e. Flashing. 71. Allow restart after ICS logout instead of exiting? Many requests for this. 71a. Would be useful to drop into NCP mode after ICS logout and allow for reconnect later. For instance, this would let you save your last partial game if you didn't have autosave on. 72. Allow switching among ICS, NCP, GNU modes?? 74. Observe/play multiple games, each with its own window. Hard. 80. Clone command. Saves current game to a file foo, then starts up another copy of xboard with -lgf foo. Should probably note current state of some options and give command line flags to set them the same way in child. What about -ncp mode, though? Might want that to be different. Would be nice to have a -moveNumber flag to position the child to the same move number in the current game. 91. Would be nice to have an option to overwrite save file instead of appending. 95. "Have the clock indicate how long the computer/player has been thinking for when the -st option is used. This should be how long for the current move only." (Dino Dini) 97. "Have the ability to change the level of the gnuchess during a game. For analysis purposes, sometimes it is useful to have the computer think really hard about certain positions." (Dino Dini) 98. Reorganize the source and split it into more files. 107. Changing time control during a game could be made to work. Current (WinBoard only) way of changing at start is suboptimal. **108. Could add search depth and time per move to (WinBoard) TimeControl dialog. 140. LoadPosition needs better checking for invalid data. 142. xboard needs a real file chooser dialog. Jeff Woolsey submitted code to merge in the one from Ghostview, but said it works only on X11R5 or later. I have not yet tried his code or looked to see if it could be made to work on X11R4. 147. Improve display of held pieces in bughouse mode, putting them closer to the player's side of the board, and perhaps using icons (and allowing dragging from the icons to drop a piece). Actually, moving the clocks would be beneficial too, so that it's easier to visually associate the right clock with the right player when looking at two boards during a bughouse match (with two copies of xboard running). Maybe multiple window layouts should be user-selectable. [4.3 supports drag-drops from holdings] 150. Keep track of castling availability, en-passant availability, and FEN half-move clock (for 50-move rule), pass the availability information to the move generator through the existing interface, and load/save it in the FEN code. [Fixed in 4.3] 150a. Note that not keeping track of ep creates a bug in mate detection. In certain positions, moving a pawn from the 3rd to 4th rank gives mate, but it is not detected because if the pawn had moved to the same position from the 2nd rank, ep capture would have been legal and there would be no mate. [problem disappeared in 4.3] 150b. Note that although we try to put in e.p. availability when writing FEN, this works only if we have the move that got us to this position in the moveList. If we load a position from FEN, the e.p. availability field of the FEN is lost. [disappeared in 4.3] 152. Generate the info file, man page, perhaps html, and perhaps even the WinBoard help file from the same sources. Right now, substantially the same text is duplicated in three places. This is a huge pain in the neck. 157. Idea: if Zippy flags some number of times in a row and keeps getting told the opponent is not out of time (presumably due to timestamp/timeseal), he should issue an adjourn or abort. 160. The xboard CTRL key flashback feature is bad in Analysis mode. Flashing back throws away the analysis. 161. SIGINT doesn't work for local programs on Win32. There is an equivalent, GenerateConsoleCtrlEvent(CTRL_C_EVENT), but I haven't gotten it to work thus far. It seems that WinBoard and the chess engine don't "have the same console"; indeed, neither has a console. 162. Supply a non-X Zippy for Unix. Perhaps use the code from Klaus Knopper. 167. Alternative bitmaps loaded at runtime for WinBoard. [font-based piece rendering provides this functionality since WinBoard_x] 169. Upload Game on file menu? This would upload the current game moves into a scratch examined game on ICS. Could do Upload Position too. Some code to do Upload Game was contributed, but it didn't handle setup positions, variants, checking for proper gameMode, etc., so I couldn't use it. 170. Auto step every k seconds should be a general feature you can turn on at any time, not just in LoadGame. What should GUI be? 171. Displaying thinking in a separate window should be an option available at all times when Show Thinking makes sense, not just in analysis mode. It should perhaps be orthogonal to analysis mode. [added in WinBoard_x] 172. Should analysis window scroll instead of showing only the last line? There could be an extra checkbox to show all chess engine output in it. [fixed in WinBoard_x] 178. Need reliable kill for chess engine on Win32. See also 161. 181. Some people want -sgf to save only played games, not observed and examined games. Others like it to save them all. Make this an option? 183. Search feature in Game List dialog [Igor Eged]. 187. "Log session" feature for ICS window. 193. Some users have reported xboard redraw bugs, but I have not been able to reproduce them on the Digital Unix, Linux, or eXcursion X servers (xboard). c. From Hawk: Dragging in xboard does not work 100%. * The dragged piece may disappear (try some fast e2-d3 movements - this is easy to reproduce). * The dragged piece may be placed on an illegal position (this happens less frequently, but it _can_ be reproduced by doing the same as above). * In both of the above cases, the board is correct after forcing a redraw (ie. minimizing/restoring the window) I'm using eXodus - a win32 X server, perhaps it's buggy. [Seems that way, or just possibly, these could be bugs that are fixed in 3.6.11beta or 3.6.12beta.] d. One user reports: "If you are 'holding' a piece over the square you want to go to and that move becomes illegal but you make it anyway, the display sometimes corrupts and a partial piece appears..sometimes a whole piece." This was under RedHat 6.0. 194. A few users have reported drawing problems with WinBoard. There may be some color map problem on certain displays. I might possibly have fixed this already; I cannot reproduce it. The common thing seems to be black pieces changing to white. This may depend on having customized the board colors. I suspect many of these problems are buggy Windows drivers for particular display cards. (May be worked around in 4.2.0 with reprocessed .bmp files.) a. From mulesmurf: if i log in and then move the board, it will happen that the black [pieces] change to white. c. People have sent pictures where the grid didn't get redrawn. This produces random bits in the grid area from uninitialized memory. Could this be a resource leak? d. From James Van Buskirk: I did notice one problem tonight playing against Comet under FX!32 1.2 (Comet, not winboard ran under FX!32): for a couple of moves winboard didn't turn off the highlighting of the square I dropped the piece on until Comet had moved. Later, the problem fixed itself. Have other users noticed this? [No.] e. One user reports: Lastly, there is some sort of slight bug in the piece dragging code, but it comes up only very occasionally (once in 500 moves?)...basically, I'm dragging, change my mind, throw the piece of the side of the board, and instead it gets stuck not inside a square. It's really disconcerting, this piece just sitting across square boundaries. When you make another move, it gets cleared up and goes back where it's supposed to. [Might be fixed in 4.0.6, but I couldn't reproduce this, so I can't be sure.] f. DAV says: "When I resized the board on win 95 and made it smaller some of the pieces turned into junk (I'm not able to give a screen shot)." Later: "Seems to happen on the three sizes below small. Win98 and NT seem to be ok, trying to get more win95 users to test it." Works fine for me on Win 95... [Might have been fixed by the cleanup of the Windows .bmp's that happened sometime before version 4.2.3] 195. Flash Moves works at the end of every change to the board, using some rather gross code in DrawPosition. This code should perhaps be ripped out and the flashing done from inside AnimateMove instead. 197. More color distinctions. Maybe allow several user-selected channels to have their own colors. 198. More sounds. Some possiblities: distinguish White vs. Black move or your move vs. opponents, distinguish different kinds of win/loss/draw/unfinished (checkmate, resignation, stalemate, other draws, opponent disconnected, etc.), game ends when you aren't playing and/or aren't in ICS mode, differentiate amongst requests (draw offer, etc.), **check, got new offboard piece (by piece type?), opponent got new offboard piece (ditto), arrival notification, "* who has an adjourned game with you," draw declined, moretime received. 199. Maybe put user names instead of White and Black on clocks, or user names above or below clocks in a smaller font. 200. I don't like these ideas, but some people do: a. Highlight all of the squares that the piece you are moving can go to. b. Clicking on the piece moves it immediately if it has only one legal move. c. Allow clicking on the destination, then the source. d. I guess highlight the pieces that can go to that destination. e. Clicking on a destination that only one piece can go to moves it there. 201. mulesmurf: piece counter so we know exactly the score 202. mulesmurf: ziics pieces, board along with color intensity 204. Hawk at Fri May 15, 12:58 CDT 1998: a minor thing with xboard: the coords disappear while dragging from a square with coords on it. [They come back when the drag is finished.] 208. WinBoard sometimes comes up with one of the menu bar items grayed out (one that should not be). I've seen this on different entries at different times. 213. Maybe add Silence to sound menu -- parallel to Monochrome on color menus. 214. Maybe easier startup dialog customize: a. Buttons to add/delete/move(?) current string to/from/within current list. b. Or maybe auto-add newly typed/edited strings up to some limit. c. Also a drop-down for Additional Options. 216. Maybe shorten menu names in WinBoard to one char if and only if the menu bar would wrap with longer names. **217. Easier way to add engines to the WinBoard startup dialog. Ideally, an engine author should be able to supply a simple configuration file or script that installs his engine. "*.wbe" idea. 218. Some folks would like Highlight Last Move to apply only to opponent's moves. 219. From Jorge Monasterio: Support automatic game starts when in tournament. In other words, do that "match bigolfish mann 5 0 black" automatically based on the info sent from mamer. [I would need to play in some tournaments before I could evaluate this idea or fill in the details.] 222. Could support time handicaps. [Added in 4.3] 223. Bug: very long comments cause buffer overflow. Need to revamp the way comments are parsed and returned from parser.l to fix this. 224. Larry Parrish requests: In an automated multi-games match I would like to load the n-th game from the file for the n-th game of the match. [That is, when -mg and -lgf or -lpf are used together without -lgi or -lpi.] [4.3.15 provides auto-increment og game and pos index] 225. From pulp: another bug (maybe with the Microsoft RichEdit control) I've observed is when you flood the edit control it loses the bottom. Eg. "games" will scroll along then start slipping until by the end of the list you are really looking at the middle of the list and have to manually scroll back to the bottom. [May be fixed?] 225a. Resizing the WinBoard ICS interaction window can cause the cursor to be off the screen, which stops scrolling. 226. From pulp: Clipboard persistence. If I copy text, then the text disappears when Winboard is closed. Eg.: Log in, highlight and copy a web page address, close, go to browser, paste *nothing*. [How does one do this in Windows?] 227a. In engine-engine matches, an engine that crashes should lose and perhaps get restarted for the next game. [In 4.3 a crashing engine forfeits the game, but still terminates a match.] 227b. Maybe when an engine playing in Zippy mode exhibits a bug, we should do a little more too. Perhaps "say Sorry, the engine seems to have a bug", resign or abort, and maybe force an engine restart for the next game. **227c. We should also detect and stop the game on false mate or draw claims, rejecting a legal move, or (maybe) missed claims of mate or draw. Note that draw claims require checking for repetition, 50 move rule, and insufficient material as well as stalemate, so this is nontrivial. [Added in 4.3] 228. RichEdit bug: sometimes a line gets indented as if it were wrapped when it should be flush left. **229. Support for sending moves from the partner's game to a bughouse engine. Ben Dean-Kanemura submitted support that works without adding general multi-game support, by relaying the moves without processing them. Should also send holding updates and clock times; not sure if Ben's code does that. Needs to be a new "feature" command option, and to be documented in engine-intf.html, removing the note that this may be done in the future. 231. See Ed Collins's WinBoard bug list on his pages: 231b. If you save an ICS examined game to disk as a PGN file, it doesn't report the end-of-game result in both the header and at the end of the notation. [It doesn't get this info from the server, but maybe there is a way it could.] 232. From Ed Collins's WinBoard wish list on his pages: 232b. Multiple winboard.ini files for different moods, loadable from inside the program. 232c. Fix bug where fics% prompt is not suppressed when using timeseal. This has something to do with a timeseal deficiency whose details I've forgotten, but there must be some way to fix it. 232e. When using the server's "examine" mode to examine a previously played game, have the game clocks display the time that each player currently had after each move was made. 232f. [Not from Ed] Deal with ICC game relays where an "examined" game is supposed to have running clocks. Not sure if this is still an issue. 232g. Customizable on-screen buttons [i.e., toolbar or toolbox]. 232h. Customizable function keys. Currently xboard can bind a key to any built-in xboard function. Should extend this to WinBoard, and also (in both programs) support sending an arbitrary ICS command when button is pressed. 233. See if anything from LightningRulez should be added. Premove is now included (from Winboard Plus), but maybe there are other useful things too. 241. There might still be bugs in xboard and/or winboard when moves come in from ICS during drag animation, though I can't reproduce them. DAV saw the opponent's piece fail to be erased from the source square, if I understood his message right. [DAV says this still exists in 4.2.5. I think bug 426 is a duplicate. The description is clearer there.] 242. User-defined "looking_at" patterns and actions. This is hard to bombproof. **243. "Rematch" shortcut in /cp mode. 246. Maybe auto-close comment window when user goes to the next move. Whether this is desirable really depends on the content of the comment, but maybe it is rare to have a long comment that discusses the plan several moves ahead and should be left up. 248. Would be nice to support retract move after checkmate or draw (etc.). 254. Different tray icons for interaction window vs. board (suggestion from FICS). 256. One user asked for "delete" option in game lists. This requires rewriting the file to close up the hole, so it's pretty heavyweight. Next people will be asking for move, sort, search, and other game database functionality; ugh. **257. Would be nice to find a way to safely implement "retract move" when the engine is still on move. (using ping/pong) **260. General mechanism where engine can declare engine properties that the user can frob and xboard/winboard will put up a simple dialog to allow user to view and set them. See email message "special engine commands" from Steffen Jakob: From: "Steffen A. Jakob" To: mann@xxx Cc: chess-engines@xxx Subject: special engine commands Date: Fri, 26 Feb 1999 09:12:26 +0100 Hi Tim! Here comes a summary of our ICC chat (I cc this mail to the list... maybe other engine programmers can give some feedback if they find this feature useful): Please add a protocol command which enables the engine to tell xboard its special commands. Maybe a set of (label, command string) pairs would be useful. Then create a menu for these commands. It could look like this (that's what I would like to see for Hossa): engine->interface: ------------------ command "Reset the log file" "reset log" command "Save Diagram as PNG" "png dia.png" command "Disable Book" "book off" command "Show Evaluation details" "eval" command "Show Search statistics" "stat" etc. While typing this list I realized that an additional parameter like this would be needed/nice (of course you can think of many more improvements): command "Save Diagram as PNG" "png %s" 1 "1" tells xboard to ask for an additional parameter (here: filename) which will replace the "%s" in the command string. [XBoard 4.3.16 has an experimental implementation of this ide through the 'feature option="..."' command.] 261. Check that "quit" is sent to engine properly if ICS connection fails to open due to error from timestamp/timeseal. "wzrdking" had a case where it didn't. Timetamp had failed with "Host name not found by name server" (because in fact there was no internet connection, arrgh). 273. Displaying the names of the players from a PGN file in the header of the window does not work if there is only one game in the file. The filename is shown instead. (This was intentional, but maybe a poor idea.) 274. Command to go to move number N, with entry box for N. 276. Make grid optional in winboard? Note that the highlight options don't work without it. [The Winboard_x -overrideLineGap option provides this.] 276a. Make color of grid an option, instead of always black. 277. Flooding xboard -zt + timestamp with tells hangs timestamp after a while. xboard is blocked writing to the timestamp pipe. timestamp is in an unknown state, not reading from the pipe nor responding to pings. (Confirmed with the software running on milwaukee, Red Hat 5.2) 278. Flooding winboard -zt + timestamp with tells hangs winboard after a while. timestamp still responds to pings. This reported by nudnick; I haven't tried to reproduce it yet. He also says that windows explorer then crashed when he tried to close winboard. 279. Idea from an anonymous ICSer: piece drop menu could have images, not words. [Or maybe both?] Also might be easier to select accurately from it if horizontally arranged, or in a 3x2 grid. [Now 4.3 has drag & drop, piece-drop menu should be deprecated] 284. dxterm hangs when it receives the escape sequence that sets the title bar on xterm. I think some other xterm substitutes do too. **287. WinBoard can look funny if you are using themes because it unconditionally uses white for certain colors instead of the default background. 289. Merge WinBoard support for the Henter-Joyce JAWS screen reader. Source code (zip file containing modified WinBoard 4.0.2 source) is at ftp://ftp.henter-joyce.com/users/hj/winboard/WinboardSource.exe. It would be interesting to make this work with festival (free Unix speech synth) or other speech synthesizers too. 290. Could have limited voice output without a speech synthesizer by playing wav files for piece names and square numbers. Idea suggested by Hannu Wegner. 291. Would be great to support DGT, Novag Universal chessboard, etc. I'm not likely to fork out the cash to buy either for testing, however. Note users have done various things along these lines. 292. When an engine is analyzing, it would be cool to have a way to automatically play out its current PV (or even older ones) on a board. These PVs could be saved as variations when we have variation support. 297. Windows users expect all programs to have a Print function, even though there are other ways to print. Useful items to make printable: PGN game scores (which are plain text, of course), maybe FEN position diagrams, maybe graphical position diagrams (i.e., same as pressing the "Print Screen" function key and printing the clipboard). 298. One user suggests that automatic move stepping should not start until you press OK in the tags window. This could be a good idea, but I think I'd rather have automatic stepping never start until you press a "play" button on the main window, and have that button always available, not just when loading a game from a file. 299. One user suggested being able to jump to a specific move by typing its number (followed by ... if it's to be black's move). 300. Can I put a hyperlink (that will invoke a browser) directly onto the WinBoard Help menu or in the Help file? Useful to take users to my chess page. 302. On NT, check if the board is redrawn properly when exiting from the screen saver. 308. There is some tricky way to maximize the WinBoard board window, although there isn't supposed to be. Maybe prevent this, or else legalize it and make sure something reasonable looking happens. Note: the trick is to select one of the "tile" options on the Windows task bar. Not clear what should happen in this case. 309. Avoid endlessly flagging every second when opponent is lagged out and autoflag is on. Automatically courtesy-adjourn (or abort if unrated) instead, at least if in zippy mode. 310. Weird bug: the last character of a FICS output can appear on the next line, *after* the fics% prompt, according to one user. I might have seen something like this myself once too. 314. One person wanted his engine to see tells when running in Zippy mode. I doubt this is generally useful, so I haven't added the code I wrote for him. (I can query for "tellfrom" in my mail file to find it.) 314a. Another person wants his computer account to relay tells to his personal account. 319. One user would like to be able to reload a PGN file and resume a game against an engine as if after an adjournment, with the clocks (and moves to next time control) restored as they were when the game was saved. 320. Display ratings of ICS players in the title bar (if there is room, presumably), or somewhere, anyway. 321. Maybe refresh the EditTags window if the gameInfo changes and the window is up. (WinBoard now does this when entering MachineWhite, MachineBlack, or TwoMachines mode -- not very general. From Winboard Plus.) 322. One user requested that Zippy games use the engine name instead of the ICS handle in the PGN tags, as he uses multiple engines on his account. (My response was "I'd say it should give both"; not sure just how to do that, though.) 324. I'm told that Blitzin supports animated dragging without holding down the mouse button and that this is "much better" and I should try it too. As yet I haven't. 326. Full support for variants and variant-capable engines in all modes, not just ICS mode. Here are some items still needed. Some if not all should probably wait for a rewrite, not be added to the current code base. [4.3 supports many variants, even those not supported by ICS. Not bughouse, though] 326a. Menu to let you see and change the current variant type, not just a command-line argument as at present. [Added in 4.3] 326b. crazyhouse: Keep track of holdings and display them, keep track of what onboard pieces are promoted so they will revert if captured, understand offboard interposition to stop mate. [Added in 4.3, (not sure about the interposition)] 326bb. One user asked for a Czech variant of crazyhouse where pawns are given to the opponent when they reach the 8th rank (after capturing, if it's a capture) instead of promoting. 326c. bughouse: Features in 326a would be helpful for editing one board of a bughouse game, and getting mate indication right even in ICS mode. In the longer term, could understand BPGN, support editing two-board games. 326d. wildcastle: Allow wildcastle castling only when playing this variant! Maybe support automatic shuffling for local play. [4.3 adds shuffling for any variant played locally] 326e. nocastle: Maybe support automatic shuffling for local play. Note that several types of ICS shuffle chess fall under this variant. Note that this isn't really a variant, since if we kept proper track of castling rights and used "setboard FEN" or the ChessBase extension of "edit" to set them, it could be treated as normal chess with a different starting position. 326f. fischerandom: Maybe support automatic shuffling for local play. Support castling. Currently, you can probably play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window, but they will not be animated correctly, and saved games will not be loaded correctly if castling occurs. FR castling is problematic because the move cannot be specified by the starting and ending coordinates of the king; in some starting positions there is a legal non-castling move that moves the king the same way. This violates a deeply ingrained assumption in the implementation. It also breaks the GUI -- you need more than just dragging the king two squares to indicate castling. (Note: In FR notation, O-O is h-side castling, O-O-O is a-side. See "help fr_rules" and "help fr" on FICS for rules.) [All fixed in 4.3] 326g. kriegspiel: Could give some thought to how to support a kriegspiel engine. I doubt anyone will ever write one, though. 326h. losers: Know that captures are mandatory. Understand the win condition. 326i. suicide: Know that captures are mandatory. Understand the win/draw condition. 326j. giveaway: Know that captures are mandatory. Understand the win condition. 326k. atomic: Understand the win condition. 326l. 3check: Understand the win condition -- ugh, have to keep a check counter! 327. Option to set the coord font color (or something) to make sure there is always enough contrast with the square colors. 329. Bernhard Maerz would like a command line option to choose the PGN player name for an engine, overriding the default of generating the name from the engine filename. This is for his ChessCall program. 331. Maybe the local autoflag menu option should *also* turn server-side autoflag on/off by sending an appropriate set command. **332. Bug: Autoflag for local engine/engine or engine/human matches does not recognize that having your flag fall when your opponent has insufficient mating material is a draw. It counts the flag fall as a loss. [Partly fixed in 4.3, which corrects any kind of losses against a bare King to draws.] 336. Of course lots of people ask for a graphical seek window. 339. There are probably some incompatibilities with chess.net, as they have made a few gratuitous changes to message formats from the FICS code base they started with, and perhaps they've added features since without duplicating the syntax closely enough. In particular it's been reported that Zippy does not correctly send "partner" and "variant" commands to bughouse engines on chess.net. Also, I doubt colorization works. As a matter of personal choice I do not spend any of my time supporting chess.net, but if others want to donate patches that allow chess.net to be supported without breaking the support for ICC and FICS, I am willing to install them. 342. Analysis mode automatically turns on the Show Thinking option; the user must then turn it off manually after leaving analysis mode if he doesn't want it. 343. Would be nice to change xboard keyboard shortcuts to not be plain letters, make the new shortcuts work also in the ICS input box, and make typing plain letters to the board redirect to the ICS input box or the xterm. Might want to change/remove the Ctrl binding at that time. 344. One user suggested having a way to save a position as a character string that would produce a board diagram when rendered in MS Word in a chess font. Perhaps there is already a nice standalone tool for this, though? 346. Could use a better way to pick default size. Now we choose the largest that fits on the screen, which is typically too big. Not too bad for WinBoard, but painful for xboard since it can't be resized after starting. 349. Check that "quit" definitely makes it to the engine before exit, if you exit via the File menu while a match is running. Uli Tuerke reported that maybe it sometimes doesn't (in WinBoard 4.0.5). 352. Perhaps recognize the ANSI escape sequence that FICS sends out for the cls command and clear the ICS interaction window. **353. WinBoard can crash when the engine outputs very long PV lines (or debug output that looks like a PV). In particular, lines that start with 4 or more blanks following a "thinking" output line are treated as continuation lines, and get concatenated into a 512-byte buffer with no checking for overflow. Generally we need a lot more care to avoid buffer overflows inside both xboard and WinBoard. [Note: changed the buffers to be 5120 bytes as a band-aid.] Guido Flohr expands on this bug: The problem is easy to reproduce, simply write a program/script that spits out lines of more than 8192 bytes (INPUT_SOURCE_BUF_SIZE) and connect it as a chess engine to xboard. No surprise, xboard cannot handle such long lines, but the resulting behavior is really weird: The program enters DoInputCallback() in xboard.c, reads the first 8192 bytes, searches for a linefeed in vain, then closes its eyes, sets the member "unused" of the InputSource to is->buf + 8192 and waits for more input although the buffer is already full. The next time it calls the same function, is->unused is exactly these 8192 bytes away from is->buf, xboard computes the amount of bytes to read in this round, which sums up to 0 nothing. It then calls read(2) with a bufsize argument of 0, and then assumes end of file when the kernel call returns 0 (which is the documented behavior). For local engines, we now jump into backend.c, ReceiveFromProgram(), and this function reports that the engine has exited unexpectedly. In fact the engine is still very vivid, which is good, because in spite of xboard's assumption that its child has died, it still sends "force", "ping N", and "quit" to the false dead. If the child was really dead, the alert boxes "error writing to ... engine" would hide the first alert box "... has exited unexpectedly". From xboard's side, it is not exactly clean to call read(2) with a zero bufsize argument. In my opinion, a sane solution would be to eat the INPUT_SOURCE_BUF_SIZE bytes, and when they contain no linefeed, print the partial line to standard error (in debug mode) and report something like Maximum line size exceeded (and then kill the engine). **354. We currently let the user go directly from TwoMachines mode to various other modes like MachineWhite or MachineBlack. This may confuse the engine that was on move, since we don't have a way to force it to stop before it makes the move it was thinking about. (use ping/pong to know when the engine has stopped) 355. Idea from LiveAndLetDie: have Zippy specially log games where it loses to a substantially lower-rated player. Such a game could indicate an xboard bug, engine bug, or perhaps a computer-using cheater. 356. Colorization for FICS tourney tells? They look like this (ugh): :DChessmaster [tourney #4]: :hi 357. A few reports of WinBoard pieces being drawn incorrectly at certain sizes. I haven't reproduced this. [Maybe worked around in 4.2.0. Or is/was this the same as 194f? I don't recall the details.] 358. One report of WinBoard colorization not working, even after restart, until the computer was rebooted. Weird. 362. Running a very long automated match (/mg option) seems to crash WinBoard eventually, usually after 300 to 500 games, sometimes later. Reported by Josh Haglund. Gets a "WINBOARD caused an invalid page fault in module KERNEL32.DLL" dialog box from Windows. See messages from Josh for examples of the registers and stack dump. 362a. A few people have reported WinBoard crashing upon exit. 363. Maybe xboard should not set the window geometry for new popups, or at least not the position. The default positions aren't very good, and setting them programmatically keeps knowledgeable X users from customizing the positions with X resources. 366. Feature to let an engine observe an ICS game and run analysis mode on the moves, perhaps whispering or channel-telling the results. It's a little too easy to cheat with this feature or I might have added it long ago. [Added in 4.2.8 and 4.4] 369. Optionally send a periodic keepalive command to ICS. Can be used to defeat autologout, so should probably not be on by default. Also should be useful to help Zippy notice more reliably when its connection has hung, so that it can exit and a shell script (batch file) can restart it. 370. One user requested a local noplay list for his computer player because the FICS limit of 50 is too small. He wants several hundred so that he can noplay everyone who disconnects in a lost position. 374. Would be good to have a way to change engines without restarting the interface. 376. WinBoard is said to crash or "lock up" when loading enormous PGN files, like a 98 MB file that comes with (??) Crafty. Win32 (at least in the Win95 lineage) has a limit of 32,767 items in a list box widget. That might explain this problem. 376a. xboard exceeds limits in X and/or Xaw if a PGN file has too many games. (The virtual window that the list box can scroll through becomes too many pixels high.) This has odd effects; the window height of the game list seems to get reduced mod 2^16 or something. Maybe detect this and do something nicer about it, like stop loading when the window is full and pop up a warning. 378. One Solaris user didn't have the "strip" program, so the install-sh script used by xboard "make install" failed. Check for this? Yuck. 381. "Illegal move: post" is apparently not handled. Should it be? 382. The UI for entering Training mode is a bit obscure: you must first select Load Game, then Training becomes enabled in the upper (!) part of the Mode menu and you can select it. You can then select it again to toggle it off. This mode is something like Analyze File (which has a problematic UI too, but somewhat less so); both should probably use a similar UI style. I consider disabling the step-forward button to be overkill, and I think you need to manually turn off auto-step when loading a game (?). One user expected it to work with .epd files that give a position and a recommended move. That seems reasonable, but doing it would require quite different code from the current pgn-game training mode. 383. Premove piece drop for bughouse/crazyhouse. 384. Pre-first-move for xboard. I don't much like the fill-in field method used in winboard. Maybe allow a move to be made for white before the game starts (in both xboard and winboard). If you get black, it's cancelled. Black can already premove after the game starts, during white's first move think time, so I don't see that a black pre-first-move is needed. **387. Have winboard draw opaque details on black pieces too. Hmm, this should probably be optional, and the detail colors should be selectable instead of hardwired to the opposite piece color. [The 4.3 -allWhite option goes in this direction. Details always in black, though.] **387a. Add "no piece border" option to WinBoard. See code from Robert Jurjevic sent 4/9/2001. 391. I have a bug report from Stefan Zipproth about engines sometimes failing to make their first move in an engine-engine match. So far I can't reproduce it. This might be fixed by the Sleep(500) voodoo in 4.2.4. 394. See about tightening matching for the "request" event. Right now it matches on help files a bit too often. (e.g. FICS "help sr_info") **Also clarify documentation on what the request event is. 396. xboard's -size defaulting code for bitmaps unfortunately always picks a size from the built-in list, even if you gave the -bitmapDirectory option. It would be more user-friendly to have some extra code that lists the directory and considers exactly the sizes that are found there, as the pixmap code does. 397. It would be nice to be able to configure xboard with bitmap pieces as the default without having to disable xpm support entirely. This should be a pretty simple mod to configure.in (and xboard.c). 397a. It would be very nice to be able to compile in both the bitmap and pixmap pieces. This would allow us to automatically switch to bitmap pieces in -mono mode, including when -mono mode was automatically selected because too few colors were available. 398. It would be nice to have the new .xpm pieces in .xim format too, since I restrained myself from ripping out the .xim support. 399. It would be nice to have a configure option to change the directory where the default piece set is taken from. Slightly nicer than having to rename the desired directory to "bitmaps" or "pixmaps" as at present. 400. TypeinMove should be grayed in ICS mode, or should raise the console window, or something. 402. Internationalization. It probably isn't practical to retrofit this into the current code base. [4.2.8 and 4.4 have international- ization of xboard.] 409. One user requested a way to put a time delay in the middle of sending zippyGameEnd commands. This would (for example) let the computer do a seek only if its opponent doesn't accept a rematch within 10 seconds. Nontrivial because Zippy has to continue to listen to input during the delay; it can't simply call sleep(). Maybe ScheduleDelayedEvent is OK, but I think it may already be in use in this situation, and it only supports one event at a time. 411. Add zippyKibitzThinking and zippyWhisperThinking features? [4.3 has an -autoKibitz option] 412. Maybe optimize setting the move list in the case where only the current move number changes; avoid slow XawListChange. **413. Add movelist window to WinBoard too. Wilkin Ng submitted a patch that I believe includes this; need to integrate and test it. **415. It was suggested that a few common options that many chess engines need be promoted to xboard/WinBoard options so that the user can set them from the GUI in a uniform way. In particular: hash size, directory name for endgame tables. [4.3 has extended WB protocol with a memory, egtpath and cores command.] **416. Can we avoid dying when xboard is in 8-bit mode, pixmap pieces are chosen (by default), and we can't get enough colors? Ugh. **419. It was suggested that stat01 be generated/accepted during normal play with "post" on, not just during analysis mode. This would need to be a "feature" command option. 422. Track FICS change to details of how timeseal works; is this implemented at FICS yet? 423. When locally stepping through an ICS game that is over, it would be nice to display the historical clock times at each move. 424. DAV at Thu Nov 9, 01:20 CST 2000: any chance on winboard/xboard of a key press and a move executing draw ? that way you at least have a chance of claiming a draw in 1 0. **426. DAV says, in xboard: If you are not on clock and you hover a piece over a square where your opponent then moves to and then move the piece away the piece the opp moved or part of it has not been drawn. [Duplicate of bug 241?] 429a. Check whether more support is needed for WinBoard to work with scroll wheel mice in the absence of special mouse drivers that generate scroll bar events directly. 431. People find Analyze File confusing; they think it should do Crafty's relatively new Annotate function. Also, it's somewhat superfluous now that you can enter Analysis mode and then load the file, or vice versa. **436. WinBoard is said to crash if started while WinBoard.debug is being tail -f'ed. **441. Can I prevent an undo after new in the odd case where it can happen now? See mail from Bob Hyatt. 450. Suggested: an option to let an engine keep pondering while an ICC game is adjourned. This seems a bit difficult. 451. Suggested: support SuperMamer messages on FICS, aka qtells. See http://www.freechess.org/SuperMamer/parsing.html. 452. Suggested: a way to say "prompt for the password" in a login.ini file. See 510 instead. **454. Add a way to claim a draw together with making a move, as can be needed for draw by repetition (creating the 3rd repetition with the move) and by the 50 move rule (the move is the 50th). Add to protocol, and implement using the individual methods on FICS and ICC. Need to be sure it's really a FICS that has the feature (somehow). [Fixed in 4.3 by usng 'offer draw' for this purpose] 455. Suggested: Add the epdkit commands such as epdpfga to the protocol, since Crafty and "many" (which?) other engines include the epdkit. **456. Bob Hyatt suggests: "feature match=1" which says "send match requests to the engine and let it decide on who to play next". I.e., maybe send an abbreviated but fixed format message like this: match time inc R/U. The engine would use "tellics accept " to accept. Add as feature to protover 3. **457. Standardize on the meaning of scores (e.g. in stat01 responses). Is positive good for white or good for the engine? Do certain scores mean forced (tablebase) draw, or forced mate in N? This should align with the EPD spec. Maybe a feature command should indicate that the engine matches this part of the spec, but then again, it's not clear what we can do about it if the engine doesn't give that command, so maybe there is no point. See discussion on chess-engines list. [Winboard_x adds an argument to tell WinBoard an egine uses absolute scores] 458. Bug: xboard will try to use an engine to play normal chess even if the engine has given the feature variant command and did not include "normal" on the list. Crafty 18.1 inadvertently relies on this bug, so it probably can't be fixed right away. **468. Need to look at Wilkin Ng's contributions! **469. Look at Zippy's behavior if the operator observes, follows, examines, etc. Some bugs in this area have been fixed, but it's received very little testing, as Zippy was never meant to be used that way. Noted later: Examining in -zp mode definitely has problems. If you go forward one move at a time, moves are sent to the engine correctly. If you go backward one move, "undo" is not sent to engine as it needs to be. Going forward or back by more than one move at a time needs to be looked at too. **471. Look at 3/17/2001 message from Laszlo Vecsey about crashes when exiting on Win ME while data is coming in from the server. **473. Visual low-time indicator. See patch in Brian Mays message of 3/27/2001. **474. Crash reported when sending certain 8-bit characters through WinBoard (180, 167, others). I'm almost certain this is a FICS timeseal issue and nothing to do with WinBoard itself. **475. Look at Laszlo Vecsey's mousewheel patch of 4/10/2001. 476. For some reason (I guess some GUI supports them), most WinBoard engines now have a graphical logo, 100x50 pixels in Windows .bmp format. It's been requested that WinBoard have a place to show the logo. [4.3.16 supports logos] 477. Implement the "book engine" idea I proposed in the protover 3 discussions. Some folks have offered to write them (e.g., Bruce Morland). [4.3.15 supports a GUI book, which is another way to acheive the same, as the only thing that would distinguish book engines is their book, not what they do.] 478. Recognize URLs in the WinBoard ics interaction window and make them work as hyperlinks (firing up your browser). **479. Possibly use Scott Gasch's 7 May 2001 patch to delay accepting challenges when ping > pong instead of declining them. Bug: if you get more than one challenge, Scott's patch forgets about all but the last one. If that guy then withdraws his challenge, the others are left in limbo, neither accepted nor declined. I suppose we could decline challenges when there is one waiting. However, if we make the change to optionally pass match requests through to the engine, Bruce Moreland would like us to queue up challenges and pass them all on. 481. 8 May 2001, Bob Hyatt "matchscore" feature suggestion could go in protover 3: "matchscore A B C D E says we are in a match, this is game A of B games. The current match score is I have won C, drawn D, and lost E games in this match. This would give the engine a chance to adjust the draw score as needed to try to win the match rather than just trying to win a single game." **482. Suggestion from Bruce Moreland: if the user goes into ICS examine mode while -zp is active, and the engine supports analyze, then put it into analyze mode and let it work on the examined game. I guess this could work for observed games too. Should it be optional or always done? [4.2.8 and 4.4 support analysis in zippy mode, but as yet only while observing games.] 483. It would be nice if the KingShine 3D board could be integrated as an alternative xboard GUI rendering. **484. Add -feature1 and -feature2 options to pretend the engine sent us those feature commands. Useful kludge for certain buggy engines. 485. Add "reset" to protover 3. (Clear the hash tables and other such info; used to put the engine into a known state before running a test/benchmark position.) [the WB 'memory' command could be defined to have this side effect? Normally we would have to clear the hash table when changing its size.] 486. Other protover 3 features listed in my 6/21/2001 message to chess-engines list. Write a full protover 3 draft for comment. [Note that 4.3 already uses protocol extensions that differ from the v3 specs.] 487. Adjudicate non-ICS games as a draw when there is insufficient mating material on both sides, especially engine/engine games. Well, maybe. I argued against this in a 6/26/2001 message to chess-engines. [Added in 4.3] 487a. Probably also adjudicate when we detect checkmate or stalemate, before bothering to notice whether the engine detected this. [Added in 4.3] 487b. Note: Do not adjudicate 50 move rule or 3x repetition since those must be claimed by a player -- at least not by default. It would be OK to have a flag to do this someday when we are smart enough to notice it. Would definitely be good to be smart enough to notice an incorrect draw claim by an engine. [In 4.3 you can set the number of moves or repeats after which draw is adjudicated] 487c. Another request: allow the operator to adjudicate engine/engine games. [Winboard_x provided menu items for this.] 488. Option to suppress tags popup on game load? This has been requested a few times, and I received one partial implementation (not enough to be useful). Needs to be on the options menu, etc. Note conflict with 298 above. 488a. Also option to suppress comment popups. 489. Maybe have Zippy use xtell for tells to avoid redefining "." if the operator is also doing tells. Do all ICSes support xtell, though? 490. Bruce Moreland request: a way to turn Zippy auto-accept on and off dynamically. 491. Bruce Moreland request: a defined way to turn on/off PV (etc.) kibitzing from the engine dynamically. I had thought it would be better to make the GUI able to relay thinking output as kibitzing on its own (and be able to turn this on/off dynamically), but Bruce points out that what engine authors want to send as kibitzing output usually includes more than the PV thinking output. [Note that engines can put whatever info they want in the PV field of the thinking output]. 492. One user reports that GNU Chess 5 crashes if you start a game, play far enough to get GNU Chess out of book, select Reset, and play e3 in the new game. This is probably a GNU Chess 5.00 bug, unrelated to WinBoard. Can't reproduce on Linux; didn't try yet on Windows. Need to see if 5.02 fixes it. 493. DAV suggests stripping off first arguments that are obviously not the name of the engine when trying to parse out the engine name from its command line -- things like nice, nohup, sh, csh, bash, etc. Ugh, but I suppose it would be helpful sometimes. 494. Internationalization. A couple of people have done (or told me they were doing) partial conversions of WinBoard to German or Spanish by manually translating the messages. I think it would be much better (but a big job) to use GNU gettext. I haven't looked into the details of that at all. [4.2.8 and 4.4 have gettext support.] 495. JamesBaud points out that FEN is not sufficient to correctly represent a crazyhouse position (or bughouse, for that matter), because it does not distinguish promoted pawns that will revert when captured from real pieces. ICS style 12 also does not give us this information. I really don't know what I could do about this -- take the lead in proposing an extension to FEN and to style 12 with new piece letters, I suppose. I don't really have time or motivation for that. If you always use PGN, not FEN, to save Crazyhouse, that works around the problem. [4.3 uses bFENs which fix this, but not in ICS mode] **496. DAV sent some code to save a screen shot in xboard. Look at merging this in. [4.3 has an option to save the board display (but not the entire window) as bitmap.] **497. Igor Eged reports: I make a move on opponents time using premove. Right in the time I am holding another piece in case of unexpected check that I can have other possibility. But then the piece hangs in the void and its invalid move, what means often loss in 1 0 lightning. 498. It would be nice for Zippy to be able to play ICC wild 20 and 21 (the types where loadgame is allowed). Presumably there would have to be an option to either send the loadgame command with a specified position, or to deal with an opponent sending it. I'm not sure how this should work exactly, or how to prevent opponents from cheating in various ways. 499. It would be nice for Zippy to be able to switch amongst several different engines depending on which variant type is being played. 500. It would be nice if Zippy could have an option to accept takebacks. Hmmm, also, the operator might want to manually offer a takeback; it would be good if that worked. 501. People would like to be able to add more bot functionality to Zippy without C programming. I don't have any ideas on how to do that. 502. One user requests the ability to have a game list file open for more than one PGN file at a time. 503. We don't do protover 2 feature negotiation properly when restarting an engine due to -xreuse mode. The timeout and done=0/1 features don't work on the restart; instead we basically assume that all the features will be the same as last time and that the engine will be ready to accept commands immediately. This probably doesn't cause a lot of problems, but if you try to replace the engine with one that sets different features, the changes might not be noticed before the first move, and the defaults will be the values from the old engine, not the documented defaults. Also, if the engine takes time to initialize and wants us to wait to send commands until it says done=1, we fail to wait. However, we do send commands in the right order and use ping, so most engines should work fine. 506. One user wants a board size even smaller than Tiny. 507. Suggested: have the cursor change to a gripping hand while moving pieces. Currently in WinBoard it's always an arrow, while in xboard it's always a hand with pointing finger while over the board and an arrow elsewhere. 508. It would be nice to make -xclock work with -ics, just for orthogonality, though it's not terribly useful. 509. It would be nice to make -clock work with -st. Perhaps each player's clock should start with the specified time on each move and count down until he moves. **510. A FICS service rep tells me that many users expect an autologin feature in winboard (other than the non-user-friendly login.ini file). Seems easy enough to add such a thing. 512. Some users dislike the clocks counting in tenths when below 10 seconds, as it's distracting, and would like this to be configurable. (From the Debian bug tracking system.) 513. Perhaps have Alt+P and Alt+C as synonyms for Pause in WinBoard, since the P or C on the button makes it look like that should be the shortcut. I suppose Alt+< and Alt+>, and the same with Shift for << and >>, would also be a good idea. Oops, but Alt+C is already CopyGame, so maybe this is a bad idea. 514. Gian-Carlo Pascutto reports: "when pasting a FEN/EPD position into WinBoard, and selecting analysis mode, the engine analyses the starting position instead of the pasted one. Re-pasting fixes this." 515. Troy Edwards suggests: "It would be nice to have the option to 'wrap text' in the comment window." 516. DAV says: "FICS now supports the setting and the making clocks tick using unpause/pause in examine mode. It seems either the clocks don't tick or are not present when using xboard. Is it possible to change the policy and base things upon the clock is paused flag in style 12?" 517. Clarify in engine-intf.html that "sd" is an extra dumbing-down feature, not a time control. Some text: In the protocol, the "sd" command isn't a time control. It doesn't say that your engine has unlimited time but must search to exactly the given depth. It says that you should pay attention to the time control as normal, but cut off the search at the specified depth even if you have time to search deeper. If you don't have time to search to the specified depth, given your normal time management algorithm, then you will want to stop sooner than the given depth. The "new" command should set the search depth back to unlimited. This is already stated in the spec. The "level" command should not affect the search depth. As it happens, xboard/WinBoard currently always sends sd (if needed) right after level, but that isn't part of the spec. [Added to the specs that go with 4.4] 518. Warn in doc that -initString is a dangerous feature. Also move doc of dalogs for sending commands directly to the engine out of the protocol spec and into the man page and help file, but warn they are dangerous too. 519. In engine-intf.html, change "st" description to not use the word "exact", which is misleading. Make sure it says this is the maximum time per move (and does not accumulate). 520. Check whether Alt+C (CopyGame) works in XP. One user says it gives an error message. 522. engine-intf.html should really be rewritten to describe the protocol as a state machine (on each end), with every command precisely defined as to what it does in each state (including perhaps being illegal). 523. Figure out what, if anything, to do with the FICS "iset singleboard". I lean toward not bothering to set it, as it only disables functionality, but maybe I'm confused. 524. theblob at Mon Mar 4, 23:23 PST 2002: it'd be nice in the xboard interaction window if control-w and control-u respectively erased the line and word, even in a Windows environment. At least, I think it'd be nice. 525. Support a 64-bit node counter in analysis mode when compiled with something that has 64-bit integer support. Both gcc and msvc++ have this, though under different names. [Done in 4.2.8 and 4.4] 526. "-initialMode analysis -lgf -" doesn't get the engine into analysis mode properly. "-initialMode analyzeFile" is a workaround, but bug should be fixed. 527. Clarify ICS.ini more in the doc, if possible. Some sample words: > You should create this file in > WinBoard's directory (usually C:\Program Files\WinBoard) using a plain > text editor such as Notepad. Make sure that Notepad doesn't decide to > call the file ICS.ini.txt for you -- you may have to select "All > Files" instead of "Text Files" in the Notepad save dialog. > > The file is simply sent to the chess server, just as if you had typed it. > So if your username is foo and password is bar, the file would look > like what is between ==== below, without the ===='s: > > ==== > foo > bar > iset movecase 1 > ==== 528. Check on updates/revisions to PGN from Steven Edwards and others. Any support needed? 529. Protover 3 needs a prefix character that says "this is debug output" and prevents the GUI from parsing that line (say ";"). [4.3 uses '#' for this purpose, when the engine sets feature debug=1] 530. The undocumented (?) checking for rsh error messages tripped up one engine author who had a "not found" in a message. Tighten this up. 531. Do we always wait for pongs to catch up with pings before starting the engine's clock? I suppose we should. 532. On FICS the clock does not start until after the first move has been made. So perhaps we don't need the "not ready, try again soon" response from Zippy there. What if Zippy is black, does black's clock also not start until he makes his first move? 533. theblob at Mon Jun 24, 20:05 PDT 2002: here's a suggestion for xboard -- give priority to fitting in amounts of material in the title bar, and truncate names instead, e.g., use "tyrionsAp...(50) vs. woden (51)" rather than "TyrionsApprentice (50) vs. woden..." -- it's much more important to see the material than the full names, especially when you're playing. 534. Steffen Jakob reports: "I use xboard 4.2.6. Yesterday I played some bullet games at ICC. In one game I lost on time. In the last move I already clicked on my queen and wanted it to move to its destination square when I forfeited on time. After that my mouse pointer was the queen piece. I couldnt drop it to any square." 535. For protover 3, the "st" command in the protocol could be extended to allow for smaller units, not just seconds. 537. Clarify in the protocol that "force" while searching means you should stop the search as soon as you can. (Isn't this clear already?) 538. Need a way for the user to adjust the clocks. This is important for WCCC and other computer competitions, where xboard/winboard's clock is not the master. I was going to do it in time for the July 2002 WCCC. Oops. [4.3 allows adjusting the clocks by clicking them in 'edit game' mode, in steps of 1 minute] 541. Related to #327, John Iverson says, "It would be nice to have the coordinates shown outside of the board along the edges, rather than in the squares where they are hard to see and give a cluttered appearance, especially on smaller board sizes. (The coordinates can be handy in certain situations, such as posting a screenshot of xboard showing an email game in progress, with the view flipped.)" 542. If you start xboard with the -geometry NxM option, it will dutifully make the window exactly that size, but it doesn't choose a -size option that fits into such a window size, so the board is cut off or has a lot of whitespace around it. In fact, the layout is generally messed up because the code doesn't expect the window to be the wrong size for the layout. We should at least ignore the size part of the -geometry option if we aren't going to do something sensible with it. How is that done with Xt? 543. See the patches and extensions on http://www.tim-mann.org/extensions.html#patches and integrate those that are worthwhile into the main code base. (Some are also mentioned elsewhere in this ToDo list.) They are pretty much all over 15 lines, so copyright assignment from their authors is needed. Unfortunately some of the authors may be hard to reach. 544. Possibly rework looking_at pattern matching to have a "match at beginning of line" character (perhaps ^). It looks like this may actually be useful after all. The historical cases where you could get a board or other output that needs parsing on the same line as a prompt *may* have been fixed. Confirming this would need testing on all the ICSes that are in use. 546. Odd bug reported by travelGirl. The last line of a multi-line macro from the ICS context menu sometimes "sticks" at the bottom of the ICS interaction window. New text gets inserted before instead of after it. This started when she upgraded to win2k. See mail. 548. Guido Flohr reports: Another "not really a bug" problem: When xboard forks in order to start a second chess engine, it is only concerned about duplicating the descriptors for the standard channels in the child. This is very interesting for the second chess engine, since it inherits the pipes to its opponent, and can use them for sending commands like "sd 2", "easy", or even for feeding a bogus FEN string into the first engine (exchanging the opponent's queen with a bishop looks really attractive to me). A very interesting feature, but not exactly what you intended? ;-) Closing the other descriptors after the fork will not completely avoid the problem, since - at least under Solaris and Linux - it is still possible to peek and write into xboard's open descriptors via the /proc pseudo file system (unless you make xboard setuid root), but leaving them open, makes this cheat very obvious. 549. "Ron" (no last name given) reports that when compiling WinBoard under VC++ 6.0, there are many warnings. These ought to be looked at. 551. "Miguel" (no last name given) reports "When you make a premove in Winboard 4.2.6, and then opponent move and premove is illegal, then and you try to make a legal move but you cannot, because piece are erased and you have to replace your move again, move twice... in lightining this is annoying." I'm not really sure what that means or if it is the same bug as 497. 552. Get rid of the need for proprietary tools to build WinBoard. It's already possible to compile winboard.exe using the Cygwin toolchain. You can even compile it with -mno-cygwin to avoid the need for cygwin1.dll. However: 552a. The Help file needs Microsoft Word to edit the source file winboard.rtf and the Microsoft Help Compiler to compile it into winboard.hlp. I tried using OpenOffice.org on the RTF file, but the result was missing some formatting that the help compiler needs. The help compiler itself is a free-as-in-beer download, but it's still proprietary software. Perhaps the help could be converted to vanilla HTML, at the cost of losing the index and search capability. 552b. The WinBoard installer package is built with InstallShield. Possible replacements: Inno Setup (http://www.jrsoftware.org/isinfo.php) - looks best NSIS (http://nsis.sourceforge.net/site/index.php) Cygwin setup (http://www.cygwin.com) - a long shot 552c. Although the cygwin resource compiler works on winboard.rc, it's a pain to create new dialogs by editing the text file. The original ones were all created using the graphical dialog editor in MSVC 5. 553. It would be nice for xboard's ICS Input box to have a history feature similar to WinBoard's ICS Interaction window. Actually it would be nice for xboard to have its own ICS Interaction window with all the bells and whistles that WinBoard's has instead of limping along using an xterm for interaction. **554. Port evaluation-graph window to XBoard. 555. Split x/wengineoutput.c in a front-end and common backend file. 556. Fix -stickyWindows option under XP and Vista, and port to XBoard. 557. Port display of engine logos to XBoard. 558. Device a smart way for -autoLogo to select logos in other modes than Two Machines. * * * Before each release: - make sure both xboard and winboard build and are up to date with each other - run zippy with new version as a shakedown - be sure gnu5 binary is up to date in winboard, and gnu5 patch (if needed) is included in both xboard and winboard kits - recheck cygwin compiling winboard - make sure ChangeLog is complete - test changes *** up to date with mail received through 5 Nov 2003, except for the "protover 3" discussions on the chess-engines mailing list *** xboard-4.7.3/usystem.c0000644000175000001440000004534012262562252011610 00000000000000/* * usystem.c -- X-free, but Unix-like code for XBoard front end * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #include #include #include #include #if !OMIT_SOCKETS # if HAVE_SYS_SOCKET_H # include # include # include # else /* not HAVE_SYS_SOCKET_H */ # if HAVE_LAN_SOCKET_H # include # include # include # else /* not HAVE_LAN_SOCKET_H */ # define OMIT_SOCKETS 1 # endif /* not HAVE_LAN_SOCKET_H */ # endif /* not HAVE_SYS_SOCKET_H */ #endif /* !OMIT_SOCKETS */ #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_SYS_FCNTL_H # include #else /* not HAVE_SYS_FCNTL_H */ # if HAVE_FCNTL_H # include # endif /* HAVE_FCNTL_H */ #endif /* not HAVE_SYS_FCNTL_H */ #if HAVE_SYS_SYSTEMINFO_H # include #endif /* HAVE_SYS_SYSTEMINFO_H */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) # define HAVE_DIR_STRUCT #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_SYS_DIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_NDIR_H # include # define HAVE_DIR_STRUCT # endif #endif #if ENABLE_NLS #include #endif // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are. #include "common.h" #include "frontend.h" #include "backend.h" #include "childio.h" #include "menus.h" #include "usystem.h" #include "gettext.h" #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif static int get_term_width P(()); static char *cnames[9] = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" }; TextColors textColors[(int)NColorClasses]; /* String is: "fg, bg, attr". Which is 0, 1, 2 */ static int parse_color (char *str, int which) { char *p, buf[100], *d; int i; if (strlen(str) > 99) /* watch bounds on buf */ return -1; p = str; d = buf; for (i=0; i 0) { if (textColors[(int)cc].fg > 0) { snprintf(buf, MSG_SIZ, "\033[0;%d;%d;%dm", textColors[(int)cc].attr, textColors[(int)cc].fg, textColors[(int)cc].bg); } else { snprintf(buf, MSG_SIZ, "\033[0;%d;%dm", textColors[(int)cc].attr, textColors[(int)cc].bg); } } else { if (textColors[(int)cc].fg > 0) { snprintf(buf, MSG_SIZ, "\033[0;%d;%dm", textColors[(int)cc].attr, textColors[(int)cc].fg); } else { snprintf(buf, MSG_SIZ, "\033[0;%dm", textColors[(int)cc].attr); } } count = strlen(buf); outCount = OutputToProcess(NoProc, buf, count, &error); if (outCount < count) { DisplayFatalError(_("Error writing to display"), error, 1); } if (continuation) return; PlaySoundForColor(cc); } char * UserName () { return getpwuid(getuid())->pw_name; } char * ExpandPathName (char *path) { static char static_buf[4*MSG_SIZ]; char *d, *s, buf[4*MSG_SIZ]; struct passwd *pwd; s = path; d = static_buf; while (*s && isspace(*s)) ++s; if (!*s) { *d = 0; return static_buf; } if (*s == '~') { if (*(s+1) == '/') { safeStrCpy(d, getpwuid(getuid())->pw_dir, 4*MSG_SIZ ); strcat(d, s+1); } else { safeStrCpy(buf, s+1, sizeof(buf)/sizeof(buf[0]) ); { char *p; if(p = strchr(buf, '/')) *p = 0; } pwd = getpwnam(buf); if (!pwd) { fprintf(stderr, _("ERROR: Unknown user %s (in path %s)\n"), buf, path); return NULL; } safeStrCpy(d, pwd->pw_dir, 4*MSG_SIZ ); strcat(d, strchr(s+1, '/')); } } else safeStrCpy(d, s, 4*MSG_SIZ ); return static_buf; } int MySearchPath (char *installDir, char *name, char *fullname) { // just append installDir and name. Perhaps ExpandPath should be used here? name = ExpandPathName(name); if(name && name[0] == '/') safeStrCpy(fullname, name, MSG_SIZ ); else { sprintf(fullname, "%s%c%s", installDir, '/', name); } return 1; } int MyGetFullPathName (char *name, char *fullname) { // should use ExpandPath? name = ExpandPathName(name); safeStrCpy(fullname, name, MSG_SIZ ); return 1; } char * HostName () { static char host_name[MSG_SIZ]; #if HAVE_GETHOSTNAME gethostname(host_name, MSG_SIZ); return host_name; #else /* not HAVE_GETHOSTNAME */ # if HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H sysinfo(SI_HOSTNAME, host_name, MSG_SIZ); return host_name; # else /* not (HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H) */ return "localhost"; # endif/* not (HAVE_SYSINFO && HAVE_SYS_SYSTEMINFO_H) */ #endif /* not HAVE_GETHOSTNAME */ } int StartChildProcess (char *cmdLine, char *dir, ProcRef *pr) { char *argv[64], *p; int i, pid; int to_prog[2], from_prog[2]; ChildProc *cp; char buf[MSG_SIZ]; if (appData.debugMode) { fprintf(debugFP, "StartChildProcess (dir=\"%s\") %s\n",dir, cmdLine); } /* We do NOT feed the cmdLine to the shell; we just parse it into blank-separated arguments in the most simple-minded way possible. */ i = 0; safeStrCpy(buf, cmdLine, sizeof(buf)/sizeof(buf[0]) ); p = buf; for (;;) { while(*p == ' ') p++; argv[i++] = p; if(*p == '"' || *p == '\'') p = strchr(++argv[i-1], *p); else p = strchr(p, ' '); if (p == NULL) break; *p++ = NULLCHAR; } argv[i] = NULL; SetUpChildIO(to_prog, from_prog); if ((pid = fork()) == 0) { /* Child process */ // [HGM] PSWBTM: made order resistant against case where fd of created pipe was 0 or 1 close(to_prog[1]); // first close the unused pipe ends close(from_prog[0]); dup2(to_prog[0], 0); // to_prog was created first, nd is the only one to use 0 or 1 dup2(from_prog[1], 1); if(to_prog[0] >= 2) close(to_prog[0]); // if 0 or 1, the dup2 already cosed the original close(from_prog[1]); // and closing again loses one of the pipes! if(fileno(stderr) >= 2) // better safe than sorry... dup2(1, fileno(stderr)); /* force stderr to the pipe */ if (dir[0] != NULLCHAR && chdir(dir) != 0) { perror(dir); exit(1); } nice(appData.niceEngines); // [HGM] nice: adjust priority of engine proc execvp(argv[0], argv); /* If we get here, exec failed */ perror(argv[0]); exit(1); } /* Parent process */ close(to_prog[0]); close(from_prog[1]); cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPReal; cp->pid = pid; cp->fdFrom = from_prog[0]; cp->fdTo = to_prog[1]; *pr = (ProcRef) cp; return 0; } // [HGM] kill: implement the 'hard killing' of AS's Winboard_x static RETSIGTYPE AlarmCallBack (int n) { return; } void DestroyChildProcess (ProcRef pr, int signalType) { ChildProc *cp = (ChildProc *) pr; if (cp->kind != CPReal) return; cp->kind = CPNone; if (signalType == 10) { // [HGM] kill: if it does not terminate in 3 sec, kill signal(SIGALRM, AlarmCallBack); alarm(3); if(wait((int *) 0) == -1) { // process does not terminate on its own accord kill(cp->pid, SIGKILL); // kill it forcefully wait((int *) 0); // and wait again } } else { if (signalType) { kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: use hard kill if so requested } /* Process is exiting either because of the kill or because of a quit command sent by the backend; either way, wait for it to die. */ wait((int *) 0); } close(cp->fdFrom); close(cp->fdTo); } void InterruptChildProcess (ProcRef pr) { ChildProc *cp = (ChildProc *) pr; if (cp->kind != CPReal) return; (void) kill(cp->pid, SIGINT); /* stop it thinking */ } int OpenTelnet (char *host, char *port, ProcRef *pr) { char cmdLine[MSG_SIZ]; if (port[0] == NULLCHAR) { snprintf(cmdLine, sizeof(cmdLine), "%s %s", appData.telnetProgram, host); } else { snprintf(cmdLine, sizeof(cmdLine), "%s %s %s", appData.telnetProgram, host, port); } return StartChildProcess(cmdLine, "", pr); } int OpenTCP (char *host, char *port, ProcRef *pr) { #if OMIT_SOCKETS DisplayFatalError(_("Socket support is not configured in"), 0, 2); #else /* !OMIT_SOCKETS */ struct addrinfo hints; struct addrinfo *ais, *ai; int error; int s=0; ChildProc *cp; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(host, port, &hints, &ais); if (error != 0) { /* a getaddrinfo error is not an errno, so can't return it */ fprintf(debugFP, "getaddrinfo(%s, %s): %s\n", host, port, gai_strerror(error)); return ENOENT; } for (ai = ais; ai != NULL; ai = ai->ai_next) { if ((s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) { error = errno; continue; } if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) { error = errno; continue; } error = 0; break; } freeaddrinfo(ais); if (error != 0) { return error; } cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPSock; cp->pid = 0; cp->fdFrom = s; cp->fdTo = s; *pr = (ProcRef) cp; #endif /* !OMIT_SOCKETS */ return 0; } int OpenCommPort (char *name, ProcRef *pr) { int fd; ChildProc *cp; fd = open(name, 2, 0); if (fd < 0) return errno; cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPComm; cp->pid = 0; cp->fdFrom = fd; cp->fdTo = fd; *pr = (ProcRef) cp; return 0; } int OpenLoopback (ProcRef *pr) { ChildProc *cp; int to[2], from[2]; SetUpChildIO(to, from); cp = (ChildProc *) calloc(1, sizeof(ChildProc)); cp->kind = CPLoop; cp->pid = 0; cp->fdFrom = to[0]; /* note not from[0]; we are doing a loopback */ cp->fdTo = to[1]; *pr = (ProcRef) cp; return 0; } int OpenRcmd (char *host, char *user, char *cmd, ProcRef *pr) { DisplayFatalError(_("internal rcmd not implemented for Unix"), 0, 1); return -1; } int OutputToProcess (ProcRef pr, char *message, int count, int *outError) { static int line = 0; ChildProc *cp = (ChildProc *) pr; int outCount; if (pr == NoProc) { if (appData.noJoin || !appData.useInternalWrap) outCount = fwrite(message, 1, count, stdout); else { int width = get_term_width(); int len = wrap(NULL, message, count, width, &line); char *msg = malloc(len); int dbgchk; if (!msg) outCount = fwrite(message, 1, count, stdout); else { dbgchk = wrap(msg, message, count, width, &line); if (dbgchk != len && appData.debugMode) fprintf(debugFP, "wrap(): dbgchk(%d) != len(%d)\n", dbgchk, len); outCount = fwrite(msg, 1, dbgchk, stdout); free(msg); } } } else outCount = write(cp->fdTo, message, count); if (outCount == -1) *outError = errno; else *outError = 0; return outCount; } /* Output message to process, with "ms" milliseconds of delay between each character. This is needed when sending the logon script to ICC, which for some reason doesn't like the instantaneous send. */ int OutputToProcessDelayed (ProcRef pr, char *message, int count, int *outError, long msdelay) { ChildProc *cp = (ChildProc *) pr; int outCount = 0; int r; while (count--) { r = write(cp->fdTo, message++, 1); if (r == -1) { *outError = errno; return outCount; } ++outCount; if (msdelay >= 0) TimeDelay(msdelay); } return outCount; } int ICSInitScript () { /* try to open the icsLogon script, either in the location given * or in the users HOME directory */ FILE *f; char buf[MSG_SIZ]; char *homedir; f = fopen(appData.icsLogon, "r"); if (f == NULL) { homedir = getenv("HOME"); if (homedir != NULL) { safeStrCpy(buf, homedir, sizeof(buf)/sizeof(buf[0]) ); strncat(buf, "/", MSG_SIZ - strlen(buf) - 1); strncat(buf, appData.icsLogon, MSG_SIZ - strlen(buf) - 1); f = fopen(buf, "r"); } } if (f != NULL) { ProcessICSInitScript(f); return TRUE; } else printf("Warning: Couldn't open icsLogon file (checked %s and %s).\n", appData.icsLogon, buf); return FALSE; } void ResetFrontEnd () { CommentPopDown(); TagsPopDown(); return; } #include static int get_term_width () { int fd, default_width; fd = STDIN_FILENO; default_width = 79; // this is FICS default anyway... #if !defined(TIOCGWINSZ) && defined(TIOCGSIZE) struct ttysize win; if (!ioctl(fd, TIOCGSIZE, &win)) default_width = win.ts_cols; #elif defined(TIOCGWINSZ) struct winsize win; if (!ioctl(fd, TIOCGWINSZ, &win)) default_width = win.ws_col; #endif return default_width; } void update_ics_width () { static int old_width = 0; int new_width = get_term_width(); if (old_width != new_width) ics_printf("set width %d\n", new_width); old_width = new_width; } void NotifyFrontendLogin () { update_ics_width(); } xboard-4.7.3/board.c0000644000175000001440000010764212262562252011172 00000000000000/* * board.c -- platform-independent drawing code for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define HIGHDRAG 1 #include "config.h" #include #include #include #include #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #include "common.h" #include "frontend.h" #include "backend.h" #include "xboard2.h" #include "moves.h" #include "board.h" #include "draw.h" #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif int squareSize, lineGap; int damage[2][BOARD_RANKS][BOARD_FILES]; /* There can be two pieces being animated at once: a player can begin dragging a piece before the remote opponent has moved. */ AnimState anims[NrOfAnims]; static void DrawSquare P((int row, int column, ChessSquare piece, int do_flash)); static Boolean IsDrawArrowEnabled P((void)); static void DrawArrowHighlight P((int fromX, int fromY, int toX,int toY)); static void ArrowDamage P((int s_col, int s_row, int d_col, int d_row)); static void drawHighlight (int file, int rank, int type) { int x, y; if (lineGap == 0) return; if (flipView) { x = lineGap/2 + ((BOARD_WIDTH-1)-file) * (squareSize + lineGap); y = lineGap/2 + rank * (squareSize + lineGap); } else { x = lineGap/2 + file * (squareSize + lineGap); y = lineGap/2 + ((BOARD_HEIGHT-1)-rank) * (squareSize + lineGap); } DrawBorder(x,y, type, lineGap & 1); // pass whether lineGap is odd } int hi1X = -1, hi1Y = -1, hi2X = -1, hi2Y = -1; int pm1X = -1, pm1Y = -1, pm2X = -1, pm2Y = -1; void SetHighlights (int fromX, int fromY, int toX, int toY) { int arrow = hi2X >= 0 && hi1Y >= 0 && IsDrawArrowEnabled(); if (hi1X != fromX || hi1Y != fromY) { if (hi1X >= 0 && hi1Y >= 0) { drawHighlight(hi1X, hi1Y, 0); } } // [HGM] first erase both, then draw new! if (hi2X != toX || hi2Y != toY) { if (hi2X >= 0 && hi2Y >= 0) { drawHighlight(hi2X, hi2Y, 0); } } if(arrow) // there currently is an arrow displayed ArrowDamage(hi1X, hi1Y, hi2X, hi2Y); // mark which squares it damaged if (hi1X != fromX || hi1Y != fromY) { if (fromX >= 0 && fromY >= 0) { drawHighlight(fromX, fromY, 1); } } if (hi2X != toX || hi2Y != toY) { if (toX >= 0 && toY >= 0) { drawHighlight(toX, toY, 1); } } hi1X = fromX; hi1Y = fromY; hi2X = toX; hi2Y = toY; if(arrow || toX >= 0 && fromY >= 0 && IsDrawArrowEnabled()) DrawPosition(FALSE, NULL); // repair any arrow damage, or draw a new one } void ClearHighlights () { SetHighlights(-1, -1, -1, -1); } void SetPremoveHighlights (int fromX, int fromY, int toX, int toY) { if (pm1X != fromX || pm1Y != fromY) { if (pm1X >= 0 && pm1Y >= 0) { drawHighlight(pm1X, pm1Y, 0); } if (fromX >= 0 && fromY >= 0) { drawHighlight(fromX, fromY, 2); } } if (pm2X != toX || pm2Y != toY) { if (pm2X >= 0 && pm2Y >= 0) { drawHighlight(pm2X, pm2Y, 0); } if (toX >= 0 && toY >= 0) { drawHighlight(toX, toY, 2); } } pm1X = fromX; pm1Y = fromY; pm2X = toX; pm2Y = toY; } void ClearPremoveHighlights () { SetPremoveHighlights(-1, -1, -1, -1); } /* * If the user selects on a border boundary, return -1; if off the board, * return -2. Otherwise map the event coordinate to the square. */ int EventToSquare (int x, int limit) { if (x <= 0) return -2; if (x < lineGap) return -1; x -= lineGap; if ((x % (squareSize + lineGap)) >= squareSize) return -1; x /= (squareSize + lineGap); if (x >= limit) return -2; return x; } /* [HR] determine square color depending on chess variant. */ int SquareColor (int row, int column) { int square_color; if (gameInfo.variant == VariantXiangqi) { if (column >= 3 && column <= 5 && row >= 0 && row <= 2) { square_color = 1; } else if (column >= 3 && column <= 5 && row >= 7 && row <= 9) { square_color = 0; } else if (row <= 4) { square_color = 0; } else { square_color = 1; } } else { square_color = ((column + row) % 2) == 1; } /* [hgm] holdings: next line makes all holdings squares light */ if(column < BOARD_LEFT || column >= BOARD_RGHT) square_color = 1; if ( // [HGM] holdings: blank out area between board and holdings column == BOARD_LEFT-1 || column == BOARD_RGHT || (column == BOARD_LEFT-2 && row < BOARD_HEIGHT-gameInfo.holdingsSize) || (column == BOARD_RGHT+1 && row >= gameInfo.holdingsSize) ) square_color = 2; // black return square_color; } /* Convert board position to corner of screen rect and color */ void ScreenSquare (int column, int row, Pnt *pt, int *color) { if (flipView) { pt->x = lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap); pt->y = lineGap + row * (squareSize + lineGap); } else { pt->x = lineGap + column * (squareSize + lineGap); pt->y = lineGap + ((BOARD_HEIGHT-1)-row) * (squareSize + lineGap); } *color = SquareColor(row, column); } /* Convert window coords to square */ void BoardSquare (int x, int y, int *column, int *row) { *column = EventToSquare(x, BOARD_WIDTH); if (flipView && *column >= 0) *column = BOARD_WIDTH - 1 - *column; *row = EventToSquare(y, BOARD_HEIGHT); if (!flipView && *row >= 0) *row = BOARD_HEIGHT - 1 - *row; } /* Generate a series of frame coords from start->mid->finish. The movement rate doubles until the half way point is reached, then halves back down to the final destination, which gives a nice slow in/out effect. The algorithmn may seem to generate too many intermediates for short moves, but remember that the purpose is to attract the viewers attention to the piece about to be moved and then to where it ends up. Too few frames would be less noticeable. */ static void Tween (Pnt *start, Pnt *mid, Pnt *finish, int factor, Pnt frames[], int *nFrames) { int fraction, n, count; count = 0; /* Slow in, stepping 1/16th, then 1/8th, ... */ fraction = 1; for (n = 0; n < factor; n++) fraction *= 2; for (n = 0; n < factor; n++) { frames[count].x = start->x + (mid->x - start->x) / fraction; frames[count].y = start->y + (mid->y - start->y) / fraction; count ++; fraction = fraction / 2; } /* Midpoint */ frames[count] = *mid; count ++; /* Slow out, stepping 1/2, then 1/4, ... */ fraction = 2; for (n = 0; n < factor; n++) { frames[count].x = finish->x - (finish->x - mid->x) / fraction; frames[count].y = finish->y - (finish->y - mid->y) / fraction; count ++; fraction = fraction * 2; } *nFrames = count; } /**** Animation code by Hugh Fisher, DCS, ANU. Known problem: if a window overlapping the board is moved away while a piece is being animated underneath, the newly exposed area won't be updated properly. I can live with this. Known problem: if you look carefully at the animation of pieces in mono mode, they are being drawn as solid shapes without interior detail while moving. Fixing this would be a major complication for minimal return. ****/ /* Utilities */ #undef Max /* just in case */ #undef Min #define Max(a, b) ((a) > (b) ? (a) : (b)) #define Min(a, b) ((a) < (b) ? (a) : (b)) typedef struct { short int x, y, width, height; } MyRectangle; void DoSleep (int n) { FrameDelay(n); } static void SetRect (MyRectangle *rect, int x, int y, int width, int height) { rect->x = x; rect->y = y; rect->width = width; rect->height = height; } /* Test if two frames overlap. If they do, return intersection rect within old and location of that rect within new. */ static Boolean Intersect ( Pnt *old, Pnt *new, int size, MyRectangle *area, Pnt *pt) { if (old->x > new->x + size || new->x > old->x + size || old->y > new->y + size || new->y > old->y + size) { return False; } else { SetRect(area, Max(new->x - old->x, 0), Max(new->y - old->y, 0), size - abs(old->x - new->x), size - abs(old->y - new->y)); pt->x = Max(old->x - new->x, 0); pt->y = Max(old->y - new->y, 0); return True; } } /* For two overlapping frames, return the rect(s) in the old that do not intersect with the new. */ static void CalcUpdateRects (Pnt *old, Pnt *new, int size, MyRectangle update[], int *nUpdates) { int count; /* If old = new (shouldn't happen) then nothing to draw */ if (old->x == new->x && old->y == new->y) { *nUpdates = 0; return; } /* Work out what bits overlap. Since we know the rects are the same size we don't need a full intersect calc. */ count = 0; /* Top or bottom edge? */ if (new->y > old->y) { SetRect(&(update[count]), old->x, old->y, size, new->y - old->y); count ++; } else if (old->y > new->y) { SetRect(&(update[count]), old->x, old->y + size - (old->y - new->y), size, old->y - new->y); count ++; } /* Left or right edge - don't overlap any update calculated above. */ if (new->x > old->x) { SetRect(&(update[count]), old->x, Max(new->y, old->y), new->x - old->x, size - abs(new->y - old->y)); count ++; } else if (old->x > new->x) { SetRect(&(update[count]), new->x + size, Max(new->y, old->y), old->x - new->x, size - abs(new->y - old->y)); count ++; } /* Done */ *nUpdates = count; } /* Animate the movement of a single piece */ static void BeginAnimation (AnimNr anr, ChessSquare piece, ChessSquare bgPiece, int startColor, Pnt *start) { AnimState *anim = &anims[anr]; if(appData.upsideDown && flipView) piece += piece < BlackPawn ? BlackPawn : -BlackPawn; /* The old buffer is initialised with the start square (empty) */ if(bgPiece == EmptySquare) { DrawBlank(anr, start->x, start->y, startColor); } else { /* Kludge alert: When gating we want the introduced piece to appear on the from square. To generate an image of it, we draw it on the board, copy the image, and draw the original piece again. */ if(piece != bgPiece) DrawSquare(anim->startBoardY, anim->startBoardX, bgPiece, 0); CopyRectangle(anr, DISP, 2, start->x, start->y, squareSize, squareSize, 0, 0); // [HGM] zh: unstack in stead of grab if(piece != bgPiece) DrawSquare(anim->startBoardY, anim->startBoardX, piece, 0); } anim->prevFrame = *start; SetDragPiece(anr, piece); } static void AnimationFrame (AnimNr anr, Pnt *frame, ChessSquare piece) { MyRectangle updates[4]; MyRectangle overlap; Pnt pt; AnimState *anim = &anims[anr]; int count, i, x, y, w, h; /* Save what we are about to draw into the new buffer */ CopyRectangle(anr, DISP, 0, x = frame->x, y = frame->y, w = squareSize, h = squareSize, 0, 0); /* Erase bits of the previous frame */ if (Intersect(&anim->prevFrame, frame, squareSize, &overlap, &pt)) { /* Where the new frame overlapped the previous, the contents in newBuf are wrong. */ CopyRectangle(anr, 2, 0, overlap.x, overlap.y, overlap.width, overlap.height, pt.x, pt.y); /* Repaint the areas in the old that don't overlap new */ CalcUpdateRects(&anim->prevFrame, frame, squareSize, updates, &count); for (i = 0; i < count; i++) CopyRectangle(anr, 2, DISP, updates[i].x - anim->prevFrame.x, updates[i].y - anim->prevFrame.y, updates[i].width, updates[i].height, updates[i].x, updates[i].y); /* [HGM] correct expose rectangle to encompass both overlapping squares */ if(x > anim->prevFrame.x) w += x - anim->prevFrame.x, x = anim->prevFrame.x; else w += anim->prevFrame.x - x; if(y > anim->prevFrame.y) h += y - anim->prevFrame.y, y = anim->prevFrame.y; else h += anim->prevFrame.y - y; } else { /* Easy when no overlap */ CopyRectangle(anr, 2, DISP, 0, 0, squareSize, squareSize, anim->prevFrame.x, anim->prevFrame.y); GraphExpose(currBoard, anim->prevFrame.x, anim->prevFrame.y, squareSize, squareSize); } /* Save this frame for next time round */ CopyRectangle(anr, 0, 2, 0, 0, squareSize, squareSize, 0, 0); anim->prevFrame = *frame; /* Draw piece over original screen contents, not current, and copy entire rect. Wipes out overlapping piece images. */ InsertPiece(anr, piece); CopyRectangle(anr, 0, DISP, 0, 0, squareSize, squareSize, frame->x, frame->y); GraphExpose(currBoard, x, y, w, h); } static void EndAnimation (AnimNr anr, Pnt *finish) { MyRectangle updates[4]; MyRectangle overlap; Pnt pt; int count, i; AnimState *anim = &anims[anr]; /* The main code will redraw the final square, so we only need to erase the bits that don't overlap. */ if (Intersect(&anim->prevFrame, finish, squareSize, &overlap, &pt)) { CalcUpdateRects(&anim->prevFrame, finish, squareSize, updates, &count); for (i = 0; i < count; i++) CopyRectangle(anr, 2, DISP, updates[i].x - anim->prevFrame.x, updates[i].y - anim->prevFrame.y, updates[i].width, updates[i].height, updates[i].x, updates[i].y); } else { CopyRectangle(anr, 2, DISP, 0, 0, squareSize, squareSize, anim->prevFrame.x, anim->prevFrame.y); } } static void FrameSequence (AnimNr anr, ChessSquare piece, int startColor, Pnt *start, Pnt *finish, Pnt frames[], int nFrames) { int n; BeginAnimation(anr, piece, EmptySquare, startColor, start); for (n = 0; n < nFrames; n++) { AnimationFrame(anr, &(frames[n]), piece); FrameDelay(appData.animSpeed); } EndAnimation(anr, finish); } void AnimateAtomicCapture (Board board, int fromX, int fromY, int toX, int toY) { int i, x, y; ChessSquare piece = board[fromY][toY]; board[fromY][toY] = EmptySquare; DrawPosition(FALSE, board); if (flipView) { x = lineGap + ((BOARD_WIDTH-1)-toX) * (squareSize + lineGap); y = lineGap + toY * (squareSize + lineGap); } else { x = lineGap + toX * (squareSize + lineGap); y = lineGap + ((BOARD_HEIGHT-1)-toY) * (squareSize + lineGap); } for(i=1; i<4*kFactor; i++) { int r = squareSize * 9 * i/(20*kFactor - 5); DrawDot(1, x + squareSize/2 - r, y+squareSize/2 - r, 2*r); FrameDelay(appData.animSpeed); } board[fromY][toY] = piece; DrawGrid(); } /* Main control logic for deciding what to animate and how */ void AnimateMove (Board board, int fromX, int fromY, int toX, int toY) { ChessSquare piece; int hop; Pnt start, finish, mid; Pnt frames[kFactor * 2 + 1]; int nFrames, startColor, endColor; /* Are we animating? */ if (!appData.animate || appData.blindfold) return; if(board[toY][toX] == WhiteRook && board[fromY][fromX] == WhiteKing || board[toY][toX] == BlackRook && board[fromY][fromX] == BlackKing) return; // [HGM] FRC: no animtion of FRC castlings, as to-square is not true to-square if (fromY < 0 || fromX < 0 || toX < 0 || toY < 0) return; piece = board[fromY][fromX]; if (piece >= EmptySquare) return; #if DONT_HOP hop = FALSE; #else hop = abs(fromX-toX) == 1 && abs(fromY-toY) == 2 || abs(fromX-toX) == 2 && abs(fromY-toY) == 1; #endif ScreenSquare(fromX, fromY, &start, &startColor); ScreenSquare(toX, toY, &finish, &endColor); if (hop) { /* Knight: make straight movement then diagonal */ if (abs(toY - fromY) < abs(toX - fromX)) { mid.x = start.x + (finish.x - start.x) / 2; mid.y = start.y; } else { mid.x = start.x; mid.y = start.y + (finish.y - start.y) / 2; } } else { mid.x = start.x + (finish.x - start.x) / 2; mid.y = start.y + (finish.y - start.y) / 2; } /* Don't use as many frames for very short moves */ if (abs(toY - fromY) + abs(toX - fromX) <= 2) Tween(&start, &mid, &finish, kFactor - 1, frames, &nFrames); else Tween(&start, &mid, &finish, kFactor, frames, &nFrames); FrameSequence(Game, piece, startColor, &start, &finish, frames, nFrames); if(Explode(board, fromX, fromY, toX, toY)) { // mark as damaged int i,j; for(i=0; i= 0 && anims[Player].dragPiece < EmptySquare) { ChessSquare bgPiece = EmptySquare; anims[Player].dragActive = True; if(boardX == BOARD_RGHT+1 && PieceForSquare(boardX-1, boardY) > 1 || boardX == BOARD_LEFT-2 && PieceForSquare(boardX+1, boardY) > 1) bgPiece = anims[Player].dragPiece; if(gatingPiece != EmptySquare) bgPiece = gatingPiece; BeginAnimation(Player, anims[Player].dragPiece, bgPiece, color, &corner); /* Mark this square as needing to be redrawn. Note that we don't remove the piece though, since logically (ie as seen by opponent) the move hasn't been made yet. */ damage[0][boardY][boardX] = True; } else { anims[Player].dragActive = False; } } /* Handle expose event while piece being dragged */ static void DrawDragPiece () { if (!anims[Player].dragActive || appData.blindfold) return; /* What we're doing: logically, the move hasn't been made yet, so the piece is still in it's original square. But visually it's being dragged around the board. So we erase the square that the piece is on and draw it at the last known drag point. */ DrawOneSquare(anims[Player].startSquare.x, anims[Player].startSquare.y, EmptySquare, anims[Player].startColor, 0, NULL, NULL, 0); AnimationFrame(Player, &anims[Player].prevFrame, anims[Player].dragPiece); damage[0][anims[Player].startBoardY][anims[Player].startBoardX] = TRUE; } static void DrawSquare (int row, int column, ChessSquare piece, int do_flash) { int square_color, x, y, align=0; int i; char tString[3], bString[2]; int flash_delay; /* Calculate delay in milliseconds (2-delays per complete flash) */ flash_delay = 500 / appData.flashRate; if (flipView) { x = lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap); y = lineGap + row * (squareSize + lineGap); } else { x = lineGap + column * (squareSize + lineGap); y = lineGap + ((BOARD_HEIGHT-1)-row) * (squareSize + lineGap); } square_color = SquareColor(row, column); bString[1] = bString[0] = NULLCHAR; if (appData.showCoords && row == (flipView ? BOARD_HEIGHT-1 : 0) && column >= BOARD_LEFT && column < BOARD_RGHT) { bString[0] = 'a' + column - BOARD_LEFT; align = 1; // coord in lower-right corner } if (appData.showCoords && column == (flipView ? BOARD_RGHT-1 : BOARD_LEFT)) { snprintf(tString, 3, "%d", ONE - '0' + row); align = 2; // coord in upper-left corner } if (column == (flipView ? BOARD_LEFT-1 : BOARD_RGHT) && piece > 1 ) { snprintf(tString, 3, "%d", piece); align = 3; // holdings count in upper-right corner } if (column == (flipView ? BOARD_RGHT : BOARD_LEFT-1) && piece > 1) { snprintf(tString, 3, "%d", piece); align = 4; // holdings count in upper-left corner } if(square_color == 2 || appData.blindfold) piece = EmptySquare; if (do_flash && piece != EmptySquare && appData.flashCount > 0) { for (i=0; i 4) /* Castling causes 4 diffs */ return 1; } } } return 0; } /* Matrix describing castling maneuvers */ /* Row, ColRookFrom, ColKingFrom, ColRookTo, ColKingTo */ static int castling_matrix[4][5] = { { 0, 0, 4, 3, 2 }, /* 0-0-0, white */ { 0, 7, 4, 5, 6 }, /* 0-0, white */ { 7, 0, 4, 3, 2 }, /* 0-0-0, black */ { 7, 7, 4, 5, 6 } /* 0-0, black */ }; /* Checks whether castling occurred. If it did, *rrow and *rcol are set to the destination (row,col) of the rook that moved. Returns 1 if castling occurred, 0 if not. Note: Only handles a max of 1 castling move, so be sure to call too_many_diffs() first. */ static int check_castle_draw (Board newb, Board oldb, int *rrow, int *rcol) { int i, *r, j; int match; /* For each type of castling... */ for (i=0; i<4; ++i) { r = castling_matrix[i]; /* Check the 4 squares involved in the castling move */ match = 0; for (j=1; j<=4; ++j) { if (newb[r[0]][r[j]] == oldb[r[0]][r[j]]) { match = 1; break; } } if (!match) { /* All 4 changed, so it must be a castling move */ *rrow = r[0]; *rcol = r[3]; return 1; } } return 0; } void DrawPosition (int repaint, Board board) { int i, j, do_flash, exposeAll = False; static int lastFlipView = 0; static int lastBoardValid[2] = {0, 0}; static Board lastBoard[2]; static char lastMarker[BOARD_RANKS][BOARD_FILES]; int rrow, rcol; int nr = twoBoards*partnerUp; if(DrawSeekGraph()) return; // [HGM] seekgraph: suppress any drawing if seek graph up if (board == NULL) { if (!lastBoardValid[nr]) return; board = lastBoard[nr]; } if (!lastBoardValid[nr] || (nr == 0 && lastFlipView != flipView)) { MarkMenuItem("View.Flip View", flipView); } if(nr) { SlavePopUp(); SwitchWindow(0); } // [HGM] popup board if not yet popped up, and switch drawing to it. /* * It would be simpler to clear the window with XClearWindow() * but this causes a very distracting flicker. */ if (!repaint && lastBoardValid[nr] && (nr == 1 || lastFlipView == flipView)) { // if ( lineGap && IsDrawArrowEnabled()) // DrawGrid(); /* If too much changes (begin observing new game, etc.), don't do flashing */ do_flash = too_many_diffs(board, lastBoard[nr]) ? 0 : 1; /* Special check for castling so we don't flash both the king and the rook (just flash the king). */ if (do_flash) { if (check_castle_draw(board, lastBoard[nr], &rrow, &rcol)) { /* Mark rook for drawing with NO flashing. */ damage[nr][rrow][rcol] |= 1; } } /* First pass -- Draw (newly) empty squares and repair damage. This prevents you from having a piece show up twice while it is flashing on its new square */ for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) if (((board[i][j] != lastBoard[nr][i][j] || !nr && marker[i][j] != lastMarker[i][j]) && board[i][j] == EmptySquare) || damage[nr][i][j]) { DrawSquare(i, j, board[i][j], 0); if(damage[nr][i][j] & 2) { drawHighlight(j, i, 0); // repair arrow damage if(lineGap) damage[nr][i][j] = False; // this flushed the square as well } else damage[nr][i][j] = 1; // mark for expose } /* Second pass -- Draw piece(s) in new position and flash them */ for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) if (board[i][j] != lastBoard[nr][i][j] || !nr && marker[i][j] != lastMarker[i][j]) { DrawSquare(i, j, board[i][j], do_flash); damage[nr][i][j] = 1; // mark for expose } } else { if (lineGap > 0) DrawGrid(); for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) { DrawSquare(i, j, board[i][j], 0); damage[nr][i][j] = False; } exposeAll = True; } CopyBoard(lastBoard[nr], board); lastBoardValid[nr] = 1; if(nr == 0) { // [HGM] dual: no highlights on second board yet lastFlipView = flipView; for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) lastMarker[i][j] = marker[i][j]; /* Draw highlights */ if (pm1X >= 0 && pm1Y >= 0) { drawHighlight(pm1X, pm1Y, 2); if(lineGap) damage[nr][pm1Y][pm1X] = False; } if (pm2X >= 0 && pm2Y >= 0) { drawHighlight(pm2X, pm2Y, 2); if(lineGap) damage[nr][pm2Y][pm2X] = False; } if (hi1X >= 0 && hi1Y >= 0) { drawHighlight(hi1X, hi1Y, 1); if(lineGap) damage[nr][hi1Y][hi1X] = False; } if (hi2X >= 0 && hi2Y >= 0) { drawHighlight(hi2X, hi2Y, 1); if(lineGap) damage[nr][hi2Y][hi2X] = False; } DrawArrowHighlight(hi1X, hi1Y, hi2X, hi2Y); } else DrawArrowHighlight (board[EP_STATUS-3], board[EP_STATUS-4], board[EP_STATUS-1], board[EP_STATUS-2]); /* If piece being dragged around board, must redraw that too */ DrawDragPiece(); if(exposeAll) GraphExpose(currBoard, 0, 0, BOARD_WIDTH*(squareSize + lineGap) + lineGap, BOARD_HEIGHT*(squareSize + lineGap) + lineGap); else { for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) if(damage[nr][i][j]) { int x, y; if (flipView) { x = lineGap + ((BOARD_WIDTH-1)-j) * (squareSize + lineGap); y = lineGap + i * (squareSize + lineGap); } else { x = lineGap + j * (squareSize + lineGap); y = lineGap + ((BOARD_HEIGHT-1)-i) * (squareSize + lineGap); } if(damage[nr][i][j] & 2) // damage by old or new arrow GraphExpose(currBoard, x - lineGap, y - lineGap, squareSize + 2*lineGap, squareSize + 2*lineGap); else GraphExpose(currBoard, x, y, squareSize, squareSize); damage[nr][i][j] &= 2; // remember damage by newly drawn error in '2' bit, to schedule it for erasure next draw } } FlashDelay(0); // this flushes drawing queue; if(nr) SwitchWindow(1); } /* [AS] Arrow highlighting support */ static double A_WIDTH = 5; /* Width of arrow body */ #define A_HEIGHT_FACTOR 6 /* Length of arrow "point", relative to body width */ #define A_WIDTH_FACTOR 3 /* Width of arrow "point", relative to body width */ static double Sqr (double x) { return x*x; } static int Round (double x) { return (int) (x + 0.5); } void SquareToPos (int rank, int file, int *x, int *y) { if (flipView) { *x = lineGap + ((BOARD_WIDTH-1)-file) * (squareSize + lineGap); *y = lineGap + rank * (squareSize + lineGap); } else { *x = lineGap + file * (squareSize + lineGap); *y = lineGap + ((BOARD_HEIGHT-1)-rank) * (squareSize + lineGap); } } /* Draw an arrow between two points using current settings */ static void DrawArrowBetweenPoints (int s_x, int s_y, int d_x, int d_y) { Pnt arrow[8]; double dx, dy, j, k, x, y; if( d_x == s_x ) { int h = (d_y > s_y) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; arrow[0].x = s_x + A_WIDTH + 0.5; arrow[0].y = s_y; arrow[1].x = s_x + A_WIDTH + 0.5; arrow[1].y = d_y - h; arrow[2].x = arrow[1].x + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[2].y = d_y - h; arrow[3].x = d_x; arrow[3].y = d_y; arrow[5].x = arrow[1].x - 2*A_WIDTH + 0.5; arrow[5].y = d_y - h; arrow[4].x = arrow[5].x - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[4].y = d_y - h; arrow[6].x = arrow[1].x - 2*A_WIDTH + 0.5; arrow[6].y = s_y; } else if( d_y == s_y ) { int w = (d_x > s_x) ? +A_WIDTH*A_HEIGHT_FACTOR : -A_WIDTH*A_HEIGHT_FACTOR; arrow[0].x = s_x; arrow[0].y = s_y + A_WIDTH + 0.5; arrow[1].x = d_x - w; arrow[1].y = s_y + A_WIDTH + 0.5; arrow[2].x = d_x - w; arrow[2].y = arrow[1].y + A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[3].x = d_x; arrow[3].y = d_y; arrow[5].x = d_x - w; arrow[5].y = arrow[1].y - 2*A_WIDTH + 0.5; arrow[4].x = d_x - w; arrow[4].y = arrow[5].y - A_WIDTH*(A_WIDTH_FACTOR-1) + 0.5; arrow[6].x = s_x; arrow[6].y = arrow[1].y - 2*A_WIDTH + 0.5; } else { /* [AS] Needed a lot of paper for this! :-) */ dy = (double) (d_y - s_y) / (double) (d_x - s_x); dx = (double) (s_x - d_x) / (double) (s_y - d_y); j = sqrt( Sqr(A_WIDTH) / (1.0 + Sqr(dx)) ); k = sqrt( Sqr(A_WIDTH*A_HEIGHT_FACTOR) / (1.0 + Sqr(dy)) ); x = s_x; y = s_y; arrow[0].x = Round(x - j); arrow[0].y = Round(y + j*dx); arrow[1].x = Round(arrow[0].x + 2*j); // [HGM] prevent width to be affected by rounding twice arrow[1].y = Round(arrow[0].y - 2*j*dx); if( d_x > s_x ) { x = (double) d_x - k; y = (double) d_y - k*dy; } else { x = (double) d_x + k; y = (double) d_y + k*dy; } x = Round(x); y = Round(y); // [HGM] make sure width of shaft is rounded the same way on both ends arrow[6].x = Round(x - j); arrow[6].y = Round(y + j*dx); arrow[2].x = Round(arrow[6].x + 2*j); arrow[2].y = Round(arrow[6].y - 2*j*dx); arrow[3].x = Round(arrow[2].x + j*(A_WIDTH_FACTOR-1)); arrow[3].y = Round(arrow[2].y - j*(A_WIDTH_FACTOR-1)*dx); arrow[4].x = d_x; arrow[4].y = d_y; arrow[5].x = Round(arrow[6].x - j*(A_WIDTH_FACTOR-1)); arrow[5].y = Round(arrow[6].y + j*(A_WIDTH_FACTOR-1)*dx); } DrawPolygon(arrow, 7); // Polygon( hdc, arrow, 7 ); } static void ArrowDamage (int s_col, int s_row, int d_col, int d_row) { int hor, vert, i, n = partnerUp * twoBoards; hor = 64*s_col + 32; vert = 64*s_row + 32; for(i=0; i<= 64; i++) { damage[n][vert+6>>6][hor+6>>6] |= 2; damage[n][vert-6>>6][hor+6>>6] |= 2; damage[n][vert+6>>6][hor-6>>6] |= 2; damage[n][vert-6>>6][hor-6>>6] |= 2; hor += d_col - s_col; vert += d_row - s_row; } } /* [AS] Draw an arrow between two squares */ static void DrawArrowBetweenSquares (int s_col, int s_row, int d_col, int d_row) { int s_x, s_y, d_x, d_y; if( s_col == d_col && s_row == d_row ) { return; } /* Get source and destination points */ SquareToPos( s_row, s_col, &s_x, &s_y); SquareToPos( d_row, d_col, &d_x, &d_y); if( d_y > s_y ) { d_y += squareSize / 2 - squareSize / 4; // [HGM] round towards same centers on all sides! } else if( d_y < s_y ) { d_y += squareSize / 2 + squareSize / 4; } else { d_y += squareSize / 2; } if( d_x > s_x ) { d_x += squareSize / 2 - squareSize / 4; } else if( d_x < s_x ) { d_x += squareSize / 2 + squareSize / 4; } else { d_x += squareSize / 2; } s_x += squareSize / 2; s_y += squareSize / 2; /* Adjust width */ A_WIDTH = squareSize / 14.; //[HGM] make float DrawArrowBetweenPoints( s_x, s_y, d_x, d_y ); ArrowDamage(s_col, s_row, d_col, d_row); } static Boolean IsDrawArrowEnabled () { return (appData.highlightMoveWithArrow || twoBoards && partnerUp) && squareSize >= 32; } static void DrawArrowHighlight (int fromX, int fromY, int toX,int toY) { if( IsDrawArrowEnabled() && fromX >= 0 && fromY >= 0 && toX >= 0 && toY >= 0) DrawArrowBetweenSquares(fromX, fromY, toX, toY); } xboard-4.7.3/texi2man0000755000175000001440000001167612262415351011412 00000000000000#!/usr/bin/perl # Written by Adrian Mariano, additional features by Eric Backus, # yet more features by Tim Mann. # Script to translate a texinfo file into an nroff manual page. $version="1.01.tpm1"; $html=0; $ignore=0; $tex=0; $doman=0; $title=0; $diditem=0; $justdidlp=1; $noman=0; $info=0; $manprefix=""; $args=($#ARGV < 0) ? "stdin" : "@ARGV"; $itemxcomma=0; printf(".\\\"Do not edit this file. It was created from %s\n", $args); printf(".\\\"using texi2man version %s on %s", $version, `date`); printf(".\\\"If you want a typeset version, you will get better\n"); printf(".\\\"results with the original file.\n.\\\"\n"); sub parse { if (s/\@c man //) { print; next; } if (/\@c noman/) { $noman=1; next; } if (/\@c end noman/) { $noman=0; next; } if ($noman) { next; } if (/\@c ifman\s*(.*)/) { $doman=1; $manprefix = $1; next; } if (/\@c end ifman/) { $doman=0; $manprefix = ""; next; } if (/^\\input/) { next; } if (/^\*/) { next; } if (/^INFO-DIR-SECTION/) { next; } if (/^START-INFO-DIR-ENTRY/) { next; } if (/^END-INFO-DIR-ENTRY/) { next; } if (/\@titlepage/) { $title=1; next; } if (/\@end titlepage/) { $title=0; next; } if (/\@tex/) { $tex=1; next; } if (/\@end tex/) { $tex=0; next; } if (/\@ignore/) { $ignore=1; next; } if (/\@end ignore/) { $ignore=0; next; } if (/\@ifinfo/) { $info=1; next; } if (/\@end ifinfo/) { $info=0; next; } if (/\@ifhtml/) { $html=1; next; } if (/\@end ifhtml/) { $html=0; next; } if (/\@ifnothtml/) { next; } if (/\@end ifhtml/) { next; } if (/\@iftex/) { $tex=1; next; } if (/\@end iftex/) { $tex=0; next; } if (/\@ifnottex/) { next; } if (/\@end iftex/) { next; } if (!$doman && ($ignore || $html || $title || $tex || $info)) { next; } s/\\/\\\\/g; s/\@-/\\-/g; s/\@cite\{([^}]*)}/\`$1\'/g; s/\@code\{([^}]*)}/\`$1\'/g; s/\@email\{([^}]*)}/\`$1\'/g; s/\@file\{([^}]*)}/\`$1\'/g; s/\@kbd\{([^}]*)}/\`$1\'/g; s/\@samp\{([^}]*)}/\`$1\'/g; s/\@url\{([^}]*)}/\`$1\'/g; s/\@dfn\{([^}]*)}/\"$1\"/g; s/\@key\{([^}]*)}/<$1>/g; s/\@emph\{([^}]*)}/\\fI$1\\fR/g; s/\@strong\{([^}]*)}/\\fB$1\\fR/g; s/\@var\{([^}]*)}/\U$1\E/g; s/\@sc\{([^}]*)}/\U$1\E/g; s/\@w\{([^}]*)}/$1/g; s/\@pxref\{([^}]*)}/See \\fI$1\\fR/g; s/\@xref\{([^}]*)}/See \\fI$1\\fR/g; s/\@ref\{([^}]*)}/\\fI$1\\fR/g; s/\@footnote\{([^}]*)}/[$1]/g; s/\@minus\{}/-/g; s/\@copyright\{}/(C)/g; s/\@noindent//; s/\@\{/{/g; s/\@}/}/g; s/\@\@/@/g; s/\\'\\'/\"/g; s/\\`\\`/\"/g; s/---/ -- /g; s/\@value\{([^\s]+)}/$value{$1}/eg; if (/\@set\s+([^\s]+)\s+(.*)$/) { $value{$1} = $2; next; } if (/\@clear\s+([^\s]+)\s+(.*)$/) { delete $value{$1}; next; } if ($itemxcomma) { # If multiple items have the same description, put the items # on one line, separated by commas if (/\@itemx (.*)/) { printf(", $1"); $diditem=1; next; } elsif ($diditem) { printf("\n"); $diditem=0; } if (/\@item (.*)/) { printf("%s.TP\n%s.B $1", $manprefix, $manprefix); $diditem=1; next; } } else { # If multiple items have the same description, put the items # on separate lines if (/\@item (.*)/) { printf("%s.TP\n%s.B $1\n", $manprefix, $manprefix); next; } if (/\@itemx (.*)/) { printf("%s.PD 0\n%s.TP\n%s.B $1\n%s.PD\n", $manprefix, $manprefix, $manprefix, $manprefix); next; } } if (s/\@chapter (.*)/.SH \U$1\E/) { printf("%s%s", $manprefix, $_); $justdidlp=1; next; } if (s/\@unnumbered (.*)/.SH \U$1\E/) { printf("%s%s", $manprefix, $_); $justdidlp=1; next; } if (s/\@section (.*)/$1/) { printf("%s.SS %s", $manprefix, $_); $justdidlp=1; next; } if (/\@example/) { printf("%s.nf\n", $manprefix); $manprefix = $manprefix . " "; $example=1; next; } if (/\@end example/) { $manprefix = substr($manprefix, 0, -4); printf("%s.fi\n", $manprefix); $example=0; next; } if (/\@display/) { printf("%s.nf\n", $manprefix); $example=1; next; } if (/\@end display/) { printf("%s.fi\n", $manprefix); $example=0; next; } if (/\@format/) { printf("%s.nf\n", $manprefix); $example=1; next; } if (/\@end format/) { printf("%s.fi\n", $manprefix); $example=0; next; } if (/\@smallexample/) { printf("%s.nf\n", $manprefix); $example=1; next; } if (/\@end smallexample/) { printf("%s.fi\n", $manprefix); $example=0; next; } if (!$example && /^\s*$/ && !$doman) { if ($justdidlp) { next; } # printf(".PP\n"); printf("\n"); $justdidlp=1; next; } if (/\@end table/) { printf("%s.PP\n", $manprefix); $justdidlp=1; } if (/\@include (.*)/) { my $INCL; open($INCL, $1) or open($INCL, "../$1") or die "$1: $!"; while (<$INCL>) { parse(); } next; } if (/^\@/) { next; } printf("%s%s", $manprefix, $_); if (!$doman) { $justdidlp=0; } } while(<>) { parse(); } xboard-4.7.3/AUTHORS0000644000175000001440000002235012262415351010774 00000000000000Contributions of xboard and WinBoard authors by file (get files names via git log --pretty=oneline --name-only --author= v4.2.7..HEAD |sort |uniq) 0. Files covered The first group are included in the xboard distribution. The second group are included in the WinBoard source distribution but not in the xboard distribution. All are part of the joint xboard/WinBoard source base and are covered by the same copyrights and licensing terms. AUTHORS autogen.sh backend.c backend.h backendz.h bitmaps/* book.c ChangeLog childio.c childio.h cmail.in cmail.man common.h config.h.in configure.ac COPYING COPYRIGHT engine-intf.txt FAQ.html frontend.h gamelist.c gettext.h ics-parsing.txt INSTALL lists.c lists.h Makefile.am moves.c moves.h NEWS parser.h parser.l pgntags.c pixmaps/* po/* README shogibitmaps/* sounds/* ToDo uci.c xboard.c xboard.h xboard.texi xedittags.c xedittags.h xengineoutput.c xgamelist.c xgamelist.h xhistory.c xhistory.h xoptions.c zic2xpm.c zic2xpm.man zippy.c zippy.h zippy.README winboard/bitmaps/* winboard/COMPILING winboard/config.h winboard/defaults.h winboard/help/* winboard/help.c winboard/help.h winboard/jaws.c winboard/makefile.gcc winboard/makefile.ms winboard/parser.c winboard/resource.h winboard/shogibitmaps/* winboard/WB4Jaws.dev winboard/wclipbrd.c winboard/wclipbrd.h winboard/wedittags.c winboard/wedittags.h winboard/wengineo.c winboard/wevalgraph.c winboard/wgamelist.c winboard/wgamelist.h winboard/whistory.c winboard/winboard.c winboard/winboard.h winboard/winboard.rc winboard/winboard.rtf (compiles to winboard.hlp) winboard/wlayout.c winboard/woptions.c winboard/woptions.h winboard/wsettings.c winboard/wsnap.c winboard/wsnap.h winboard/wsockerr.c winboard/wsockerr.h 1. Wayne Christopher Wrote from scratch (I believe) bitmaps.xchess/*80*.bm. Other bitmaps in the bitmaps.xchess directory were derived from these by shrinking and some hand-tuning. By default these bitmaps are no longer used. Their copyright status is unclear. 2. Chris Sears and Dan Sears Wrote from scratch parser.l, xboard.c, xboard.h, xboard.man. Parts (sometimes small) of these files were later moved by Tim Mann to backend.c, backend.h, childio.c, common.h, frontend.h, and parser.h. Chris and Dan's original work is copyrighted by Digital Equipment Corporation with licensing terms similar to what the X Consortium uses (see the file COPYRIGHT). All the work listed below is copyrighted by the Free Software Foundation and covered by the GPL (see the files COPYRIGHT and COPYING). 3. Tim Mann Wrote from scratch FAQ.html, backendz.h, childio.h, comment.in, config.h.in, configure.in, engine-intf.txt, ics-parsing.txt, moves.c, moves.h, pgntags.c (split from backend.c by Jochen Wiedmann), xedittags.c, xedittags.h, xgamelist.c, xgamelist.h, zippy.README, zippy.c, zippy.h, winboard.rtf, config.h, defaults.h, resource.h, wedittags.c, wedittags.h, wgamelist.c, wgamelist.h, winboard.c, winboard.h, winboard.rc. Major additions and changes to nearly all other files listed in section 0. 4. John Chanak Addition to xboard.c, mostly later moved into backend.c. 5. Evan Welsh Wrote from scratch cmail.in and cmail.man. Additions to backend.c and xboard.c. 6. Elmar Bartel Wrote from scratch the Metafont code from which bitmaps/* were generated. The Metafont code itself is not included in the package. 7. Jochen Wiedmann Wrote from scratch gamelist.c, lists.c, lists.h. Wrote xboard.texi, mostly based on xboard.man and cmail.man. Minor additions to backend.c. 8. Frank McIngvale Wrote from scratch zic2xpm.c and zic2xpm.man. Additions to backend.c, xboard.c, and xboard.man. 9. Hugh Fisher Additions to backend.c and xboard.c. 10. Allessandro Scotti Made many additions to the WinBoard user interface and graphics capabilities, such as new windows for engine output, board textures and font-based piece rendering. These changes became collectively known as Winboard_x. change to: backend.c, backend.h, backendz.h, bitmaps/analyze_14.ico, bitmaps/analyze2_14.ico, bitmaps/baloon_14.ico, bitmaps/black_14.ico, bitmaps/clock_14.ico, bitmaps/ponder_14.ico, bitmaps/trans_14.ico, bitmaps/unknown_14.ico, bitmaps/white_14.ico, common.h, config.h, frontend.h, gamelist.c, lists.c, lists.h, moves.c, moves.h, parser.c, parser.h, pgntags.c, readme.htm, uci.c, winboard/defaults.h, winboard/resource.h, winboard/wclipbrd.c, winboard/wclipbrd.h, winboard/wedittags.c, winboard/wedittags.h, winboard/wengineoutput.c, winboard/wevalgraph.c, winboard/wgamelist.c, winboard/wgamelist.h, winboard/whistory.c, winboard/winboard.c, winboard/winboard.h, winboard/winboard.ini, winboard/winboard.rc, winboard/wlayout.c, winboard/woptions.c, winboard/woptions.h, winboard/wplugin.c, winboard/wplugin.h, winboard/wsnap.c, winboard/wsnap.h, zippy.c, zippy.h 11. H.G. Muller Heaviliy modified winboard.c, backend.c, moves.c and parser.l, to allow board sizes other than 8x8, and many non-orthodox Chess pieces, so that WinBoard is now capable of playing variants like Shogi and Xiangqi. Also implemented displaying of the Crazyhouse holdings, and many adjudication and other backend options. This version of WinBoard, (4.3.xx) containing all of the WinBoard_x options, became known as WinBoard_F. changes to: acconfig.h, aclocal.m4, AUTHORS, backend.c, backend.h, backendz.h, bitmaps/*, book.c, childio.h, cmail.in, common.h, config.guess, config.h, config.h.in, config.sub, configure, configure.ac, configure.in, copyright.texi, engine-intf.html, FAQ.html, frontend.h, gamelist.c, ics-parsing.txt, install-sh, lists.c, lists.h, Makefile.am, Makefile.in, manual.html, mkinstalldirs, moves.c, moves.h, parser.c, parser.h, parser.l, pg_key.c, pgntags.c, pg_show.c, pixmaps/*, pxboard, README, READ_ME, readme_HGM.txt, shiphtml, shogibitmaps/*, texi2man, ToDo, uci.c, winboard/bitmaps/*, winboard/config.h, winboard/cygwin.mak, winboard/defaults.h, winboard/help.c, winboard/help/*, winboard/internationalize, winboard/jaws.c, winboard/jaws.h, winboard/jaws.rc,winboard/language.txt, winboard/makefile.gcc, winboard/makefile.ms, winboard/metascript.txt, winboard/parser.c, winboard/readme.txt, winboard/resource.h, winboard/shogibitmaps/*, winboard/wchat.c, winboard/wclipbrd.c, winboard/wclipbrd.h, winboard/wedittags.c, winboard/wedittags.h, winboard/wengineo.c, winboard/wengineoutput.c, winboard/wevalgraph.c, winboard/wgamelist.c, winboard/wgamelist.h, winboard/whistory.c, winboard/winboard.c, winboard/winboard.h, winboard/winboard.htm, winboard/winboard.ini, winboard/winboard.rc, winboard/winboard.rtf, winboard/wlayout.c, winboard/woptions.c, winboard/woptions.h, winboard/wplugin.c, winboard/wplugin.h, winboard/wsettings.c, winboard/wsnap.c, winboard/wsnap.h, xboard.c, xboard.h, xboard.texi, xedittags.c, xedittags.h, xengineoutput.c, xgamelist.c, xgamelist.h, xhistory.c, xhistory.h, xoptions.c, zippy.c, zippy.h, zippy.README also: worked on the installer files (not in the tar-ball, but available via Savannah) 12. Arun Persaud changes to: acconfig.h, AUTHORS, autogen.sh, backend.c, backend.h, backendz.h, book.c, ChangeLog, childio.c, childio.h, cmail.in, common.h, config.h.in, configure.ac, COPYING, COPYRIGHT, copyright.texi, FAQ.html, frontend.h, gamelist.c, gettext.h, .gitignore, gpl.texinfo, ics-parsing.txt, INSTALL, install-sh, lists.c, lists.h, Makefile.am, moves.c, moves.h, NEWS, parser.c, parser.h, parser.l, pgntags.c, pixmaps/pixmaps.h, po/de.po, po/LINGUAS, po/Makefile.in.in, README, READ_ME, shogibitmaps/README, texi2man, ToDo, TODO, uci.c, uci/uci_protocol.txt, winboard/bitmaps/bitmaps.h, winboard/wchat.c, winboard/config.h, winboard/defaults.h, winboard/jaws.c, winboard/parser.c, winboard/readme.txt, winboard/shogibitmaps/README, winboard/WB4Jaws.dev, winboard/wclipbrd.c, winboard/wclipbrd.h, winboard/wedittags.c, winboard/wedittags.h, winboard/wengineo.c, winboard/wengineoutput.c, winboard/wevalgraph.c, winboard/wgamelist.c, winboard/wgamelist.h, winboard/whistory.c, winboard/winboard.c, winboard/winboard.h, winboard/winboard.rc, winboard/wlayout.c, winboard/woptions.c, winboard/woptions.h, winboard/wsnap.c, winboard/wsnap.h, winboard/wsockerr.c, winboard/wsockerr.h, xboard.c, xboard.h, xboard.texi, xedittags.c, xedittags.h, xengineoutput.c, xgamelist.c, xgamelist.h, xhistory.c, xhistory.h, xoptions.c, zic2xpm.c, zic2xpm.man, zippy.c, zippy.h, zippy.README 13. Eric Mullins Makefiles for different compilers for windows, several changes for those compilers change to: AUTHORS, backend.c, backend.h, backendz.h, common.h, frontend.h, gamelist.c, README, winboard/bcc32.cfg, winboard/borland.mak, winboard/COMPILING, winboard/config.h, winboard/cygwin.mak, winboard/help.c, winboard/help.h, winboard/jaws.c, winboard/makefile.gcc, winboard/makefile.ms, winboard/mingw32.mak, winboard/msvc7.mak, winboard/msvc.mak, winboard/resource.h, winboard/res/winboard.exe.manifest, winboard/WB4Jaws.dev, winboard/wevalgraph.c, winboard/winboard.c, winboard/Winboard.dev, winboard/winboard.dsp, winboard/winboard.dsw, winboard/winboard.h, winboard/winboard.ini, winboard/winboard.rc, winboard/woptions.c, winboard/wsettings.c, xboard.c also: prepared installer files for winboard (not in the tar-ball, but available via Savannah) xboard-4.7.3/parser.h0000644000175000001440000000605612262415351011376 00000000000000/* * parser.h -- Interface to XBoard move parser * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ extern void yynewfile P((FILE *f)); extern void yynewstr P((char *s)); extern int Myylex P((void)); // [HGM] yylex now globally invisible, all calls must use wrapper extern ChessMove yylexstr P((int boardIndex, char *s, char *buf, int buflen)); extern char currentMoveString[]; extern int yyboardindex; extern int yyskipmoves; /* If TRUE, all moves are reported as AmbiguousMove instead of being disambiguated. */ extern char *yy_text; /* Needed because yytext can be either a char[] or a (non-constant) char* */ extern int yyoffset P((void)); extern signed char initialRights[BOARD_FILES]; xboard-4.7.3/usounds.c0000644000175000001440000001113412262562252011571 00000000000000/* * usounds.c -- sound handling for XBoard (through external player) * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include "common.h" #include "frontend.h" void PlaySoundFile (char *name) { if (*name == NULLCHAR) { return; } else if (strcmp(name, "$") == 0) { putc(BELLCHAR, stderr); } else { char buf[2048]; char *prefix = "", *sep = ""; if(appData.soundProgram[0] == NULLCHAR) return; if(!strchr(name, '/')) { prefix = appData.soundDirectory; sep = "/"; } snprintf(buf, sizeof(buf), "%s '%s%s%s' &", appData.soundProgram, prefix, sep, name); system(buf); } } void RingBell () { PlaySoundFile(appData.soundMove); } void PlayIcsWinSound () { PlaySoundFile(appData.soundIcsWin); } void PlayIcsLossSound () { PlaySoundFile(appData.soundIcsLoss); } void PlayIcsDrawSound () { PlaySoundFile(appData.soundIcsDraw); } void PlayIcsUnfinishedSound () { PlaySoundFile(appData.soundIcsUnfinished); } void PlayAlarmSound () { PlaySoundFile(appData.soundIcsAlarm); } void PlayTellSound () { PlaySoundFile(appData.soundTell); } void PlaySoundForColor (ColorClass cc) { switch (cc) { case ColorShout: PlaySoundFile(appData.soundShout); break; case ColorSShout: PlaySoundFile(appData.soundSShout); break; case ColorChannel1: PlaySoundFile(appData.soundChannel1); break; case ColorChannel: PlaySoundFile(appData.soundChannel); break; case ColorKibitz: PlaySoundFile(appData.soundKibitz); break; case ColorTell: PlaySoundFile(appData.soundTell); break; case ColorChallenge: PlaySoundFile(appData.soundChallenge); break; case ColorRequest: PlaySoundFile(appData.soundRequest); break; case ColorSeek: PlaySoundFile(appData.soundSeek); break; case ColorNormal: case ColorNone: default: break; } } xboard-4.7.3/lists.c0000644000175000001440000000575512262415351011240 00000000000000/* * lists.c -- Functions to implement a double linked list XBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* * This file could well be a part of backend.c, but I prefer it this * way. */ #include "config.h" #include #if STDC_HEADERS # include #endif /* not STDC_HEADERS */ #include "common.h" #include "lists.h" /* Check, if List l is empty; returns TRUE, if it is, FALSE * otherwise. */ int ListEmpty (List *l) { return(l->head == (ListNode *) &l->tail); } /* Initialize a list. Must be executed before list is used. */ void ListNew (List *l) { l->head = (ListNode *) &l->tail; l->tail = NULL; l->tailPred = (ListNode *) l; } /* Remove node n from the list it is inside. */ void ListRemove (ListNode *n) { if (n->succ != NULL) { /* Be safe */ n->pred->succ = n->succ; n->succ->pred = n->pred; n->succ = NULL; /* Mark node as no longer being member */ n->pred = NULL; /* of a list. */ } } /* Delete node n. */ void ListNodeFree (ListNode *n) { if (n) { ListRemove(n); free(n); } } /* Create a list node with size s. Returns NULL, if out of memory. */ ListNode * ListNodeCreate (size_t s) { ListNode *n; if ((n = (ListNode*) malloc(s))) { n->succ = NULL; /* Mark node as not being member of a list. */ n->pred = NULL; } return(n); } /* Insert node n into the list of node m after m. */ void ListInsert (ListNode *m, ListNode *n) { n->succ = m->succ; n->pred = m; m->succ = n; n->succ->pred = n; } /* Add node n to the head of list l. */ void ListAddHead (List *l, ListNode *n) { ListInsert((ListNode *) &l->head, n); } /* Add node n to the tail of list l. */ void ListAddTail (List *l, ListNode *n) { ListInsert((ListNode *) l->tailPred, n); } /* Return element with number n of list l. (NULL, if n doesn't exist.) * Counting starts with 0. */ ListNode * ListElem (List *l, int n) { ListNode *ln; for (ln = l->head; ln->succ; ln = ln->succ) { if (!n--) { return (ln); } } return(NULL); } xboard-4.7.3/config.h.in0000644000175000001440000001225612262562277011765 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* template */ #undef ATTENTION /* template */ #undef DEFINED_SYS_ERRLIST /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* template */ #undef FIRST_PTY_LETTER /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `grantpt' function. */ #undef HAVE_GRANTPT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LAN_SOCKET_H /* Define to 1 if you have the `i' library (-li). */ #undef HAVE_LIBI /* Define to 1 if you have the `seq' library (-lseq). */ #undef HAVE_LIBSEQ /* template */ #undef HAVE_LIBXPM /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `rand48' function. */ #undef HAVE_RAND48 /* Define to 1 if you have the `random' function. */ #undef HAVE_RANDOM /* Define to 1 if you have the `setitimer' function. */ #undef HAVE_SETITIMER /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_STROPTS_H /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FCNTL_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `usleep' function. */ #undef HAVE_USLEEP /* Define to 1 if you have the header file. */ #undef HAVE_X11_XPM_H /* Define to 1 if you have the `_getpty' function. */ #undef HAVE__GETPTY /* template */ #undef IBMRTAIX /* template */ #undef LAST_PTY_LETTER /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* template */ #undef PTY_ITERATION /* template */ #undef PTY_NAME_SPRINTF /* template */ #undef PTY_OPEN /* template */ #undef PTY_TTY_NAME_SPRINTF /* template */ #undef REMOTE_SHELL /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* template */ #undef RTU /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* template */ #undef UNIPLUS /* template */ #undef USE_PTYS /* Define if you want to use Xaw3d */ #undef USE_XAW3D /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* template */ #undef X_LOCALE /* template */ #undef X_WCHAR /* should zippy be enabled */ #undef ZIPPY xboard-4.7.3/common.h0000644000175000001440000007436412262562252011404 00000000000000/* * common.h -- Common definitions for X and Windows NT versions of XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef XB_COMMON #define XB_COMMON /* Begin compatibility grunge */ #if defined(__STDC__) || defined(WIN32) || defined(_amigados) #define P(args) args typedef void *VOIDSTAR; #else #define P(args) () typedef char *VOIDSTAR; #endif #ifdef WIN32 typedef char Boolean; typedef char *String; #define popen _popen #define pclose _pclose #else #ifdef _amigados /* It is important, that these types have */ typedef int Boolean; /* a length of 4 bytes each, as we are */ typedef char *String; /* using ReadArgs() for argument parsing. */ #ifdef _DCC FILE *popen(const char *, const char *); int pclose(FILE *); #endif #else #ifdef X11 #include #else typedef char Boolean; typedef char *String; #define True 1 #define False 0 #endif #endif #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #define UNKNOWN -1 /* [HGM] nps */ #if !HAVE_RANDOM # if HAVE_RAND48 # define srandom srand48 # define random lrand48 # else /* not HAVE_RAND48 */ # define srandom srand # define random rand # endif /* not HAVE_RAND48 */ #endif /* !HAVE_RANDOM */ /* End compatibility grunge */ /* unsigned int 64 for engine nodes work and display */ #ifdef WIN32 /* I don't know the name for this type of other compiler * If it not work, just modify here * This is for MS Visual Studio */ #ifdef _MSC_VER #define u64 unsigned __int64 #define s64 signed __int64 #define u64Display "%I64u" #define s64Display "%I64d" #define u64Const(c) (c ## UI64) #define s64Const(c) (c ## I64) #else /* place holder * or dummy types for other compiler * [HGM] seems that -mno-cygwin comple needs %I64? */ #define u64 unsigned long long #define s64 signed long long #ifdef USE_I64 #define u64Display "%I64u" #define s64Display "%I64d" #else #define u64Display "%llu" #define s64Display "%lld" #endif #define u64Const(c) (c ## ULL) #define s64Const(c) (c ## LL) #endif #else /* GNU gcc */ #define u64 unsigned long long #define s64 signed long long #define u64Display "%llu" #define s64Display "%lld" #define u64Const(c) (c ## ull) #define s64Const(c) (c ## ll) #endif #define PROTOVER 2 /* engine protocol version */ // [HGM] license: Messages that engines must print to satisfy their license requirements for patented variants #define GOTHIC "Gothic Chess (see www.GothicChess.com) is licensed under U.S. Patent #6,481,716 by Ed Trice" #define FALCON "Falcon Chess (see www.chessvariants.com) is licensed under U.S. Patent #5,690,334 by George W. Duke" /* [HGM] Some notes about board sizes: In games that allow piece drops, the holdings are considered part of the board, in the leftmost and rightmost two files. This way they are automatically part of the game-history states, and enjoy all display functions (including drag-drop and click-click moves to the regular part of the board). The drawback of this is that the internal numbering of files starts at 2 for the a-file if holdings are displayed. To ensure consistency, this shifted numbering system is used _everywhere_ in the code, and conversion to the 'normal' system only takes place when the file number is converted to or from ASCII (by redefining the character constant 'a'). This works because Winboard only communicates with the outside world in ASCII. In a similar way, the different rank numbering systems (starting at rank 0 or 1) are implemented by redefining '1'. */ #define BOARD_RANKS 11 /* [HGM] for in declarations */ #define BOARD_FILES 16 /* [HGM] for in declarations */ #define BOARD_HEIGHT (gameInfo.boardHeight) /* [HGM] made user adjustable */ #define BOARD_WIDTH (gameInfo.boardWidth + 2*gameInfo.holdingsWidth) #define BOARD_LEFT (gameInfo.holdingsWidth) /* [HGM] play-board edges */ #define BOARD_RGHT (gameInfo.boardWidth + gameInfo.holdingsWidth) #define CASTLING (BOARD_RANKS-1) /* [HGM] hide in upper rank */ #define VIRGIN (BOARD_RANKS-2) /* [HGM] pieces not moved */ #define EP_STATUS CASTLING][(BOARD_FILES-2) /* [HGM] in upper rank */ #define HOLDINGS_SET CASTLING][(BOARD_FILES-1) /* [HGM] in upper-right corner*/ #define ONE ('1'-(BOARD_HEIGHT>9)) /* [HGM] foremost board rank */ #define AAA ('a'-BOARD_LEFT) /* [HGM] leftmost board file */ #define VIRGIN_W 1 /* [HGM] flags in Board[VIRGIN][X] */ #define VIRGIN_B 2 #define DROP_RANK -3 #define MAX_MOVES 1000 #define MSG_SIZ 512 #define DIALOG_SIZE 256 #define STAR_MATCH_N 16 #define MOVE_LEN 32 #define TIME_CONTROL "5" /* in minutes */ #define TIME_DELAY_QUOTE "1.0" /* seconds between moves */ #define TIME_DELAY ((float) 1.0) #define MOVES_PER_SESSION 40 /* moves per TIME_CONTROL */ #define TIME_INCREMENT -1 /* if >= 0, MOVES_PER_SESSION unused */ #define WhiteOnMove(move) (((move) % 2) == 0) #define ICS_HOST "chessclub.com" #define ICS_PORT "5000" #define ICS_COMM_PORT "" #define FIRST_HOST "localhost" #define SECOND_HOST "localhost" #define TELNET_PROGRAM "telnet" #define DEF_BITMAP_DIR BITMAPDIR #define MATCH_MODE "False" #define INIT_STRING "new\nrandom\n" #define WHITE_STRING "white\ngo\n" #define BLACK_STRING "black\ngo\n" #define COMPUTER_STRING "computer\n" #define REUSE_CHESS_PROGRAMS 1 #define WHITE_PIECE_COLOR "#FFFFCC" #define BLACK_PIECE_COLOR "#202020" #define LIGHT_SQUARE_COLOR "#C8C365" #define DARK_SQUARE_COLOR "#77A26D" #define JAIL_SQUARE_COLOR "#808080" #define HIGHLIGHT_SQUARE_COLOR "#FFFF00" #define PREMOVE_HIGHLIGHT_COLOR "#FF0000" #define LOWTIMEWARNING_COLOR "#FF0000" #define BELLCHAR '\007' #define NULLCHAR '\000' #define FEATURE_TIMEOUT 10000 /*ms*/ #define CLOCK_FONT 0 #define MESSAGE_FONT 1 #define COORD_FONT 2 #define CONSOLE_FONT 3 #define COMMENT_FONT 4 #define EDITTAGS_FONT 5 #define MOVEHISTORY_FONT 6 #define GAMELIST_FONT 7 #define NUM_FONTS 8 /* Default to no flashing (the "usual" XBoard behavior) */ #define FLASH_COUNT 0 /* Number of times to flash */ #define FLASH_RATE 5 /* Flashes per second */ /* Default delay per character (in msec) while sending login script */ #define MS_LOGIN_DELAY 0 /* [AS] Support for background textures */ #define BACK_TEXTURE_MODE_DISABLED 0 #define BACK_TEXTURE_MODE_PLAIN 1 #define BACK_TEXTURE_MODE_FULL_RANDOM 2 /* Zippy defaults */ #define ZIPPY_TALK FALSE #define ZIPPY_PLAY FALSE #define ZIPPY_LINES "yow.lines" #define ZIPPY_PINHEAD "" #define ZIPPY_PASSWORD "" #define ZIPPY_PASSWORD2 "" #define ZIPPY_WRONG_PASSWORD "" #define ZIPPY_ACCEPT_ONLY "" #define ZIPPY_USE_I TRUE #define ZIPPY_BUGHOUSE 0 #define ZIPPY_NOPLAY_CRAFTY FALSE #define ZIPPY_GAME_END "gameend\n" #define ZIPPY_GAME_START "" #define ZIPPY_ADJOURN FALSE #define ZIPPY_ABORT FALSE #define ZIPPY_VARIANTS "normal,fischerandom,crazyhouse,losers,suicide,3checks,twokings,bughouse,shatranj" #define ZIPPY_MAX_GAMES 0 #define ZIPPY_REPLAY_TIMEOUT 120 typedef VOIDSTAR ProcRef; #define NoProc ((ProcRef) 0) typedef VOIDSTAR InputSourceRef; typedef void (*DelayedEventCallback) P((void)); typedef enum { Press, Release } ClickType; typedef enum { BeginningOfGame, MachinePlaysWhite, MachinePlaysBlack, AnalyzeMode, AnalyzeFile, TwoMachinesPlay, EditGame, PlayFromGameFile, EndOfGame, EditPosition, Training, IcsIdle, IcsPlayingWhite, IcsPlayingBlack, IcsObserving, IcsExamining } GameMode; typedef enum { /* [HGM] the order here is crucial for Crazyhouse & Shogi: */ /* only the first N pieces can go into the holdings, and */ /* promotions in those variants shift P-W to U-S */ WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, WhiteFerz, WhiteAlfil, WhiteAngel, WhiteMarshall, WhiteWazir, WhiteMan, WhiteCannon, WhiteNightrider, WhiteCardinal, WhiteDragon, WhiteGrasshopper, WhiteSilver, WhiteFalcon, WhiteLance, WhiteCobra, WhiteUnicorn, WhiteKing, BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, BlackFerz, BlackAlfil, BlackAngel, BlackMarshall, BlackWazir, BlackMan, BlackCannon, BlackNightrider, BlackCardinal, BlackDragon, BlackGrasshopper, BlackSilver, BlackFalcon, BlackLance, BlackCobra, BlackUnicorn, BlackKing, EmptySquare, NoRights, // [HGM] gamestate: for castling rights hidden in board[CASTLING] ClearBoard, WhitePlay, BlackPlay, PromotePiece, DemotePiece /*for use on EditPosition menus*/ } ChessSquare; /* [HGM] some macros that can be used as prefixes to convert piece types */ #define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int) #define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int) #define PROMOTED (int)WhiteDragon - (int)WhiteRook + (int) #define DEMOTED (int)WhiteRook - (int)WhiteDragon + (int) #define SHOGI (int)EmptySquare + (int) typedef ChessSquare Board[BOARD_RANKS][BOARD_FILES]; typedef enum { EndOfFile = 0, WhiteKingSideCastle, WhiteQueenSideCastle, WhiteKingSideCastleWild, WhiteQueenSideCastleWild, WhiteHSideCastleFR, WhiteASideCastleFR, BlackKingSideCastle, BlackQueenSideCastle, BlackKingSideCastleWild, BlackQueenSideCastleWild, BlackHSideCastleFR, BlackASideCastleFR, WhitePromotion, WhiteNonPromotion, BlackPromotion, BlackNonPromotion, WhiteCapturesEnPassant, BlackCapturesEnPassant, WhiteDrop, BlackDrop, NormalMove, AmbiguousMove, IllegalMove, ImpossibleMove, WhiteWins, BlackWins, GameIsDrawn, GameUnfinished, GNUChessGame, XBoardGame, MoveNumberOne, Open, Close, Nothing, Comment, PositionDiagram, ElapsedTime, PGNTag, NAG } ChessMove; typedef enum { ColorShout, ColorSShout, ColorChannel1, ColorChannel, ColorKibitz, ColorTell, ColorChallenge, ColorRequest, ColorSeek, ColorNormal, ColorNone, NColorClasses } ColorClass; typedef enum { SoundMove, SoundBell, SoundAlarm, SoundIcsWin, SoundIcsLoss, SoundIcsDraw, SoundIcsUnfinished, NSoundClasses } SoundClass; /* Names for chess variants, not necessarily supported */ typedef enum { VariantNormal, /* Normal chess */ VariantLoadable, /* "loadgame" command allowed (not really a variant)*/ VariantWildCastle, /* Shuffle chess where king can castle from d file */ VariantNoCastle, /* Shuffle chess with no castling at all */ VariantFischeRandom, /* FischeRandom */ VariantBughouse, /* Bughouse, ICC/FICS rules */ VariantCrazyhouse, /* Crazyhouse, ICC/FICS rules */ VariantLosers, /* Try to lose all pieces or get mated (ICC wild 17)*/ VariantSuicide, /* Try to lose all pieces incl. king (FICS) */ VariantGiveaway, /* Try to have no legal moves left (ICC wild 26) */ VariantTwoKings, /* Weird ICC wild 9 */ VariantKriegspiel, /* Kriegspiel; pawns can capture invisible pieces */ VariantAtomic, /* Capturing piece explodes (ICC wild 27) */ Variant3Check, /* Win by giving check 3 times (ICC wild 25) */ VariantShatranj, /* Unsupported (ICC wild 28) */ Variant29, /* Temporary name for possible future ICC wild 29 */ Variant30, /* Temporary name for possible future ICC wild 30 */ Variant31, /* Temporary name for possible future ICC wild 31 */ Variant32, /* Temporary name for possible future ICC wild 32 */ Variant33, /* Temporary name for possible future ICC wild 33 */ Variant34, /* Temporary name for possible future ICC wild 34 */ Variant35, /* Temporary name for possible future ICC wild 35 */ Variant36, /* Temporary name for possible future ICC wild 36 */ VariantShogi, /* [HGM] added variants */ VariantXiangqi, VariantCourier, VariantGothic, VariantCapablanca, VariantKnightmate, VariantFairy, VariantCylinder, VariantFalcon, VariantCapaRandom, VariantBerolina, VariantJanus, VariantSuper, VariantGreat, VariantTwilight, VariantMakruk, VariantSChess, VariantGrand, VariantSpartan, VariantUnknown /* Catchall for other unknown variants */ } VariantClass; #define VARIANT_NAMES { \ "normal", \ "normal", \ "wildcastle", \ "nocastle", \ "fischerandom", \ "bughouse", \ "crazyhouse", \ "losers", \ "suicide", \ "giveaway", \ "twokings", \ "kriegspiel", \ "atomic", \ "3check", \ "shatranj", \ "wild29", \ "wild30", \ "wild31", \ "wild32", \ "wild33", \ "wild34", \ "wild35", \ "wild36", \ "shogi", \ "xiangqi", \ "courier", \ "gothic", \ "capablanca", \ "knightmate", \ "fairy", \ "cylinder", \ "falcon",\ "caparandom",\ "berolina",\ "janus",\ "super",\ "great",\ "twilight",\ "makruk",\ "seirawan",\ "grand",\ "spartan",\ "unknown" \ } #define ENGINES 2 typedef struct { char *language; #if !defined(_amigados) char *whitePieceColor; char *blackPieceColor; char *lightSquareColor; char *darkSquareColor; char *jailSquareColor; char *highlightSquareColor; char *premoveHighlightColor; char *dialogColor; char *buttonColor; #else int whitePieceColor; int blackPieceColor; int lightSquareColor; int darkSquareColor; int jailSquareColor; int highlightSquareColor; int premoveHighlightColor; #endif int movesPerSession; float timeIncrement; char *engInitString[ENGINES]; char *computerString[ENGINES]; char *chessProgram[ENGINES]; char *directory[ENGINES]; char *pgnName[ENGINES]; Boolean firstPlaysBlack; Boolean noChessProgram; char *host[ENGINES]; char *themeNames; char *pieceDirectory; char *border; char *soundDirectory; char *remoteShell; char *remoteUser; float timeDelay; char *timeControl; Boolean trueColors; Boolean icsActive; Boolean autoBox; char *icsHost; char *icsPort; char *icsCommPort; /* if set, use serial port instead of tcp host/port */ char *icsLogon; /* Hack to permit variable logon scripts. */ char *icsHelper; Boolean icsInputBox; Boolean useTelnet; Boolean seekGraph; Boolean autoRefresh; char *telnetProgram; char *gateway; char *loadGameFile; int loadGameIndex; /* game # within file */ char *saveGameFile; Boolean autoSaveGames; Boolean onlyOwn; /* [HGM] suppress auto-saving of observed games */ char *loadPositionFile; int loadPositionIndex; /* position # within file */ char *savePositionFile; Boolean matchMode; int matchGames; Boolean monoMode; Boolean debugMode; Boolean clockMode; char *boardSize; char *logoDir; int logoSize; Boolean Iconic; char *searchTime; int searchDepth; Boolean showCoords; char *clockFont; char *messageFont; /* WinBoard only */ char *coordFont; char *font; /* xboard only: all other fonts */ char *tagsFont; /* WinBoard only */ char *commentFont; /* WinBoard only */ char *icsFont; /* WinBoard only */ Boolean ringBellAfterMoves; Boolean autoCallFlag; Boolean flipView; Boolean autoFlipView; char *cmailGameName; /* xboard only */ Boolean alwaysPromoteToQueen; Boolean oldSaveStyle; Boolean oneClick; Boolean quietPlay; Boolean showThinking; Boolean ponderNextMove; Boolean periodicUpdates; Boolean autoObserve; Boolean autoCreateLogon; Boolean autoComment; Boolean getMoveList; Boolean testLegality; Boolean topLevel; /* xboard, top-level auxiliary windows */ Boolean titleInWindow; /* xboard only */ Boolean localLineEditing; /* WinBoard only */ Boolean zippyTalk; Boolean zippyPlay; int flashCount; /* Number of times to flash (xboard only) */ int flashRate; /* Flashes per second (xboard only) */ int msLoginDelay; /* Delay per character (in msec) while sending ICS logon script (xboard only) */ Boolean colorize; /* If True, use the following colors to color text */ /* Strings for colors, as "fg, bg, bold" (strings used in xboard only) */ char *colorShout; // [HGM] IMPORTANT: order must conform to ColorClass definition char *colorSShout; char *colorChannel1; char *colorChannel; char *colorKibitz; char *colorTell; char *colorChallenge; char *colorRequest; char *colorSeek; char *colorNormal; char *soundProgram; /* sound-playing program */ char *soundShout; // [HGM] IMPORTANT: order must be as in ColorClass char *soundSShout; char *soundChannel1; char *soundChannel; char *soundKibitz; char *soundTell; char *soundChallenge; char *soundRequest; char *soundSeek; char *soundMove; // [HGM] IMPORTANT: order must be as in SoundClass char *soundBell; char *soundIcsAlarm; char *soundIcsWin; char *soundIcsLoss; char *soundIcsDraw; char *soundIcsUnfinished; Boolean disguise; /* [HGM] Promoted Pawns look like pieces in bughouse */ Boolean reuse[ENGINES]; Boolean animateDragging; /* If True, animate mouse dragging of pieces */ Boolean animate; /* If True, animate non-mouse moves */ int animSpeed; /* Delay in milliseconds between animation frames */ Boolean popupMoveErrors; Boolean popupExitMessage; int showJail; Boolean highlightLastMove; Boolean highlightDragging; Boolean blindfold; /* if true, no pieces are drawn */ Boolean premove; /* true if premove feature enabled */ Boolean premoveWhite; /* true if premoving White first move */ char *premoveWhiteText; /* text of White premove 1 */ Boolean premoveBlack; /* true if premoving Black first move */ char *premoveBlackText; /* text of Black premove 1 */ Boolean icsAlarm; /* true if sounding alarm at a certain time */ int icsAlarmTime; /* time to sound alarm, in milliseconds */ Boolean autoRaiseBoard; int fontSizeTolerance; /* xboard only */ char *initialMode; char *variant; char *chatBoxes; int protocolVersion[ENGINES]; Boolean showButtonBar; Boolean icsEngineAnalyze; Boolean variations; /* [HGM] enable variation-tree walking */ Boolean autoExtend; /* [HGM] enable playing move(s) of right-clicked PV in analysis mode */ /* [AS] New properties (down to the "ZIPPY" part) */ Boolean scoreIsAbsolute[ENGINES]; /* If true, engine score is always from white side */ Boolean saveExtendedInfoInPGN; /* If true, saved PGN games contain extended info */ Boolean hideThinkingFromHuman; /* If true, program thinking is generated but not displayed in human/computer matches */ Boolean useBitmaps; Boolean useFont; Boolean useBorder; char * liteBackTextureFile; /* Name of texture bitmap for lite squares */ char * darkBackTextureFile; /* Name of texture bitmap for dark squares */ int liteBackTextureMode; int darkBackTextureMode; char * renderPiecesWithFont; /* Name of font for rendering chess pieces */ char * fontToPieceTable; /* Map to translate font character to chess pieces */ int fontBackColorWhite; int fontForeColorWhite; int fontBackColorBlack; int fontForeColorBlack; int fontPieceSize; /* Size of font relative to square (percentage) */ int overrideLineGap; /* If >= 0 overrides the lineGap value of the board size properties */ int adjudicateLossThreshold; /* Adjudicate a two-machine game if both engines agree the score is below this for 6 plies */ int delayBeforeQuit; int delayAfterQuit; char * nameOfDebugFile; char * pgnEventHeader; int defaultFrcPosition; char * gameListTags; Boolean saveOutOfBookInfo; Boolean showEvalInMoveHistory; int evalHistColorWhite; int evalHistColorBlack; Boolean highlightMoveWithArrow; Boolean tourney; char * tourneyOptions; int highlightArrowColor; Boolean useStickyWindows; Boolean bgObserve; /* [HGM] bughouse */ Boolean dualBoard; /* [HGM] dual */ Boolean viewer; char * viewerOptions; int adjudicateDrawMoves; Boolean autoDisplayComment; Boolean autoDisplayTags; Boolean isUCI[ENGINES]; Boolean hasOwnBookUCI[ENGINES]; char * adapterCommand; char * ucciAdapter; char * polyglotDir; Boolean usePolyglotBook; Boolean defNoBook; char * polyglotBook; int bookDepth; int bookStrength; int defaultHashSize; int defaultCacheSizeEGTB; char * defaultPathEGTB; int defaultMatchGames; /* [HGM] Board size */ int NrFiles; int NrRanks; int holdingsSize; int matchPause; char * pieceToCharTable; char * pieceNickNames; char * colorNickNames; Boolean allWhite; Boolean upsideDown; Boolean alphaRank; Boolean testClaims; Boolean checkMates; Boolean materialDraws; Boolean trivialDraws; int ruleMoves; int drawRepeats; #if ZIPPY char *zippyLines; char *zippyPinhead; char *zippyPassword; char *zippyPassword2; char *zippyWrongPassword; char *zippyAcceptOnly; int zippyUseI; int zippyBughouse; int zippyNoplayCrafty; char *zippyGameEnd; char *zippyGameStart; int zippyAdjourn; int zippyAbort; char *zippyVariants; int zippyMaxGames; int zippyReplayTimeout; /*seconds*/ int zippyShortGame; /* [HGM] aborter */ #endif Boolean lowTimeWarning; /* [HGM] low time */ char *lowTimeWarningColor; char *serverFileName; char *serverMovesName; Boolean suppressLoadMoves; int serverPause; int timeOdds[ENGINES]; int timeOddsMode; int accumulateTC[ENGINES]; int NPS[ENGINES]; Boolean autoKibitz; int engineComments; int eloThreshold1; /* [HGM] select */ int eloThreshold2; int dateThreshold; int searchMode; int stretch; Boolean ignoreColors; Boolean findMirror; char *userName; int rewindIndex; /* [HGM] autoinc */ int sameColorGames; /* [HGM] alternate */ int smpCores; /* [HGM] SMP */ char *egtFormats; int niceEngines; /* [HGM] nice */ char *logo[ENGINES];/* [HGM] logo */ char *pairingEngine;/* [HGM] pairing */ Boolean autoLogo; Boolean noGUI; /* [HGM] fast: suppress all display updates */ char *engOptions[ENGINES]; /* [HGM] options */ char *fenOverride[ENGINES]; char *features[ENGINES]; char *featureDefaults; char *sysOpen; Boolean keepAlive; /* [HGM] alive */ Boolean forceIllegal;/*[HGM] illegal */ Boolean noJoin; /* [HGM] join */ char *wrapContSeq; /* continuation sequence when xboard wraps text */ Boolean useInternalWrap; /* use internal wrapping -- noJoin usurps this if set */ Boolean pasteSelection; /* paste X selection instead of clipboard */ int nrVariations; /* [HGM] multivar */ int zoom; /* [HGM] evalGraph */ int evalThreshold; /* [HGM] evalGraph */ Boolean dropMenu; /* [HGM] pv */ Boolean markers; /* [HGM] markers */ Boolean autoCopyPV; Boolean pieceMenu; Boolean sweepSelect; Boolean whitePOV; Boolean scoreWhite; Boolean pvSAN[ENGINES]; int recentEngines; char *recentEngineList; char *tourneyFile; char *defName; char *processes; char *results; char *participants; char *afterGame; char *afterTourney; int tourneyType; int tourneyCycles; int seedBase; Boolean roundSync; Boolean cycleSync; Boolean numberTag; } AppData, *AppDataPtr; /* PGN tags (for showing in the game list) */ #define LPUSERGLT_SIZE 64 #define GLT_EVENT 'e' #define GLT_SITE 's' #define GLT_DATE 'd' #define GLT_ROUND 'o' #define GLT_PLAYERS 'p' /* I.e. white "-" black */ #define GLT_RESULT 'r' #define GLT_WHITE_ELO 'w' #define GLT_BLACK_ELO 'b' #define GLT_TIME_CONTROL 't' #define GLT_VARIANT 'v' #define GLT_OUT_OF_BOOK 'a' #define GLT_RESULT_COMMENT 'c' /* [HGM] rescom */ #define GLT_DEFAULT_TAGS "eprd" /* Event, players, result, date */ #define GLT_ALL_TAGS "esdoprwbtvac" #define PGN_OUT_OF_BOOK "Annotator" extern AppData appData; typedef struct { /* PGN 7-tag info */ char *event; char *site; char *date; char *round; char *white; char *black; ChessMove result; /* Additional info */ char *fen; /* NULL or FEN for starting position; input only */ char *resultDetails; char *timeControl; char *extraTags; /* NULL or "[Tag \"Value\"]\n", etc. */ int whiteRating; /* -1 if unknown */ int blackRating; /* -1 if unknown */ VariantClass variant; char *outOfBook; /* [AS] Move and score when engine went out of book */ int boardWidth; /* [HGM] adjustable board size */ int boardHeight; /* [HGM] For Shogi and Crazyhouse: */ int holdingsSize; /* number of different piece types in holdings */ int holdingsWidth; /* number of files left and right of board, 0 or 2 */ } GameInfo; /* [AS] Search stats from chessprogram, for the played move */ // [HGM] moved here from backend.h because it occurs in declarations of front-end functions typedef struct { int score; /* Centipawns */ int depth; /* Plies */ int time; /* Milliseconds */ } ChessProgramStats_Move; /* [AS] Layout management */ typedef struct { Boolean visible; int x; int y; int width; int height; } WindowPlacement; extern WindowPlacement wpEngineOutput; extern WindowPlacement wpEvalGraph; extern WindowPlacement wpMoveHistory; extern WindowPlacement wpGameList; extern WindowPlacement wpTags; #define MAXENGINES 2000 // [HGM] chat #define MAX_CHAT 5 extern int chatCount; extern char chatPartner[MAX_CHAT][MSG_SIZ]; // Some prototypes of routines so general they should be available everywhere /* If status == 0, we are exiting with a benign message, not an error */ void DisplayFatalError P((String message, int error, int status)); void DisplayError P((String message, int error)); // [HGM] generally useful macros; there are way too many memory leaks... #define FREE(x) if(x) free(x) #define ASSIGN(x, y) if(x) free(x); x = strdup(y) // [HGM] for now we use the kludge to redefine all the unstructured options by their array counterpart // in due time we would have to make the actual substitutions all through the source #define firstInitString engInitString[0] #define secondInitString engInitString[1] #define firstComputerString computerString[0] #define secondComputerString computerString[1] #define firstChessProgram chessProgram[0] #define secondChessProgram chessProgram[1] #define firstDirectory directory[0] #define secondDirectory directory[1] #define firstProtocolVersion protocolVersion[0] #define secondProtocolVersion protocolVersion[1] #define firstScoreIsAbsolute scoreIsAbsolute[0] #define secondScoreIsAbsolute scoreIsAbsolute[1] #define firstHasOwnBookUCI hasOwnBookUCI[0] #define secondHasOwnBookUCI hasOwnBookUCI[1] #define firstTimeOdds timeOdds[0] #define secondTimeOdds timeOdds[1] #define firstAccumulateTC accumulateTC[0] #define secondAccumulateTC accumulateTC[1] #define firstHost host[0] #define secondHost host[1] #define reuseFirst reuse[0] #define reuseSecond reuse[1] #define firstIsUCI isUCI[0] #define secondIsUCI isUCI[1] #define firstNPS NPS[0] #define secondNPS NPS[1] #define firstLogo logo[0] #define secondLogo logo[1] #define fenOverride1 fenOverride[0] #define fenOverride2 fenOverride[1] #define firstOptions engOptions[0] #define secondOptions engOptions[1] #endif xboard-4.7.3/pixmaps/0000755000175000001440000000000012262562252011466 500000000000000xboard-4.7.3/pixmaps/WHITE_14.xpm0000644000175000001440000000064512262562252013325 00000000000000/* XPM */ static char *WHITE_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ ".....****.....", "...** **...", "..* .... *..", ".* ........ *.", ".* ........ *.", "* .......... *", "* .......... *", "* .......... *", "* .......... *", ".* ........ *.", ".* ........ *.", "..* .... *..", "...** **...", ".....****....." }; xboard-4.7.3/pixmaps/ini48.xpm0000644000175000001440000000512512262562252013072 00000000000000/* XPM */ static char *nld49[] = { /* columns rows colors chars-per-pixel */ "48 48 3 1", " c black", ". c transparent", "X c whit", /* pixels */ "................................................", "................................................", "................................................", "............ ........ ..........................", "............ ..... X .........................", "............ XX .... XX ........................", "............ XXX .. XXX ........................", "............ XXXX XXX .....................", "............. XX X XXX XXX ..................", "............ XX XXXXXXXXXXXXXX ................", "........... XXXXXXXXXXXXXXXXXXXX ...............", ".......... XXXXXXXXXXXXXXXXXXXXXX .............", ".......... XXXXXXXXXXXXXXXXXXXXXXX ............", "......... XXXXX XXXXXXXXXXXXXXXXXXX ...........", "......... XXX XXXXXXXXXXXXXXXXXXXXX ..........", "......... XXX XXXXXXXXXXXXXXXXXXXXXXX ..........", "......... XX XXXXXXXXXXXXXXXXXXXXXXXX .........", "........ XXXXXXXXXXXXXXXX XXXXXXXXXXXX ........", "........ XXXXXXXXXXXXXXXX XXXXXXXXXXXX ........", "........ XXXXXXXXXXXXXXXX XXXXXXXXXXXXX .......", "....... XXXXXXXXXXXXXXXXX XXXXXXXXXXXXX .......", "....... XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX .......", "...... XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX ......", "..... XXXXXXXXXXXXXXXXX . XXXXXXXXXXXXXX ......", "..... XXXXXXXXXXXXXXXX .. XXXXXXXXXXXXXXX ......", ".... XXXXXXXXXXXXXXX ... XXXXXXXXXXXXXXX .....", ".... XXXXXXXXXXXXXX ..... XXXXXXXXXXXXXXX .....", "... XX XXXXXXXXX ...... XXXXXXXXXXXXXXX .....", "... XX XXXXXXXXX ....... XXXXXXXXXXXXXXXXX .....", "... XXXXXXXXXXX ........ XXXXXXXXXXXXXXXXX ....", "... XXXXXX XXX ........ XXXXXXXXXXXXXXXXXX ....", "... XXXXX XXX ........ XXXXXXXXXXXXXXXXXXX ....", ".... XXXX XX ........ XXXXXXXXXXXXXXXXXXXX ....", "..... X ........ XXXXXXXXXXXXXXXXXXXXX ....", ".......... ....... XXXXXXXXXXXXXXXXXXXXXXX ....", ".................. XXXXXXXXXXXXXXXXXXXXXXXX ...", ".................. XXXXXXXXXXXXXXXXXXXXXXXX ...", "................. XXXXXXXXXXXXXXXXXXXXXXXXX ...", "................ XXXXXXXXXXXXXXXXXXXXXXXXXX ...", "............... XXXXXXXXXXXXXXXXXXXXXXXXXXX ...", "............... XXXXXXXXXXXXXXXXXXXXXXXXXXX ...", ".............. XXXXXXXXXXXXXXXXXXXXXXXXXXXX ...", ".............. XXXXXXXXXXXXXXXXXXXXXXXXXXXX ...", ".............. XXXXXXXXXXXXXXXXXXXXXXXXXXXX ...", ".............. ....", "................................................", "................................................", "................................................" }; xboard-4.7.3/pixmaps/THINKING_14.xpm0000644000175000001440000000064512262562252013660 00000000000000/* XPM */ static char *THINK_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ "..... ......", "... ... ....", ".. ... ... ...", ". .... .... ..", ". .... .... ..", " ..... ..... .", " .... .. .", " ..... ..... .", ". ......... ..", ". ......... ..", ".. ....... ...", "... ... ....", "..... ......", ".............." }; xboard-4.7.3/pixmaps/board32.xpm0000644000175000001440000000244712262562252013377 00000000000000/* XPM */ static char *board__[] = { /* columns rows colors chars-per-pixel */ "32 32 4 1", " c #000000", ". c #FFFF00", "X c #808080", "o c #FFFFFF", /* pixels */ "X.X. X.X. X.X. X.X. ", ".XoX .XoX .XoX .XoX ", "X.X. X.X. X.X. X.X. ", "oX.X oX.X oX.X oX.X ", " X.X. X.X. X.X. X.X.", " .XoX .XoX .XoX .XoX", " X.X. X.X. X.X. X.X.", " oX.X oX.X oX.X oX.X", "X.X. X.X. X.X. X.X. ", ".XoX .XoX .XoX .XoX ", "X.X. X.X. X.X. X.X. ", "oX.X oX.X oX.X oX.X ", " X.X. X.X. X.X. X.X.", " .XoX .XoX .XoX .XoX", " X.X. X.X. X.X. X.X.", " oX.X oX.X oX.X oX.X", "X.X. X.X. X.X. X.X. ", ".XoX .XoX .XoX .XoX ", "X.X. X.X. X.X. X.X. ", "oX.X oX.X oX.X oX.X ", " X.X. X.X. X.X. X.X.", " .XoX .XoX .XoX .XoX", " X.X. X.X. X.X. X.X.", " oX.X oX.X oX.X oX.X", "X.X. X.X. X.X. X.X. ", ".XoX .XoX .XoX .XoX ", "X.X. X.X. X.X. X.X. ", "oX.X oX.X oX.X oX.X ", " X.X. X.X. X.X. X.X.", " .XoX .XoX .XoX .XoX", " X.X. X.X. X.X. X.X.", " oX.X oX.X oX.X oX.X" }; xboard-4.7.3/pixmaps/UNKNOWN_14.xpm0000644000175000001440000000064712262562252013606 00000000000000/* XPM */ static char *UNKNOWN_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ ".....****.....", "...** **...", "..* . . *..", ".* . . . . *.", ".* . . . . *.", "* . . . . . *", "* . . . . . *", "* . . . . . *", "* . . . . . *", ".* . . . . *.", ".* . . . . *.", "..* . . *..", "...** **...", ".....****....." }; xboard-4.7.3/pixmaps/cross48.xpm0000644000175000001440000000514512262562252013446 00000000000000/* XPM */ static char *cross[] = { /* columns rows colors chars-per-pixel */ "48 48 4 1", " c #000000", ". c #FF0000", "X c #0000FF", "o c #FFFFFF", /* pixels */ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXooooooooooooooooooooooooooooooooooooooooooooXX", "XXo ooooooooooooooooooooooooooooooooooooXX", "XXo ooo.ooooooooooooooooooooooooooooooooXX", "XXo ooo.ooooooooooooooooooooooooooooooooXX", "XXo o.....ooooooooo.....ooooooooooooooooXX", "XXo ooo.ooooooooooooooooooooooooooooooooXX", "XXo ooo.ooooooooooooooooooooooooooooooooXX", "XXo ooooooooooooooooooooooooooooooooooooXX", "XXoooooooo oooooooooooooooooooooooooooooXX", "XXoooooooo ooooooooooooooooo.oooooooooooXX", "XXoooooooo ooooooooooooooooo.oooooooooooXX", "XXoo.....o ooooooooooooooo.....oooooooooXX", "XXoooooooo ooooooooooooooooo.oooooooooooXX", "XXoooooooo ooooooooooooooooo.oooooooooooXX", "XXoooooooo oooooooooooooooooooooooooooooXX", "XXooooooooooooooo ooooooooooooooooooooooXX", "XXooooooooooooooo ooooooooooooooooo.ooooXX", "XXooooooooooooooo o.....ooooooooooo.ooooXX", "XXooooooooooooooo ooooooooooooooo.....ooXX", "XXooooooooooooooo o.....ooooooooooo.ooooXX", "XXooooooooooooooo ooooooooooooooooo.ooooXX", "XXooooooooooooooo ooooooooooooooooooooooXX", "XXoooooooooooooooooooooo oooooooooooooooXX", "XXoooo.ooooooooooooooooo oooooooooooooooXX", "XXoooo.ooooooooooo.....o oooooooooooooooXX", "XXoo.....ooooooooooooooo oooooooooooooooXX", "XXoooo.ooooooooooo.....o oooooooooooooooXX", "XXoooo.ooooooooooooooooo oooooooooooooooXX", "XXoooooooooooooooooooooo oooooooooooooooXX", "XXooooooooooooooooooooooooooooo ooooooooXX", "XXooooooooooooooooooooooooooooo ooo.ooooXX", "XXooooooooooooooooooooooooooooo ooo.ooooXX", "XXooooooooo.....ooooooooooooooo o.....ooXX", "XXooooooooooooooooooooooooooooo ooo.ooooXX", "XXooooooooooooooooooooooooooooo ooo.ooooXX", "XXooooooooooooooooooooooooooooo ooooooooXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXoooooooooooooooo.....ooooooooo.....o oXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXoooooooooooooooooooooooooooooooooooo oXX", "XXooooooooooooooooooooooooooooooooooooooooooooXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }; xboard-4.7.3/pixmaps/cross32.xpm0000644000175000001440000000244512262562252013437 00000000000000/* XPM */ static char *cross[] = { /* columns rows colors chars-per-pixel */ "32 32 4 1", " c #000000", ". c #FF0000", "X c #0000FF", "o c #FFFFFF", /* pixels */ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "X oooooooooooooooooooooooooX", "X oo.ooooooooooooooooooooooX", "X o...ooooooo...oooooooooooX", "X oo.ooooooooooooooooooooooX", "X oooooooooooooooooooooooooX", "Xooooo ooooooooooooooooooooX", "Xooooo oooooooooooo.oooooooX", "Xo...o ooooooooooo...ooooooX", "Xooooo oooooooooooo.oooooooX", "Xooooo ooooooooooooooooooooX", "Xoooooooooo oooooooooooooooX", "Xoooooooooo o...oooooooooooX", "Xoooooooooo oooooooooooo.ooX", "Xoooooooooo o...ooooooo...oX", "Xoooooooooo oooooooooooo.ooX", "Xooooooooooooooo ooooooooooX", "Xoo.oooooooo...o ooooooooooX", "Xo...ooooooooooo ooooooooooX", "Xoo.oooooooo...o ooooooooooX", "Xooooooooooooooo ooooooooooX", "Xoooooooooooooooooooo oooooX", "Xoooooooooooooooooooo oo.ooX", "Xoooooo...ooooooooooo o...oX", "Xoooooooooooooooooooo oo.ooX", "Xoooooooooooooooooooo oooooX", "Xooooooooooooooooooooooooo X", "Xooooooooooo...ooooooooooo X", "Xooooooooooooooooooooo...o X", "Xooooooooooooooooooooooooo X", "Xooooooooooooooooooooooooo X", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }; xboard-4.7.3/pixmaps/ini32.xpm0000644000175000001440000000242612262562252013064 00000000000000/* XPM */ static char *nld33[] = { /* columns rows colors chars-per-pixel */ "32 32 3 1", " c black", ". c transparent", "X c white", /* pixels */ "................................", "................................", "................................", "......... ... ................", "......... X . XX ...............", "......... XX XX .............", "......... X XX XX ...........", "......... X XXXXXXXXX .........", "........ XXXXXXXXXXXXX ........", "........ X XXXXXXXXXXX .......", "....... X XXXXXXXXXXXXXX ......", "....... X XXXXXXXX XXXXX ......", "...... XXXXXXXXXXX XXXXXX .....", "...... XXXXXXXXXXX XXXXXX .....", "..... XXXXXXXXXXXX XXXXXXX ....", "..... XXXXXXXXXXX XXXXXXXX ....", ".... XXXXXXXXXX XXXXXXXX ....", ".... XXXXXXXXX .. XXXXXXXXX ...", "... X XXXXXX ... XXXXXXXXX ...", "... X XXXXX .... XXXXXXXXXX ...", "... XXX XX ..... XXXXXXXXXX ...", "... XXX X ..... XXXXXXXXXXXX ...", ".... ..... XXXXXXXXXXXXX ..", "............. XXXXXXXXXXXXXX ..", "............ XXXXXXXXXXXXXXX ..", "........... XXXXXXXXXXXXXXXX ..", "........... XXXXXXXXXXXXXXXX ..", ".......... XXXXXXXXXXXXXXXXX ..", ".......... XXXXXXXXXXXXXXXXX ..", ".......... ..", "................................", "................................" }; xboard-4.7.3/pixmaps/BLACK_14.xpm0000644000175000001440000000064512262562252013261 00000000000000/* XPM */ static char *BLACK_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ ".....****.....", "...** **...", "..* *..", ".* *.", ".* *.", "* *", "* *", "* *", "* *", ".* *.", ".* *.", "..* *..", "...** **...", ".....****....." }; xboard-4.7.3/pixmaps/PONDER_14.xpm0000644000175000001440000000064612262562252013435 00000000000000/* XPM */ static char *PONDER_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ ".... .. ....", ".. ... .. ..", ". .......... .", " .......... ..", " ........... .", ". .......... ", ".. .......... ", ". .......... .", ".. ....... ..", "... .. .. ...", ".. . .. ....", ". ..........", " .............", ".............." }; xboard-4.7.3/pixmaps/CLEAR_14.xpm0000644000175000001440000000064512262562252013273 00000000000000/* XPM */ static char *CLEAR_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", "..............", ".............." }; xboard-4.7.3/pixmaps/ANALYZING_14.xpm0000644000175000001440000000064712262562252014003 00000000000000/* XPM */ static char *ANALYZE_14[] = { /* columns rows colors chars-per-pixel */ "14 14 3 1", " c white", "* c black", ". c None", /* pixels */ "....... ....", "..... ... ..", ".... ....... .", ".... .. .... .", "... .. ..... ", "... ......... ", "... ......... ", ".... ....... .", ".... ....... .", "... . ... ..", ".. . .. ....", ". . ..........", " ...........", ".............." }; xboard-4.7.3/pixmaps/board48.xpm0000644000175000001440000000515012262562252013400 00000000000000/* XPM */ static char *board__[] = { /* columns rows colors chars-per-pixel */ "48 48 4 1", " c #000000", ". c #FFFF00", "X c #808080", "o c #FFFFFF", /* pixels */ "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", "X.X.X. X.X.X. X.X.X. X.X.X. ", "oX.XoX oX.XoX oX.XoX oX.XoX ", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", " X.X.X. X.X.X. X.X.X. X.X.X.", " oX.XoX oX.XoX oX.XoX oX.XoX", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", "X.X.X. X.X.X. X.X.X. X.X.X. ", "oX.XoX oX.XoX oX.XoX oX.XoX ", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", " X.X.X. X.X.X. X.X.X. X.X.X.", " oX.XoX oX.XoX oX.XoX oX.XoX", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", "X.X.X. X.X.X. X.X.X. X.X.X. ", "oX.XoX oX.XoX oX.XoX oX.XoX ", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", " X.X.X. X.X.X. X.X.X. X.X.X.", " oX.XoX oX.XoX oX.XoX oX.XoX", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", "X.X.X. X.X.X. X.X.X. X.X.X. ", "oX.XoX oX.XoX oX.XoX oX.XoX ", "X.X.X. X.X.X. X.X.X. X.X.X. ", ".XoX.X .XoX.X .XoX.X .XoX.X ", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", " X.X.X. X.X.X. X.X.X. X.X.X.", " oX.XoX oX.XoX oX.XoX oX.XoX", " X.X.X. X.X.X. X.X.X. X.X.X.", " .XoX.X .XoX.X .XoX.X .XoX.X", }; xboard-4.7.3/dialogs.c0000644000175000001440000027455012262562252011530 00000000000000/* * dialogs.c -- platform-independent code for dialogs of XBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // [HGM] this file is the counterpart of woptions.c, containing xboard popup menus // similar to those of WinBoard, to set the most common options interactively. #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include "common.h" #include "frontend.h" #include "backend.h" #include "xboard2.h" #include "menus.h" #include "dialogs.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif int values[MAX_OPTIONS]; ChessProgramState *currentCps; //----------------------------Generic dialog -------------------------------------------- // cloned from Engine Settings dialog (and later merged with it) char *marked[NrOfDialogs]; Boolean shellUp[NrOfDialogs]; void MarkMenu (char *item, int dlgNr) { MarkMenuItem(marked[dlgNr] = item, True); } void AddLine (Option *opt, char *s) { AppendText(opt, s); AppendText(opt, "\n"); } //---------------------------------------------- Update dialog controls ------------------------------------ int SetCurrentComboSelection (Option *opt) { int j; if(!opt->textValue) opt->value = *(int*)opt->target; /* numeric */else { for(j=0; opt->choice[j]; j++) // look up actual value in list of possible values, to get selection nr if(*(char**)opt->target && !strcmp(*(char**)opt->target, ((char**)opt->textValue)[j])) break; opt->value = j + (opt->choice[j] == NULL); } return opt->value; } void GenericUpdate (Option *opts, int selected) { int i; char buf[MSG_SIZ]; for(i=0; ; i++) { if(selected >= 0) { if(i < selected) continue; else if(i > selected) break; } switch(opts[i].type) { case TextBox: case FileName: case PathName: SetWidgetText(&opts[i], *(char**) opts[i].target, -1); break; case Spin: sprintf(buf, "%d", *(int*) opts[i].target); SetWidgetText(&opts[i], buf, -1); break; case Fractional: sprintf(buf, "%4.2f", *(float*) opts[i].target); SetWidgetText(&opts[i], buf, -1); break; case CheckBox: SetWidgetState(&opts[i], *(Boolean*) opts[i].target); break; case ComboBox: if(opts[i].min & COMBO_CALLBACK) break; SetCurrentComboSelection(opts+i); // TODO: actually display this (but it is never used that way...) break; case EndMark: return; default: printf("GenericUpdate: unexpected case in switch.\n"); case ListBox: case Button: case SaveButton: case Label: case Break: break; } } } //------------------------------------------- Read out dialog controls ------------------------------------ int GenericReadout (Option *opts, int selected) { int i, j, res=1; char *val; char buf[MSG_SIZ], **dest; float x; for(i=0; ; i++) { // send all options that had to be OK-ed to engine if(selected >= 0) { if(i < selected) continue; else if(i > selected) break; } switch(opts[i].type) { case TextBox: case FileName: case PathName: GetWidgetText(&opts[i], &val); dest = currentCps ? &(opts[i].textValue) : (char**) opts[i].target; if(*dest == NULL || strcmp(*dest, val)) { if(currentCps) { snprintf(buf, MSG_SIZ, "option %s=%s\n", opts[i].name, val); SendToProgram(buf, currentCps); } else { if(*dest) free(*dest); *dest = malloc(strlen(val)+1); } safeStrCpy(*dest, val, MSG_SIZ - (*dest - opts[i].name)); // copy text there } break; case Spin: case Fractional: GetWidgetText(&opts[i], &val); x = 0.0; // Initialise because sscanf() will fail if non-numeric text is entered sscanf(val, "%f", &x); if(x > opts[i].max) x = opts[i].max; if(x < opts[i].min) x = opts[i].min; if(opts[i].type == Fractional) *(float*) opts[i].target = x; // engines never have float options! else if(opts[i].value != x) { opts[i].value = x; if(currentCps) { snprintf(buf, MSG_SIZ, "option %s=%.0f\n", opts[i].name, x); SendToProgram(buf, currentCps); } else *(int*) opts[i].target = x; } break; case CheckBox: j = 0; GetWidgetState(&opts[i], &j); if(opts[i].value != j) { opts[i].value = j; if(currentCps) { snprintf(buf, MSG_SIZ, "option %s=%d\n", opts[i].name, j); SendToProgram(buf, currentCps); } else *(Boolean*) opts[i].target = j; } break; case ComboBox: if(opts[i].min & COMBO_CALLBACK) break; if(!opts[i].textValue) { *(int*)opts[i].target = values[i]; break; } // numeric val = ((char**)opts[i].textValue)[values[i]]; if(currentCps) { if(opts[i].value == values[i]) break; // not changed opts[i].value = values[i]; snprintf(buf, MSG_SIZ, "option %s=%s\n", opts[i].name, opts[i].choice[values[i]]); SendToProgram(buf, currentCps); } else if(val && (*(char**) opts[i].target == NULL || strcmp(*(char**) opts[i].target, val))) { if(*(char**) opts[i].target) free(*(char**) opts[i].target); *(char**) opts[i].target = strdup(val); } break; case EndMark: if(opts[i].target) // callback for implementing necessary actions on OK (like redraw) res = ((OKCallback*) opts[i].target)(i); break; default: printf("GenericReadout: unexpected case in switch.\n"); case ListBox: case Button: case SaveButton: case Label: case Break: break; } if(opts[i].type == EndMark) break; } return res; } //------------------------------------------- Match Options ------------------------------------------------------ char *engineName, *engineChoice, *tfName; char *engineList[MAXENGINES] = {" "}, *engineMnemonic[MAXENGINES]; static void AddToTourney P((int n, int sel)); static void CloneTourney P((void)); static void ReplaceParticipant P((void)); static void UpgradeParticipant P((void)); static int MatchOK (int n) { ASSIGN(appData.participants, engineName); if(!CreateTourney(tfName) || matchMode) return matchMode || !appData.participants[0]; PopDown(TransientDlg); // early popdown to prevent FreezeUI called through MatchEvent from causing XtGrab warning MatchEvent(2); // start tourney return FALSE; // no double PopDown! } static Option matchOptions[] = { { 0, 0, 0, NULL, (void*) &tfName, ".trn", NULL, FileName, N_("Tournament file: ") }, { 0, 0, 0, NULL, (void*) &appData.roundSync, "", NULL, CheckBox, N_("Sync after round") }, { 0, SAME_ROW|LL, 0, NULL, NULL, "", NULL, Label, N_(" (for concurrent playing of a single") }, { 0, 0, 0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle") }, { 0, SAME_ROW|LL, 0, NULL, NULL, "", NULL, Label, N_(" tourney with multiple XBoards)") }, { 0, LR, 175, NULL, NULL, "", NULL, Label, N_("Tourney participants:") }, { 0, SAME_ROW|RR, 175, NULL, NULL, "", NULL, Label, N_("Select Engine:") }, { 150, T_VSCRL | T_FILL | T_WRAP, 175, NULL, (void*) &engineName, "", NULL, TextBox, "" }, { 150, SAME_ROW|RR, 175, NULL, (void*) engineMnemonic, (char*) &AddToTourney, NULL, ListBox, "" }, { 0, 0, 0, NULL, NULL, NULL, NULL, Break, "" }, // to decouple alignment above and below boxes //{ 0, COMBO_CALLBACK | NO_GETTEXT, // 0, NULL, (void*) &AddToTourney, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") }, { 0, 0, 10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0 = round-robin, 1 = gauntlet):") }, { 0, 1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles (or Swiss rounds):") }, { 0, 1, 1000000000, NULL, (void*) &appData.defaultMatchGames, "", NULL, Spin, N_("Default Number of Games in Match (or Pairing):") }, { 0, 0, 1000000000, NULL, (void*) &appData.matchPause, "", NULL, Spin, N_("Pause between Match Games (msec):") }, { 0, 0, 0, NULL, (void*) &appData.saveGameFile, ".pgn .game", NULL, FileName, N_("Save Tourney Games on:") }, { 0, 0, 0, NULL, (void*) &appData.loadGameFile, ".pgn .game", NULL, FileName, N_("Game File with Opening Lines:") }, { 0, -2, 1000000000, NULL, (void*) &appData.loadGameIndex, "", NULL, Spin, N_("Game Number (-1 or -2 = Auto-Increment):") }, { 0, 0, 0, NULL, (void*) &appData.loadPositionFile, ".fen .epd .pos", NULL, FileName, N_("File with Start Positions:") }, { 0, -2, 1000000000, NULL, (void*) &appData.loadPositionIndex, "", NULL, Spin, N_("Position Number (-1 or -2 = Auto-Increment):") }, { 0, 0, 1000000000, NULL, (void*) &appData.rewindIndex, "", NULL, Spin, N_("Rewind Index after this many Games (0 = never):") }, { 0, 0, 0, NULL, (void*) &appData.defNoBook, "", NULL, CheckBox, N_("Disable own engine books by default") }, { 0, 0, 0, NULL, (void*) &ReplaceParticipant, NULL, NULL, Button, N_("Replace Engine") }, { 0, SAME_ROW, 0, NULL, (void*) &UpgradeParticipant, NULL, NULL, Button, N_("Upgrade Engine") }, { 0, SAME_ROW, 0, NULL, (void*) &CloneTourney, NULL, NULL, Button, N_("Clone Tourney") }, { 0, SAME_ROW, 0, NULL, (void*) &MatchOK, "", NULL, EndMark , "" } }; static void ReplaceParticipant () { GenericReadout(matchOptions, 7); Substitute(strdup(engineName), True); } static void UpgradeParticipant () { GenericReadout(matchOptions, 7); Substitute(strdup(engineName), False); } static void CloneTourney () { FILE *f; char *name; GetWidgetText(matchOptions, &name); if(name && name[0] && (f = fopen(name, "r")) ) { char *saveSaveFile; saveSaveFile = appData.saveGameFile; appData.saveGameFile = NULL; // this is a persistent option, protect from change ParseArgsFromFile(f); engineName = appData.participants; GenericUpdate(matchOptions, -1); FREE(appData.saveGameFile); appData.saveGameFile = saveSaveFile; } else DisplayError(_("First you must specify an existing tourney file to clone"), 0); } static void AddToTourney (int n, int sel) { int nr; char buf[MSG_SIZ]; if(sel < 1) buf[0] = NULLCHAR; // back to top level else if(engineList[sel][0] == '#') safeStrCpy(buf, engineList[sel], MSG_SIZ); // group header, open group else { // normal line, select engine AddLine(&matchOptions[7], engineMnemonic[sel]); return; } nr = NamesToList(firstChessProgramNames, engineList, engineMnemonic, buf); // replace list by only the group contents ASSIGN(engineMnemonic[0], buf); LoadListBox(&matchOptions[8], _("# no engines are installed"), -1, -1); HighlightWithScroll(&matchOptions[8], 0, nr); } void MatchOptionsProc () { NamesToList(firstChessProgramNames, engineList, engineMnemonic, ""); matchOptions[9].min = -(appData.pairingEngine[0] != NULLCHAR); // with pairing engine, allow Swiss ASSIGN(tfName, appData.tourneyFile[0] ? appData.tourneyFile : MakeName(appData.defName)); ASSIGN(engineName, appData.participants); ASSIGN(engineMnemonic[0], ""); GenericPopUp(matchOptions, _("Match Options"), TransientDlg, BoardWindow, MODAL, 0); } // ------------------------------------------- General Options -------------------------------------------------- static int oldShow, oldBlind, oldPonder; static int GeneralOptionsOK (int n) { int newPonder = appData.ponderNextMove; appData.ponderNextMove = oldPonder; PonderNextMoveEvent(newPonder); if(!appData.highlightLastMove) ClearHighlights(), ClearPremoveHighlights(); if(oldShow != appData.showCoords || oldBlind != appData.blindfold) DrawPosition(TRUE, NULL); return 1; } static Option generalOptions[] = { { 0, 0, 0, NULL, (void*) &appData.whitePOV, "", NULL, CheckBox, N_("Absolute Analysis Scores") }, { 0, 0, 0, NULL, (void*) &appData.sweepSelect, "", NULL, CheckBox, N_("Almost Always Queen (Detour Under-Promote)") }, { 0, 0, 0, NULL, (void*) &appData.animateDragging, "", NULL, CheckBox, N_("Animate Dragging") }, { 0, 0, 0, NULL, (void*) &appData.animate, "", NULL, CheckBox, N_("Animate Moving") }, { 0, 0, 0, NULL, (void*) &appData.autoCallFlag, "", NULL, CheckBox, N_("Auto Flag") }, { 0, 0, 0, NULL, (void*) &appData.autoFlipView, "", NULL, CheckBox, N_("Auto Flip View") }, { 0, 0, 0, NULL, (void*) &appData.blindfold, "", NULL, CheckBox, N_("Blindfold") }, { 0, 0, 0, NULL, (void*) &appData.dropMenu, "", NULL, CheckBox, N_("Drop Menu") }, { 0, 0, 0, NULL, (void*) &appData.variations, "", NULL, CheckBox, N_("Enable Variation Trees") }, { 0, 0, 0, NULL, (void*) &appData.hideThinkingFromHuman, "", NULL, CheckBox, N_("Hide Thinking from Human") }, { 0, 0, 0, NULL, (void*) &appData.highlightLastMove, "", NULL, CheckBox, N_("Highlight Last Move") }, { 0, 0, 0, NULL, (void*) &appData.highlightMoveWithArrow, "", NULL, CheckBox, N_("Highlight with Arrow") }, { 0, 0, 0, NULL, (void*) &appData.oneClick, "", NULL, CheckBox, N_("One-Click Moving") }, { 0, 0, 0, NULL, (void*) &appData.periodicUpdates, "", NULL, CheckBox, N_("Periodic Updates (in Analysis Mode)") }, { 0, SAME_ROW, 0, NULL, NULL, NULL, NULL, Break, "" }, { 0, 0, 0, NULL, (void*) &appData.autoExtend, "", NULL, CheckBox, N_("Play Move(s) of Clicked PV (Analysis)") }, { 0, 0, 0, NULL, (void*) &appData.ponderNextMove, "", NULL, CheckBox, N_("Ponder Next Move") }, { 0, 0, 0, NULL, (void*) &appData.popupExitMessage, "", NULL, CheckBox, N_("Popup Exit Messages") }, { 0, 0, 0, NULL, (void*) &appData.popupMoveErrors, "", NULL, CheckBox, N_("Popup Move Errors") }, { 0, 0, 0, NULL, (void*) &appData.showEvalInMoveHistory, "", NULL, CheckBox, N_("Scores in Move List") }, { 0, 0, 0, NULL, (void*) &appData.showCoords, "", NULL, CheckBox, N_("Show Coordinates") }, { 0, 0, 0, NULL, (void*) &appData.markers, "", NULL, CheckBox, N_("Show Target Squares") }, { 0, 0, 0, NULL, (void*) &appData.useStickyWindows, "", NULL, CheckBox, N_("Sticky Windows") }, { 0, 0, 0, NULL, (void*) &appData.testLegality, "", NULL, CheckBox, N_("Test Legality") }, { 0, 0, 0, NULL, (void*) &appData.topLevel, "", NULL, CheckBox, N_("Top-Level Dialogs") }, { 0, 0,10, NULL, (void*) &appData.flashCount, "", NULL, Spin, N_("Flash Moves (0 = no flashing):") }, { 0, 1,10, NULL, (void*) &appData.flashRate, "", NULL, Spin, N_("Flash Rate (high = fast):") }, { 0, 5,100, NULL, (void*) &appData.animSpeed, "", NULL, Spin, N_("Animation Speed (high = slow):") }, { 0, 1,5, NULL, (void*) &appData.zoom, "", NULL, Spin, N_("Zoom factor in Evaluation Graph:") }, { 0, 0, 0, NULL, (void*) &GeneralOptionsOK, "", NULL, EndMark , "" } }; void OptionsProc () { oldPonder = appData.ponderNextMove; oldShow = appData.showCoords; oldBlind = appData.blindfold; GenericPopUp(generalOptions, _("General Options"), TransientDlg, BoardWindow, MODAL, 0); } //---------------------------------------------- New Variant ------------------------------------------------ static void Pick P((int n)); static char warning[MSG_SIZ]; static Option variantDescriptors[] = { { VariantNormal, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("normal")}, { VariantMakruk, SAME_ROW, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("makruk")}, { VariantFischeRandom, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("FRC")}, { VariantShatranj,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("shatranj")}, { VariantWildCastle, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("wild castle")}, { VariantKnightmate,SAME_ROW,135,NULL,(void*) &Pick, "#FFFFFF", NULL, Button, N_("knightmate")}, { VariantNoCastle, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("no castle")}, { VariantCylinder,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("cylinder *")}, { Variant3Check, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("3-checks")}, { VariantBerolina,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("berolina *")}, { VariantAtomic, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("atomic")}, { VariantTwoKings,SAME_ROW,135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_("two kings")}, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("Board size ( -1 = default for selected variant):")}, { 0, -1, BOARD_RANKS-1, NULL, (void*) &appData.NrRanks, "", NULL, Spin, N_("Number of Board Ranks:") }, { 0, -1, BOARD_FILES, NULL, (void*) &appData.NrFiles, "", NULL, Spin, N_("Number of Board Files:") }, { 0, -1, BOARD_RANKS-1, NULL, (void*) &appData.holdingsSize, "", NULL, Spin, N_("Holdings Size:") }, { 0, 0, 275, NULL, NULL, NULL, NULL, Label, warning }, { 0, 0, 275, NULL, NULL, NULL, NULL, Label, "Variants marked with * can only be played\nwith legality testing off"}, { 0, SAME_ROW, 0, NULL, NULL, NULL, NULL, Break, ""}, { VariantFairy, 0, 135, NULL, (void*) &Pick, "#BFBFBF", NULL, Button, N_("fairy")}, { VariantGreat, SAME_ROW, 135, NULL, (void*) &Pick, "#BFBFFF", NULL, Button, N_("Great Shatranj (10x8)")}, { VariantSChess, 0, 135, NULL, (void*) &Pick, "#FFBFBF", NULL, Button, N_("Seirawan")}, { VariantFalcon, SAME_ROW, 135, NULL, (void*) &Pick, "#BFBFFF", NULL, Button, N_("falcon (10x8)")}, { VariantSuper, 0, 135, NULL, (void*) &Pick, "#FFBFBF", NULL, Button, N_("Superchess")}, { VariantCapablanca,SAME_ROW,135,NULL,(void*) &Pick, "#BFBFFF", NULL, Button, N_("Capablanca (10x8)")}, { VariantCrazyhouse, 0, 135, NULL, (void*) &Pick, "#FFBFBF", NULL, Button, N_("crazyhouse")}, { VariantGothic, SAME_ROW, 135, NULL, (void*) &Pick, "#BFBFFF", NULL, Button, N_("Gothic (10x8)")}, { VariantBughouse, 0, 135, NULL, (void*) &Pick, "#FFBFBF", NULL, Button, N_("bughouse")}, { VariantJanus, SAME_ROW, 135, NULL, (void*) &Pick, "#BFBFFF", NULL, Button, N_("janus (10x8)")}, { VariantSuicide, 0, 135, NULL, (void*) &Pick, "#FFFFBF", NULL, Button, N_("suicide")}, { VariantCapaRandom,SAME_ROW,135,NULL,(void*) &Pick, "#BFBFFF", NULL, Button, N_("CRC (10x8)")}, { VariantGiveaway, 0, 135, NULL, (void*) &Pick, "#FFFFBF", NULL, Button, N_("give-away")}, { VariantGrand, SAME_ROW, 135, NULL, (void*) &Pick, "#5070FF", NULL, Button, N_("grand (10x10)")}, { VariantLosers, 0, 135, NULL, (void*) &Pick, "#FFFFBF", NULL, Button, N_("losers")}, { VariantShogi, SAME_ROW, 135, NULL, (void*) &Pick, "#BFFFFF", NULL, Button, N_("shogi (9x9)")}, { VariantSpartan, 0, 135, NULL, (void*) &Pick, "#FF0000", NULL, Button, N_("Spartan")}, { VariantXiangqi, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFFF", NULL, Button, N_("xiangqi (9x10)")}, { -1, 0, 135, NULL, (void*) &Pick, "#FFFFFF", NULL, Button, N_(" ")}, // dummy, to have good alignment { VariantCourier, SAME_ROW,135, NULL, (void*) &Pick, "#BFFFBF", NULL, Button, N_("courier (12x8)")}, { 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void Pick (int n) { VariantClass v = variantDescriptors[n].value; if(!appData.noChessProgram) { char *name = VariantName(v), buf[MSG_SIZ]; if (first.protocolVersion > 1 && StrStr(first.variants, name) == NULL) { /* [HGM] in protocol 2 we check if variant is suported by engine */ snprintf(buf, MSG_SIZ, _("Variant %s not supported by %s"), name, first.tidy); DisplayError(buf, 0); return; /* ignore OK if first engine does not support it */ } else if (second.initDone && second.protocolVersion > 1 && StrStr(second.variants, name) == NULL) { snprintf(buf, MSG_SIZ, _("Warning: second engine (%s) does not support this!"), second.tidy); DisplayError(buf, 0); /* use of second engine is optional; only warn user */ } } GenericReadout(variantDescriptors, -1); // make sure ranks and file settings are read gameInfo.variant = v; appData.variant = VariantName(v); shuffleOpenings = FALSE; /* [HGM] shuffle: possible shuffle reset when we switch */ startedFromPositionFile = FALSE; /* [HGM] loadPos: no longer valid in new variant */ appData.pieceToCharTable = NULL; appData.pieceNickNames = ""; appData.colorNickNames = ""; PopDown(TransientDlg); Reset(True, True); return; } void NewVariantProc () { if(appData.noChessProgram) sprintf(warning, _("Only bughouse is not available in viewer mode")); else sprintf(warning, _("All variants not supported by first engine\n(currently %s) are disabled"), first.tidy); GenericPopUp(variantDescriptors, _("New Variant"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------- Common Engine Options ------------------------------------- static int oldCores; static int CommonOptionsOK (int n) { int newPonder = appData.ponderNextMove; // make sure changes are sent to first engine by re-initializing it // if it was already started pre-emptively at end of previous game if(gameMode == BeginningOfGame) Reset(True, True); else { // Some changed setting need immediate sending always. if(oldCores != appData.smpCores) NewSettingEvent(False, &(first.maxCores), "cores", appData.smpCores); appData.ponderNextMove = oldPonder; PonderNextMoveEvent(newPonder); } return 1; } 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,16000, NULL, (void*) &appData.defaultHashSize, "", NULL, Spin, N_("Hash-Table Size (MB):") }, { 0, 0, 0, NULL, (void*) &appData.defaultPathEGTB, "", NULL, PathName, N_("Nalimov 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:") }, { 0, 0, 100, NULL, (void*) &appData.bookDepth, "", NULL, Spin, N_("Book Depth (moves):") }, { 0, 0, 100, NULL, (void*) &appData.bookStrength, "", NULL, Spin, N_("Book Variety (0) vs. Strength (100):") }, { 0, 0, 0, NULL, (void*) &appData.firstHasOwnBookUCI, "", NULL, CheckBox, N_("Engine #1 Has Own Book") }, { 0, 0, 0, NULL, (void*) &appData.secondHasOwnBookUCI, "", NULL, CheckBox, N_("Engine #2 Has Own Book ") }, { 0,SAME_ROW,0,NULL, (void*) &CommonOptionsOK, "", NULL, EndMark , "" } }; void UciMenuProc () { oldCores = appData.smpCores; oldPonder = appData.ponderNextMove; GenericPopUp(commonEngineOptions, _("Common Engine Settings"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------ Adjudication Options -------------------------------------- static Option adjudicationOptions[] = { { 0, 0, 0, NULL, (void*) &appData.checkMates, "", NULL, CheckBox, N_("Detect all Mates") }, { 0, 0, 0, NULL, (void*) &appData.testClaims, "", NULL, CheckBox, N_("Verify Engine Result Claims") }, { 0, 0, 0, NULL, (void*) &appData.materialDraws, "", NULL, CheckBox, N_("Draw if Insufficient Mating Material") }, { 0, 0, 0, NULL, (void*) &appData.trivialDraws, "", NULL, CheckBox, N_("Adjudicate Trivial Draws (3-Move Delay)") }, { 0, 0,100, NULL, (void*) &appData.ruleMoves, "", NULL, Spin, N_("N-Move Rule:") }, { 0, 0, 6, NULL, (void*) &appData.drawRepeats, "", NULL, Spin, N_("N-fold Repeats:") }, { 0, 0,1000, NULL, (void*) &appData.adjudicateDrawMoves, "", NULL, Spin, N_("Draw after N Moves Total:") }, { 0, -5000,0, NULL, (void*) &appData.adjudicateLossThreshold, "", NULL, Spin, N_("Win / Loss Threshold:") }, { 0, 0, 0, NULL, (void*) &first.scoreIsAbsolute, "", NULL, CheckBox, N_("Negate Score of Engine #1") }, { 0, 0, 0, NULL, (void*) &second.scoreIsAbsolute, "", NULL, CheckBox, N_("Negate Score of Engine #2") }, { 0,SAME_ROW, 0, NULL, NULL, "", NULL, EndMark , "" } }; void EngineMenuProc () { GenericPopUp(adjudicationOptions, _("Adjudicate non-ICS Games"), TransientDlg, BoardWindow, MODAL, 0); } //--------------------------------------------- ICS Options --------------------------------------------- static int IcsOptionsOK (int n) { ParseIcsTextColors(); return 1; } Option icsOptions[] = { { 0, 0, 0, NULL, (void*) &appData.autoKibitz, "", NULL, CheckBox, N_("Auto-Kibitz") }, { 0, 0, 0, NULL, (void*) &appData.autoComment, "", NULL, CheckBox, N_("Auto-Comment") }, { 0, 0, 0, NULL, (void*) &appData.autoObserve, "", NULL, CheckBox, N_("Auto-Observe") }, { 0, 0, 0, NULL, (void*) &appData.autoRaiseBoard, "", NULL, CheckBox, N_("Auto-Raise Board") }, { 0, 0, 0, NULL, (void*) &appData.autoCreateLogon, "", NULL, CheckBox, N_("Auto-Create Logon Script") }, { 0, 0, 0, NULL, (void*) &appData.bgObserve, "", NULL, CheckBox, N_("Background Observe while Playing") }, { 0, 0, 0, NULL, (void*) &appData.dualBoard, "", NULL, CheckBox, N_("Dual Board for Background-Observed Game") }, { 0, 0, 0, NULL, (void*) &appData.getMoveList, "", NULL, CheckBox, N_("Get Move List") }, { 0, 0, 0, NULL, (void*) &appData.quietPlay, "", NULL, CheckBox, N_("Quiet Play") }, { 0, 0, 0, NULL, (void*) &appData.seekGraph, "", NULL, CheckBox, N_("Seek Graph") }, { 0, 0, 0, NULL, (void*) &appData.autoRefresh, "", NULL, CheckBox, N_("Auto-Refresh Seek Graph") }, { 0, 0, 0, NULL, (void*) &appData.autoBox, "", NULL, CheckBox, N_("Auto-InputBox PopUp") }, { 0, 0, 0, NULL, (void*) &appData.premove, "", NULL, CheckBox, N_("Premove") }, { 0, 0, 0, NULL, (void*) &appData.premoveWhite, "", NULL, CheckBox, N_("Premove for White") }, { 0, 0, 0, NULL, (void*) &appData.premoveWhiteText, "", NULL, TextBox, N_("First White Move:") }, { 0, 0, 0, NULL, (void*) &appData.premoveBlack, "", NULL, CheckBox, N_("Premove for Black") }, { 0, 0, 0, NULL, (void*) &appData.premoveBlackText, "", NULL, TextBox, N_("First Black Move:") }, { 0, SAME_ROW, 0, NULL, NULL, NULL, NULL, Break, "" }, { 0, 0, 0, NULL, (void*) &appData.icsAlarm, "", NULL, CheckBox, N_("Alarm") }, { 0, 0, 100000000, NULL, (void*) &appData.icsAlarmTime, "", NULL, Spin, N_("Alarm Time (msec):") }, //{ 0, 0, 0, NULL, (void*) &appData.chatBoxes, "", NULL, TextBox, N_("Startup Chat Boxes:") }, { 0, 0, 0, NULL, (void*) &appData.colorize, "", NULL, CheckBox, N_("Colorize Messages") }, { 0, 0, 0, NULL, (void*) &appData.colorShout, "", NULL, TextBox, N_("Shout Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorSShout, "", NULL, TextBox, N_("S-Shout Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorChannel1, "", NULL, TextBox, N_("Channel #1 Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorChannel, "", NULL, TextBox, N_("Other Channel Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorKibitz, "", NULL, TextBox, N_("Kibitz Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorTell, "", NULL, TextBox, N_("Tell Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorChallenge, "", NULL, TextBox, N_("Challenge Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorRequest, "", NULL, TextBox, N_("Request Text Colors:") }, { 0, 0, 0, NULL, (void*) &appData.colorSeek, "", NULL, TextBox, N_("Seek Text Colors:") }, { 0, 0, 0, NULL, (void*) &IcsOptionsOK, "", NULL, EndMark , "" } }; void IcsOptionsProc () { GenericPopUp(icsOptions, _("ICS Options"), TransientDlg, BoardWindow, MODAL, 0); } //-------------------------------------------- Load Game Options --------------------------------- static char *modeNames[] = { N_("Exact position match"), N_("Shown position is subset"), N_("Same material with exactly same Pawn chain"), N_("Same material"), N_("Material range (top board half optional)"), N_("Material difference (optional stuff balanced)"), NULL }; static char *modeValues[] = { "1", "2", "3", "4", "5", "6" }; static char *searchMode; static int LoadOptionsOK () { appData.searchMode = atoi(searchMode); return 1; } static Option loadOptions[] = { { 0, 0, 0, NULL, (void*) &appData.autoDisplayTags, "", NULL, CheckBox, N_("Auto-Display Tags") }, { 0, 0, 0, NULL, (void*) &appData.autoDisplayComment, "", NULL, CheckBox, N_("Auto-Display Comment") }, { 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("Auto-Play speed of loaded games\n(0 = instant, -1 = off):") }, { 0, -1,10000000, NULL, (void*) &appData.timeDelay, "", NULL, Fractional, N_("Seconds per Move:") }, { 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("\noptions to use in game-viewer mode:") }, { 0, 0,300, NULL, (void*) &appData.viewerOptions, "", NULL, TextBox, "" }, { 0, LR, 0, NULL, NULL, NULL, NULL, Label, N_("\nThresholds for position filtering in game list:") }, { 0, 0,5000, NULL, (void*) &appData.eloThreshold1, "", NULL, Spin, N_("Elo of strongest player at least:") }, { 0, 0,5000, NULL, (void*) &appData.eloThreshold2, "", NULL, Spin, N_("Elo of weakest player at least:") }, { 0, 0,5000, NULL, (void*) &appData.dateThreshold, "", NULL, Spin, N_("No games before year:") }, { 0, 1,50, NULL, (void*) &appData.stretch, "", NULL, Spin, N_("Minimum nr consecutive positions:") }, { 0, 0,205, NULL, (void*) &searchMode, (char*) modeValues, modeNames, ComboBox, N_("Search mode:") }, { 0, 0, 0, NULL, (void*) &appData.ignoreColors, "", NULL, CheckBox, N_("Also match reversed colors") }, { 0, 0, 0, NULL, (void*) &appData.findMirror, "", NULL, CheckBox, N_("Also match left-right flipped position") }, { 0, 0, 0, NULL, (void*) &LoadOptionsOK, "", NULL, EndMark , "" } }; void LoadOptionsPopUp (DialogClass parent) { ASSIGN(searchMode, modeValues[appData.searchMode-1]); GenericPopUp(loadOptions, _("Load Game Options"), TransientDlg, parent, MODAL, 0); } void LoadOptionsProc () { // called from menu LoadOptionsPopUp(BoardWindow); } //------------------------------------------- Save Game Options -------------------------------------------- static Option saveOptions[] = { { 0, 0, 0, NULL, (void*) &appData.autoSaveGames, "", NULL, CheckBox, N_("Auto-Save Games") }, { 0, 0, 0, NULL, (void*) &appData.onlyOwn, "", NULL, CheckBox, N_("Own Games Only") }, { 0, 0, 0, NULL, (void*) &appData.saveGameFile, ".pgn", NULL, FileName, N_("Save Games on File:") }, { 0, 0, 0, NULL, (void*) &appData.savePositionFile, ".fen", NULL, FileName, N_("Save Final Positions on File:") }, { 0, 0, 0, NULL, (void*) &appData.pgnEventHeader, "", NULL, TextBox, N_("PGN Event Header:") }, { 0, 0, 0, NULL, (void*) &appData.oldSaveStyle, "", NULL, CheckBox, N_("Old Save Style (as opposed to PGN)") }, { 0, 0, 0, NULL, (void*) &appData.numberTag, "", NULL, CheckBox, N_("Include Number Tag in tourney PGN") }, { 0, 0, 0, NULL, (void*) &appData.saveExtendedInfoInPGN, "", NULL, CheckBox, N_("Save Score/Depth Info in PGN") }, { 0, 0, 0, NULL, (void*) &appData.saveOutOfBookInfo, "", NULL, CheckBox, N_("Save Out-of-Book Info in PGN ") }, { 0, SAME_ROW, 0, NULL, NULL, "", NULL, EndMark , "" } }; void SaveOptionsProc () { GenericPopUp(saveOptions, _("Save Game Options"), TransientDlg, BoardWindow, MODAL, 0); } //----------------------------------------------- Sound Options --------------------------------------------- static void Test P((int n)); static char *trialSound; static char *soundNames[] = { N_("No Sound"), N_("Default Beep"), N_("Above WAV File"), N_("Car Horn"), N_("Cymbal"), N_("Ding"), N_("Gong"), N_("Laser"), N_("Penalty"), N_("Phone"), N_("Pop"), N_("Slap"), N_("Wood Thunk"), NULL, N_("User File") }; static char *soundFiles[] = { // sound files corresponding to above names "", "$", NULL, // kludge alert: as first thing in the dialog readout this is replaced with the user-given .WAV filename "honkhonk.wav", "cymbal.wav", "ding1.wav", "gong.wav", "laser.wav", "penalty.wav", "phone.wav", "pop2.wav", "slap.wav", "woodthunk.wav", NULL, NULL }; static Option soundOptions[] = { { 0, 0, 0, NULL, (void*) (soundFiles+2) /* kludge! */, ".wav", NULL, FileName, N_("User WAV File:") }, { 0, 0, 0, NULL, (void*) &appData.soundProgram, "", NULL, TextBox, N_("Sound Program:") }, { 0, 0, 0, NULL, (void*) &trialSound, (char*) soundFiles, soundNames, ComboBox, N_("Try-Out Sound:") }, { 0, SAME_ROW, 0, NULL, (void*) &Test, NULL, NULL, Button, N_("Play") }, { 0, 0, 0, NULL, (void*) &appData.soundMove, (char*) soundFiles, soundNames, ComboBox, N_("Move:") }, { 0, 0, 0, NULL, (void*) &appData.soundIcsWin, (char*) soundFiles, soundNames, ComboBox, N_("Win:") }, { 0, 0, 0, NULL, (void*) &appData.soundIcsLoss, (char*) soundFiles, soundNames, ComboBox, N_("Lose:") }, { 0, 0, 0, NULL, (void*) &appData.soundIcsDraw, (char*) soundFiles, soundNames, ComboBox, N_("Draw:") }, { 0, 0, 0, NULL, (void*) &appData.soundIcsUnfinished, (char*) soundFiles, soundNames, ComboBox, N_("Unfinished:") }, { 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.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:") }, { 0, 0, 0, NULL, (void*) &appData.soundChannel1, (char*) soundFiles, soundNames, ComboBox, N_("Channel 1:") }, { 0, 0, 0, NULL, (void*) &appData.soundTell, (char*) soundFiles, soundNames, ComboBox, N_("Tell:") }, { 0, 0, 0, NULL, (void*) &appData.soundKibitz, (char*) soundFiles, soundNames, ComboBox, N_("Kibitz:") }, { 0, 0, 0, NULL, (void*) &appData.soundRequest, (char*) soundFiles, soundNames, ComboBox, N_("Request:") }, { 0, 0, 0, NULL, (void*) &appData.soundSeek, (char*) soundFiles, soundNames, ComboBox, N_("Seek:") }, { 0, SAME_ROW, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void Test (int n) { GenericReadout(soundOptions, 1); if(soundFiles[values[2]]) PlaySoundFile(soundFiles[values[2]]); } void SoundOptionsProc () { free(soundFiles[2]); soundFiles[2] = strdup("*"); GenericPopUp(soundOptions, _("Sound Options"), TransientDlg, BoardWindow, MODAL, 0); } //--------------------------------------------- Board Options -------------------------------------- static void DefColor P((int n)); static void AdjustColor P((int i)); static char oldPieceDir[MSG_SIZ]; static int BoardOptionsOK (int n) { if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; else lineGap = defaultLineGap; InitDrawingParams(strcmp(oldPieceDir, appData.pieceDirectory)); InitDrawingSizes(-1, 0); DrawPosition(True, NULL); return 1; } static Option boardOptions[] = { { 0, 0, 70, NULL, (void*) &appData.whitePieceColor, "", NULL, TextBox, N_("White Piece Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFFCC", Button, " " }, /* TRANSLATORS: R = single letter for the color red */ { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, /* TRANSLATORS: G = single letter for the color green */ { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, /* TRANSLATORS: B = single letter for the color blue */ { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, /* TRANSLATORS: D = single letter to make a color darker */ { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.blackPieceColor, "", NULL, TextBox, N_("Black Piece Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#202020", Button, " " }, { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.lightSquareColor, "", NULL, TextBox, N_("Light Square Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#C8C365", Button, " " }, { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.darkSquareColor, "", NULL, TextBox, N_("Dark Square Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#77A26D", Button, " " }, { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.highlightSquareColor, "", NULL, TextBox, N_("Highlight Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#FFFF00", Button, " " }, { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 70, NULL, (void*) &appData.premoveHighlightColor, "", NULL, TextBox, N_("Premove Highlight Color:") }, { 1000, SAME_ROW, 0, NULL, (void*) &DefColor, NULL, (char**) "#FF0000", Button, " " }, { 1, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("R") }, { 2, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("G") }, { 3, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("B") }, { 4, SAME_ROW, 0, NULL, (void*) &AdjustColor, NULL, NULL, Button, N_("D") }, { 0, 0, 0, NULL, (void*) &appData.upsideDown, "", NULL, CheckBox, N_("Flip Pieces Shogi Style (Colored buttons restore default)") }, //{ 0, 0, 0, NULL, (void*) &appData.allWhite, "", NULL, CheckBox, N_("Use Outline Pieces for Black") }, { 0, 0, 0, NULL, (void*) &appData.monoMode, "", NULL, CheckBox, N_("Mono Mode") }, { 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.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*) &BoardOptionsOK, "", NULL, EndMark , "" } }; static void SetColorText (int n, char *buf) { SetWidgetText(&boardOptions[n-1], buf, TransientDlg); SetColor(buf, &boardOptions[n]); } static void DefColor (int n) { SetColorText(n, (char*) boardOptions[n].choice); } void RefreshColor (int source, int n) { int col, j, r, g, b, step = 10; char *s, buf[MSG_SIZ]; // color string GetWidgetText(&boardOptions[source], &s); if(sscanf(s, "#%x", &col) != 1) return; // malformed b = col & 0xFF; g = col & 0xFF00; r = col & 0xFF0000; switch(n) { case 1: r += 0x10000*step;break; case 2: g += 0x100*step; break; case 3: b += step; break; case 4: r -= 0x10000*step; g -= 0x100*step; b -= step; break; } if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; if(r > 0xFF0000) r = 0xFF0000; if(g > 0xFF00) g = 0xFF00; if(b > 0xFF) b = 0xFF; col = r | g | b; snprintf(buf, MSG_SIZ, "#%06x", col); for(j=1; j<7; j++) if(buf[j] >= 'a') buf[j] -= 32; // capitalize SetColorText(source+1, buf); } static void AdjustColor (int i) { int n = boardOptions[i].value; RefreshColor(i-n-1, n); } void BoardOptionsProc () { strncpy(oldPieceDir, appData.pieceDirectory, MSG_SIZ-1); // to see if it changed GenericPopUp(boardOptions, _("Board Options"), TransientDlg, BoardWindow, MODAL, 0); } //-------------------------------------------- ICS Text Menu Options ------------------------------ Option textOptions[100]; static void PutText P((char *text, int pos)); void SendString (char *p) { char buf[MSG_SIZ], *q; if(q = strstr(p, "$input")) { if(!shellUp[TextMenuDlg]) return; strncpy(buf, p, MSG_SIZ); strncpy(buf + (q-p), q+6, MSG_SIZ-(q-p)); PutText(buf, q-p); return; } snprintf(buf, MSG_SIZ, "%s\n", p); SendToICS(buf); } void IcsTextProc () { int i=0, j; char *p, *q, *r; if((p = icsTextMenuString) == NULL) return; do { q = r = p; while(*p && *p != ';') p++; if(textOptions[i].name == NULL) textOptions[i].name = (char*) malloc(MSG_SIZ); for(j=0; jnrOptions) { DisplayNote(_("Engine has no options")); return; } currentCps = cps; GenericPopUp(cps->option, _("Engine Settings"), TransientDlg, BoardWindow, MODAL, 0); } void FirstSettingsProc () { SettingsPopUp(&first); } void SecondSettingsProc () { if(WaitForEngine(&second, SettingsMenuIfReady)) return; SettingsPopUp(&second); } //----------------------------------------------- Load Engine -------------------------------------- char *engineDir, *engineLine, *nickName, *params; Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick, secondEng; static void EngSel P((int n, int sel)); static int InstallOK P((int n)); 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*) &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*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (do not wait for engine features)") }, { 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, 0, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" } }; static int InstallOK (int n) { if(n && (n = SelectedListBoxItem(&installOptions[1])) > 0) { // called by pressing OK, and engine selected ASSIGN(engineLine, engineList[n]); } PopDown(TransientDlg); // early popdown, to allow FreezeUI to instate grab if(!secondEng) Load(&first, 0); else Load(&second, 1); return FALSE; // no double PopDown! } static void EngSel (int n, int sel) { int nr; char buf[MSG_SIZ]; if(sel < 1) buf[0] = NULLCHAR; // back to top level else if(engineList[sel][0] == '#') safeStrCpy(buf, engineList[sel], MSG_SIZ); // group header, open group else { // normal line, select engine ASSIGN(engineLine, engineList[sel]); InstallOK(0); return; } nr = NamesToList(firstChessProgramNames, engineList, engineMnemonic, buf); // replace list by only the group contents ASSIGN(engineMnemonic[0], buf); LoadListBox(&installOptions[1], _("# no engines are installed"), -1, -1); HighlightWithScroll(&installOptions[1], 0, nr); } static void LoadEngineProc (int engineNr, char *title) { isUCI = storeVariant = v1 = useNick = False; addToList = hasBook = True; // defaults secondEng = engineNr; if(engineLine) free(engineLine); engineLine = strdup(""); if(engineDir) free(engineDir); engineDir = strdup("."); if(nickName) free(nickName); nickName = strdup(""); if(params) free(params); params = strdup(""); ASSIGN(engineMnemonic[0], ""); NamesToList(firstChessProgramNames, engineList, engineMnemonic, ""); GenericPopUp(installOptions, title, TransientDlg, BoardWindow, MODAL, 0); } void LoadEngine1Proc () { LoadEngineProc (0, _("Load first engine")); } void LoadEngine2Proc () { LoadEngineProc (1, _("Load second engine")); } //----------------------------------------------------- Edit Book ----------------------------------------- void EditBookProc () { EditBookEvent(); } //--------------------------------------------------- New Shuffle Game ------------------------------ static void SetRandom P((int n)); static int ShuffleOK (int n) { ResetGameEvent(); return 1; } static Option shuffleOptions[] = { { 0, 0, 0, NULL, (void*) &shuffleOpenings, NULL, NULL, CheckBox, N_("shuffle") }, { 0,-1,2000000000, NULL, (void*) &appData.defaultFrcPosition, "", NULL, Spin, N_("Start-position number:") }, { 0, 0, 0, NULL, (void*) &SetRandom, NULL, NULL, Button, N_("randomize") }, { 0, SAME_ROW, 0, NULL, (void*) &SetRandom, NULL, NULL, Button, N_("pick fixed") }, { 0,SAME_ROW, 0, NULL, (void*) &ShuffleOK, "", NULL, EndMark , "" } }; static void SetRandom (int n) { int r = n==2 ? -1 : random() & (1<<30)-1; char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%d", r); SetWidgetText(&shuffleOptions[1], buf, TransientDlg); SetWidgetState(&shuffleOptions[0], True); } void ShuffleMenuProc () { GenericPopUp(shuffleOptions, _("New Shuffle Game"), TransientDlg, BoardWindow, MODAL, 0); } //------------------------------------------------------ Time Control ----------------------------------- static int TcOK P((int n)); int tmpMoves, tmpTc, tmpInc, tmpOdds1, tmpOdds2, tcType; static void SetTcType P((int n)); static char * Value (int n) { static char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%d", n); return buf; } static Option tcOptions[] = { { 0, 0, 0, NULL, (void*) &SetTcType, NULL, NULL, Button, N_("classical") }, { 0,SAME_ROW,0,NULL, (void*) &SetTcType, NULL, NULL, Button, N_("incremental") }, { 0,SAME_ROW,0,NULL, (void*) &SetTcType, NULL, NULL, Button, N_("fixed max") }, { 0, 0, 200, NULL, (void*) &tmpMoves, NULL, NULL, Spin, N_("Moves per session:") }, { 0, 0,10000, NULL, (void*) &tmpTc, NULL, NULL, Spin, N_("Initial time (min):") }, { 0, 0, 10000, NULL, (void*) &tmpInc, NULL, NULL, Spin, N_("Increment or max (sec/move):") }, { 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("Time-Odds factors:") }, { 0, 1, 1000, NULL, (void*) &tmpOdds1, NULL, NULL, Spin, N_("Engine #1") }, { 0, 1, 1000, NULL, (void*) &tmpOdds2, NULL, NULL, Spin, N_("Engine #2 / Human") }, { 0, 0, 0, NULL, (void*) &TcOK, "", NULL, EndMark , "" } }; static int TcOK (int n) { char *tc; if(tcType == 0 && tmpMoves <= 0) return 0; if(tcType == 2 && tmpInc <= 0) return 0; GetWidgetText(&tcOptions[4], &tc); // get original text, in case it is min:sec searchTime = 0; switch(tcType) { case 0: if(!ParseTimeControl(tc, -1, tmpMoves)) return 0; appData.movesPerSession = tmpMoves; ASSIGN(appData.timeControl, tc); appData.timeIncrement = -1; break; case 1: if(!ParseTimeControl(tc, tmpInc, 0)) return 0; ASSIGN(appData.timeControl, tc); appData.timeIncrement = tmpInc; break; case 2: searchTime = tmpInc; } appData.firstTimeOdds = first.timeOdds = tmpOdds1; appData.secondTimeOdds = second.timeOdds = tmpOdds2; Reset(True, True); return 1; } static void SetTcType (int n) { switch(tcType = n) { case 0: SetWidgetText(&tcOptions[3], Value(tmpMoves), TransientDlg); SetWidgetText(&tcOptions[4], Value(tmpTc), TransientDlg); SetWidgetText(&tcOptions[5], _("Unused"), TransientDlg); break; case 1: SetWidgetText(&tcOptions[3], _("Unused"), TransientDlg); SetWidgetText(&tcOptions[4], Value(tmpTc), TransientDlg); SetWidgetText(&tcOptions[5], Value(tmpInc), TransientDlg); break; case 2: SetWidgetText(&tcOptions[3], _("Unused"), TransientDlg); SetWidgetText(&tcOptions[4], _("Unused"), TransientDlg); SetWidgetText(&tcOptions[5], Value(tmpInc), TransientDlg); } } void TimeControlProc () { tmpMoves = appData.movesPerSession; tmpInc = appData.timeIncrement; if(tmpInc < 0) tmpInc = 0; tmpOdds1 = tmpOdds2 = 1; tcType = 0; tmpTc = atoi(appData.timeControl); GenericPopUp(tcOptions, _("Time Control"), TransientDlg, BoardWindow, MODAL, 0); SetTcType(searchTime ? 2 : appData.timeIncrement < 0 ? 0 : 1); } //------------------------------- Ask Question ----------------------------------------- int SendReply P((int n)); char pendingReplyPrefix[MSG_SIZ]; ProcRef pendingReplyPR; char *answer; Option askOptions[] = { { 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, { 0, 0, 0, NULL, (void*) &answer, "", NULL, TextBox, "" }, { 0, 0, 0, NULL, (void*) &SendReply, "", NULL, EndMark , "" } }; int SendReply (int n) { char buf[MSG_SIZ]; int err; char *reply=answer; // GetWidgetText(&askOptions[1], &reply); safeStrCpy(buf, pendingReplyPrefix, sizeof(buf)/sizeof(buf[0]) ); if (*buf) strncat(buf, " ", MSG_SIZ - strlen(buf) - 1); strncat(buf, reply, MSG_SIZ - strlen(buf) - 1); strncat(buf, "\n", MSG_SIZ - strlen(buf) - 1); OutputToProcess(pendingReplyPR, buf, strlen(buf), &err); // does not go into debug file??? => bug if (err) DisplayFatalError(_("Error writing to chess program"), err, 0); return TRUE; } void AskQuestion (char *title, char *question, char *replyPrefix, ProcRef pr) { safeStrCpy(pendingReplyPrefix, replyPrefix, sizeof(pendingReplyPrefix)/sizeof(pendingReplyPrefix[0]) ); pendingReplyPR = pr; ASSIGN(answer, ""); askOptions[0].name = question; if(GenericPopUp(askOptions, title, AskDlg, BoardWindow, MODAL, 0)) AddHandler(&askOptions[1], AskDlg, 2); } //---------------------------- Promotion Popup -------------------------------------- static int count; static void PromoPick P((int n)); static Option promoOptions[] = { { 0, 0, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW, 0, NULL, (void*) &PromoPick, NULL, NULL, Button, NULL }, { 0, SAME_ROW | NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void PromoPick (int n) { int promoChar = promoOptions[n+count].value; PopDown(PromoDlg); if (promoChar == 0) fromX = -1; if (fromX == -1) return; if (! promoChar) { fromX = fromY = -1; ClearHighlights(); return; } UserMoveEvent(fromX, fromY, toX, toY, promoChar); if (!appData.highlightLastMove || gotPremove) ClearHighlights(); if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY); fromX = fromY = -1; } static void SetPromo (char *name, int nr, char promoChar) { ASSIGN(promoOptions[nr].name, name); promoOptions[nr].value = promoChar; promoOptions[nr].min = SAME_ROW; } void PromotionPopUp () { // choice depends on variant: prepare dialog acordingly count = 8; SetPromo(_("Cancel"), --count, 0); // Beware: GenericPopUp cannot handle user buttons named "cancel" (lowe case)! if(gameInfo.variant != VariantShogi) { if (!appData.testLegality || gameInfo.variant == VariantSuicide || gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) || gameInfo.variant == VariantGiveaway) { SetPromo(_("King"), --count, 'k'); } if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) { SetPromo(_("Captain"), --count, 'c'); SetPromo(_("Lieutenant"), --count, 'l'); SetPromo(_("General"), --count, 'g'); SetPromo(_("Warlord"), --count, 'w'); } else { SetPromo(_("Knight"), --count, 'n'); SetPromo(_("Bishop"), --count, 'b'); SetPromo(_("Rook"), --count, 'r'); if(gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantGothic || gameInfo.variant == VariantCapaRandom) { SetPromo(_("Archbishop"), --count, 'a'); SetPromo(_("Chancellor"), --count, 'c'); } SetPromo(_("Queen"), --count, 'q'); } } else // [HGM] shogi { SetPromo(_("Defer"), --count, '='); SetPromo(_("Promote"), --count, '+'); } promoOptions[count].min = 0; GenericPopUp(promoOptions + count, "Promotion", PromoDlg, BoardWindow, NONMODAL, 0); } //---------------------------- Chat Windows ---------------------------------------------- static char *line, *memo, *partner, *texts[MAX_CHAT], dirty[MAX_CHAT]; static int activePartner; void ChatSwitch P((int n)); int ChatOK P((int n)); Option chatOptions[] = { { 0, T_TOP, 100, NULL, (void*) &partner, NULL, NULL, TextBox, N_("Chat partner:") }, { 1, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" }, { 2, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" }, { 3, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" }, { 4, SAME_ROW|TT, 75, NULL, (void*) &ChatSwitch, NULL, NULL, Button, "" }, { 100, T_VSCRL | T_FILL | T_WRAP | T_TOP, 510, NULL, (void*) &memo, NULL, NULL, TextBox, "" }, { 0, 0, 510, NULL, (void*) &line, NULL, NULL, TextBox, "" }, { 0, NO_OK|SAME_ROW, 0, NULL, (void*) &ChatOK, NULL, NULL, EndMark , "" } }; void OutputChatMessage (int partner, char *mess) { char *p = texts[partner]; int len = strlen(mess) + 1; if(p) len += strlen(p); texts[partner] = (char*) malloc(len); snprintf(texts[partner], len, "%s%s", p ? p : "", mess); FREE(p); if(partner == activePartner) { AppendText(&chatOptions[5], mess); SetInsertPos(&chatOptions[5], len-2); } else { SetColor("#FFC000", &chatOptions[partner + (partner < activePartner)]); dirty[partner] = 1; } } int ChatOK (int n) { // can only be called through in chat-partner text-edit, as there is no OK button char buf[MSG_SIZ]; if(!partner || strcmp(partner, chatPartner[activePartner])) { safeStrCpy(chatPartner[activePartner], partner, MSG_SIZ); SetWidgetText(&chatOptions[5], "", -1); // clear text if we alter partner SetWidgetText(&chatOptions[6], "", ChatDlg); // clear text if we alter partner HardSetFocus(&chatOptions[6]); } if(line[0]) { // something was typed SetWidgetText(&chatOptions[6], "", ChatDlg); // from here on it could be back-end if(line[strlen(line)-1] == '\n') line[strlen(line)-1] = NULLCHAR; SaveInHistory(line); 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 else { if(!atoi(chatPartner[activePartner])) { snprintf(buf, MSG_SIZ, "> %s\n", line); // echo only tells to handle, not channel OutputChatMessage(activePartner, buf); snprintf(buf, MSG_SIZ, "xtell %s %s\n", chatPartner[activePartner], line); } else snprintf(buf, MSG_SIZ, "tell %s %s\n", chatPartner[activePartner], line); } SendToICS(buf); } return FALSE; // never pop down } void ChatSwitch (int n) { int i, j; if(n <= activePartner) n--; activePartner = n; if(!texts[n]) texts[n] = strdup(""); dirty[n] = 0; SetWidgetText(&chatOptions[5], texts[n], ChatDlg); SetInsertPos(&chatOptions[5], strlen(texts[n])); SetWidgetText(&chatOptions[0], chatPartner[n], ChatDlg); for(i=j=0; i= strlen(GLT_ALL_TAGS)) return; strings[index] = strings[index+1]; strings[++index] = p; LoadListBox(&listOptions[0], "?", index, index-1); // only change the two specified entries } else if (n == 2) { if(index == 0) return; strings[index] = strings[index-1]; strings[--index] = p; LoadListBox(&listOptions[0], "?", index, index+1); } else if (n == 1) { safeStrCpy(lpUserGLT, GLT_DEFAULT_TAGS, LPUSERGLT_SIZE); GLT_TagsToList(lpUserGLT); index = 0; LoadListBox(&listOptions[0], "?", -1, -1); } HighlightListBoxItem(&listOptions[0], index); } void GameListOptionsPopUp (DialogClass parent) { safeStrCpy(lpUserGLT, appData.gameListTags, LPUSERGLT_SIZE); GLT_TagsToList(lpUserGLT); GenericPopUp(listOptions, _("Game-list options"), TransientDlg, parent, MODAL, 0); } void GameListOptionsProc () { GameListOptionsPopUp(BoardWindow); } //----------------------------- Error popup in various uses ----------------------------- /* * [HGM] Note: * XBoard has always had some pathologic behavior with multiple simultaneous error popups, * (which can occur even for modal popups when asynchrounous events, e.g. caused by engine, request a popup), * and this new implementation reproduces that as well: * Only the shell of the last instance is remembered in shells[ErrorDlg] (which replaces errorShell), * so that PopDowns ordered from the code always refer to that instance, and once that is down, * have no clue as to how to reach the others. For the Delete Window button calling PopDown this * has now been repaired, as the action routine assigned to it gets the shell passed as argument. */ int errorUp = False; void ErrorPopDown () { if (!errorUp) return; dialogError = errorUp = False; PopDown(ErrorDlg); PopDown(FatalDlg); // on explicit request we pop down any error dialog if (errorExitStatus != -1) ExitEvent(errorExitStatus); } static int ErrorOK (int n) { dialogError = errorUp = False; PopDown(n == 1 ? FatalDlg : ErrorDlg); // kludge: non-modal dialogs have one less (dummy) option if (errorExitStatus != -1) ExitEvent(errorExitStatus); return FALSE; // prevent second Popdown ! } static Option errorOptions[] = { { 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, // dummy option: will never be displayed { 0, 0, 0, NULL, NULL, NULL, NULL, Label, NULL }, // textValue field will be set before popup { 0,NO_CANCEL,0, NULL, (void*) &ErrorOK, "", NULL, EndMark , "" } }; void ErrorPopUp (char *title, char *label, int modal) { errorUp = True; errorOptions[1].name = label; if(dialogError = shellUp[TransientDlg]) GenericPopUp(errorOptions+1, title, FatalDlg, TransientDlg, MODAL, 0); // pop up as daughter of the transient dialog else GenericPopUp(errorOptions+modal, title, modal ? FatalDlg: ErrorDlg, BoardWindow, modal, 0); // kludge: option start address indicates modality } void DisplayError (String message, int error) { char buf[MSG_SIZ]; if (error == 0) { if (appData.debugMode || appData.matchMode) { fprintf(stderr, "%s: %s\n", programName, message); } } else { if (appData.debugMode || appData.matchMode) { fprintf(stderr, "%s: %s: %s\n", programName, message, strerror(error)); } snprintf(buf, sizeof(buf), "%s: %s", message, strerror(error)); message = buf; } ErrorPopUp(_("Error"), message, FALSE); } void DisplayMoveError (String message) { fromX = fromY = -1; ClearHighlights(); DrawPosition(TRUE, NULL); // selective redraw would miss the from-square of the rejected move, displayed empty after drag, but not marked damaged! if (appData.debugMode || appData.matchMode) { fprintf(stderr, "%s: %s\n", programName, message); } if (appData.popupMoveErrors) { ErrorPopUp(_("Error"), message, FALSE); } else { DisplayMessage(message, ""); } } void DisplayFatalError (String message, int error, int status) { char buf[MSG_SIZ]; errorExitStatus = status; if (error == 0) { fprintf(stderr, "%s: %s\n", programName, message); } else { fprintf(stderr, "%s: %s: %s\n", programName, message, strerror(error)); snprintf(buf, sizeof(buf), "%s: %s", message, strerror(error)); message = buf; } if(mainOptions[W_BOARD].handle) { if (appData.popupExitMessage) { ErrorPopUp(status ? _("Fatal Error") : _("Exiting"), message, TRUE); } else { ExitEvent(status); } } } void DisplayInformation (String message) { ErrorPopDown(); ErrorPopUp(_("Information"), message, TRUE); } void DisplayNote (String message) { ErrorPopDown(); ErrorPopUp(_("Note"), message, FALSE); } void DisplayTitle (char *text) { char title[MSG_SIZ]; char icon[MSG_SIZ]; if (text == NULL) text = ""; if(partnerUp) { SetDialogTitle(DummyDlg, text); return; } if (*text != NULLCHAR) { safeStrCpy(icon, text, sizeof(icon)/sizeof(icon[0]) ); safeStrCpy(title, text, sizeof(title)/sizeof(title[0]) ); } else if (appData.icsActive) { snprintf(icon, sizeof(icon), "%s", appData.icsHost); snprintf(title, sizeof(title), "%s: %s", programName, appData.icsHost); } else if (appData.cmailGameName[0] != NULLCHAR) { snprintf(icon, sizeof(icon), "%s", "CMail"); snprintf(title,sizeof(title), "%s: %s", programName, "CMail"); #ifdef GOTHIC // [HGM] license: This stuff should really be done in back-end, but WinBoard already had a pop-up for it } else if (gameInfo.variant == VariantGothic) { safeStrCpy(icon, programName, sizeof(icon)/sizeof(icon[0]) ); safeStrCpy(title, GOTHIC, sizeof(title)/sizeof(title[0]) ); #endif #ifdef FALCON } else if (gameInfo.variant == VariantFalcon) { safeStrCpy(icon, programName, sizeof(icon)/sizeof(icon[0]) ); safeStrCpy(title, FALCON, sizeof(title)/sizeof(title[0]) ); #endif } else if (appData.noChessProgram) { safeStrCpy(icon, programName, sizeof(icon)/sizeof(icon[0]) ); safeStrCpy(title, programName, sizeof(title)/sizeof(title[0]) ); } else { safeStrCpy(icon, first.tidy, sizeof(icon)/sizeof(icon[0]) ); snprintf(title,sizeof(title), "%s: %s", programName, first.tidy); } SetWindowTitle(text, title, icon); } #define PAUSE_BUTTON "P" #define PIECE_MENU_SIZE 18 static String pieceMenuStrings[2][PIECE_MENU_SIZE+1] = { { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), N_("Empty square"), N_("Clear board"), NULL }, { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), N_("Empty square"), N_("Clear board"), NULL } }; /* must be in same order as pieceMenuStrings! */ static ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = { { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, WhiteKing, (ChessSquare) 0, WhiteAlfil, WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0, PromotePiece, DemotePiece, EmptySquare, ClearBoard }, { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, BlackKing, (ChessSquare) 0, BlackAlfil, BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0, PromotePiece, DemotePiece, EmptySquare, ClearBoard }, }; #define DROP_MENU_SIZE 6 static String dropMenuStrings[DROP_MENU_SIZE+1] = { "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen"), NULL }; /* must be in same order as dropMenuStrings! */ static ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = { (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen }; // [HGM] experimental code to pop up window just like the main window, using GenercicPopUp static Option *Exp P((int n, int x, int y)); void MenuCallback P((int n)); void SizeKludge P((int n)); static Option *LogoW P((int n, int x, int y)); static Option *LogoB P((int n, int x, int y)); static int pmFromX = -1, pmFromY = -1; void *userLogo; void DisplayLogos (Option *w1, Option *w2) { void *whiteLogo = first.programLogo, *blackLogo = second.programLogo; if(appData.autoLogo) { switch(gameMode) { // pick logos based on game mode case IcsObserving: whiteLogo = second.programLogo; // ICS logo blackLogo = second.programLogo; default: break; case IcsPlayingWhite: if(!appData.zippyPlay) whiteLogo = userLogo; blackLogo = second.programLogo; // ICS logo break; case IcsPlayingBlack: whiteLogo = second.programLogo; // ICS logo blackLogo = appData.zippyPlay ? first.programLogo : userLogo; break; case TwoMachinesPlay: if(first.twoMachinesColor[0] == 'b') { whiteLogo = second.programLogo; blackLogo = first.programLogo; } break; case MachinePlaysWhite: blackLogo = userLogo; break; case MachinePlaysBlack: whiteLogo = userLogo; blackLogo = first.programLogo; } } DrawLogo(w1, whiteLogo); DrawLogo(w2, blackLogo); } static void PMSelect (int n) { // user callback for board context menus if (pmFromX < 0 || pmFromY < 0) return; if(n == W_DROP) DropMenuEvent(dropMenuTranslation[values[n]], pmFromX, pmFromY); else EditPositionMenuEvent(pieceMenuTranslation[n - W_MENUW][values[n]], pmFromX, pmFromY); } static void CCB (int n) { shiftKey = (ShiftKeys() & 3) != 0; if(n < 0) { // button != 1 n = -n; if(shiftKey && (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack)) { AdjustClock(n == W_BLACK, 1); } } else ClockClick(n == W_BLACK); } Option mainOptions[] = { // description of main window in terms of generic dialog creator { 0, 0xCA, 0, NULL, NULL, "", NULL, BarBegin, "" }, // menu bar { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("File") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Edit") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("View") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Mode") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Action") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Engine") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Options") }, { 0, COMBO_CALLBACK, 0, NULL, (void*)&MenuCallback, NULL, NULL, DropDown, N_("Help") }, { 0, 0, 0, NULL, (void*)&SizeKludge, "", NULL, BarEnd, "" }, { 0, LR|T2T|BORDER|SAME_ROW, 0, NULL, NULL, "", NULL, Label, "1" }, // optional title in window { 50, LL|TT, 100, NULL, (void*) &LogoW, NULL, NULL, -1, "" }, // white logo { 12, L2L|T2T, 200, NULL, (void*) &CCB, NULL, NULL, Label, "White" }, // white clock { 13, R2R|T2T|SAME_ROW, 200, NULL, (void*) &CCB, NULL, NULL, Label, "Black" }, // black clock { 50, RR|TT|SAME_ROW, 100, NULL, (void*) &LogoB, NULL, NULL, -1, "" }, // black logo { 0, LR|T2T|BORDER, 401, NULL, NULL, "", NULL, -1, "2" }, // backup for title in window (if no room for other) { 0, LR|T2T|BORDER, 270, NULL, NULL, "", NULL, Label, "message" }, // message field { 0, RR|TT|SAME_ROW, 125, NULL, NULL, "", NULL, BoxBegin, "" }, // (optional) button bar { 0, 0, 0, NULL, (void*) &ToStartEvent, NULL, NULL, Button, N_("<<") }, { 0, SAME_ROW, 0, NULL, (void*) &BackwardEvent, NULL, NULL, Button, N_("<") }, { 0, SAME_ROW, 0, NULL, (void*) &PauseEvent, NULL, NULL, Button, N_(PAUSE_BUTTON) }, { 0, SAME_ROW, 0, NULL, (void*) &ForwardEvent, NULL, NULL, Button, N_(">") }, { 0, SAME_ROW, 0, NULL, (void*) &ToEndEvent, NULL, NULL, Button, N_(">>") }, { 0, 0, 0, NULL, NULL, "", NULL, BoxEnd, "" }, { 401, LR|TB, 401, NULL, (char*) &Exp, NULL, NULL, Graph, "shadow board" }, // board { 2, COMBO_CALLBACK, 0, NULL, (void*) &PMSelect, NULL, pieceMenuStrings[0], PopUp, "menuW" }, { 2, COMBO_CALLBACK, 0, NULL, (void*) &PMSelect, NULL, pieceMenuStrings[1], PopUp, "menuB" }, { -1, COMBO_CALLBACK, 0, NULL, (void*) &PMSelect, NULL, dropMenuStrings, PopUp, "menuD" }, { 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } }; Option * LogoW (int n, int x, int y) { if(n == 10) DisplayLogos(&mainOptions[W_WHITE-1], NULL); return NULL; } Option * LogoB (int n, int x, int y) { if(n == 10) DisplayLogos(NULL, &mainOptions[W_BLACK+1]); return NULL; } void SizeKludge (int n) { // callback called by GenericPopUp immediately after sizing the menu bar int width = BOARD_WIDTH*(squareSize + lineGap) + lineGap; int w = width - 44 - mainOptions[n].min; mainOptions[W_TITLE].max = w; // width left behind menu bar if(w < 0.4*width) // if no reasonable amount of space for title, force small layout mainOptions[W_SMALL].type = mainOptions[W_TITLE].type, mainOptions[W_TITLE].type = -1; } void MenuCallback (int n) { MenuProc *proc = (MenuProc *) (((MenuItem*)(mainOptions[n].choice))[values[n]].proc); if(!proc) RecentEngineEvent(values[n] - firstEngineItem); else (proc)(); } static Option * Exp (int n, int x, int y) { static int but1, but3, oldW, oldH; int menuNr = -3, sizing; if(n == 0) { // motion if(SeekGraphClick(Press, x, y, 1)) return NULL; if(but1 && !PromoScroll(x, y)) DragPieceMove(x, y); if(but3) MovePV(x, y, lineGap + BOARD_HEIGHT * (squareSize + lineGap)); return NULL; } if(n != 10 && PopDown(PromoDlg)) fromX = fromY = -1; // user starts fiddling with board when promotion dialog is up shiftKey = ShiftKeys(); controlKey = (shiftKey & 0xC) != 0; shiftKey = (shiftKey & 3) != 0; switch(n) { case 1: LeftClick(Press, x, y), but1 = 1; break; case -1: LeftClick(Release, x, y), but1 = 0; break; case 2: shiftKey = !shiftKey; case 3: menuNr = RightClick(Press, x, y, &pmFromX, &pmFromY), but3 = 1; break; case -2: shiftKey = !shiftKey; case -3: menuNr = RightClick(Release, x, y, &pmFromX, &pmFromY), but3 = 0; break; case 10: sizing = (oldW != x || oldH != y); oldW = x; oldH = y; InitDrawingHandle(mainOptions + W_BOARD); if(sizing) return NULL; // don't redraw while sizing DrawPosition(True, NULL); default: return NULL; } switch(menuNr) { case 0: return &mainOptions[shiftKey ? W_MENUW: W_MENUB]; case 1: SetupDropMenu(); return &mainOptions[W_DROP]; case 2: case -1: ErrorPopDown(); case -2: default: break; // -3, so no clicks caught } return NULL; } Option * BoardPopUp (int squareSize, int lineGap, void *clockFontThingy) { int i, size = BOARD_WIDTH*(squareSize + lineGap) + lineGap, logo = appData.logoSize; mainOptions[W_WHITE].choice = (char**) clockFontThingy; mainOptions[W_BLACK].choice = (char**) clockFontThingy; mainOptions[W_BOARD].value = BOARD_HEIGHT*(squareSize + lineGap) + lineGap; mainOptions[W_BOARD].max = mainOptions[W_SMALL].max = size; // board size mainOptions[W_SMALL].max = size - 2; // board title (subtract border!) mainOptions[W_BLACK].max = mainOptions[W_WHITE].max = size/2-3; // clock width mainOptions[W_MESSG].max = appData.showButtonBar ? size-135 : size-2; // message mainOptions[W_MENU].max = size-40; // menu bar mainOptions[W_TITLE].type = appData.titleInWindow ? Label : -1 ; if(logo && logo <= size/4) { // Activate logos mainOptions[W_WHITE-1].type = mainOptions[W_BLACK+1].type = Graph; mainOptions[W_WHITE-1].max = mainOptions[W_BLACK+1].max = logo; mainOptions[W_WHITE-1].value= mainOptions[W_BLACK+1].value= logo/2; mainOptions[W_WHITE].min |= SAME_ROW; mainOptions[W_WHITE].max = mainOptions[W_BLACK].max -= logo + 4; mainOptions[W_WHITE].name = mainOptions[W_BLACK].name = "Double\nHeight"; } if(!appData.showButtonBar) for(i=W_BUTTON; i #else #include #define dirent direct #endif #include #define MAXFILES 1000 static ChessProgramState *savCps; static FILE **savFP; static char *fileName, *extFilter, *savMode, **namePtr; static int folderPtr, filePtr, oldVal, byExtension, extFlag, pageStart, cnt; static char curDir[MSG_SIZ], title[MSG_SIZ], *folderList[MAXFILES], *fileList[MAXFILES]; static char *FileTypes[] = { "Chess Games", "Chess Positions", "Tournaments", "Opening Books", "Sound files", "Images", "Settings (*.ini)", "Log files", "All files", NULL, "PGN", "Old-Style Games", "FEN", "Old-Style Positions", NULL, NULL }; static char *Extensions[] = { ".pgn .game", ".fen .epd .pos", ".trn", ".bin", ".wav", ".xpm", ".ini", ".log", "", "INVALID", ".pgn", ".game", ".fen", ".pos", NULL, "" }; void DirSelProc P((int n, int sel)); void FileSelProc P((int n, int sel)); void SetTypeFilter P((int n)); int BrowseOK P((int n)); void Switch P((int n)); void CreateDir P((int n)); Option browseOptions[] = { { 0, LR|T2T, 500, NULL, NULL, NULL, NULL, Label, title }, { 0, L2L|T2T, 250, NULL, NULL, NULL, NULL, Label, N_("Directories:") }, { 0,R2R|T2T|SAME_ROW,100, NULL, NULL, NULL, NULL, Label, N_("Files:") }, { 0, R2R|TT|SAME_ROW, 70, NULL, (void*) &Switch, NULL, NULL, Button, N_("by name") }, { 0, R2R|TT|SAME_ROW, 70, NULL, (void*) &Switch, NULL, NULL, Button, N_("by type") }, { 300, L2L|TB, 250, NULL, (void*) folderList, (char*) &DirSelProc, NULL, ListBox, "" }, { 300, R2R|TB|SAME_ROW,250, NULL, (void*) fileList, (char*) &FileSelProc, NULL, ListBox, "" }, { 0, 0, 300, NULL, (void*) &fileName, NULL, NULL, TextBox, N_("Filename:") }, { 0, SAME_ROW, 120, NULL, (void*) &CreateDir, NULL, NULL, Button, N_("New directory") }, { 0, COMBO_CALLBACK, 150, NULL, (void*) &SetTypeFilter, NULL, FileTypes, ComboBox, N_("File type:") }, { 0, SAME_ROW, 0, NULL, (void*) &BrowseOK, "", NULL, EndMark , "" } }; int BrowseOK (int n) { if(!fileName[0]) { // it is enough to have a file selected if(browseOptions[6].textValue) { // kludge: if callback specified we browse for file int sel = SelectedListBoxItem(&browseOptions[6]); if(sel < 0 || sel >= filePtr) return FALSE; ASSIGN(fileName, fileList[sel]); } else { // we browse for path ASSIGN(fileName, curDir); // kludge: without callback we browse for path } } if(!fileName[0]) return FALSE; // refuse OK when no file if(!savMode[0]) { // browsing for name only (dialog Browse button) if(fileName[0] == '/') // We already had a path name snprintf(title, MSG_SIZ, "%s", fileName); else snprintf(title, MSG_SIZ, "%s/%s", curDir, fileName); SetWidgetText((Option*) savFP, title, TransientDlg); currentCps = savCps; // could return to Engine Settings dialog! return TRUE; } *savFP = fopen(fileName, savMode); if(*savFP == NULL) return FALSE; // refuse OK if file not openable ASSIGN(*namePtr, fileName); ScheduleDelayedEvent(DelayedLoad, 50); currentCps = savCps; // not sure this is ever non-null return TRUE; } int AlphaNumCompare (char *p, char *q) { while(*p) { if(isdigit(*p) && isdigit(*q) && atoi(p) != atoi(q)) return (atoi(p) > atoi(q) ? 1 : -1); if(*p != *q) break; p++, q++; } if(*p == *q) return 0; return (*p > *q ? 1 : -1); } int Comp (const void *s, const void *t) { char *p = *(char**) s, *q = *(char**) t; if(extFlag) { char *h; int r; while(h = strchr(p, '.')) p = h+1; if(p == *(char**) s) p = ""; while(h = strchr(q, '.')) q = h+1; if(q == *(char**) t) q = ""; r = AlphaNumCompare(p, q); if(r) return r; } return AlphaNumCompare( *(char**) s, *(char**) t ); } void ListDir (int pathFlag) { DIR *dir; struct dirent *dp; struct stat statBuf; static int lastFlag; if(pathFlag < 0) pathFlag = lastFlag; lastFlag = pathFlag; dir = opendir("."); getcwd(curDir, MSG_SIZ); snprintf(title, MSG_SIZ, "%s %s", _("Contents of"), curDir); folderPtr = filePtr = cnt = 0; // clear listing while (dp = readdir(dir)) { // pass 1: list foders char *s = dp->d_name; if(!stat(s, &statBuf) && S_ISDIR(statBuf.st_mode)) { // stat succeeds and tells us it is directory if(s[0] == '.' && strcmp(s, "..")) continue; // suppress hidden, except ".." ASSIGN(folderList[folderPtr], s); if(folderPtr < MAXFILES-2) folderPtr++; } else if(!pathFlag) { char *s = dp->d_name, match=0; // if(cnt == pageStart) { ASSIGN } if(s[0] == '.') continue; // suppress hidden files if(extFilter[0]) { // [HGM] filter on extension char *p = extFilter, *q; do { if(q = strchr(p, ' ')) *q = 0; if(strstr(s, p)) match++; if(q) *q = ' '; } while(q && (p = q+1)); if(!match) continue; } if(filePtr == MAXFILES-2) continue; if(cnt++ < pageStart) continue; ASSIGN(fileList[filePtr], s); filePtr++; } } if(filePtr == MAXFILES-2) { ASSIGN(fileList[filePtr], _(" next page")); filePtr++; } FREE(folderList[folderPtr]); folderList[folderPtr] = NULL; FREE(fileList[filePtr]); fileList[filePtr] = NULL; closedir(dir); extFlag = 0; qsort((void*)folderList, folderPtr, sizeof(char*), &Comp); extFlag = byExtension; qsort((void*)fileList, filePtr < MAXFILES-2 ? filePtr : MAXFILES-2, sizeof(char*), &Comp); } void Refresh (int pathFlag) { ListDir(pathFlag); // and make new one LoadListBox(&browseOptions[5], "", -1, -1); LoadListBox(&browseOptions[6], "", -1, -1); SetWidgetLabel(&browseOptions[0], title); } static char msg1[] = N_("FIRST TYPE DIRECTORY NAME HERE"); static char msg2[] = N_("TRY ANOTHER NAME"); void CreateDir (int n) { char *name, *errmsg = ""; GetWidgetText(&browseOptions[n-1], &name); if(!strcmp(name, msg1) || !strcmp(name, msg2)) return; if(!name[0]) errmsg = _(msg1); else if(mkdir(name, 0755)) errmsg = _(msg2); else { chdir(name); Refresh(-1); } SetWidgetText(&browseOptions[n-1], errmsg, BrowserDlg); } void Switch (int n) { if(byExtension == (n == 4)) return; extFlag = byExtension = (n == 4); qsort((void*)fileList, filePtr < MAXFILES-2 ? filePtr : MAXFILES-2, sizeof(char*), &Comp); LoadListBox(&browseOptions[6], "", -1, -1); } void SetTypeFilter (int n) { int j = values[n]; if(j == browseOptions[n].value) return; // no change browseOptions[n].value = j; SetWidgetLabel(&browseOptions[n], FileTypes[j]); ASSIGN(extFilter, Extensions[j]); pageStart = 0; Refresh(-1); // uses pathflag remembered by ListDir values[n] = oldVal; // do not disturb combo settings of underlying dialog } void FileSelProc (int n, int sel) { if(sel < 0 || fileList[sel] == NULL) return; if(sel == MAXFILES-2) { pageStart = cnt; Refresh(-1); return; } ASSIGN(fileName, fileList[sel]); if(BrowseOK(0)) PopDown(BrowserDlg); } void DirSelProc (int n, int sel) { if(!chdir(folderList[sel])) { // cd succeeded, so we are in new directory now Refresh(-1); } } void Browse (DialogClass dlg, char *label, char *proposed, char *ext, Boolean pathFlag, char *mode, char **name, FILE **fp) { int j=0; savFP = fp; savMode = mode, namePtr = name, savCps = currentCps, oldVal = values[9]; // save params, for use in callback ASSIGN(extFilter, ext); ASSIGN(fileName, proposed ? proposed : ""); for(j=0; Extensions[j]; j++) // look up actual value in list of possible values, to get selection nr if(extFilter && !strcmp(extFilter, Extensions[j])) break; if(Extensions[j] == NULL) { j++; ASSIGN(FileTypes[j], extFilter); } browseOptions[9].value = j; browseOptions[6].textValue = (char*) (pathFlag ? NULL : &FileSelProc); // disable file listbox during path browsing pageStart = 0; ListDir(pathFlag); currentCps = NULL; GenericPopUp(browseOptions, label, BrowserDlg, dlg, MODAL, 0); SetWidgetLabel(&browseOptions[9], FileTypes[j]); } static char *openName; FileProc fileProc; char *fileOpenMode; FILE *openFP; void DelayedLoad () { (void) (*fileProc)(openFP, 0, openName); } void FileNamePopUp (char *label, char *def, char *filter, FileProc proc, char *openMode) { fileProc = proc; /* I can't see a way not */ fileOpenMode = openMode; /* to use globals here */ FileNamePopUpWrapper(label, def, filter, proc, False, openMode, &openName, &openFP); } void ActivateTheme (int col) { } char * Col2Text (int n) { return NULL; } xboard-4.7.3/xboard-pgn-viewer.desktop0000644000175000001440000000210212262415351014650 00000000000000[Desktop Entry] Name=Xboard Name[af]=X-bord Name[ar]=Xboard Name[bg]=Xboard Name[bn]=এক্সবোর্ড Name[cs]=Xboard Name[da]=Xboard Name[de]=Xboard Name[el]=Xboard Name[es]=Xboard Name[et]=Xboard Name[fi]=XBoard Name[fr]=XBoard Name[gl]=Xboard Name[hi]=एक्सबोर्ड Name[hr]=Xboard Name[hu]=XBoard Name[it]=XBoard Name[ja]=Xboard Name[km]=XBoard Name[ko]=X보드 Name[lt]=Xboard Name[mr]=Xबोर्ड Name[nb]=Xboard Name[nl]=Xboard Name[pa]=Xboard Name[pl]=Xboard Name[pt]=Xboard Name[pt_BR]=Xboard Name[ru]=Xboard Name[sk]=Xboard Name[sv]=Xboard Name[ta]=பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): எக்ஸ்போர்ட் Name[th]=Xboard Name[tr]=XBoard Name[uk]=Xboard Name[vi]=XBoard Name[xh]=Ibhodi ye-X Name[zh_CN]=X 国际象棋 Name[zh_TW]=Xboard 國際象棋 Name[zu]=I-Xboard Comment=Run XBoard as PGN viewer GenericName=X-windows chess board Type=Application Categories=Game;BoardGame; Exec=xboard -viewer -lgf %f Icon=xboard NoDisplay=true Terminal=false MimeType=application/x-chess-pgn; xboard-4.7.3/mdate-sh0000755000175000001440000001363712247021262011361 00000000000000#!/bin/sh # Get modification time of a file or directory and pretty-print it. scriptversion=2010-08-21.06; # UTC # Copyright (C) 1995-2013 Free Software Foundation, Inc. # written by Ulrich Drepper , June 1995 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST fi case $1 in '') echo "$0: No file. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: mdate-sh [--help] [--version] FILE Pretty-print the modification day of FILE, in the format: 1 January 1970 Report bugs to . EOF exit $? ;; -v | --v*) echo "mdate-sh $scriptversion" exit $? ;; esac error () { echo "$0: $1" >&2 exit 1 } # Prevent date giving response in another language. LANG=C export LANG LC_ALL=C export LC_ALL LC_TIME=C export LC_TIME # GNU ls changes its time format in response to the TIME_STYLE # variable. Since we cannot assume 'unset' works, revert this # variable to its documented default. if test "${TIME_STYLE+set}" = set; then TIME_STYLE=posix-long-iso export TIME_STYLE fi save_arg1=$1 # Find out how to get the extended ls output of a file or directory. if ls -L /dev/null 1>/dev/null 2>&1; then ls_command='ls -L -l -d' else ls_command='ls -l -d' fi # Avoid user/group names that might have spaces, when possible. if ls -n /dev/null 1>/dev/null 2>&1; then ls_command="$ls_command -n" fi # A 'ls -l' line looks as follows on OS/2. # drwxrwx--- 0 Aug 11 2001 foo # This differs from Unix, which adds ownership information. # drwxrwx--- 2 root root 4096 Aug 11 2001 foo # # To find the date, we split the line on spaces and iterate on words # until we find a month. This cannot work with files whose owner is a # user named "Jan", or "Feb", etc. However, it's unlikely that '/' # will be owned by a user whose name is a month. So we first look at # the extended ls output of the root directory to decide how many # words should be skipped to get the date. # On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. set x`$ls_command /` # Find which argument is the month. month= command= until test $month do test $# -gt 0 || error "failed parsing '$ls_command /' output" shift # Add another shift to the command. command="$command shift;" case $1 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac done test -n "$month" || error "failed parsing '$ls_command /' output" # Get the extended ls output of the file or directory. set dummy x`eval "$ls_command \"\\\$save_arg1\""` # Remove all preceding arguments eval $command # Because of the dummy argument above, month is in $2. # # On a POSIX system, we should have # # $# = 5 # $1 = file size # $2 = month # $3 = day # $4 = year or time # $5 = filename # # On Darwin 7.7.0 and 7.6.0, we have # # $# = 4 # $1 = day # $2 = month # $3 = year or time # $4 = filename # Get the month. case $2 in Jan) month=January; nummonth=1;; Feb) month=February; nummonth=2;; Mar) month=March; nummonth=3;; Apr) month=April; nummonth=4;; May) month=May; nummonth=5;; Jun) month=June; nummonth=6;; Jul) month=July; nummonth=7;; Aug) month=August; nummonth=8;; Sep) month=September; nummonth=9;; Oct) month=October; nummonth=10;; Nov) month=November; nummonth=11;; Dec) month=December; nummonth=12;; esac case $3 in ???*) day=$1;; *) day=$3; shift;; esac # Here we have to deal with the problem that the ls output gives either # the time of day or the year. case $3 in *:*) set `date`; eval year=\$$# case $2 in Jan) nummonthtod=1;; Feb) nummonthtod=2;; Mar) nummonthtod=3;; Apr) nummonthtod=4;; May) nummonthtod=5;; Jun) nummonthtod=6;; Jul) nummonthtod=7;; Aug) nummonthtod=8;; Sep) nummonthtod=9;; Oct) nummonthtod=10;; Nov) nummonthtod=11;; Dec) nummonthtod=12;; esac # For the first six month of the year the time notation can also # be used for files modified in the last year. if (expr $nummonth \> $nummonthtod) > /dev/null; then year=`expr $year - 1` fi;; *) year=$3;; esac # The result. echo $day $month $year # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: xboard-4.7.3/aclocal.m40000644000175000001440000013630212262562274011576 00000000000000# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for 'mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl FIXME we are no longer going to remove this! adjust warning dnl FIXME message accordingly. AC_DIAGNOSE([obsolete], [$0: this macro is deprecated, and will soon be removed. You should use the Autoconf-provided 'AC][_PROG_MKDIR_P' macro instead, and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.]) dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR m4_include([m4/gettext.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intlmacosx.m4]) m4_include([m4/lib-ld.m4]) m4_include([m4/lib-link.m4]) m4_include([m4/lib-prefix.m4]) m4_include([m4/nls.m4]) m4_include([m4/po.m4]) m4_include([m4/progtest.m4]) xboard-4.7.3/menus.h0000644000175000001440000001443412262415351011230 00000000000000/* * menus.h -- platform-indendent menu handling code for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ typedef void MenuProc P((void)); typedef struct { char *string; char *accel; char *ref; MenuProc *proc; void *handle; } MenuItem; typedef struct { char *name; char *ref; MenuItem *mi; } Menu; typedef struct { char *name; Boolean value; } Enables; extern Menu menuBar[]; void ErrorPopUp P((char *title, char *text, int modal)); void AppendEnginesToMenu P((char *list)); void LoadGameProc P((void)); void LoadNextGameProc P((void)); void LoadPrevGameProc P((void)); void ReloadGameProc P((void)); void LoadPositionProc P((void)); void LoadNextPositionProc P((void)); void LoadPrevPositionProc P((void)); void ReloadPositionProc P((void)); void CopyPositionProc P((void)); void PastePositionProc P((void)); void CopyGameProc P((void)); void CopyGameListProc P((void)); void PasteGameProc P((void)); void SaveGameProc P((void)); void SavePositionProc P((void)); void ReloadCmailMsgProc P((void)); void QuitProc P((void)); void AnalyzeModeProc P((void)); void AnalyzeFileProc P((void)); void MatchProc P((void)); void MatchOptionsProc P((void)); void EditTagsProc P((void)); void EditCommentProc P((void)); void IcsInputBoxProc P((void)); void ChatProc P((void)); void AdjuWhiteProc P((void)); void AdjuBlackProc P((void)); void AdjuDrawProc P((void)); void RevertProc P((void)); void AnnotateProc P((void)); void AlwaysQueenProc P((void)); void AnimateDraggingProc P((void)); void AnimateMovingProc P((void)); void AutoflagProc P((void)); void AutoflipProc P((void)); void BlindfoldProc P((void)); void FlashMovesProc P((void)); void FlipViewProc P((void)); void HighlightDraggingProc P((void)); void HighlightLastMoveProc P((void)); void HighlightArrowProc P((void)); void MoveSoundProc P((void)); //void IcsAlarmProc P((void)); void OneClickProc P((void)); void PeriodicUpdatesProc P((void)); void PonderNextMoveProc P((void)); void PopupMoveErrorsProc P((void)); void PopupExitMessageProc P((void)); //void PremoveProc P((void)); void ShowCoordsProc P((void)); void ShowThinkingProc P((void)); void HideThinkingProc P((void)); void TestLegalityProc P((void)); void SaveSettingsProc P((void)); void SaveOnExitProc P((void)); void InfoProc P((void)); void ManProc P((void)); void GuideProc P((void)); void HomePageProc P((void)); void NewsPageProc P((void)); void BugReportProc P((void)); void AboutGameProc P((void)); void AboutProc P((void)); void DebugProc P((void)); void NothingProc P((void)); void ShuffleMenuProc P((void)); void EngineMenuProc P((void)); void UciMenuProc P((void)); void TimeControlProc P((void)); void OptionsProc P((void)); void NewVariantProc P((void)); void IcsTextProc P((void)); void LoadEngine1Proc P((void)); void LoadEngine2Proc P((void)); void FirstSettingsProc P((void)); void SecondSettingsProc P((void)); void GameListOptionsProc P((void)); void IcsOptionsProc P((void)); void SoundOptionsProc P((void)); void BoardOptionsProc P((void)); void LoadOptionsProc P((void)); void SaveOptionsProc P((void)); void SaveSettings P((char *)); void EditBookProc P((void)); void InitMenuMarkers P((void)); void ShowGameListProc P((void)); // in ngamelist.c void HistoryShowProc P((void)); // in nhistory.c // must be moved to xengineoutput.h void EngineOutputProc P((void)); void EvalGraphProc P((void)); int SaveGameListAsText P((FILE *f)); void FileNamePopUp P((char *label, char *def, char *filter, FileProc proc, char *openMode)); void AppendMenuItem P((char *text, int n)); MenuItem *MenuNameToItem P((char *menuName)); void SetMenuEnables P((Enables *enab)); void EnableButtonBar P((int state)); char *ModeToWidgetName P((GameMode mode)); void CreateAnimVars P((void)); void CopySomething P((char *s)); extern char *gameCopyFilename, *gamePasteFilename; extern Boolean saveSettingsOnExit; extern char *settingsFileName; extern int firstEngineItem; #define CHECK (void *) 1 #define RADIO (void *) 2 #define OPTIONSDIALOG #define INFOFILE "xboard.info" xboard-4.7.3/png/0000755000175000001440000000000012262562252010571 500000000000000xboard-4.7.3/png/marble_d.png0000644000175000001440000011714212262415351012767 00000000000000PNG  IHDR8RD pHYsHHFk> vpAg~IDATx}iduw9;gf*f5HKM pnrЂ GRIIUŚrwqZf;>ܺ^û.o4mq 0 (|k4°ivf 0 l>k}4l|hqG5 8&hYgiZE;aөOo)K~qkO..2w˲˲ 0l0,qfeeȂðǑiayqlz۫jamfٳ_n`L C7fcYAIbYqoeg|bÀ{ne}0ȟ8iZmw]sy$y!\u_m1[q]N0emיm۶a Cߏc۶eq=}ӧYe$a躮$Q4 EQX]ǃmmm۲,L0<4-k뚦놡g8+\_\_far mMu8U4uU4eYUe]g}? 8-u-˶=q(ض]8纆1}v6q$ 4MӶ c0,4~ia 088mm&^uݶ]8Ag=/$I$Iز, ],SQ0Eݽ{N]k^vyنa$Iוex6ka0$G1)rEMu41*ϲ<2 }(*4/SAl6iv1HoaQl;wcu]:,UT,$$ }7Mrs]ϳmxvYƖ* y,'B6u뎏z뭷|u]wlVuY<`,#p㸮WǭY[>7ߘ0 g}uneX,/_yl ,0f, Qpqݪr]b;t:N&D*-˶nǟt]ڶ6P~lT9~v4% epLi-qu/0|ϧӢnl}&6k7 AiO&IB|aӟ^x^:QUU!,^_Eu]i5pl=꺪|*eU¾: (:Ԣi:Ϸ[Ўaph: im8,(3M:.H"жMuuuuMhC"c<ð,`{mc/==uAX*@zѣ㫫f»fa#lm۪J Cpbql0l#d3ܓkIcӲL$ӶmG>϶붍$}I}-k1Mw//~/ oa*-+M뺪@l ˊ",uw}&MW,+IaQ.˪Tdl9UG}4 M ,ciZVsM@`6t꺮(m[b9}X{koH:888itнKMT"^]4]l0kYm)ˢ:P (_.zZ.l{ej;^nt%6. 0Moh<7d0ZյGdR'F Uf [eYr"y }/Eq lLVa [ tF;+ AlU~ukuQ4O?????$"3(M?Ͼ GY_j%SU<@\O,CJr|߲$X5b42v~^_^ #ƮOhoEU m;|?I -+m[VԍOZGuv88RxT`q7eaъb- ~jqLs6sO ,mSryEѶx3֜3]  ~ϩ2mƸ]WzZEUUaې$I˃wIIm- Ls y}O-~aٰ][P8LKPC8^T=/pOkƶ]7`bv[EϢShɎC0(Y7 v[Dk15i$@8d.BAEaEѶÐeeI 4 _U, ducPįa}U0DC8iuʥW!Gfs}yxy`a gzI$Y,H$uuD AB}:CeXEݻ>xa`i$qL ԓv<8X. ~i Ƚ'p+Mk`S bK~Eprk'%}Ǐi/_x Q̍pE?x?kIr3~.Qm6B jͦ0(i6a: ad0 WO^f.(,I^-I(51To??>l6R)5 hm`꺮% K(paƿ` o )+QLn7dRT~wpGy;&$emeٶe)]M2@@zy.M됶ڶX 0' }ŦHTĝF gք~Gw3>m\жx2K*l3A#v} ڢ(KfDWöMmYXa@BS0u_ T'PA<׽^63yp@o kY۶a^iA)¹ꚓ^?+bY@-Rs,dU]]/Y^~1 .7HHbͣ^z&%<>c&ɄBl`UU Se&I-{{9K_6qLsbPE0g3bzb}wif"R˂G 69f,}=(K/Y ^ c>ͦ(Lf3rZ|>dE?1~FM]eQ4MQ5o^|F+ %Oӄ$`uU6 sLi4@09t~Ke&X2Ӵ,Ge,b Byu].!T׍f0~ya#ۀ0S aQEr&IX#cSJ!Tu]Apk[PeY[t\M80"|(D .dmR놴#}u?rICii)8RZLN(c1T 9βl puUUpxȞƑE.1J,4ws U CE4*I (q}8L.uP64/tC|‡Oa4mjnU1i+Dkr-4M$ 'lYlW*w޹6F۞__gO8+mmE/\EuMǞz۪2 bjFh2 # TCQ9_HyYVUM#})ڶmwߥM.I 0 %Liڶ(jr@iiB?va47u;e Ca`S',t8"c6 Tb dpuжvz,}ZV a8 )^) ΂㣣:MW~d]vqZXe1{GpC'ƽLQ1ͶN]7@ZEfeI!YaNO"g8N|6s( '%a$umY,P`Y")m OLۯhBxp~}S1%Paax||pptt~~qq}M~|XmKPC$RÀW*D#|m0$`hۺnOOe $q_^ӛ&\QH $'TIx] L UHMiZUey|tSD tZ/^<{y^Y&75Hm=ゔo69}|f3Mi2w~~yy}M.#ÅU#*w0KՋ虐M@(ͦ(Ϧ2w-5xV 0`}j?|xr\ܽ[T,-9gmBa-bJbkvEe.Ge9m|nlO `u]Y=mWa(W4Y3.72J]`Ph NA=2ZaHmۿ8nEuRXm6i(0$vWuUȹMIf^ɄfId]) * DA] Ce%MwaVz> 9EB*&17;K]G Hy)"!2GEmӚ|E/:LY,<@ ɆNYzQ$]*MD8<ϲX l9ÇffGA|n{1ۅ-IPBDiqS޹s[oEQDii5MI,2vӧϞ`}Kss]L3Md;`2U(RDF RpSURJ60tD{2alO?4E?Ų^[:ҌNR%ɨAPC#Ƒ&w=H-@uG.rl#LjK$*6] 4t=qssqqqQ˜I]6֋n'1;#D%ۖ)!7}U0a IOioчbJۆa1/w~~yZ5MU%h=$5,>%/+*:aߗ ܒ GE/Tm+*lmBw]۾\@YF39/ŷAxqqsKE0WnmA=D4͙Kֶ87IRBce݁>0I<˶[1R>[,nUOJژaƣG<|XmAj?&DYToޡmB:_RId_(}TZ×$ lV+%B?}ҙEb) SuQWTj^Pϲv]udx)̂"L4Iw2 2"̴0MX} QXl8֋lX>A:!Ѫ^H%I2  Pd%2|9T!ebEfٌoh:c 'N9hG?s޽4ԃYJ:`ARX@z $2TN$jߺKj,ETTIdSAE<z21ƂJz'dHvJBƦ}x0T5ܹ^տܙ_:VIֻi?>z +y(/#HwJ4\7R:i^_B˭*zil[4QÇ|{agYeYviz}}s4À4b]Sa;dYa8y$ B]Ia,A_YEZܜ|iBz?<̲j"7z//`!ͷTu `+,u=gA8477}.qubv"ZTZﳬ(..W(r]ʇ>2>7"+8pN < ..V5fq.EQU]#3#j8'(J6<O>?Y]o Qc`o"[K*BeƢy(霝zR+C7&; C:C #B(0 4CA4n'ďQv锖<,[,s jos6ϧWկ0(M//'$޽{Νf8I{ɓ'O jC\^IX12f.R,{` "XDp:MlmKVB8 41PF䳖QT}? ɏq CMp0 uZI i(aDK5zmFj;R",s\ @ⷿo˗/h^O HO   bjr74D^7M$$r/K>z^Bߠ.˲m)(W͖7S3VئD8d2NN.n[V̋@ o[oyyЃݽ ׿կXdqFNg3<;Oi/:5 l4LfGjP A<@mȶ?. t!{{%t*`2.E[a" 4EQE*?g?ƛLfd]vroo<{)?T7#bHǪm;:a8(Xc,6MDDpK<*tG|fiS!]e@a mIH- +E{ۚfJ>W8 ˙v,˲nmE+*,c0|>A*===;;;,f=8&tUeƻ^vZ4MST2ˋ ΄`Ff`@,˶!zvzMS?z!UַaXW4ǖRf.!Ʊ(0S%Feu]Wǟ~J8dRR8$8;p7|hBL`AkKnYB ̃łJjJSH`Ay' KopVz\a "*BH0²].h"R͐ (5"L^a eYx)l*fU.AH]?ca9lpv;,+{RԼi:E 5t: x#&Nl6#󛛛 ʲmmh-*`2Lƿnﻮ 7T-Zs2,hbNOw;_. :Ç{o]oK`8Vrwp7H.&\eM 2@Jg yܜ z`h=hRn`E{R'&A0xΗ[?+SVRy}? ER9(=b]3=/ZaW7ضzټ|W_~ъ"9KR:fE@Ʉcļe@վTB1 ð>h~&o5-ɓ'ݻw^"rNjusá, *u]+$@fEY Օtm'IPlkCA+5ɄXYvep$0)"&O,}:=> k$b!M?x0i->  S< J_m W|"|ϣp秧~>dgx^MCI"DL6eۈAž}F_nW{{IE42~w_}W?n677£dϡ)ĮP8Nx!vn[tDx Rb "nYҞB YM)Mwx^L&)0<$IDÇ?~l6m mӤpϗKRUXJh!y4tltTW\4on[7M:ۖ1ǮGANMpo1znc8Z RAiǾ˗/OOE( RJu޿ݻ/_|yv&ʂ$Ay#|;x!8I832ͩ z,a(LlHU^11b jC$uL,]GZ)eO,W/*6MhIaDm[)3l&_oRq~RW奊Su.D!YQG"cHX$4CWxB4Խ(PUW@4n^ץFNoX0Lvs.z(]A=/ [4M|Imڶ(ٳg] *`Y0_Eya8@&S玢bP'`}6<]j$JRbm˕:m6zM'~駘b ~"?}y^S.IP_6d_6~kB]V.O| A Z';\!{΀avLW:00ʶi1aSɖSZ'<|!篓&"ˊ,oDzxZԥTe '23%umj:soB/AlX,lUi ٳZeٲu*NK ja''߿!d ~ʚ)JӢ6<#hٮLPyy^)D0KxWշ7Nf͓`~|[Hv>_Uu!!ܶ&BS D+y2b*hE>P[ʢ wւGig.HvB.s!"=fbdǙ͒U$a˦!?).U].AƪR}j(}umۄO}‘Ue!)wP!)@!0C`b۶m0 `7SQ$lM RUQیc4z]<0M ֥Dp3ݮAaBV5a(K2׊Q8يwK= UBuz!x;Da#c8]TD]WplBc^ӧO!}(ܚ$D穛2hQ:IBeE`U1T=ccY('[]Qx^0.4}p\_'ZTl]-厣ӔMqQ8Nt2@o~n4ɄHzdXAh\iQﺦ`[’e ϻ9?|+ CxV X;** ЙlE`<14S[XGu@/%BLJ\Q>nێeՕi)\Ů{Ʀ>aޑp T$7ксP{77WWx4ϓŴ|^T!'|>IƢovGE=g`vJJYS]?(lrH9Jꩾn[oY0K4M˲,!X4PH v4DQr5D* JH e85 0l ym߶ 7WW77,GY( *TP`v2!8i(/}d',$|Y4WeWUUeʳ^HLR\qy}BX )N@0 ρ:߯~_ggz9u,ѯ?J -|n)[~I9[61, up3Dkzp^WF*V&̺:ua<<<<߶Y /Ǔ^)gPEj r: C8 C-U&Ɠ̫W^_]]_r93ia踪pNIdw<قWta/?X8 DP_ONyѣGJ0HOH>cէimMVq>?QacC4i,HB 5?aEQ֧$cxPU۵m<~{Q)DGug -*)D.+uMb\.n A&fyqp2_,/.32E3$}4m[jN؃&`(Mw2Mu]t"LZ VC &rAt6uMYD*}޽{oųbl+ ΁^:]0vI4۶m><\. ~(EIK%`XqWNOg3SsEy+I*s Cl*!"݃@0̗;f,=!% OFA\iMͨ IOx=PC 3X8a[49~ߒ#t2+`(^Qަh-ZYA`Qh[K?.E;  7z8>|;ϟ|!t^MSLúS9FiHifƒPgu]DsLN"wm[g  &Ya(^%qά 92y;ϥAj6NPbHJiFQH}F$Yx' ٶ9i Q"2:BBΓ98L@6@I}YLL x뭓/3= mh6M- !ҹJ&XY_W8EtimŴ;w :B[4 I@YB2aS![ Sݪ +R% Af/vr 82A~(Q"K=WP<BUEnQcBM4yw&HiƱWU1,$Lg pȸt 5(A977|@w:O3xSJ'_S~{O|ϟ?}J1ǚ#Q: VPh}^77ȏ`S}e>Qn҃5a`p<` Cd*Ϸ[qa?h=&4@ؗi}JCb}ɓ<i>m-Qᐌw +V (Cz WQDR)OF ѧ߬0w$4$ SpsuroOTRToWd*b)*Om(:< O(NJ@C.ե؄|Ȓb %Lq|N/A,PJDnx2sw۷8y ~q!ry[9ס2*+ÿr4C Ҏ(-TQDZlf "¹yaX}~ef]0g%E='Q4g~DxKit%=%-MvMSe%FFa4qYƜ|6{]mqhmA!paRR22m]Zؖ)eiypUG$n(&2@i,{{I?|ÇhՑy԰-.0dJ Oide#/r0-< FcA_a"5&|ehI=FLt@L$KLIKʐ.?@ČRNO|[e)-˶dNzJEi3pDaVkDB0k0]cT)Ѝ, eqhri 1FKa6YNĦn3TL||J-Ki[EA)F=Yc}[wbYfL$'Dn!m6p]Ms:‰PƮ T<-d&L!,Ō[5߲T 뤢爅c|l @<%Tj_4p* YJ}n+ JBW)K3@}oYEU198?x{AX1v;zTH&:X%C"t~DH0RSߨ6ܤU8%}4u-BM#K–@ŧjYt.k.yI v&g0MAuMHt=H #(WUA%ƱmPJbYW4y"y. B$2]:3vUÃB%u!Svg;0l6LLonYeYUjABkYv[j rxHY{t-,ZeiaՑq]u|4- e"Aim\#]xvv[r5uP]&A{r1̇Tv;wv ov}`q&ɿض >\90Eq>>@_:6}`0% ~C ~3AQ߮jxpQu3aǘ8Giҹ"R4r 2xyǑh^'̩B$Stp /+y ylq캸Bx(H/ʹ)Ta,uea e n[q* hbEN&CfI@s+M??׍"8]jYÍѺE aT'`aL&e\3N6hI )]%rN(@cP>CsĚ$G\t%Pf8嗘{ٮ9;iH*HltKI#H*wy6ѣG77az+T 7 L6bs0I|2Y7ap]a(tCr:YEbbeo7IJx˒RO&I?]6nuSU+Den>NUe=Ǒ,^#"4ݍ2 pϡ:uDxU@hXg^{:(N5ߍ@NfC{s bufC1ϷgϞ=;=)pj["]*#HuDwxI |0 <AGGz-d 5(\K™üǢ躃4hDHITa #=Qet7XLy}6c rOdX:RVY ₪]Ob@peu-+ 8*wU!t`=p[JeE_/S g " @eY2} }ʖ8<2j-}۱ ߓiY5?`T 4 xq}?/OO}?ooVUt(p'm!8EzD+i!O-K UH g&M% ı|!pbPpeYx?oaJHƷ;cs+WdhmQ<+۵m]cku-77M$~k~˟|m,#p@(]c׍#R{EQu OAP/2"o~3DܙH^#Vj1%:aL&*Ōv]p?~0Mtn4<1v  ’&b۾vYܻG(r:!E6 cułS$ [,MC+Hb:eCĚeB48bpnDl+ ÐZAy#;-HG^]]__],ND<<({D~m[248G)F miRV'$% m۲NN./A)S l>.]sA(Pg#0SAY]ǐ(8n( 0A+UUUQ8ys|Xހ̝DTc%G?8[|>_s  9mK3i!b6!62#h9T<ǑVqߗ4%o&E=qfC(F!!#kNUz :|vuXY Ki*{:~Z-dr7vU?vp$VQvuMsv) LLK\00WELk0D$0s6u@BU??>R+Vl]e饥;$$qf=2{{`iz~UE iF" $򼮋ŧZ]7Maym3M)ijDdbKM))|j|,}}$2"Kݶ-+˪*ϩ-(Bt *(IR'y3Ea2Q l} 8^,f,`$r6[,QyA@{ Ė:Ͱxuy OI] meӖE~RLFXD}ɣGTOdpq8aaoyshQly绝ܸ\&bX nkݡJK\FH/>yEOu~FO$R(D.0$lQJZRæI03#I_F&< `c)ի奘nd;j)Kջ$0&(= n l$O%Ν} z0DO@Y9י6\WzA`}?^x ]iF? aHDZm`oo89Y,o9===n jJt vEQ]gM#\W{ݻsgoo?cF^vM&lя~o//Do@ u ,uwak8\1>CB0L |]drpXP`2jۺٺM#r a &hxn&<'ny^JJ6)4d]7IEaЪi@p1*~u=o>*4V*Z~v+ˮ:=VgiZUy^Tem׵~Ozz_|!`wR9=}a(zX0IJ,W/.6g^bt:2 mA3\7Hl$L[.x3a$ r|GA dRTt=8$47j pB#śg@s)Bv!B*GӤUĒer Wqx8L&?EW;λ~W_w%}O q+$Lt26q LX,ӢH<'%Bgi~s0\oF|l>ro8۲<1|b lcI%@-VUUS hb𼦑߱(04[:A7){;z3Q5 [$ofCJ}ݻotH~(%SJ(X,ٌ|;Ug"x@L}?kA%%o]: Qv+(=2z+!WQ9 闅 b-KJ =-15B&QN()adEM&R  B/%.$b A`c^e6-< c<~U;?G&#۵ot~xaP$@"Y8v.j6Cg>gf^8ha0kFAbp`t!>A$Ç/.xeiqO6!^?mdY|WYf{ޣG߽+]ٶk}4@ 6,e%R_E*3:M#$8۲\C!o:V hd€Zu|]_MBcL(oQӄ '"B `jl$QG|ᇈ$RJ^:HHc>,K aUm/Y DQVUdM1?o; CdY2R2 `alF |අp7OQ_y`IicbLrQ4$t$bA(}Q$E1-  -.6[$k)KLHQlrrc9 ŤO@6-,KupMmXu:"n()8:QV {'&(;aH!Ob2iA q_,NNKːMflJMoR'-aUaiJ{tٰLP@G;>>>%7fPUEMUٶI2!x E, }$ty*˂7-/P$B~!HY%K{eѨ.{{tHݛ4V>B"" œcN=^ {{yB1R yGF2""sL)S-Wu]]"ʢtǘc?ӯjZqO1> '(I/[Q>iMh["E ޕǦ/hIX%NOw3Rjhc 00 r4]u6SITa9<\"`_{dQ}f,Rpi3OdZzU8q:Rb;zÇrNu |#$[1Y8FĶȡ4J^-t,2p\$ʺ1/:on?&F뢞b~4Z|LM?z/V?u U*lWb8NfЦ4|M+^K+ࣣ~w=o!ߜEUm_.9vKYFqu}]˪y(L44wvKv,Z|ʲ64M@= vN/LCݻo8N4%kPb6q4! T#,<8AU`d $"4 )qDΜ q,94u Oֲ\7 " f|'*Mۖ.*PDS8u|>RdvS# -jHvxeye <>s]fv @nݮ1c4]aJum v.AO2_i? uz( (Ѡ F$hrdn23?O [6A 77 tۯo'l K w;wdx <@nVi~~vvzzqE%ԌuØN\yEHMSU-6m-` N{*{.lE5W3rL,˲_.7(65{rZ]\\\XU:ʢ(*u*MZ_\i^_]]^ҨG::Z.n }=]XE $0xeUª:99>>:"ӧOLu>|x@וS}g?ZÙ!T3ըSA[ƲL&~DZ,m{ pCt:9|@8cy]gYQԵ໸Nqt(.a nPd%--/ض, HDl{ih$<88k}tΝ;W_}9EYd|`A<0 :*B)B1pqLm|\ CA-bn[r:^8x$Q|? 0BT9l?*QMb ˲ VU):Os].HȻ_q캎Iu$ncb%vbĞLLw wvvvvvqdgcLsY7VPZAs]J0GQӴ벌%vb?{Ea8ESU"MuI%(`>UWV-r|{yof%aܬ̺l:=:J鴮m{r 7@4l[VH`ae %] p:2bK-}\w.+O}JͲ\Wv<" wA@TOg W(%7GeZY@U8֍ċ.. !кn]5H}> X;϶тR+@OK+{{9+R$ @%''ǺЖUN~'uUiQdO~8]ܜRC&a G g't S7OJn"% @,ۖ14IKd+Uuc}8Ƣ~q0@m8>>9sΝ=BŋS }\w"k2IFs 3\"1t1 Pc lBNQli*S4ւTt$-R48y8!;Y|AI g쭷z.fꃃMKl4޴L(^[dV9q${m"u4s+l77ۭģ3;0PIz*ÐvkVWWш[MB́8[,|B58C-n }2.L M!HN5 TY E xM=߲0/_xoޓ'Y_ע[Yݺ"! 8<09}E2Ϯ1m[@ $asr'|wBnL3MLDZخ%%d|E:# BTSqE:!zhӊNA//O -7h}cnƃoey''z}9???'# CCda;@$W(P1gzPe \WjQiɹ|C ǑsɃ29^4sH &,s{*֐*Z/q^Y0\늂m*6ӭ,S Ç"E97rzpitk}Hbhi[M JX0I$l(j*LbA*z$hdZ/gO[=G ]Qnb0m EJaD )pږׅmY7nW/L#R0(,*lmJؘPYx]C溞G֡  !-G , m; A #;R> A]{^` nJ~fI2=}pwmD kz T*ш2 nNq'߼8T6D~NߕYyܜUɘ ý: dvSza6y^z@p{g4Nm[ל\egzty/ e"#$Qfg CyUB'^)hd. g0ʒ1 ]稰,`1#_o TŕSZrA*"1VZwP-U0\H0P②bh"'g72rT7|:N`Azv{iv{yy}}yIǿ^]\_ dDjY6 |>g.YTe=?$ R-F,oiZOd KtkL 4eҙAZ9An`]ǿ!=MadIeg>J|ԛvu\됶]`YjH6Mc}S bqQ-<<-%P9E20\rK5SUU:`$Mt 6^*5 =T4RUsnXGb*M6a8EdB dI =5 sB>G;l4z ̐I)ła7qp"d}_ErԇGJ[A2"oj[ gA' P FR; 1Gt]Tv(G." _#IPiEEoVQ]4up^?P(8s(h5$A3*p"Oh X(&h@"P V(3qQTU]l,+K/ bm/U0QcND vQuZz@iЛ/?m[{{U6ضMD"c4ieˡ46It%D\{Ͳ76M˒b.5H[akR!2HꏝX.oÏONRĢ˦(}< kY"G\GnV϶Ð@II\?y@gZo- 6cl5!L/HB(bO5xqǣ;w ̀*/mjue' pAGdJɒ:۪njqtwpVD )M1 1IDޑRaZu-Yl3 t,s]RȷqzJ0,DۖkQm+{E1en1g,kreӚk胧:}Q01*mɕg<߷~>8>>::8HЍF.Gk83m뚎')ZV&qA@fXAS*JA AH0ږxmk`P$2|(,q,OB5>O;wEoYIq\׻]5MU_߇!(NLҙ!eI+%SAƠp-ZCF/C$>(9J%4˒U*e:qt\HCS nC-g4]y?yɥ)Sfa~S4d jD 0br S>Ӛmy>JCiԈ MEJZ!(޿WxGҦ#B2Y"z'$h]#IDATKR_'`,b#@X>s5dʵ :qRYPfEd|:i fBVz5GIFp]$9fd `)/"Ov_y! r6*83X޲%/xCʼ])Er4"nxV E) t2, ih+tt%L_fUriieiz}^(t:U-x'ꨦ ʨCTzDɝ2ӄڦkf_T~gn׶B?& rL9}AW_w)4Un=a־iQQ~yYn6$]'k$umYF\wz^vd_SUErY?G"A clP%/hY< ry0m6e΀Ð@5$9>E0 6.a|̲ Cb݁_2 Ðԙ2k9m(SVIX?t@몊)m(ۖBXu]TS}jqCprHr`/TOd7B(euz 2gAFF 8 YUE #ֶ=/M4_NsL۶탃|H0;wV˫+@1lEAp|]7Hi C(.)v*zF`Eu}?O&IyQʸad̺r4@騋~d=pBBqy,[CA&Ah>Z,82בaX29IeaȹS8.;oԾ}g+ǢT^C&~$Ua<AT9~߷αِ,7U(+Eklooo÷~]OO_q/|{]r y""V4Nqj9熸]tfo[,Yҕ 8TY \X,2c1rT[9UL.=ŔB2@0yQPBש cJ2uSA0QZNi]t sD0M9=}?~}躾O06 ĥ4?z'g&^Rd0MdA ߧ=ulxlGe6&If+Zkfazu~~u^o6-v[Yuul!0fe"kl0Npn?SFgJEcr]Aqt0t E#{2ͲD,o[IprQXcD0p*yhK  X5ҵD|*iβ,4S//Ym Vt' \C͋{]WQ MȭHd l&.T & tII|A=z`_U٤niXo%d2<}zzy$fnEd] v݃rxS$q.!B ms5E!܉O[h]v; %IenW@. m4 VGo0qxHЄ7nni:G:Tk]-*CA`۞X,%q+w]nW4E##:'PHm%9E OSC*qBB5|DJp)V"MI?OnÃ*Mt6˲f!Fǧo6SM?OgϾxvPi$cm^(Ot: =\8` U%{)8;;=}B5,CC@wE\/NGGDc25 ØHApT$Tp׍"fL Ew'd%nk&ogY''cYJA~GL}\|W\u$A\)^.Ro ƏnWӄ^,obtjU_aC52  ~xXыdM#s~6 iYv7REy:i2G!ʯxΑ~DKM0tCn+,z};ѾC2 CGAq荂N%Jr&Y,f358g%H6 C]KumUѯ${{aL|c;~gdo_}7|s}و''2+Mbҁ@!0zVmC!xN5IHDk/&ВՀ)#\J.TeQ,VUUbb0Yg}<{P*a@Q10(h j/\I@ecX:V؄7ÿ/3)Q۪X4hL DC4mrὰ5 d,\$6iVV ڢhV7Mߏdq )K-14@e#YvsZV]734 Kfdd8 TL!&ԆEƄ%3!r@=:d( |RoL}Y"$4(㋋Konv;$@t_9>ߧ[#,q^g0P$zx=87ҚOM'3x(ta 2/!cL6ETl0D@ | x,Ef*d3D6I8IigC+,* U!;84!C^V\r39qG^y믿Fh)m&b\" Bɂ|$0&8Nz+(i&-4 ml U=ϫ*H$3-inqEwyw/KJi!<(;hoSEc [{r\bP*y:w@׮LShڶ~"g;@  mQ:$uG(qȸ9 VqPHAcؒjT"sXFzٶ ޏ t3o`!Uab4d2fR?z;77NR4<j % v>ͤ  l)$r涍lPˡcHm @M)KGLL%V,Tx6'ۢ(g3g]qn1tk:g3AaYb1]^VJ m!M @@A ٶ kbd21bBEP0+M?eQ ,**/}zTދg>`51 eg@]'A:\L͖J (Cx'DJTЪ8}ߐ'8 Pep\RqWWܟ$I$̤*2Nj.]hN g8`3>ĔR$9‘x䤼Q  6v $D0(X,σ6 ,l7˫$Lz7QgmEE/:=F{ׅy 3;ݿ2n7gW@k&Eb lћ\(UAa!ݥ=X=ˆ[<<V#y4'#zszV^WWrdd<vdJTB+G%g#o1 Fot{ږ4+QPCDS~  eVU@IAEYra`OJ_Hp+LId^l[W(KY2ڜaPp2Lb>ʠ(MC6$YJrGTPKx]L6 k)vjA lt,& B0e `:V,))|>Dz{ P/߷>+''өiDiRP;>x[% "yE)w+W5թCݮ+q_:kM_ӎ"|0}? YŦ٤EXVI}I<(kKnQUe5d {2@Err;^N{{̔D77"Qm#y2AB_Jr ! k$|Nlrxxxmį_>6}]/:H^38H M{o:ŤKGBYyӠ;aYZΕ#j(e޳4c\FS!f>E4ٶ2T8^yuz9pK}AUg2MY tIM@ {U/;1iMjۮef^}Ay5ͪ 8n!B\41FضM˕.0M<|%a/>$G)q~Q@">#򌶍}~82Wsq,{ hYM#Hv-:A!hHVuXV -Q0[O&ݽE @-P@k 4 XQ# 3({bxɑ(T;L4aOijtP͍EζxIKWF!qiceb,LP3ު j` 㰎 qnҊ%c۶,9 uQiZ\WX0(Klvq]q<$tEa({Mjh16B+I1f FMtO^75ɫiF$ Lmˢ`uWr> @ޥ&PJ* 4Хm[^o+j}-CLh9 =7qj/rLX۶,EWm[It9 l'H+ADekhj YVCmdv PF04y.㤔Zu%C-PP?ݣ/.l {.rs!8*ڢ&Պ*:8iF8S׮+*2ﶖriJEm;3EY<)|8Zg1)y="aE璁]m2BL6Pc%"6z]3(. %TQJ ?6`s Vz'ѥ( D.\a]8UE*8?c@Tgێb1!am g[}`!@f 5\mmm4Q`0k p0y4_i0C0"PI%{ `(DdQΓ\H\#.MyGDZHD> f_U6fmXdvi^SW @<,I7HnJQ}_,DȑWIw8q2#wxe0dtٶ X,@YPUψ|/%tEXtdate:create2012-10-24T09:28:02+02:00[6%tEXtdate:modify2012-10-24T09:27:48+02:00`IENDB`xboard-4.7.3/png/BlackGold.png0000644000175000001440000000422612262415351013042 00000000000000PNG  IHDR@@iqbKGDKIDATx{lT}جellCА6@@ PJ Bi DԨ4jP#T)jiA!jAqD. q-1?f6f]ڑtҝ;3w̜s"D!B"D0f@ L5:P@v@X,770fA9 xh x%‰&!Z OJ,G ]7J|}K\b6CXO#@xweN Cod<{ dYP3+\U`N&"֭#5Վ:I\8a_cD-ˀ?FcEOhl(?C|j#>WSO͗Kzҕmvk, عsSmAIIJ"slLf{)rsӱXtn7#g3 qW_"4a=՝ CҴ2ﺈrٝQd(!YSS4iQOOŮ]#JKkP*'1@TYZZyya';tQ|2,X>gl=ʚEFF2Fo۴w|K\peМΡed2  G`±4@yv47_kn7.O:m*64RSdgr7ٱcӦMhhDUyS]]Gcck0 `P-|o$Ӻqq1dgAaa60o^66Tz?/B+JjIB.*rrXrrʚn%62j[ωdbݻ6ri.C?pW?ɈIp$&e˾ϰjbv+Wܠ-45rj;ۭ݃kb&!a ̜ȬYs9ӆ٬|Ey~eePgktVd˖Ւ2Ch4JAAO TH8RUu@6oȝ`HQJ,`RtyݟIoo\ٵkpmb`0ȺuKtܽ[."rU˪U?xo1,%;wn;w># IT9G^ %%Jr9tג2rPtb6r'+l6Mp_ariy:ov!e%bMplʔxٻw88Tc/z`F'H=t ?O<8b& !C tup7]/q;?8u<}؇'(`*7'C܋r8zS''BQ>:47?n). P TFDQ4Ix[N+ǰ!BsgIENDB`xboard-4.7.3/png/BlackMarshall.png0000644000175000001440000000413712262415351013721 00000000000000PNG  IHDR@@iqbKGDIDATxPǿAPBm#)(MGPE[b51NT3f2qd&㌓fʴVRÈ`$qNgM0p? ;|f?y$I #LSgy2M ȍCP aCI(cfm U_"x 7 v( S68Sc:mG6nii$OÑ$:l8~Y-秗#5.I,Ww rl6 gfzp]`NCc^an]DU\EƘ ב&]j!-##5n(""LO `z x߆ZcYQnOH\~xu'OC%qE3ejdY|!ԩv߯l޽UTR\aYK\ r`cJJ޽UmNis덲,]8,$%%smߒ\ O>9E[)))!Nq)EI**֒> ^TZ rh%fJz40ANyCz%t+R;wn&256=>FGl'2W4~%ᇿKnwUWELee)\T^:POc00,mczϞj=:"MqgY=t}i3qz@Bls{{R]ݦ@55e`Qt"Eң(W{DvZ \t!11))ѧmHOOg IPɨ0qSU#QO7>H7o~@<eJ#3b "‰P[XkkCS9LFAQ FVBT/Fs Kdh=o`P?<߶m4>!Eʕ42gڵks${t~髯>-[ևsG55e4>!!wi ̛ `X8zmvSWTSSFi22Rznz:燩|@F|^y9p0N|FGBD=ruID=t%jn c gn̕E=vSkQۓ)(ZhժoREZ,ɲ=zӱc$/1{oIzC~X?t9}IT7"(ȑ)}~eZ#th I cEݴiӚɦTPo"Q9S*+K #:l%&U.»VGa$QnvDa( VtYLj!C# u=+WLSg1”=`00ng"$ 7g?ʲOL߷P^ .RIo_%I 7u!6qe| X_( Ȳl5^g⦛~`i'U׵-HNv @hbPӔWȲ1 }/K_y!UU$bt/zhꏶYLteݰ@ Qq 7к"4M_ƌ9 nBlEu$6 ݭF `t\*@I7`O=]K'놡 2sJ+ 4\M_}U,s^o1зbJeoNwh;M@\1BGSSBk,GxBfw>݄BEKG⤧u543`3] Eyc%lE$*(OvČ.g'ûWEQVvݿ끇l;=: `Y]n+4k0 3כ0xpEt{|9pڴic31+G(dggCW ?k \~f[sݷ놡b7|ݷo4zYH}em;VxD;uRe2@ss@SUŋh"tt]eeaYL`ԥMS=kxǓW}푔$D4v`$IO#ʁ5N\20{6yE:(ߙP89ϟ+<P;O 5de8N%d4uSOݧ>|MSk%z@$쩮>ܹ6솈ԙζ6IScٳw334:A>_hQ9 L 2ewy  IͶ vdz8Ojlc +rW5;l؍̛7%b\k@+'k,Ʌtc zCv hVQRR̜ya>BϷhw`+VY<}^,̋ ʄ %MS_(d1cE)rFF*Dn5+w2Biڶx͆׵.X/T04O;|*Sdwx/I&jE]|AA׵3@C<]D={v⛦ʕBp C?hEVu]ƌ*x99>22R?!JJBmժ3gD4MϷqnZ4# 7n8eaay>ȇxcfo1-B`UR'QT'r, ID^5t8 ;׈ ԴoMMIJe DRK4O>yM[*05^%f$M IWeܸ^nfÆ\siO,/p ^7?j@usy^Oq"nJCKKhq*W8z.nݽЙŶD_= @!ڡHUMsNt3r{W3|>=Amm='N|ٳv!HJr*iidg{맨(osKD"]tnjʟ1o$#7ONd7.\.ihh¶Ü?4sL#))n :u4ů!|DUk$Ik%IbҤq())(LJp)6obݺmn%XP(l~[|AWk3c9BΕBoȲԒNtBODلZ@n57,f'BJUUHKKF/N"k} 7ysAlb>|ĉSX rr|߇< (..Hm5@4ڂz8 v))n C040MM-_G݇ٱc?MAuTUỈeoB 6m W in**]z o˙i47غ={sW|UNmaY%$'(RRD:2+@Hcޗ;3z}.[Fw9ssfΝ{ޱc+V >1/ЩSkT\\cWBJc8Tψ Rʫ>Nsܮ~nnh/7>3h~IN6˒2 4szCze(IiBa{r=,R^Q~VM=ؗLuu76UKed#r#kee'(mno޼(զyض+h_vk׋>w*,C}SIZgXkC%f8s Ѻ&A2de sz꒒g>d#ak')x$ &7^:!˲r"jϞ<̋_4㸲SS\RͫPCCU8|R-^ CB\0k{RZ߸qp=w/%|B^35`/T | zjmĜޜ:;I/L!vz0]~߅+v(QO}nSAJoڟic-p/ō3R0x=S2,]L;0;w*%68IDƸs)Ƞ:LDZ54T0?еm@QDkDZ餆?`~x  9q?e{;޻0_V҄ Iƨpܲd<|ii;;PꮻDq$N7LR`Rpi2ƸTE8^L.Rz"6~yA Eq/?\?,iNfnW6̨Hmۊ,Znlc)vLUUHF5;Xǚ =ǎK)bGɹ___>3v(/"w%k砰Џ>BikZ[KHOa qK"E0mN}/ y֜9%?׃.Ue``x֩P($FDVˢb63Mk}3[3EE)q&eeݸ_ `hKdܮ~@R`l<<ҿ\׈d4-YYJ) 5̝[$:`g*W?XlԦүfew@Ua1`?l0ƖʞGtu]Zee ݮ (۶p1 zs1(_,w^@Y%魷NR$ڮ (-cGrWJcx3 v/u )<.ڵ/mCYlw^>{f{ߍXz{Cc=6&BH F*$2ڀ) ٭nqR=1fr-ēi/g:tOPsx˒hi9'x>\F6\ڋcyeIg":>SL&?em}xM!G"2YSȷl Hc׀LI 1lH|WB`$}i, p<|喎`rcH]n:p*"ɓ'Oq$S'e~Wus~~?УG=zh)Вi "Z0 6]f HEvlQI2*bTt"لK9<=f[;@Vc!\j8RFv?pBJf#K->IչGD&+1F8zQM)WgoNavxm0)tn@$4j8<׊A _+-RDDhӴ!vmN*flKfdYZ ZQí8j8shV0 \9kic@86`+yo]bd2tc2p>_`gGakkbD"&)3n`=:L~ ӧ= r4ٔ`ssx\fm!XIeiIH*9uF4Q^/- P @6ci)$ʼnb2Dx\Fr NYZ 1uCPX,Պ"YNHY]MLDב4n#ըsa3>}}erFV͊ε٬%$)|e料TE*u@۸|y._~WO0C&aaK"Ud9>mva7n&&19yQC*:7n?;w[Ibd{}b1L~@r}v p@z &(m7\32%  8>a&&a4H$D 5.]o k̈"x"@FjgDV)"& afYÌal,H0CS*LJej7ʐX_X,Q((t:fS-7XN;nۉv0E!B,/ǹ_޽/woGfi$)N$Ro|\b1zqvpK~UUfsR$:Cmٗ>*'󰣓OaCdnj% O#Fq1AkE-;`Y ZXQ72^ b iR0հ6_q#Dr;V+2B\~}WֵUfPQbn#BH )$ `Nrs r@pV5V~WgXqͦJግd36ڬw=zJ? [kIENDB`xboard-4.7.3/png/wood_l.png0000644000175000001440000007276312262415351012516 00000000000000PNG  IHDR8RD pHYsHHFk> vpAg~u.IDATxڕג$ۑZƆcfK^9x?W4bT{DT54CNVvd],__AAEs/K^g6xu4`swaX$0 ,W4-<籣hYP8fc*IbK$a迻Q*4-i%{_ 0<y%ˊ(0^^^_]I"Ye4 W>q2 }Ͻqg]4X[eaY(ʲ0Ͳ0L,:(~յeqsA?u00D04MuTkt,Dz̲8qd09r:yaY,<J(麺mmm,2?${QybA~͗Wd#E `ɽJi ycm)N0&2Oz02 |}EiZA0]{ۿKQDQ5Mߣʜ l<yQa!`DU$YcYDGllh, ˧k":)4c4MIgZT}o{$l0=9k<, C/ 2M' wu )&5<ϣSb%% WI0 (,7CIy]6xa;h9,Nxyy}'>ٶ(lϐqDP"^Ye?;v 15 $4LWy4,Ot]$I\^^?~wti M?}ʲ<ϲ$YFN<~1Zqy<5yNӾW$ub!%pYZ(XRy> ж}EQ$۬WPbOFioȌ}}?Ml|>6JXN&3ͺ+@)6 j>R84$=0ߝit84}ב;>Sy.:$\#ˊtj[h) WeYu( Cs"U>MLbciY 4 C?"OvmELS~FPA \+ÉA@9% tuy~, D1s\sA}~$ ˤG+QSUG۶M(0:K%0uث,(,kd4aߝd=eeg>Ϫr[+E,e@IBgC<> X0 ՂxQ[﵏1X=:լg:zIQ<"N3\,V 03'%=}6GQHBDZ8T90`i2py}v,Kۢ yNN^NX0x[7 B=(ioue/!de% l F$Q?X+)` rb ,"IHIgώh=1ϸFUwb(y,ѩH[ՐoS/^%|X(R6LQ߷^u}mFXl!ueEBa!9$/[}fYxǗ/*a㏄MsAu-ۂ L6:˒$1ryy\t"TA:aޜ?m-KӢxy\m8r-)V,43\ l~Y_ܧ. CiU)=eiz:N׸=$^٦Jc߿\. Ir3}w>( c)d2NŢ*YF0ݶMscdJo1RS3F!U>PSqG33i:MEQ,|v,VDQYR8~y)K(ʲA]N sE~~QZRseO=+$QRg'G\U `n'q~ǚNS幭y{D BrӔ\xsX-yetJ囹n0<ۭiܠQDQm],UUUEA0s W2"ɲiR=JÜ$" 릉!IEӔa8M >BغݨGeY}$oۺxJ|t8*y:$ &I4iNEfޡGuQr#hC1]gE$sUy:t_(,Ͳ<#Ħ(@0`I0 ~+- uTGÐ>My_tat|!2O]؝=NUB}R"e-PI1x^1q~b>"~Jpi)pi 2E<,oiٲ<x۹V 0̳W'^)? mD),y^ޮWNr!F88IV4E2#zo97m; ] b$S!B޶ RmOV'3~=4ֹ/O|(ҩ(:YEEAE{WCZ,pgƷ`1" GR8&=em;M]=xleBX`,Sj/z GyU,IʁY/6 P}tpDXDw(M 44zy ]׶+xn`0I]sD*A$ !EӀEQ\4BQ1՛,Ib gR|8&تڍ CE]'d}r` K9˒ H~Hx9}M;:qa]W ͮ0kZD,Se}PeN.KSBY@,I=WrIqֶàRu-@N !:[nܶwTRmۋ;mfזQ.LÜuu]8 u=MJ͈ J"C,Kj0]M ϗ%M}v;@#ãaM1\=yQLSX@?4oeldei("-g Eq{,PQp,J} $[eY"is "*ǖ_t[CӼ5!}۶kӴ4e3ʲϽh( O|:FdeQB ;%MpYBW{2goh?"C ͣ{/P4 E_y4]}fW(d^<BWܼa 4Y*gaUpT%Iwܭ=݄wgOg\eiR8nW;\\3x7_w|ʺ& ]*Z"C;oJ!`>+.%$M2/FM#ju2xee%?rĊ֣hϦEGerg:ܱv{ﺦi[@0%(ahm#"68 Q!U#RѱCy({0, `:g$׺8~/kyi3G+,3ٯG>ω[r\Inq <)Or:ɸMSʇ4|U DBy}+׊wQt8xX s+L,*Bp8ɾEQd; qLFcANS~Ogcx4tF}noo4$))yÁwƙeI} &#IJM'ĶcY_o?qa:~AD7(x&ۭipR&\ĎOQ$IS*QE9uy+N 2ey:YgIo3Г Wlq8R>?U^L')Ip'Yv:].W]|#?䒱yJꚛH# Ѿk_kWq"tROg: XAm{4mE^,h\AUsCQ1|CXn\166#-kp:(ǃө[|io)(湮oZpqushxuIr<LxYVwqLv (B٭y~>g=WYd<C"vEq:].[fYTU^U)bwҔhÉy}$NN-K\G`k+X\` Y YDrtAѨAxn>3-dVװCRo9uZ#El-x1hLm_{{iG~&k>mN]]sV#R=ҔA0 ˂p#kk۟3d+Wsuϧ|b-G4DzLil}_l,˲4 u} ̤P۳H\.3y X0o[CFUY:,MW<!G~K2!'da=M˲,]+@,<'Jij[qLH>+,#Wkxt}4cQ me!i[%ump\UX=Ze1 ؟ 9֫ L> #Bxة@(u86NIxrL8 $T6넗]s9)An޺b^ ޷5`3՞;bYEķsFyP^cy}~z⮟ Aj}òDdՄ|=8㶽Wf(kdDYLia&XX\OQ*8zܻ.lY4%}*H,ۅXds){/E(hCx!3jܧiY -c9$ܶjQA;1@bbakC#S¢ETc'2j$0X$ mͿޣCVqB۾>ʼmG#>YYu㥉ײ N"ͳuݶ>%KmȅUUU՗]~l9v7m&w|=uz7o_EOh}G[bܡ%L)m4),ZPh1 ]ETlgx9{'=ڶE jorp"EYENu GVnPDvǑ FסB QC XRCN8(|CH=xGQk%8O~kO_VVFv Gy/_|3M. cUq",qEujW:חsiyOz/YRv]~ʶ݋;n>SFJ <=ԲHOQ$w|=D)z@YVU44ur0rg6`W=ouEU].Z.~zk,ҊnO|MxyN 0 q,mkuu%韮Wzy?w4ҽiƷ[w]Yg 03(acKI- t#gݚS4\PAWDBsq"KfmVxa3b7c!6o {d)J3`{lnf/јoݺ+U_JZGz*X'+FPzb\-)bb7o5Nߠ[iZS8b|휑kdinT}&X'÷k8hX=Y#;", \?KDϧqkҔ[[}8QBvP (b)>#!0$dP<✗~IEG lowܭ 8h%,aP',}q5͚g)Ix^{ѢЗqYls4b'i)$+pP 3hP0Ο<G{̢vd6MzV72f`D \hYRNiݐvp~, ~'{>O҆*8CW G' Q%m"FqY% a<@$d% 1:)KחdNeYm2ȩ*UvB}-K?8_c{umGHX܂Opy*[NYsA~`+62 a`NQ-}W9BL%+E?U}~{G|#CD&:dh[jEhr)k@ȎחoB)]8񜒧&3)/$9A3گeYM<ɲYX<gб#{RH,iڶb9pM20< <\,~2TP9e4 ;F4-K9PpH,CPbd8ȍI1 +T82W@Dq&CgZ8=,Yaѽ]"*ο#Q>q 1Sǯ;Lb,rkET$OWYk{ri(Kah\oJaߢʠY#Qr<^.d@bZ?J|۔+40[SmӑmKbmUƝl]>9,4% ?=׷@rσHlZ So{-si;x:@ԥы͚IvBj0W5ڇp/v^D"6- a9OKc5 # ò\^^dax{^×]HtS!htF(0eo4Áȹ2b Ϩtoݛy‡OKcFAբ8纶/((kĜ +˗y{>/_P'*tڿe~? W?ۿ#GN BxU?_/_=;x]n>j@k}|~[tG[c}@_fc@ƣ -[\^^Uu):[Xw$hcH@A⯫{JuPms Ccmhv_T۴z~#5 Z> [DtEzdb$Ah= umUBN-jI@-j(4e G-I4Z=aY(Q)o&K@< -83ߑc 0e|J0Po=QPQF//QDw]_&]f d窒HV u?LG:m,>ӶHpbM#0To:~۲bW#ڶm;u-|`Ey<Ѫo1nLuQk82$64qjYJYf|szhw벪xtEBhu$ryF4Iqߨb, cz`wT:n7~ |yy}=7S_aeO?ED s{Cy_*nwѪ6ԃ.&C&<3~R)*&<)bxnpVH1*iG|K&ж x[s ڞ\G}$\@  !Ki[H/clUuJq }8nzD %MK@w_x!2G,˲,e5Q+˴mq>~sH,D[_5+R7/@*Qt4K4͆QD *,gzR̭kX8~XAPPǣj5s7 &mœmvrEQbVijY\E:m很E/ F8Ig=X̔GEѦt 9=>uӵ@uT.8\2e`dEs2 ӄo겗ZDJ)w>Ě !I!{k!!f#4#*{ fVdY(3CǩNsuIiR$AQ[Y|v]߃T|*5}QǺa`06ӑ-K߯kA H=G Y$GDbvpGK5M]ӠuqLY25ƾZ4+zHtު :}骳#&#]HSe%9CuSaƶպD'?//t0%\ax<Ixn*X~ SgjƔ{->QSL?{x;tbE;7/j4Ta^)Rn4aD✐*6<=0uӏ?mȇ8Bxy{7_Y~t84TNӽ׍1OGPmQOzVu{ĨH[Ykj;a5 "$C >IFB)~s?ef,(蒥˴nuhl{m@ p=璬/K GweKMljfvYw V‰3TO5DT$pک&{}}y9|@i]Td>B] $N!|SjxHEFS\AJdՈig|>=hPX`xがXJHVDv:>d%|ԣo7mm uYҔj+y2z,K=t:՗?<ː˲ (h L|>-dnikiJAI;Hq{A>YCRΤ>Ս=ﯿ}gݑזzo|/ٶu}L9MZׯ뺾^p`]m[9E+ðU%~ +))PW>hkb{k6 $wQ- !Ho[ *5WFz } O1MxLBYl]1~, N5!CtRŧ* mQr4DI )AafD)l>u>Yl.νh `q ı* 38k.w\yhTX ѥn*ET) NssFأ&[kXlfe{8#cɰE"Q;w$y H0-KWҘ8>|p [4^~^Q B]=/VwgȠăhR`<"B7"{ d|0Ր${ N eӴ,{Kva S_4=(#:n'GGݒ=ؾdkF^0A 2G@35+O3S$ro#"7?6Em[~g %G7-Utx!JIh[>}*24tɾcw|AL*S{t[zW];_gN^|+|n׫~0g&ϣӧGd ƃB)ڰYkBR $}xT܆h}jVɤYliE* KOSzhxY4P`QO? Jj& $}>_.J*YF' D@-dM$`;(J,퇗Dlg;,m+ 42]֌F +E1@^l xE@SGh覯3`mUE# G$D3y0*&P4yd76 < pk )[olj9UrY~~%(z^s\.//&gBM @UE4EʢޑrE鄵'[E)XH?ISq[SA0 in$E-Fo[;h+Sy$Zqgi~E$ Mum[O?=u1ldCQ­68Pd3 m=w˥sJ6Pu>^IA\y_J")N8e40ώ16П Mco1u~ĸDXEt:{{t?[q8A#NȆu[1p0QȲ$9,KSw:=(.lN40JwY1:6Ϫ-1pwo|8>fǾ=+͓}Ub~bMZg$=థܖ$H}2x=,GDu[뱫?T$[oW˓V4nuyCG{sxd'i(;~rnIRXٿdcCüWvHz%c|k,#mcf,旉vg=ٖ~,usE<j)c sFq *3{XSn[ $Wk}p˿.m[YOߊWn? ,%ڽ,]G:ºΟ6#~"|C#&Z RkΚ}Yk8:@*\*=\ HG*pΏQ.G:KV ,+fx1ް{YH1ghk-[; |E]`8ڽ[ rKceYGV|2ƻF~(hnGy:N ੩lio _:X^ -yQ$PyQ>QcjߛK""OJ5Z  M}P'`![]$x"x1嬨qf֪o<ۇ*IG=瞋r=s~.Ͱ&}'EuKex@U/K]r߼BE0('qqRd `HC(Q&Yt>(,^UmQ) +'hen7!c;a2ƍko&l.2͵0QkTg|j~'QD=; $#yn9tPa&a`Έ[Pj[+ 436Iu?RF&1z 6{/}Z+0s=C 3pZs#Z OK'e8stFx.>vl^vEq6O $2rcX~0nt۾Fg?wv(&@6H1yĽW4r@'V>adXǪ%$,mhS0rMח5\z<8A6:KdʓHB RhIw%Z&K&7 ݤ}0T Jww+TiXG]qQC {&d C]7 ǻKp7 f8cI>Ey%V(su(0Em{2ױ4$rT)B<1>Gp<@Hlez<}m|Ǒ,خi q<THNQXL%*|c9fJ-0t6kҞ$e)wz <EFH(R$8%f^0zDxt]nX=^˟QS׮&x,A nIRa ԂQ/O?bQwdcVW*˅~̵6u)r],iz8fV`PU>@Ŗ?:Ⱦn7{5Yf dZkdŲOuK )]޾RcBj"޴Gb¤O!yN[7p'*N<9Q9ϋzf)(T G[AK"K @&pܙWƀ\ktlъy9 t0ݻ*vkҦmK!ik\?b}]ec[1R<ܢ;ԃxTÖ$1Qi\`^8Dincoє2c)N= Gr`B/K]3AwhK߲<4EY28U1@Qa{\>ԣj?RNzi|B*i0%>_'|G g0ןuz}zlS{>-3:$}/ e!:ٮ=R\Ɂ<~0GtdeyQ]U6DX ƭfMSnpǘ+il~$mπ)=~Qtf]>w~"&S.˨*;L4)aj-c5'T$fRuoQzƭ~)ݳ?{FЌՏ {ݿAȉMjnĮaH(AAp6[kY$/{q64q5B&wl SWEW"C3>4(è(W$0auLSy>MaTg'IU->58r*/KNe^GpLS=K(U߷-sNQ QʤWJe׶umم%:N/Jl@jIeL0u _&W\G9I3k({u}c]%x+}Zy5ۖYkէk+ V[U~I+xw}`ۍggvdPjijc2"2OEPrk㘓OSDy# :aEy]%׈"\y{gMkʈ|Bpo[l,k!pQ$6iglN?,CG*&*!Mz{MpxB"m*vW[L̫ڬ4cl=ra}ښ+{z^)=[HM쯩HOQVkG+@۝[öBkmX$4E?>T`-,y `"-gt ܴ16\UXc΍@* &32Ҕߋ|Ƀ ɨ{ee)0M I N9/ w;AkΤb}XKб&svZ(,HI 2`O:N>A3x[Ƀ!.ı>׹p K(QUۗ/,:>85` pA,'EI-NCb}kgg;CTA.I±$Y ]@6ͯ2<$Yɓ)4g/c~_6"=Uu`-Q 9'bPq  ;F su3*5*<{{>omøapeZUe"&I︦cbO2=|e;K{Bxi[m$7 *>s8T\=' tdt1/uwQAVd$)U6d(ci%e)q7|0-7,P#*!ݚA 7M[[< Y*tڮm2Ψ($*->Ƭ(O!t 1▟~nNA||~/p*5pHi?YcWL OBݿޙ_OSwν7< aZ!6[c-Ҕ \Qny(,˲f_&a#e(?L E|e`&d^ZqRn5Czdk¢?xMs5ЃDlT,IǵG9 _/t*@^m Pg+;y"o8iդ#&AejJS\n/K`Wod;t8EYN^L}I%9$6M!%=QȋwEO勪k894#=Bpطdeƌ$DSUs4J֖݈f7 GӼtp][eQ:|6湮^3Y[UWQ$g_7+Xгg-{/D#eb)"E6}?/#Uk>AY-tfެp~O"7Q` z4-<駟pm c)iȠ>"%e 0@=9x">;^V b,@>?w^EQb\8SzU7>tPu*ml DD{ }M+10w`yYA3a{ }<>J˧ b{'O$+$ k}y[eo׃)Y %.(ћInnN>M]wyo.@}j n Gk bL޹y<~o۶[ kg|Ϙ4JH->%c 5o? [ >"6#Pen!zk'H& ޞkF:)xx?Կ1XEtg`t)MI o^Ef\3̩փG]m{:SέT(vKNa\^^PP@֣ = &POu:=nfKPf)!.ի(DmG"¿K!vzz[KS#EcϷ_EO.r;T,zfHu _-=3U4:| yHS>)nfY^?K8~rLx(2*@ 1c2,+,;ne*g)I[w?y:*Di>MT0gzFQI-N=H G;(|k'U麮Ce34$}:>Y?9 &XI+BpZ/i<++:F+3;d$ʀ50˖iV.?S8u\$0;g4c-~6haf=(N'*"9/?plL㘿fn#(]u] 3N%8؉-cDQ n<(蟓w+?ﭑQ\i6VbD'Zl+{+ÿ=v/Oޗj3u-g+n"6 x;p|^ʧA3o.[\ޚjz lEOױx@XB[@ٲc]9 >Mz cϦ~qa{bxju<׃AT΋%Aax2vCkLHy姒.ZM{p[1: u>}!Ѩ w*)z~7f{-cz.O`äux:i>$hwɱ4lk֛ PƌQ|` ͥ$RN[+ cdH($zD862~$ĬC9^c}C:}`|#xpASl6u)Ꭓ, )a6g=\i0sB48?ӿKy__o}|s,#X&Ԝa  ts%|bY A kJAж//˗/?ۧO////Ri.}>|>RviTSn^//gPfh,2 vl: N;0Ht!|U5pg;"s>dw2M_ǗqupZCc(jxcy2U7tC&N%.3<Z o? +E$B )w2<9_^._Gи+ QM4V6jY1ReZ;.}e׃rٌ0όc S ".k9 фk^:4?%wSt:Ax]۱2>$'cq)mt!6]&Mihyʚ FRq$Q?8z*|}ω${2ķmAhpC0 $i9,@00<3a.|POD)mw@ДYF*P1(@քNS &dUɛ4=g`>+K zM2 dW'iq;ӔA.OJwۂ(dq2y>ux8)mu]1VT^1~v~BE֟Zr6l.A7FImK¡eC GUh1m 8-n1fӻU=i~9)<\nnu$t>d r_ gPac'PfYQD~HKx?~VeI6xDh7ja`ba+8a7i]yg Tm Spdx Pd'^qyTmJ>˞@ߚbf|kK ֡UUE! G؟ڨ'p=ߨ p2E"+"u?:o+PNN)/\  4?5>4R9}OM0O6GPFaΆtxۼeQHIEOshqMWĎ[^# k̇b kfX4M*(AJͩb841@{F~==I07β?)ڣdAWO(0~ϋt:ʠT5fPhv]O~UҾg|R씚9BOPhCP]24pDcl!Z,9nxijs<̔#:MU怲{ y57A*tb7?2 ۖ>QDh@[^fSwղ؜F(a1<4ޮW1 4UUUvyNӺG&~_g0gO4!)t^8"<q1s-6pE9Ap)ܵEBfumb. QD0pc8fQ'rMS)B$KQu*qlf>CL?}.,1-Ծ<[8qӔ$BN!p`sێ,Sb2$?- Ix"B"HV`5F9'G#w?S,9瀅 ֔<] uU.3>M|VZ@k8ʲo$>mFpfsqy2`Z[`o|H kVW35zKk$E"d)J{v}t!D>g@ (i" i!J*׷#7 ϧYu 3MJh9Q*tEM@V6ZaPOYU糟3nU/`0Ы V@XWD"|JʢspzD;zL`qV_rX/|TA{d'[뵯m}ޞ=5#j{T-P`ƞSNY_xrv@oGE;,Ή( %$-}@рBn#$>60:< D繇4tdC4(TlzgDb D "g$Ȳ,d|4#A'fբ}8uY>_8.TZdf怽_i~ژ!}81!TM9#mad@~Mc/SUUԆR4LS~y}$QgfP(\qb"ލ|$C`Y@]+y~ :ˊ5 -:$@,K2+ hj#?h_τDH%\?۩ $ی 0Y,P錨-zR~+i5,oM:)dS.5 f*[#m嬰| {҇T^axHp<33}9)n龟g҆z!3Xᚋ a2 ex N|q25 ynʲe՞USuAiy>%U1ˋ1a_8~y9?x,Ҵ(⸮o/_Kߣ eIl M gQ@|4ݳ3xyIhE2 @LסwVɪ:/%h)˲Gէy$Uu^eY߫=Ϝ` D>,Wy @fð,yA Sm)qG%`sY&(b4s]?ӂ8%nϟWϲ,_^|&Uoo?BGgc_0jc?xokkLQ~ 9Oi&bJmE-4_ĉ4=Qiv;^_7|Fخ/zU?XQHUUUYǿ_ZU 1R8r(`L<<:ϲ(d2kz2R81LX K5_!ds{@kD>=x? /ٳ룼|=@6J>4(hX4υҥ" aNُ^{XZO}!\q!Zc}hnEON5W O#֓v]B 4$"ueIy_-ou J-HZ4"@`=a=6bK/Zq|(HqRW&L!8,sG. W(Qjؘ udL8|4i^_v7yA*T0ǀ䳌š*A=\GޔPKKZqJ|Be]1Kꛋy~-41iR#<ho?+sB*A)w! YVQskuD40hq<7N'r0F7+hj!{A@lQW [ЫC(,@n_G9癊9Q4MJQdDȥCsV& $zb[YEm{vʆ18)eaw(kȊ;]ghsS޾І4};Qâk`ey:zG,G];Ը+mX, K=o7J-AcGหeax>;$8pȶe<׫y|pZIl /kFe'ªQ 렫yt'4=z<{ KzpΙdYPQx?FQ+,#Ež޾a0/h*K)7{Q >!a?^>Pߺ2k:lp]|?hb}äk"[T0Bڞw {{7,b/_uX j+wkFxj#2̷yNg?2,#io_VXW- G8RY[\Lk@L {x7{xILJD4yei:cU]ghV 5<`R0m*mޮW@4ca yup/g)3^U!ԟoQhDd>c"dE_O7*@($p']*Jy0%tEXtdate:create2012-10-04T12:02:12+02:00弲%tEXtdate:modify2012-10-04T12:02:12+02:00IENDB`xboard-4.7.3/png/WhiteGoldLance.png0000644000175000001440000000625012262415351014050 00000000000000PNG  IHDR@@iqbKGD ]IDATxyXTsf̙aQA,*5"14u裏>%їD@Z-Kdp8:nZׁ ߝ  ,$C6'S,o^K]SZz,Vm&ћHZJ%{4W/ꅩc2ɬZgٞicFZbddHu:v:bW(j0~9).ÉZ~!_]VV`ٓ[w[DQs,(;**Le+ 46RWDSS+ 0a$<|8G3r0ÇiVv3+X绣۝Lhԧ-7qΗԒto&땔US^^͍UTPPp봴QͤIDGfpJ\PHlJ.j&gժ(T=:**j(,,ҥkdf^"3RÇ3mx̉a|mҍ/&઎KR'=Ctnmm…BΝ'==o͢`΍%...meet:ÀWG<=KJnwU_g7GY,X0ooNʹW_^v_W PyxH/k~̓FǎСo0d̪͛U ,\8Q%uGlْ\b2ɡ*ZYy\Tzwq8>Czzmm&BC0 PԳX]p8)* ܭ}x)0mxb|%%-d?j🀏R ߓR2ZmŤѨXpt X$ pƍ:Eܫ7T*k$J)%9&LEll$oSzRRSԩQLQgg2J hq'پyv`ݝ̛ۢ4ѣyn[lg2J%CK[{V%5+Wn׷<2 //8z{f͊Wׯmڦ_:jW+FY՘.r%~j22r78q? t֮TFiM+V̿cSS+&ZZ zz".ns;jW*oJEƟtp3yB IZzVλ /†:6 z4 JWzܙ3*^1_sBB g{l2ɘL2MM)))r9{6={JYYN۟I"n??VtOVi l6{lnzz__oƏZnhkks x2ض˫L2yKLLn-(nsrydfPPpқTVa0- //AhB5DE`,[C\϶45> v  Xl/IM=ʼngofԨs 7k٩i:]I~~1%\G|\;h"0pP/ ## 8q xx NRB֮]|ϕ?sA3!122tS^>zMg3%Kݾ~wDA5I422rjƆ ?gɒ{yUǮ]O򽍷QJAPo}0d6mz;2n6o~ =F[*+ط|rxyy??ׄ!-m+}QF5u~SFhjj7cYQTtCyv3AA~DGsw u`L(xz6Ͳ:1qキfzkX+t1{ky%}ܹ,m6{\W]-yl9s|'L’U`ٗ啗j;_Y7oMя͛һի8[-\]Wg8Q|>jp];sĞ֍?_@rrpTlp";SPFf%Ǝ[61q}77nTqp|RNf[t #zUտN#.n} qVw0d23/qx~c.(&IXc6[?>:BosVhxI4$ɑΨ9#qRJξLZysvn$Ik2#@v/}S):8Nt:U^^?ooAE}}fU]]@5j,N~Z;@ &Op[%]G}Gϣ}*|IENDB`xboard-4.7.3/png/WhiteUnicorn.png0000644000175000001440000000613212262415351013634 00000000000000PNG  IHDR@@iqbKGD IDATx{Xu_p: P'LM7غzSA#Oz#x]%[Shtt~?fBaa;yx>{-nqk{^(<h}>,f2<'>>y@$'ǕI^>ua;h@7)ii4i ;Hq@$I25M좀/9" _S _jzÆ297?BB ua'R"#C-m'<}ե j/xu1ɇ'lJIM[ɓ[Dm:%??NJ`\ TV) lqt]E/(cZ@ /3Q_YaOx(4`Ȼey]gN;>[>!*@3p8 ի׮OhoY@wHH0=ZX2uh[XXܞ

x?psD@̓ONz.]WwR\:ΣL<.m!iifz?}O={~G23iw}|&&U=ڮf͟đ#DŽVO> jp;,O8B<{jO @dd}"@ӧ-7"H k…%Rh "JJ)9b6vcn-,b_ziۼO-;رٳ_m6 0 C`= ))V2tW0 d`R$mNbȐrW_KPotΔ)i x8ݮPswީCδ򗋕o=Gݍ\no2tcteJ( 333^BTWV VݻSK$)<ΝĔ)a6ؼyTSր o3kH tvvC 1\JNv+oڽ\:W%Vѣz{ i/֭5Bm5X> &LxRY43'E Yog˚PVi`ذ\ĉ&فSzO+L!#)j}z!wR^N}JС>=_r7w Z]}`8xw;g~߄z~bi^PcGSrr2N**i1d8cUVT5KE--->O(!>Җ,?=Ewsxw.`lGx~2EgO4<8)0eGGenl3Z[['7NX z]g)zsw&>1윞T}{sӶJ@̙z} FN^_ wpZ_C0~#/O+}%@@q|G{Bq8\skp>+nl-ONKrCIENDB`xboard-4.7.3/png/WhiteGoldKnight.png0000644000175000001440000000615712262415351014260 00000000000000PNG  IHDR@@iqbKGD $IDATxyTU׽?{\AĠ"4D,Zc6}ѷ.S34mV ֘D{YJmuLUL p'E¥=~={slc1c1cP1`" ^@P%ym(&i4o%Im 3 JTJlmUWYjkU -:AdF*1h OfmOO=%e+&&FJ춣 pB1]V4F`]-@VbD[~|$I="h߻V*I~8ኀ]%@V+}*˖}/ŶcKbHȣ.2?ܻfۿO*Iʲe5`Z-vS\`RkZd7kk$(fdڶY( #0^SsNΕYñ3\DI?h4kPhќa ѣF9htֆ8  䈢ttQGCC &ww/z"iio}jlpvLj5'<=CC jIz7zo 2ԩ!*j2~~>NVYokzbL_gx\璒bPxe3w4R[[Ou=jkjn߮nŴiIL4bc l~dZ8(:*V+RSgfӎqHN{leٻ5t`JTU%78w2WQEϟ%1$'%..ʡr-l!'tSRPGl<(,,# E^9lDjcyy{@#@wu1Ckѳ9r|<<-bӦ4.=`_h4E:b(hҩwOǏsط(ٔUaCDD+W.aӦ4z݀>;v>;W_ {)6n\x.]*a޼go{(MK[ȑ\:/_.gժWu@?VXȇVUe߾?ohhha͚laaAxx,͖CŢ$Jwq G!**jmmؽg& ]~x\Xʕ)((5ݺu7xwJŵǙ8ဆbɒWC^g3dd|ٳfv>J TNkq x;^$%Œ_j+$zOCQ 4$$e}˕nx ZJBBfiPy{{J7]_R;%lj =L+}#Vz틊zl6ՕAPf6[8q"Ǖn7Qk$@׽{M+,\8o/(P⢠I3X%*++t E;_7TULEE+ TFwwҠp_XLTZ/BF,#!  SXO_W(fjj)*A~uqr9whhhsWNbt|}/7΃6n\Ǡ)&L/I( z"..JUPPJIMꚱەJ2%Pӧ(tYJ'sv[VE!|b%.. R>^߲l.zzuQYY͛TTr9**jihhA93(bcԩz{{ ^I &e܁_FBx0O?_#55QXXի|iԓ0e撜xɓ9dffqjk4)H#jk3MZ77MAo8?8 QYTkvsmR|LM{GI&?'.pHߡIVj4͟;R;lF咀dIשҲ^c^3ϛ7>kV&""‚й(\)';;XPP&YVN)52Gqe{"鴳T*"F9n=e??zNu*JEssUcc@EQ,5f9ÅgKKM؁orc1c17rrKIENDB`xboard-4.7.3/png/WhiteGold.png0000644000175000001440000000610512262415351013104 00000000000000PNG  IHDR@@iqbKGD IDATxkTgU].aܔWp58s1x6qz<:aN2''3Ntf7^&^2^ *F "BpmxMM;z/O0C 1C 1/~`_Q8`<H v"$ t;N쯌D-d -ZΝZdf9v_ F!,3u̜%ϝ(Ι@h^ 8N J+3oݮ||/ mE._>^X7/Qd*rrk_T٠(&`?"h_g0{].w/>Ζ-kEot_ihhaݻ?EugŹhM_N'v޼$ސ"}`3,[VQ,{5ͽ|۶mܸ A&VmVOJQU ?v^3,:u?~nuO>9ޤ(n_mw(%I|I6w݆$6EO_5=Wlg  >rҤq8hjJSSd20z("",LAth=cC<+#LΝwUս/m"@,K{lxK R:s:**)-͛U8*&1$$L"11X'"R_B~~3gu\Xື Tg}̼{fQTUՔTPZzR.^JUU)S&69s=;K79N?(޶J'vyO7=#7 yy8*̝HFF iiSއ狙1yMӴt'z2L&CX#v"Μ)1lXXl. Lh>6vRZzk ozӦSz}轤Gs9p4_|qQY85k`.jvvo ]~oLkjÇ]hhhjש, DHHv8v,{?Ͼ$,,uX&H . @(P[,e33g?6DMhB:z);>({,/?.S]͎'oN'f-Y2g8r$KsHv‚yq ǎIIϲl+ހxaa^3g%?ݩ\>}2_~߶!;;Ev˖c2T_v2Ν+y͹s\\o;;_CM(nꭍ'&;n:O'%I||cx bQ,ҥIIyE,KƳxqO|eebyHTϓ(v/;w'.vxէ֯g\艹'ln֧7$&Ʋz"zA^/z"&WjjGPL詎'nܻg.Z|+;(>,4}Oo$Ig?u>(jj ݁86,~~F uj4ٷmvePShKxjE' } D|rZ:U2.CB0!ATT$3re6(dY{\Kyy( $'DZ~NdXV߷c)44pߥ.gsz$IGlxbIN#))ɓJx67p>zhkQg޽٬ZO:1̈f">}rVjk/ҥkUg_R[ۈd 5u )'3ujSÿDO L}hFqq9.\ҥRJKoQY-w?w(!`h3uj Kb hnn[|}OGB¤ hTs:tk"**XNa„Ǝ #<<9S:jGkk;7SQq^ 2̘1tzVF뀂xaVV~ˎٻ,^7.\Ѩgʔh^9taï99NJFO6= 0O=)9֭}>Ɠ>Cܽ['#T0lX ;/3n\8NJHH} ';eYw7KM~'u;JJ*sEqa!99N;xLጠ/ްYm>jص/46'?{jӛlYƍO.A};/;.\(JU]sz_l;y^`0v6Ӧ=tIU]+iT/kj)mF6o~O[.ܖp8^%2dY4&fagO>믯sH۳[*Eqlt͹@_HI󥗖볲_fPUUǡCgÃJQMɤfsYeu:FQVh柞LҦ7?ŋ%8T ^Q䵁)1`N[K l6%LI?XG3qh,NIОhkOYm*r:gد\!\.hlG8G| RP r7i4z~㕪29+Zˢ .ƎJq {XFvv&Gd AHnjj)uc+ |Fvu( L#XϾ}kIII{0t]:lz#Oq]$cQ};x2mDf)_t:^x [fAVMy&@ZZ 99SYs?wu$n$ɂh۵MkEVsm$;;_|#s/3y\/UTT:55?Q0 `0[n1\MKPRk|- xc>ēOXoó>~EnWGnHMD2}ɹGWYYe{^/0fzQSjn~z$''룬lRUkk>|`ΐǛgU\$31eTUcEķ@h Ø|/|Wg#l|f%UU[R}߉$5^Hjڵ|ai[|:wmg!&$p];z1!jeٲw޻w/ Ȉ^L&AO`}*Ur竳!3z /-x<}YvfEYv K=.--?5 \4Mk?j#0g;`65LrضmL|m40ws'N8q?L2}I9IENDB`xboard-4.7.3/png/BlackUnicorn.png0000644000175000001440000000376312262415351013577 00000000000000PNG  IHDR@@iqbKGDIDATxZkl~wI'N/(M+S0UҲiBVi&JU4hS' na@Ҥ !ibݏ؝ vl'Hd~s"tpTTNr^w799$44 xM*1c_F͍ٛgqg  WULӸ:P(3<[W( ~ rji ~mۦ !4rpYxRGJF;_wFY" zOlۼ x(՛7z,K/ZdY4#B0iDZ& Cc=5!iBP__D}4:2mٲ_MMu'?4;S0H$H`) رў=">U;a4dhoG/|>ߐBzFF^">qEjkf=w?Ӫ*.|p@$ɓ?Lt,@yy ={h4`G:ڹ 9HN :C:H$pHC@b," 56֑ey4M} +7+7OK 12 m^(V89 l:̍E%MQ8א*ahW%P&':3ruط;hhc"?&'"g1?B(q}#<^?J]/)JNŏ innїw癋Yfu s%Qta=GD[Suv~>q7 _,H&׵{-x<ּ$ͲQg|w 4u^@Rݪ*2&`e `NB9)@9,K1妩m(]^pP[r4:Q b?66!&8SSQ_*w|Y3WBKK'sWP,B4P5J^SxcS# W.򭦩'XFt]>ZGq؇B|o;ij٥aW37G-M;c( SɀsZt UUȑa%&b_+|mIۺ_G z=C_'By^.Eo&)"ZpB(qEQNazΠ,l|v-V%_ըi6㌡;wEaEBBP(@niŊc:ɏi1!yW۶y-m9-LH fr -Ic$8/xb.|UC!907.:ڰa5cV ӲeYnSSUEP,2(ZZB8p\yO{uHHėni+0 BCO>QCCx[[51ǟ9D]o"ܫy׵GǺΐkWS7G1ǓWmmsY02~_IuCv.f@iЄPy<3e[G]] Xjc!ĜRQt]afPo|p@B*J>ŶHiݶ͡2)9 ]R`2-뢬9?S{JGuؤib®tB(9'"bHf>)1 z!M؎X,Ȋ?W( Ϻ%nzIc,}?@k''(0ƴle pW,[0WTүx:l˴g2wdmhr$g}2NiT\"E,ƏIENDB`xboard-4.7.3/png/WhiteRook.png0000644000175000001440000000206012262415351013125 00000000000000PNG  IHDR@@iqbKGDIDATx_h[U?'M.l5Yb+e|2j`GtpbAP > ZX7Ł2GThΤ3VVVsor9ޛsFhJ̱,ALrhsd PIWWKƆg~UmmKlcl wY/;;PU8<! HXǪQ@y?[wU٢PiC{1yhUU )kPc@4ؾ>[K}R.u"JMΜ_]`U@;axGg+.^|zBܺ+mm, v 5Lw϶lٸkt4۳F)LN^T,ۏd)`Zys0+nn~S_r15_)G!wZN8!Ĥg}EɔHH)YUqb"$Sm {'‘#00plv<@pۀ66: mnpۀ66: mnS8rt9L;OD-'b UTٰ(OLN-(N }ʱc'%`P׆^!N&}F5,.] &T\^CÇ;iW9c 08xXW +&`ފ@_`xmUrtuUf+;wޯ*w7V֖D'PTܵ C,v rM=ڭk{qչA#'&>irF4Yѩ{gط4&yP[[ll|o}DcѨIF"O)wt*'DپV p ދcnh4=b(6IENDB`xboard-4.7.3/png/BlackAdvisor.png0000644000175000001440000000361012262415351013560 00000000000000PNG  IHDR@@iqbKGD=IDATxkLu 2 , MC]MіinMuҲMݟH3uӴM۟5ZNJ͔-Y6 +%4dmcwDZq_6~W 9}s>(RH"E(`)P \bK 8yOH$~`3 Oy`{t)DT/9C|O/~ϖB'ĒŔM8}Wt)?6>/9E¬n|J cΩC:!rD_/NJdxE0\힡g ˱x-wXy!3-ϸJ2|P 2]# (9ګLa,rhg O`uX򂗉ip^-Xlȧ3%p 0ϔ̸eO ɦyYd;׳vWw7ocei 2J ]@h4;j}Gxݖ1:@ Q*Fijߑz z}]7z!BK% zFcx<|NuQ^?AZ bOWU:\!ã.{9:PK0X,UX,ULFر>v TJqb?gϾ!.]s5 RGZ? /<+k1 Z8tsg~(,ΗBa<ЖK =^ÍiN$/.iB[.G/V3r'+r++#jf#&L&fszT*%:RJNa p^dbĄg"kE3؟3yvAkՕ!&'%`nPQGTP^.T]]I] ͂N`zK_/G_|0ؑ-9$-@|GDGG~˗cp# ^ctf:ʥdΝ bݴ:Bpl7/xsC$M5|[}k+$UU8yiqBQ}ntqę3Pp+7ـ-_L{'9n&Ikw9P(܆Z]BioH$zg':˩߃Qq/ǽ֚XNe6th;j$¡[r3>~q].7cc\~!Z*YܼVtIrVSvhf߾&m( fg}q7nLF ,,D45z})ju t`Ylfj|EygzKHAѸS"k U͍daqYv],=\$=gyu  =7#ru^"?w1ƥ (*?.dY6,RH"2|2{igIENDB`xboard-4.7.3/png/hatch.png0000644000175000001440000000061512262415351012305 00000000000000PNG  IHDRˆ pHYsHHFk> vpAg~IDATxҡ 0t߶Cw4 87:P܀@q 87:P܀@q 87:P܀@q 87:P܀@q 87:P܀@q 87:P܀@q 87:P܀@q 87:P܀j~L%tEXtdate:create2012-10-12T09:28:43+02:00l%tEXtdate:modify2012-10-12T09:27:59+02:00 AIENDB`xboard-4.7.3/png/BlackKnight.png0000644000175000001440000000523312262415351013400 00000000000000PNG  IHDR@@iqbKGD PIDATx[{l#&_`4ig"Q HRU%*RABPBBZ 4+@cǁEQp$u99E9^3wJ9':BCιTNrP0/G+iۅscB(vN<1K2xa۶(|=2UhcWIiAP@].f˲kAsHUEu0W10Cىя !C`:s.ٮ~!pdR؉jZ6+T[{A5vo4qmssP__CDd_} '5M FvatJri4YDevx^ji\ )/KNZ-V̙VK˃ƍߖ554 /"۫B(;9mPRRo^E gg ̸̙WScc=55]M|#ׇ~~c̲m=">FY( !}1c?:RcywȶW#Vo,--cq x>v]Og*))nkG8tyF* 'pv|R>vغuQ50Zj(t:/͸[t]Z|[\"j[nY%UUH!GrfRZS(4YU[WEecgGb =ȏdxi&Ғ%oZZ5k~gc %۹1D9sr,U0 rRYYYFvsa;dyyYc2 GƕM rx?Q{áBTc -ǵRţoy>vM+);ۅc:#dI5`Tc &3"[ob>?EEypp&O*`dg1M+7EYFN1 AuYsrspޝOD&nx8pY SBAA.VhHɔwabAUdqH=y+ +RnwD{㍃ f.gB(K,K}R0 %)K$chjN8r@`/ánɴOUU|}}pWfz]hӦfBa" "MSڶOGd@5mϲwiepMTUUƤ*Mv*[]9](!".Ҷر TTQ(dduL>H t#+c`B(joLr_h@u픔% -`i:>s+ln^)D,4uyϟ_F(pD yFJ4/paeΝǞ=aCC-S0*zv4- ɽ{[ StT@n/;|9\J ľ}0`tY]-9{4&% /+hڄm@BpΉs6yN䫫10U ccP#NOv+R'm@Qo%6c`\CmN-fۣuˉs]Wk$t1 Șp,.PRG(:7~ɸGUBөWrӴ), vmtVJ\x<^f±|b!(&^SIpx,3cXhqaauu"jzzia8j 6KR6_ #n0Y vu8Njc>g0wn>rs ̋W?]ASU.{#,s4䌟'O/++rZ$wiew8w#" [UՇlDFDL{۶d g10Xv W׵ΆeʊƜ!n&4 %? hs@ Pi6>|~<.ׇ8Wz&\49-CUGfN D[[kj[q:tY80ӈz}0ݯӴv:3#yTL- |lg%\%\%|c?BHܚIENDB`xboard-4.7.3/png/WhiteArchbishop.png0000644000175000001440000000462412262415351014305 00000000000000PNG  IHDR@@iqbKGD IIDATx}LTWƟ;3@H_2f+n]Ơvl-]f`mMT-ڬ&M+5mwYE46nbPԂ*X\dc&_?fƕA.Ҵg>"C.SG>S3gѱTQ"]y#aQC0o21_ F^i'N|H6n|aJ d Ŕ61_%96:uBFƣt8UG WJQk럢Sͼ!i6F a7$ WWa'?pf6oh1cvII.n҉JAxTsFee? ٪=eˋSsbm7>r]JJJB\C6?i]v! bL# ̼8"Vk d/1@3Ϙz;7wظRSVBC YDiֵd ji U\MMM76Ech <Øz{͚>8x.tzA0=1 Z>&ܼ'Vp;8xz쵹fM?RO* 4o\ ̕=zm9|Soh o޸ <)@ȁ?~|s=  f>FAxj1Bےdzϟ? :QR*+Wq'Z['k#Tyg *+W-45uwe1OUT[aJ aDŽcvƟ,G$cvO(khABpZ0j捫frEQh!~BBp.e TWz{?ڼ(:rY󓆠=Ag-pl6+B8vlXn ~!R(ʁ%Z9JK1cF}nbŊZ_߿Խ{74WV;r3(R\\:쐣/ <}g>܆a.ԩ"_7Vnu\9|gaWB}Ęvgڵ(++sٿۭ_pOx0%rzo!χ`f uY?XRUU dFP2FǶgL^ݸqrruYdr k>''[q+5wq:38x, ah3fA2c1c& yB_ [7hZn,!L08frr5!8(B!8dk+BTB}}C TD&ä@"Ż1u늬mXW=EQ-,|{}II ho͛3jgL dZ̼ysfII ^>׼|S x۲n]1sDLg"|@b Q~)++sx`5vZ)++sx43hXv3j(>0o(@ȽАf~/2S!ٳ .RscC3¢[~n?~.뺮]׷7٤mW^w{n:~Xour?~.heq5;ʃILMM֢0?O?9C枲RS5H~%je?^劢hvGG]AbLՎ}oB]0pCmmM$͇`b>$A6ě$ir:g,y$*@ii)>s#3μ]zR|c%K9C7Ȩѿ cv}"AVOK5iMkZ?`Gu K9PIENDB`xboard-4.7.3/png/WhiteGoldPawn.png0000644000175000001440000000553512262415351013740 00000000000000PNG  IHDR@@iqbKGD IDATx}TTu?sΝ)!TLEF4iC|)_Jj5;dgZMnY{  0 0 2DAfi^/PU(YYVj8}T_ 9 i4J39>44H5*AMI7%$ arejk/R]][]NUAPDQ<*@ "F!5uuΜ SdN۔MM:-{|m߾Ge[v)@Fk ?HZ|11vp8cJyy%n[`  dxغye,+N2 8 x{l ֭e466xZXVUu#d2|8;77GY닻fKg #GJ4k'z*@$L-,|SJOO#:f̘$Q,x<'$ f1.33U,)9rxUUinnChFYYt6[j/pݯw7E}TQhllzbb"HL%99xRRС9wEVJĉ;dYYp k,6n|Twٳ\fNYY%p=2nH,T22RXRIH;q*RSznDਯv ?ҳϮT8y3sw[iiiCx/,&?tf̘wU^^IjB4T̗}`QxxvcHH/>{MuuyyG/bC44\!+k,es9^sȤI?s>|b3/su%`:~C<9~rsz,Q\9%Kn?oK/óϾR#!jQwD2=]_9vڋ,Z4U3qh iiy}QKxlƏOaӦ5g֧jdd,gFd2tězf~ͽ.Fҥ3)(Fyxp.| >mO=K>Ct_SYYˋ/Ο!v{7oAA 9K#s]x !..ٳx hO&@̐!~ӦM`Ĉ87lMſ!?7d6WyMYU=}Zk&O,+57Νv}dA5ƛ6GL&A]@ܵxϞdHddD]뺷;|`{TM}}UUu˴n‚ 0a6 "0LDDXĺ"22\Y)pkvd˖E±cXvTck(F'WiFD||4IICHL%)iIICHOO&*볽E3n0KKO CDtLƎAbb,Qtv@ev/cr9N>VC^QNFQ\ :eiX,Bpp._nृMt:]G^=;WA9hhhʕsڨ:ud36m'hz5Uӗ|S"ή{`q`햖D_ksȑR #c( (`82Ͻ$0$dYA4Xl7ޘj;!,,[ijj] uo+[7aBGlZ ڸܵ+>+1#XFLB EûL]%jZ8q7""&ƌeٲY>' 0(/vۤibӦ?cp=,Xi&S]Q]]ǁ%:-|HRR,K`͚坊z?/dƌGT w6ƛO {/gY~Uq#y7/hVVֲw]@A1zx}t +V2JZZ"9]iii[Z~ $  4i4K'7?S^PYYkWߧA̧(ˮXlJfӊ.+%<<ĿYvyNly/r \o6] \~ì^SEڇ3ujؚk>W}bu:].QJKm{RRrꢪbeR άoOkn<:sEqM|u ~4bDxBɱ۶*V]2BYV6I3MaiA99ܹ&OCZZ~D'EEe>ȓ+*&XGߛIx 0ѣK))1b(Ç%*:liijc))9IAA|)`2I%}`/Pҋ Y@h'B,+њpOHH.$$(&-\ܤt I&A˲ +X{& \  LGKt|Y|`z~%oPIENDB`xboard-4.7.3/png/WhiteQueen.png0000644000175000001440000001045512262415351013277 00000000000000PNG  IHDR@@iqbKGDIDATxZ{tTL&2!!0cESJ+Ғ\.]>h)Z|Jb~T (mקGH  yN3s1dB$o5d}w}p p ? xk&|/`A˲p`Z]md >eUYj< 6hT\Y9H…HCqu8 R5q.Y 9o>x֯E,H92ZYD "2` 1wSD:R s?|ײ6 JLEaݞ*eeB4 >[ydZSS3g'^sVF{c07w(8c(!^͝m[O{?ɲ,"uϳ+ٸq9o'p,n$Ib5Z'8Njiuy~m9dYqGE<;'AO$8:x]m2ExI*-}V(9HsQ?Xxf;vl j|v*& e`) зP=>m-`^A $y^5f̈c]7+GFeqiX?Yu ^͐<`Zu Ɂc=\wjs7ɲt@ME$.g$PHQi99),˲Pn:`@D ,~?@Dص[lYKc<>{?y4atԎd7˲C,xMv$REKLs~ /|C(e{_yeN >nQ繮=^9޼y"߈1.^E}XȕeԚ5K(-LH2jQ<9A;}Jj>"rP}} 1  Ag$I!< &D? I&B0Z㢌F-L+sQIlˆnA23S\Ʒv#$Isat<#)}ED  0"څ gu<mHT2 Ϟ %ZfY(  d%IXrL>L˝`Ģߝ?]7} >c&$ yyl`(dYpyD΍p6xo02̤0a,x;0{%KOnC"%'++W4m$ $I\ZP0("Bd~|1GBNCXE4̟&I+u]b@ ry]X\.^dgB)ݕL.*a,E$qsaa Mq9! *b}}3`8"z>ɣ :28Iz'dv{TS4zpƊ0 矿SAU)vX _0Zre!':tN>,+Isl-m0nlVDD#K֋0*ʿF /1)/? eU'C)eY2^QQQWXp<oL:ክ2anpٽ,ˮ1+S$4nS" ֯X8v+S6̂o8`v{ZݢS'"M8nqnDj]EDOH7lX.ee'Q G rT/G p`Ѣ9`ǣǫPVv{\.5apײe_ٙ @/ zVV5M/ Gpq_WWRh<(k/mݺ\%  j)}ɫ?Ԧlڱc#UWD50--_˵yZ( ڽ{K4mŕcÀZ[wRR"rМ9UcŸ_iԨa,2SBBƌASPM.jh(u"5-q,N_E  5>"rPl%yn9}_'>2C_CDzg_~C,G'z6mZA(ܹөs"r҃Ehmut˽G;vlɓ*,̧ҷAmm_/ co<,j[G׿LDڹ%<B5qFWxo>yy-PSS~ێwXa`65ȑX!Xmt]6Z>pYn^E¯] bXr^~v**l4m~86˲ug^WYYEp8A3'Q]gş%%('c0vw^^u@ϳdYw_1~upw,ڏ{zp0}Vkmb.,;\؀5.4&WVȲ)K4̈83ƍKfERRB}v# 㸽&ٔkew%%q)?K 5#.Ό"" E 6hU.6uuGUxEFjhtS&h/ni 333g`?~$Ǝ&Gŷ~ccR8jW~31@L?1`0mA~{_a}ζP.5rY(Xb,qE0 BD J:TʳBeYTWע.5$Xa`0 l6+ƍ ͊ bΝ%":7 'p F - S 66Fo) IJNjن5S ǏW.RSCY g`< `BLLn}6mZUA{ gÉgV'~$?< ㎛nǏWp%5ɉVt^YVQ0"mX$&Zq Iݍ7˖=05e([<|AsVQaYacHHEll41v]o7hnnEcMMN7:;wg֠,DQI6NԩptTuS6r"6611QOo 7Lݞ뱫V/`44 bqW$&1[A^^X>l-{յtiI(f\yƒ%sa6.zpG[or/ř#z64MGI~,_whS Fj+ϳ&@U,cJ(>9yp+Í 8ޒ(A8׫}}Y@4|Whmw0h~;,ڏeUb#ZEU&2n9SHPKDP\V7FY6-*-n݌15@]>mCX+C|A4_X((PUTS'3 FxV3%qsjxI ߢ@_"xQR/֘xr`ؽ)UGU9x' (?L&`~ $cEpZbʠ9e%@PeA-3!Hxځxao8.d!.qᣂħ @ $&QO8mAEqLkm@9. v(͂v> / !Ha$%,J#`&W֕$ 9Ï$wt"یN(ɱj+ɋ [,"A@ D{Fz7Q$64$%US.B}y5bP;w# Z1$8Ni]ӭ$yoh{*@FNX_"9vJZ̚.&H.ЇDx+@`n{(]1zd1f%0RC?c?jVQglBftd[O$[!<S 9ȾBb` JlIla !h(bRx%21@;b iB2XeN3 ( 9墵!1W^0gze #98FCHpٺ!2؃隣yf4)S ).Ѩٳ}8u,'9|.}Xfl^Y3bŊŔ3xq!"X,--f2jkezj #ڵ/sdCL`"_ ذa3wM\?_. 3[Bgj锼.Qu' ظltro!Gp>pӌSN$k#ːc4 S{Cȵo߳-1 Mr[lw7K9\?vpW}yGy/2nOA|>IENDB`xboard-4.7.3/png/BlackGoldSilver.png0000644000175000001440000000416112262415351014225 00000000000000PNG  IHDR@@iqbKGD&IDATx{l?qCJGB`M6ҮSـbZà骪ڄZV Z֡u F۵H t m.Q@n Gqk8?'t羿{~{ 0#0#0/1}@G=i@$`:@'F>88p܀!|JNHعXd`;0qTƆh)5۾fxl~&V`(.fKkңiA"m%:ĐC)R`N0qK\]CYvLqBN0D95,N Os/ꥧ:]ܼy+A XKűZR u1,_^ɔȌHLrWWhkLkk--m; D'Rq,+{@5|cHNNd̜֬3J%33lO&+fs -ͭlchpKU\ `C`2%üy)(CQQyyDFpO1s℅KbB dt(ÇKaa.EE ))YLi7IJJjLuuǎ10`K@Vc\Ny]rG20P+UURQFݫ ;Vu@9J^^=fMV 5/ڵenjVV XGgR22R."ye`Vlg󒟟| 'ʲjN~8+2kԩm?KYY7 tQyHf|X*.^$;qС? jv (y@fq͒I99RRR (5Ġ DD<rZD,uL._>*"m|ٿnKb2%W!(` ʦMo'%>ިJsI*/hfdHc"=8X/.Y}t[e< pj< IH9;wn֚W: +V,AD`ɒZwE:`-ӟbǎ_]^W~KG|;|ȴiSn?OD"`ʊbϼ d۶'B;u3<1.HfLbb7l\%CwwڡNvRPp{}eo羳t邈ʧ3'jsj.tp\;Ϸ9_| y/FeHWD֞e߾CXXa;G2LL$%%>3),eddvfhhh̙8%9u [ ޣL@a2%ĢE9吗…Yddp8X>714TGn#;l?DEERP0E,^˼yI#9yڈr6[? #v'"1DS#G>b#Xn_CիKyxb㍴~N}}--my/rD]18#3g&6,Y';;^u?@CC3o}| o`Y{f;)țoF֭$$k J-[?/Gohg!>[.QwE|rrr5Ų_6n\%qqyo~塇jl'E".W>lCk!a/Fcl J}O"swwʍESr;mPs%Lj\v\{ltI%\Y"{ehQD,O6CnШjrMw(`[&ޛV>򠼨I'8T(JHC$T@U ѐi(nHъ?@h~E!k P=6ĽgӨW [QHev' 1}X2pJ.,* /kME=-C(c={!{#W'`:4B (1ȔZ=S_ bk>E@FaF_bW7IENDB`xboard-4.7.3/png/WhiteBishop.png0000644000175000001440000000505712262415351013450 00000000000000PNG  IHDR@@iqbKGD IDATxZ{pU9wHrhhtP1<0HD 2c:Z'0m#t|@Klcyhe b5: D HwrsB'@ln:mݻߜILkKE35B&YQVgOߪh ![n񵶖0ƪcUƺ}/[)Ye \UJivLa鴁18'Pٰ1>:7M4z&єŋx[8IthqLYGEQEQe~`D ,~(IRGD`RJ^[TQHf֯_m?z%cy%'#5.4 18EQ\ȫ+R]׭,]zucƌ kiyc{ <ђ$޽%޽%ػ$N vmQ$I|c9 PEs裩(C%#=}'/\nfoܘp+afpe2ˆٜFFz.Ӵ()(gUշz{tV9w^GDw=>{ǦLcc+75eeGNIzgDihj7v8xdY?XZQufY \];yP{aE\ 0:M\k8USS fF怣uu Joo?[֯_}C;vZ 5ހ I>|Tf")iڜ>]~ Ȩ^ 7 {6R >naطmm]9.̟/ahnտ|>u8}<^X[iiţ 1̙q,yj qQ ors\n&Ӎ΋4a[1uMw"4?g:ddgX!p8l0 ^ttx1ۭLQdSQ(kn L>Lp[$;Me%$Ę˗IwoQGmYTV֢KСB~6A2^d"íRFc"=_=75M{"d+(xf#\_HN5M %pSJ^=;aEEMA}}y1n|8!m[˗׷B ahR$Da.ݑ6m*nf &;v1v &^yr:RKK'|ETT̙0 I"N)SBAӆK04ޅOCRLQoZ 5^B xeGz\$'߅FoBDa7$*+kQZZ{j`?fX,JcFFZΝqhi:֮ 6 n^\ $)1\,Xp܈sg65ط. 0ݼ428 c]aӦݑժ.]ۭn||F.yA)$r`@y Fl$3=8%IzR1n4M?; ў>₝+,"`ŊBLLȑW3ddMACPh_U窴_1A Y`FnJIV|4㏷3f\;]&/o۰a$I,uFSb`Hҫ1Aeg*,[P~晕ÖG0!IãrTwf8QxYSS"ˤCU?#Hh0?%Dʏu7?%gd<oQ!deh̙sKGܸ;:(([|>SUk_H۶se NdznKJ*D%Hv0RrrO aa%W6"Hg3l>V]HeeGO>9,RJa@ < pC;ɰ0fNND }cգ{UVQL"e;jTC#XgULe+Igg/5`/yieI+eb_ "%VP&ık *( 2&Z$&1ILQ5O.bnIENDB`xboard-4.7.3/png/BlackBishop.png0000644000175000001440000000270612262415351013402 00000000000000PNG  IHDR@@iqbKGD{IDATxKlU?npZY@MnKVT$DBY,"%P$XbM! XЊ *}I>ڊ"Q)NwřN8X35wν 5𿆣Jr| | F4b oA *exحLekM p) { p^U{ϒY}*e+?w>vۣ؁L9xz x hnc c/4pxJ:Z7˛CRK`!倯`U pbx!_Z+B'+oP6^1ڀߘ/re_8~юM(+al`|F{La5lmppٙ֨RZe2.4\۪r@Qo9xtY>T9Y/:br@/]p=.\8D8\^q6mzmߠ vU@GK{޽ }N"SJ鋋v ѣgˑw9-">fpSUL`8(e ǎ+W^ PV`ڞ28}NFJmCe.>evO`M-6c`"N}Z Ф6i@V_tzQV$0K " Ý]9b8.M02rht#GNARU8  pFGřPW砹ُ wyl60T,W9#:t֩ZׄD*nق~ 5jeUj[׍릥σi$)b8Dd2$ NRXU.` HOOPP6֢ 4Mcr2uFG26vǣ >SjLWo cc8y<[kD"u z=^L(00Ї4BZX(=>$5u4U8Jgw=_+Y3 xe(;-#ȩ H{;Hy~B+YVhhNv0lms,>K>BQR<DYlx!W(@^J 6"!CD oX0dƧD>eARfg gw:ENec# ҏ7K䀹T =3HNre 3 ,jq@2p@Y.wEYkY'cCޖJi=n]H 12KY,>l@4=7t"S׀~#ٟ4 ǏC&v`/௄ͨGj+RC 5PJ?<\#IENDB`xboard-4.7.3/png/WhiteCommoner.png0000644000175000001440000000547712262415351014011 00000000000000PNG  IHDR@@iqbKGD IDATxklT睇sϘǎoBL!k7-m`Mڤ*RUX>4Q7elUMUUM6@clc\6Ƿ̹̜~{ g?y2,2Kk,%64Ȳ4آ(gZP:Sybe~b3&nloq MS4J+9&SZ?Hto!?~ ru:,AEO9r⦟obfd#LEh,mŴvl0ObG@6`bzQ͚7M4d$BTaj$%v /:󑈱8?ezL,--v #Á˕0O$S OGG/g\қZ$ӴlI1 ͸#MWA8{}w{ Tל;ߊ=zBTa_ZPiʯNGwPyǐt5)pru˲{-$*4l}}uɓlݺQLo/=& xMqW, |Νc&O*~/8\PI1+/ȺnnRFjv˲|&Ű}(J\JĖ-V^;5ui'w*YY__L}FˏLO/^X3<%Ƿ0=WuQUo>N]ui $/| "eY~ȟŏdɒ9Qk[ ~o(}RyꩇxM&wt?-Iһ귿vPAFw[ccLLJ&o1 |4M%#Ñ&''+2w+/w{{oOظ蹪ƃp2lRľ}{47ڕ^f|| YV;+Y8Zb#]7D~>c+fYdQYYLUU kįDW:22Ύ_5Z[zt ng"ڻs+GO_رb6EE>Jظ2~,!=Km366ôt•+]tu(=Hcc[nc47麱 kr0WTvضC\t?l! {Yb <(ݙ3E_0ݴuqJmm񯱷wL'7v5~@`?Oss 'N]7`0k(r(k|\O?0WLeExg\tuF 7MA7Cp84E&+˙LbLM1MHD'։D C exx KJVQUuեTVPM]]圻Sx_34$]6MFvɲt_2 s]7v@`af``QL"73˲Dvv&nw6"咟uD a?С`Y'7g OUUmt{;a~VQ͛ٳR]K`77*7 +ݺr{F"xGoCe{8á=ҪUy<`u44TSYY'uX Ng.\h߿@ 0áY3'Lo3߂#nIjZm۸\٬YSBuu)EEVn UO?O?}x]ӱN T UcX[)(R*./o\rܠ͘DQEF4M]{gUM;h{gT}|<8S%߽MrqEF:*O.Z4)pѢjsPQ5%I6dd 10++ $$E^V @y>GPOhGVX^~ z@[UE6[5@9&]t_^Uee?Ka-wDqLAً?B{og%|x5֯B4T 8 @SuE ,hfQXLZ\YCgYWp&Sף(*}w3-[# iv HbYEQ~O`ʥ lmmAkk;A ;tk$fEit$%!!! 86n]]{OΝUU][|,no^=xp*;otV%;׈ڋk偢8E9 $ ტeW^OL6[2S ڮbݺֶ6y4 EQ,$ɲBHXdd DF@ bCzzj%&!11&͍zAKK+ZZ\m@mE^D}}EEBB,<eu`irh/F̟?0a4 rb…(JAy){~A%mUUZOmր):!9ᇿ&O^5;v%ŧ|*: eVS1~&p HKgӒ$Ϊ_4iSUmFz@NJOl:3(,|ZzbjM=q^ru72]hnv%7M\4@מblDZZ L͖bA~̈́Nj^_ ʀg/ w<ر**jPYY L&"9ي8ƀ$I&AcAQ8C%|v/ΟoFY7 ??c رaZj[3{Eńa˺bo_b˖qw03&#FdaĈ,d`iQt;hh:|i;v5eӦüy1}K.df>*|~ `M{O^g2:=<ٓPT ՙ(Jع|۶}ݻϞ}ӂ !nLdY̲e /_@GvѣU((XE:7WDQZz'OK;xs y(+s(/zH=6'ob^ Q+$.:ۃ+h~`Bd+Wp\#P_ߌ/p"TO1XX[oj͖AR`>驠qbL&*">s#Ǝpx5N<xq> 0o[1hw v XL I"0ϋӺ ll0…$ 5F Ea( j^pegy^@UHcJJ&:{%jmؾ0a%(#G:?¹ UUQ[ۀTT*8bCܹӐ=v{/X G􆒒"j۶p8Xx|0:^?=غu;A(-$9 F4je=nRpryvgx͏ 2E)PzP0,ˈ%%iʛ**j0z\hOsoH" ~j=@4:T1.''˗ݘ3UԩܲBա "}#˪uEIO;οw+ ,WCEov :!fM} q9 ,`A)q~"BV;;3: P*Z)U[553`@1bK5`RXY^0w*+ K&`l+я 48ZP Oĩ`Z``qXJeVHiEiqFUUh%#M1yrp__{lIGYS$I;ͽO$ie՛@!~ɲ{|޼)_u/}2! @0xf~7Lu"iۂ`PM|0r|>|zzRӓ ;UMl꒶6 ˲l,n(VrjZT,'C':o^٣,2)-=}2iZqȉURiÀH~$UY99KTgOfHVE$kך8sBܻ؄-[>[^^sda= Vrׯ7yߙ `HfAl4X_ N׊ܶ|]/4m3))ί9 ZÙNڦ,_Eqv ##;U쳵BtU?xEB~k,&tkMEG}S)gknVVk W{i`4JJ*iiIzl _rrܷJJ>~xVGG;ؽ{e޼ժ}vƭN}˹sXWwFCCii.ji߄EV~Z TV~JBBlojj%#cOw:Xl6իxIAF|/۰!O>Rؼyu!盗UU_]ؿl>33Yea:^zWȑ#'rüySp:[|.x#2ӧs~3==)H7b*+=sS?W$x9444 Y&FZ:,K +ěBa?j~cUGx#֯=nɠ߯u9>"$\$~wĆc9syPӂK[ ioY)㋋0wJ 7na<=AMӗ{]Ӧ=:T#{1s3A_ۤiw]Os$IۂkX|%= rRQq*/S_H}}#^t]K;ӎ$I8v q3RRIMFZZ٣)P3M5kja.n7X)I N֯7"{ٻE;OI'>vQQVTkikF}}#׮5\Ad 4ɓ3x{Y`* }ӫ,aO}W6}={TT\dƌ G? ''\E. %v{D0C^)̖6Y EnX' 8JѹP>Rp@"۟w;6B4BGWKCAfMIENDB`xboard-4.7.3/png/BlackCobra.png0000644000175000001440000000243412262415351013202 00000000000000PNG  IHDR@@iqbKGDIDATx_Hef 03m3%FuaRt!Q\ˬbDۅ R@]GXRHR9P5҅Rҙ9ǧ"~}?xny>{=rcorB ,m.FP灊 8[`XPJ Y~:rF`eubOQ+gSP| Qm|VxY3aP5)گvVnqƬlCrQikkQ; JŻ%^QGD brrIǯQ>ʊ[~n` Q(j;\FN0l'H$2$MMٶftt4IqqKkAپhhɾ}OJ08 cD*+$ gUv"vw%-s76,99w&kn%7dU#Tl2ۣ9K@ Ct\I!`´B`H @ϺfH VFZ^HExc=,jE\gueDP 8Jэь+ HG>p Z>Cը|&Uk\Dm=$5u@5{}?pUY2;bo&< CQ)Amt8~跢TU)^M4B\V \pԂ$ڇWm`gM^Եej8>`KGpXwcTH.JZtK!z< 8Y|OXwNU6Ͻˊ7@߸XǧQa]6>T\΀OQuTȶ8m褤H- c2c':C%oɢ[JJB$tlxE${439qt0b{aW0Ar0uu8ОBx......ˑ"K0ӻI,te{\H_#bKID1=ZO|2&1|nndL"!vNx`y;ԝbY _ 1iu-TK(+akv\ VgZ|iAQ{(>K@NT&_{ JV|*:Ϩv$\&XoiKݖ˧\_7]LoR'𸽱XG, /(O ]W@X {P;hi[]}]Xgoz1ڥPC0GNNb([P{w#+R7˔RJ6?4ޯPP57:D5oDRW|@h V24@/_|@ BGA:R/!toJ._:N Fǵx\Xp8PfpK}IENDB`xboard-4.7.3/png/BlackPawn.png0000644000175000001440000000144012262415351013055 00000000000000PNG  IHDR@@iqbKGDIDATx횹kUAH D WqA!Q\k `#67-Ҩ("A[x1rfq>8;3sf;3 H$D?2pG}{sXGgրuBd-y4u wg f$j6|ֳ2;@hWB+h8 4 oA|*WM%-Q88E"oQ{wTw4dzyԢ(L X:)+^X"߼> ~n \ ݙ*2M0_:-3%pC]~{,xOOACVsBjPBjxw `c}\7Zx`?PxXpK{VfkMF) <ʪ}'8 l &* Y$#tYȻڝyQ`&@xKJ۞oP."hxCuA rsa?j$&5km fmEB.NeG4&pp'b{Y!\磊˂x )Pﵗ-Mma\FN{DXauUmÞF#`86-iߦm!oQ83(MؾV aY7XbEb%D"HkEEOqIENDB`xboard-4.7.3/png/BlackRook.png0000644000175000001440000000156512262415351013072 00000000000000PNG  IHDR@@iqbKGD*IDATxKhA$T7bX JkA-w!zԋ^A/*xbD(^+EC+}faS0M`.$3P(%y H?<R%Owh3*fXr%Jxx<_B^O?;a'B*dm@6*dm@6*dm@6*dm@6*dXhCU&܏NĿq`daaM;@sx\$og7>Z]u~6Qwa\Ӌj׿G~.tDd4+]]1FF(w@$:)C x&t}B ЄϺt ,Y4D0{V#/Np75,f7;+43Ւo쭾&H<&ngYZQl9@2~%U䘞,"w #__s/yƌl BN6 IENDB`xboard-4.7.3/png/BlackCanon.png0000644000175000001440000000242612262415351013213 00000000000000PNG  IHDR@@iqbKGDIDATx]h[e9ITk+17[m좳L+sJk)" ݨtv!z1HمB׉Zm-CMAmRVa&9I^/dIr$9yX_7/;~ڀɟF8 ܓMІ嫫+m6;@ aCʊ@ ڀ)k` 7y\9shepT:rw9"axAuyhzMTxpn&'3\W2+\$Do3tܡgF]JiWUUk,&{c^Coo?.ٻ1 YI&DeW]]I}[\MfFAn=vd'JN%_ÝgݖJlK E`,Qu(=*@9 JK kXtz KUݘb(f_ n/CUp1::׻r( BDhmî]s /N nnIªju !/xF8e9Mg].U'n#>HwmVGHHUbq܆ pgQW#U.#jOu2 Ϛ<ޱݒu=\[[3~ʡ^?րci~vb7 j,ch %&b/l7Ezxz9<5[7ض '|UFF.BзWo@QNcfll>;})/w^Vg2k<. ّ[}tn{r9~Z'?PW[lV g`9Q_l6k!Gǣӡ9+8V尢Xuu;WkkZV?1hL'!EI `8e_۞aXbjIENDB`xboard-4.7.3/png/BlackNightrider.png0000644000175000001440000000556212262415351014260 00000000000000PNG  IHDR@@iqbKGD 'IDATx[{lTUǽw^}CZҖhRu_Y]wcA0>qŨȢuAeH`ȣ-t3{sia3KNr9w.b#|{ S{Xޤ$OӔ*#&U? gBmnD]nxl+ekM]PFJ)rM!8 WtTLU1טFL+X>@2xi0 !3EE1Ʈ S;t"t꺑ENeٴI>_: F ]RxM✛m)NO%R ^s1B`ܸ,;vGBTڿVZ NuSSKIhh~TUo]),)y`IJAN.]hBu2]W?oL^B22ɓu2L?sf^R1oL3''òUUq4K>W8sv'?aI v7,;łPN97Paa>M1cF^o3V|(/cL7 +"mŀB6I)'~;Bޫu`ȐT*,|衻-v?<>|n 4oK)_^#.]hLolB5k)0vG]{ؗFNmt0֭ -Yr'=w[o=G*Dtי։@["M)RSvִv;)_S9M^@BpZ %KMM_ųl Bp?>ۚG/.bORǏD@QdK5k^"KNZ꩸(NW_c_DedzC54MX_|ko߾5Kt<UpgStE8bU&!DMM}F^^&F@TgX&<,_`ÆcmGn`iiq5yr~PP"RlMH]t:<+V,mGܹi͚HJ ƚ--_De?n326v1/jcK un0p]p:ZQZ-] uumf28x߷H lNTEo.y<;O^&EۖK7.ΝR'*++?6v =;Uфpᇪ^qPLm͟_LR 8b#`* z#XO@jnSyyE :˶o/cpE=&ecz+XwBcb E"3s`qwu"`L'ГDx<>ӉUWc`R+B!=HԓiJģ3g~bnwۡE7iͦE7NQ4UUeJxGNGqq!eec.岟1Mk`/paeؼm;ϥQ)pCWP(;6w7l)1Νr imC$%ٯh0M0#+k8 uU/1)X"4mZm LO9'_Rl]Ɗ'|Vp0(21fS,'9i=߿w"r0)4k DWyNE6c 7<)(<@ 4My5 IBG+1bh8{mѦ*MS#PU;v|N5M  y9-QEm_~vHDݿX!]"ȑJ񲃢Vu9] 91["JX`x_yMӢվB <"ݮ\PHo!)]5?me[)v{acʔRs6 mFcdGa]l3(HIq9СQE':Q^]]>@n$zsI&_ך`.`\.f_\s8x8HIqdd% u>_ /tǭ|jj29ّ&WGCei? #:C$`*[yz[|RG" YQ HhxoN%+RDaݞ$  HIq10Xr UaaxLⰌvgHuF*A]]#:no;f,݁ (f|s=n!pSˉsŽPSMksRGg VTmoR %7.zGg8Gį[&18o|y<t/XFϛc (s{=<7B -6!pػƺ4:J@(y:ڷ]u@ri7ה߸ Pc7k$ltc!6Q]:6N"y76)e6A6t"[j1HcdZ-0lӦQ^G8ېg# b.#ʛ_}9/.8ˈqBXCO Mq m_z䁫J++}4 |m}p+6V 6qvu: r8 a?_qxm>.[H4L~RÌwx<s6OJ!#4`u Y=}.\*?O0,uj݁ACj=nվ悇U}=u}%Ӈ2(eIeqԥ t?e؃>>=,['tQ9{vd9N mTB䟻p*3.W{lnc60 sàFgQ9=6*]uv+Bs>%5^Fszx OPkP0fn: ^6W[nyɐ4|.a['$D6bGdZGQ3쒳#JGTS6Uj,xFQAJ&kX&w r=1b;Q)Za׀aɸT l3TW} R7t.Ow F!@c>t23:~*FI)CN[Ev{.VNյe,-oGŀ{'Q#Ves|PmU#[-*Qa$ӗf{vg&9@? cĜz\/y)t)Q˂y_4^&p+ RZJ_RxmucRd\WsSeE33p3:14.}H$z퍒HHHvh2khF*a~>|T*C2/&'/19ydr|ƿSjբLH:;>+#2> ",33s\rR 纱:b1y-դg``PBɓg9q )/΂}12r w_>={)Kn}ԅ`0`?##066NJx&UYP|uDUh(HRD”;Kyi)ˤYv=]F4:א3Hgϭܹ[i M7ňǣ-bD:ennI&gI&g9}NE&s $J6b@ʇ=ēJe.\i8~/ϓN/NgI ,/YZaCmman(x7 ٱc϶m|84ǎo |;mQ}՝^wwv{X[CƘ[~w ܿʶ^PDUß-6^r%*pb7ظzd*]Y_iqNUAA y;Tmr_e+y+5ӏBF ~oo :7,"oO"ɊGGlAnz(vS},>/b ~īZh+7(VIENDB`xboard-4.7.3/png/BlackElephant.png0000644000175000001440000000460512262415351013716 00000000000000PNG  IHDR@@iqbKGD :IDATx{lT]c `ű1$BVD@Ѥ )iH'B(T:N⑤  8AZ0 7~ʑ$`Д&H;GS/9\3f8DOwG`=Rq`pzH̀;R뿖իFRxPH!eE$'+WvKAd2r!^ܹFN,hl.q\&L-^1yQ<-&}Gk@{X cT|Gdb@8~.V@,)ţ|kTE9^t?MWhQ›mj?R9y0)|f'׮pN-g^s<ˋ/>:<`ر###\ij:,f=ݖ; SWΞ.b;]Ni^TΜ٪P7"d u7n&?CV%5rlذe^xis]`OgG͛ߖk,t`!3'J:8yX,a7QRbXw`s~n`.5\g݀Z5;`@8߈HJC!3wP2QYmh?)к`ٌn4yo&ç[H]bN*COx#J𽎒И&|%Cń[+{ݻI>")eSaXˤLgمSii6khI86vU@!"Ba/Sd2y w(~ J86DR ,z7ngϟ昖HruklݺZ23)FyasAF=h+`Vc-yyӫTwxM))IRV{LFJ6"}rsqLX,PfK:wJʭ[%'' R4{wq/x<2rE&o5~֎e Xbq8*T_1t\=ZFJ6]Qi+,S w~0a9՚k^VSU?dnp(W.3p8|dv>{j֧Oou ?,ÇwY٧ͫz׈p$ hwP͹s=~܌-=+kh.UESˢ 0 G1Px'bF8l6?߽e2ztf9TVޠ 55w~&MMNaB)Aqp}TR0CI7?6[bs.;?r9'Js2=(B| L7nèkΘQ(?@ 2ڙ.Hdc( z=J[`A?qfݵIENDB`xboard-4.7.3/png/WhiteLance.png0000644000175000001440000000311312262415351013235 00000000000000PNG  IHDR@@iqbKGDIDATxoHiǿ;<Y=_e"!Pd2Ț@A]ewu&A\Dы43hΖ;s͟g<33@4iҤQ &ii^M j#&7P 2#YYjP-gx<>==jP -2WEe^Ъ!D U\\@"??]*iQ|{x[E(>qx[̷֥[ap1p_$آŻ^?znJ-0oUZha_Z %TT\q nCIA&j^qZ9,70?i"ĴjP(oBJR()<bBmN(&H%baxͮ׎ݬ6) P. Geeɺ ++K`0d8l_B ymhr4 xm$ 7 _INmC?x=ht .8%*`OEE16<PQQ {dSDl׼EcAbOȡi)rwת6 ͒M=t>;$| M0& @KS'.aC_P2$B؉ P84ԙ28.N-Zj]]|\}b8|Wt8E#[ 8!$RKy+_<4܍7#"щw?> aS"vhX"!,)]!]eM@j~-.(aSO*'`LUQG4iҤl J6̯IENDB`xboard-4.7.3/png/BlackHawk.png0000644000175000001440000000402712262415351013046 00000000000000PNG  IHDR@@iqbKGDIDATx}pT_,B>b+%,M0PiSS NQS38IL[?dJLڨJ P1R v7oeՙ3nn9s=@1bEs`:$n+* 8(TOG>w^l UUh4 `9f CYw>]>qȏ$g0G|oEIS(/>h]3QQ! Bbͪ 9F4~58:ibѢjU.Vl6+5SQ p| @C,oAV^"vM\.Lr*UU/ȨQ#" |SHnjٶYq;ANY~{r9eC֡(,9kꨪKDy5sk9VH4ȹsI||R]^NG^~D:;H[>x_zEXt@@7/8 E=b;--m47qB\߯l6 C0alrPSns{6yˮ]RTXv5S6o$% .6Ȅ B1z[Iu (+j`d+sdg{77w={˰a.A KC=fv8!a\aUWDN>lddcſD 6nhٰa)qZ9xZÇ+--NzsXE#osNz-jŋfs:;ݛZ[bC=rA.S{ 1gGe#EߢɓMx<WӦ} \aT.lqX9`"'Q=[8::։O(`Õ޽0o tJGkkG 60'Y9,!2@} @nq9 CriXpsǨ7nbqGO0gE7a)uՇ]E||\:Nj7 8E_\OwlV_ڷTH"[bRz;F1bIiiHIENDB`xboard-4.7.3/png/WhiteGoldSilver.png0000644000175000001440000000613612262415351014275 00000000000000PNG  IHDR@@iqbKGD IDATx{Tg /#qZU"$*f&1d&Yl2j9hljhDxD$:D# Yi:OUM7tM7tM7/zA 3 VA .$4 (2+]TW  , 8[hIP6L?jpc߾=TTPZZݸq[|j pT>NL&Ë<̛70c( '#oWç{Ozio ֟$ 5b|/~Lxxp c׮#Jii@m 0h4|*k<'^4&?Ee˖=_r8VglvVxC>\26ImS^^O+…{:#hJ8iǎO&tTQU6j}tH4m;a0H'9vJS렙IN~Thj nn;=T,A8A,((!33"JKeрd3sfp n-pi!0MCBlpIQTܹ{Uu`0l@BBlDD <<`"";n# qqKTUe{Gx^wߴ$- hFYY5唔TpV/"? Gllv{GaGԧ=qƍ{vk@| D˫W?e޸OwrB238Av5EeAL2LKH}ui_56:/fY&ݷIyTkdd䒞EZZwL| $%M!0ҦDG/U_ҚEE=v[($-΂̛7{Zn֙5_|x.X,߯]ohŋ?EFjBslA]>=Ό/kZ-J4žVk?8nX̾ӟ^%8xOn,v:Bjq$IgfbξرO JڲHG]s^Ǵi1l۶c*Ξa̘L<ǏaLF0Ѓ0'9yjGw^9tO_P}5+p_xS bLY}4'6&XUuHHPmzAp8 ))씭caߑNvi\ݠx<lك6A3`@"6,;ちC0d IJzvo뉈'EjZzQԭkIpMdd빹>58O=rCt)c0w+NUu Z+؆xca䟴x&zDQϞ=_)?>az罕&"lA|{-\n~,\7_ ||ly~>_~mc]kABΞ+&MF2[RRwP><_̙3CZZn٥ե̛EE-ϼ@ C^g̛7~ 矟;L2xJc,-ϙ3멨8N^=OIY $'X}:nVVޡTՅ0 ib1c6q!!%Ɍ=U|Μp!d9&ƒFʲ, DXPBC:VSbn<(^hc\q. $9y*-#,l(6[õwijrRW%:tRTEXP⢰#bܸQ]"~LjԵ)w;wOzwo浪D;^ޟ5kG!Y&tNH8!׋F^֭{#y͗d/TV!58;w ZDZq/5*S!((Q{x@o0681Ks^#[ 5b۶|~p=Stm?fZUUu ijuo6F'7+5 `:m ٫Wܷz+/.Q&>%%3~m-EQdd8 󋈉Yde]qR햪^N8QuSϤk,[VWw7MQ|י,^F6oa {ǣ#yl~гcaMN:)s"=SQorOE^x i~ء-n,СS|^a0  {vd-):XgΌsϝ4yO=: ޿C[J˻a2JYVw;b.3z"A|98 0!Ji# ca ǧ/D/ʕ"rTuMr݂d D?Ÿ`(t x<@%(h-LFN'PSSﮭm^7HXe5pX9 A@o?AdUwܥk8n馛n~'QrIENDB`xboard-4.7.3/png/BlackGoldKnight.png0000644000175000001440000000425312262415351014207 00000000000000PNG  IHDR@@iqbKGD`IDATx{LT?A50-([鮊ݤnmMWnn6}dfcY&F[knQ4.oWQxa;ؤI~s9g=ŋ/^x%>ܞH8L p \jAOwoKX`%%# ؀3@hp_uQb퀸iOk߉:ˁzԛhg@9;QK*p ! sqco|,@TKt(o\l@0ZG |ēMnzhCX1L*4}۰9>ݝ6s]<u,x3dzKK5.]RFCC uuMrql~C8`6P$b ))Sc:UMI#%%@W]ꚨHee=u4604pߏcHGMbjP`20sT22LftK'**{|y#%%_P\\III5ӌ 8 `ntJK';;Jvv"BEEŕR^^1"@2ЪWb$7wϥb8~L{uϑ@x/x>&&R^zrȻbHO ٵwh\1 {I/ W^|{r1-o^;:V^.Ǐo im=,[LfV]''JEET۷#EEdd:-k?sV&{l9sFUO*t-l9JxoIٴi\`0HAbDJv"[< Qm2Y'{L[(9OYο9LKG9`ǎuw4jD4Rqq]=% olf_T8 պI~2<ʏ ;==^Xb'بuÄ:67w'J;E]<\tÇO˫=c-AE4h9}͛qKBC9r],'FSuz6,[ 'ݿ>eJ0/deq nңAOj9&>>D fbcDv{H||!!YΝwArV0JS '3sϛon 55XGZ45Q_̹sm`>>$$Dc2rr;V[-N`±miƱce\p|;Cdd(͡a$&ZHKK"/o!7SVVCYY 44pA5QY]BeP$ӓ;w&YY35+9^**r/͂JP?hGHKKd9de`ƌ$RSX"4)8ڏh 00>+O7p ;իOR~pV倷M@V~~,[,b*ee56BK5::nkΝ1 !::( ;; j˩Sgپ=ZA}th$Cbw~)7n9xOvwbe7g0$3sl}(v{T@ʺu+h4.ˀ-—*?V&ƍIxx'lժoۥT^.dojw͏Fl޼VzzNș3{%??G|||&D3ɒmbHߒi4)P>[e︆ބ/3gQ)"UfMHY7@@ KddSe&ٺhן(7=xPa O6t׆+uӲCT'QKx]Y2\~uέ!u2kd=m#}8 uv~pp ;*Ff_x X*yVV@5[`.:p0x5JFڰb\I`u%(nzO6(A(Bΰŋ/^<.0X6IENDB`xboard-4.7.3/png/WhiteChancellor.png0000644000175000001440000000467212262415351014300 00000000000000PNG  IHDR@@iqbKGD oIDATx}PUe?sp/\^M`0mE˗ K2+PmV!4mu Ma%sfwr4_rllLvEWr40nP\7@c;Q4(k !!A݉1 z#`6_*k.Tu^([9}CeҤ ԗXʱc'W)@;h,,U._>8hVobܺ:ѝFٕ+{)׊fMQ)'NQw+$* H~VkXP͝w )) ZZZ T;v85_6 `YIMM6W r v,K^x'ԧQ{{ͭ$$DqImDFe̝X:wBrѣӅm 9^ h 0!"!H$FGGprXQQ=u@O%@!f,(x|22zG?vKGg|2@( A^y'`fgݼnLv_[{)SSW ;Ii̙K.$2f->yEbb"L#44Al |ho˗b6tPW7nWs)ӓe,/(ƍANX,u`;=r>{TU(/1L 0Tkо; o!54LJJ"?oߗ%-jXfΜVΟuc11= aj׎`2y0{l]TWj<##DQ/XС^2EE##CXj>@$Wo}!@˛^&?Vݚ?~wKꍭ^bP'++kcůu?ikDTT8F)^Kњ''rDD* /bf#nj9@IxM^n!sPl6`NצVL6 G}} f߾/p3*$KP?36 ${O;ꜲaU}tU5r@?%DKu4i4hJJ2aBfpjgБ .BB<ۦj!))W_]FZZb:8 hJw{Bz6o Y\IHW~pf8g),#A;U""BDE_ֲ ns@qf%%%/xc8miQو`@Ϯs%8XQ/O>`#f+RR t>3##--WYPYy#C,͟o~^s-+ٮ=p%1'aUK{?ܾhi$_H86anQUuBF%rǒG:ogU #7ۦf!Ov1flggRed1we&{}$.JyV|챥`u{]Qssnq\^ٳ-=(+ϫ+i^ΎVW׊'`,j/Ze=3`k/e{h s?~_վbNIENDB`xboard-4.7.3/png/xqboard.png0000644000175000001440000001050712262562252012662 00000000000000PNG  IHDRF{e pHYsHHFk> vpAg+3QIDATxn@ạ GZf3\,T6u]ׯ?p>F +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @eY>?> u]>)T#Mi)ؾ3W>[.05/ù |@)*sd%M\NPd%q>A "+K J`^<JA\LPd%D\FP %;x/ˑJ8Y ".{'(Y  J KV18ee8N!.d%p"qY!+Ӊ˻JJ'+K˳ J.<%+ۈA T +#%PJ@5(D\@M(G\"(d%P@}(M\ Jq)(Jĥz$+Ό藬4^\ Jwq)(1J{ƥF"+AR?.%0*Y f\ J`lV d%0{RPKA FV&.%0'Y L缸d%0l\ JY Lx\ JY ˸[[{\ Jg/q)(^?xKA oYgVqwϪWMZR SF׬^K-L)yMp @F"+Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ \e(eO-)v^>Y @ @Vq꺮ȹRXK%R)QξӉ`xK%R7XV6jmJL)0”ZR ʭf7.`HK dCQr/- )v.Mpd%Y @@Y̴hD D]"= +OV +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%e]в,w@u*Y1Q2Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @VqlYUѬ\u(zd)3”ZR SjaJ-j^sY @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +J:eYϻZ..bHeO:JꓕJd%w@~}}+e]". +=x8 vD]"eMpZql*MjcߦϔZR SjaJ-L)yMp^jqifp|vDAV>%g;8.bHIҽ @V +t>L=KK%Rzٓd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ @V +XeK>{B;y?ZZK 77-3A 쓕KA ?˙ JJ]-/^Jq#%p~I\DPJq;A J @\HPYd%&.+yd%p qY&+ %p Y N\EPWE%p=Y \J\MPw %p/Y F\JY L\!(:d%P|@!ⲅj@9A T&+喠ꓕ@iRP@KA EVݘ'.%#Y tf@d%ХRP@ƈKA AV7.%0Y xd%0q)(QJ`@5RPcĥf +p}\ J`65q)(9J`:ťf&+IeRPJ`jRPY #(_@e(DP@M(APK\Jfq !+q T +3K^<"++Kz8$+ %p Y BPV#.J LPV&.J FPB\g@쑸d%p인Rd%Kr$8NVox~GVMl%.Y J%AɃZJg'+JKY |3Y J~I\[K'*#7Jd%Y @ @V +Jd%Y @ @V +Jd%Y @ UJ2%tEXtdate:create2012-10-24T09:28:02+02:00[6%tEXtdate:modify2012-10-24T09:27:48+02:00`IENDB`xboard-4.7.3/png/BlackGoldPawn.png0000644000175000001440000000362012262415351013665 00000000000000PNG  IHDR@@iqbKGDEIDATx{lS?HEy//$kBЄ"!!u`&[A[56m"X Ic]))0`G_8-b"0&'\<W Sd.Z`Ep?$*<x1̯slaنن)NT *@r&= ]lVKJxJHJJd2'ܦ6mm]tvvEwwN[kb#N_*/Td2zu ideF^),"**I;]45ASSVkNqہV%|1d$;;ur))cƵTT%%aFGihB]: K[6`q@8*گFu5\EEE1եlZuMP_»^ԩznr.^w]-))Ajkkʭ[E,wd/-TK|8LP`0Hyyr夈X޽OKrz8Yks䥗~ }}A~ٶJ eZ)Wf2eM[IZ[,vm9LPg+>y]BFܻwAΟ?vӟ㥤$o89Tta~px!Z2g˜p໨yr@gV-,[B"oiX]Qxh9`gqwR]%(8Z?Ҙ:IELOO&''3X 08w 34tWBur>&p ::w  jpb q :;Z{Z{|@scUtu2p8q8DDtvg9~X,6>Z8J4I\\ O<;JMM%aa&ZZ\t~F?P?::dH͛(($6vS^رp)} J͛mo28=_v"ёet+eϞZã26vAD,t6G]xNbb ?t8GN\rB).t;姨=KU3j7mf{nm~)BWP Pt{Q=V顁3P.6ARBŎJ2Zf{向@CZ%nW!Bq/IũIENDB`xboard-4.7.3/png/WhiteHawk.png0000644000175000001440000000600612262415351013111 00000000000000PNG  IHDR@@iqbKGD IDATx{pUهr;!7(D(,wP %@J+)b t2Ŋ(K (Z 0mHDn! $C !9ɹf:3s&39Z{]tE]"ܡ< 0`)pt" Yxv fgϞ=fAӥ^jUjE`VL'tE~v{DܹJ#GGV8v} ʱW*zk;_>:Am3$ٳSUP98N0 x$I댂9 lLؾ?hnnGe7VӕE;t~1 ب{ QIzt.;󈪪_%"gDEݟW{wTY:udsr__CLt,IL'*{TU TuTsd2Tlؐck ,,<_WZx<Ȑ!xzKwgdkiqj:P $Ł^:ztQ'U_HZOL' D]U-"3s snѣ'v#(t@Fmi__[ÆDP,jZ[_o緪xPg|JLH'.'F;vFOcO?w2+G),~6 e_ @ LSR10%̛ywÆݍ`+hs.RVv?iKvG4c?|^z<ҷ~Y^tk̝ +W&3qp?;0 A>1(Ϳ#88L2[ =X,A^˖NY&{v{P:|ZIPŵ }6''t}'ᄏ{?{3hPdY#GNI3|;r3uϞâ$IVj[dd8~s~GǏS\|M~=>| UYUU…)-`˖շ538qjŀ€|׎f,֬dɒ,_("{m0ԩs޴}G8T Np裃meժd$k, Ԗ/Lj#!L,^rsxTfΜ)~{q\cj0tާ`63mZ I>\LNH%"",wEn脇[3Z>;>>>NkX(/oiH޽IJGXXzdnwPQQ͑#'sF7o8}H@uJc ^ : Z,rXh )) [7g07g4-[^MsHHMcc3N;0\F`|.֮}+3X RS79r0 Lf׮OY lœ9H۶$iͧi\oVkvyr&w /FЦ(P JK\Mlh=h4Çrc)$oˀY xQwV|LFݫxɒ%shA3p` !..Q1ʲ 뼎7t&oL}Z7(.>C^Ŵ@vk̜9'Iۊfcb"?|7fPrr{rjm&0c,Klٲǣ>yklq? ((F ϑz3FR՛=vV8Zׯ~Xx3>h3yy} }CyPn}̀(3gM_̜9?jmKAAfƌ®]EO ^WZuuY#F T<7MM6%:S˗ŜIUU!wj[:D``n _N.?21AJIENDB`xboard-4.7.3/png/WhiteCanon.png0000644000175000001440000000357212262415351013262 00000000000000PNG  IHDR@@iqbKGD/IDATxkl`(. cxEB 0I(A\$#(N)-VQ2QmHEBrU~;uc6`TC 5 {fgwN,H]K]9Hcg{۳,Ĉ#F1bĈ#FpGA%_m@F@hrb n & dY_^.**ZII6i7 G.ZB@zаSlذLLBQ\$IzxXm?8W[!S |3JK()49t8>p O5GH---uicnn?Kyy eeբӐTuL}WI8ȲS%K^dYrߖ>Iee=UyFi?u(u@Ą3 "9ys4!'O^ Ԭi-**ω#$15YvHLLp-v#11wa=-KxP7>@oE\rX@^2Q۷PVVMIIeZORG9ЛЀWUUYkYK_;|LĂ{H4n+^u Dn׀.d`*1M ڵ9IHBЄ{ƅ -nfȲ,/ዤH x8O4͵0̌ٳ׭{U6QJ{xjj#<<|0sW/r͜yWjoþ}Gz˻\릇`hp#Fھ}\z5|Xl5r)M&>Nŋ=;yge5,_>7lV۞@{'0`rTU.|/3ӝjޔѶnwnw=ʕ#K`G|Yo(9ĕ+7}͛ ]Ƅ )9ݻ+L{x زIv4iG޽^vp|37oަlY/m?&՗-3`֔@bӦ>("tx?vq|>;w3~| ?\.@fѡSP!C⩭m^? 3f$bw-vv6Ai@\e6X 7ހ:; v4ddL$'% qF sz))ΞSO}? D<]k'Yj >,;ټy' ;QU?鋌gqa;&Q~ȈܽWVsb q}[PPvf_X%K6>sgF*߾.]Utĉsן}x=&g,\|D !Xno/ `޼L\A~Vz:ihh^XC)S&S+D͝'d]&OyOsomvfw ˷,5@Q @B08<r<=²ۑ"|Ç=J)a=Ӄ'7zsN,a:r*V&WTTW }:r+ef>(q]׿|X?~L)xvmf5Ǐ,}DeFcYv-7)`o?~KwYYdC$tǽ$>mcS{.7RSDi4%eT 2s[,%kk=O0? "UVh6#@ VŔ?Ι B8o"I26mڅg(;fYVVx“MYdsr2ܹ3{O45`ݺwf[MC 0esYg3+WgL&nhǺuڵo)4!JLRJrEӧR⊽q3E*DQz Gݭݿ@ Vsދ/ٯl1ţŋUx# Aynar @N(%{nt#Axx(n}"b1e .g.䵻 طoB q֛; _|B|4=yƌTzv~HJJ!uUIP7{!?p`NYEEtxWSق;7,[6m[eetѾҝE^fqoq٩ԩsmٲ0{tО5Μ,Ig(P;+ `$l˗Ep+?f\;{嗱`K'8٠(RJWʲܚoGD9)aժ:(n4p}5,+Qv{3K"? FhGJ"E͒$y8hx&dOBBl444ХŇSq7ߔcʔ%Ruu](JuYƬ ,**HcS4M/I4Mj!R%Ȋ3#GfJYj[iӞѝN@I"m6)iciEMP^~ŇP\|DWm'tRGMA~ٲO\ᣏb%aؿ[ױXL<9jŜ'`SIl@{Znc(%._Kz6fEdDDLt^֐CDc |ԩca{?~}WjTUڵF8N6:`A)jAHH""lGll$7 #cPXih!,֌7;yѫW0aCD 8~8 @Q(WPYY?55 b̘سDu=a=`$0R_F݅2ŠjYkiq<ƸkhXYfTTo$$܁dxM1 L|) S bc#pb1AxY-E MM-|*.\^*8AM&)à5 y? hX`2ueuJI+0"!l)4C0pҌ&VEZ-2]+ho933?+dև$ _!? qX,Yz\[ۀ#2ʚ+(w])2$yN/H]v@OK [,&]; è@؝u]B>?BSSĀQsΟEk;eWńxY[ۀ'ŶmΝJEQvu: ,[&4䱃چի嗷k‰fnR>,kLjrwxѯ(I7ߪ\g f~C[Z8w.9܂cNMlQu 楗-\8r f l-@FdzWcYvb=M=9yDqlN -E,d5 G|p0`[Gɿ$ԯ ?Ak@{Xd~Ç_=1+IENDB`xboard-4.7.3/png/BlackCrownedRook.png0000644000175000001440000000215512262415351014410 00000000000000PNG  IHDR@@iqbKGD"IDATx_h[U?IMU)M6ԂN n"cpl"t/ec*T hQكd VOA=(  &T'^Mׇӄ&ɽ=r??{ιg7oG߀\V` xX> ?A@L`WUGNDN`rB, | ,#A16J-bh*i1z'^/LN^/42>8?k )]1)3 _L.O!^gg_r20i%v8@(${wD+ Eil%K:0aubYcxHզ~qP(hFcoRskpK*dGE^-|Cyr<W;ddjZ |.ֿ⬲Z+^>g9}(irUT 2z!e[EggSS?ؒ ;JupUS]t1:}GYɓgdr7~)f8ܒWl R ofI&W 9Rd倛e6){ݵkדA2ѿs_Sr.cbheWY7 ?rPjT'G @uqPj^fo~5t=nUȲ47ػug`P(>I$~*З> >` VXH m,/ZN3_տAGeffn息Ɛnků ȶ"kˈ5!;Km;~ #ε;w &kZtwQۀO7\ moF݈}5r?XZJUpt}X,KؚKT QT֎W+j7c[3sd}(c;otppppP9LC~IENDB`xboard-4.7.3/png/BlackGoldLance.png0000644000175000001440000000433412262415351014005 00000000000000PNG  IHDR@@iqbKGDIDATxmP. AEPP˛5P$SjF:c6Li͘NhkͤSM8Sg$:#4El Va5采_؅e{9{{!  A[@"$!@V?@P FGUՀd;:/u(x&;q]@Q &7(OҞػO͈g&'5@-2e=҅2 ;K azF#fa,p78Pi۶NSS+-46hjjjOC @/: =@l!++ "Ѩ.V \zʯRQQKSSfGُV X [ǣѣ&>>'@||4PVv _ڵF_|9X (}yFRSͤ6-ٳӘ93).>ωp╡pu=XѡI(SMUh3g sN#7w146p${q8JwktO?:z)?>6$^&EɬYiw뤤=}t:ldٲg DR-a e_S9}kř3dggkN*HʻV9N4U]:x pEΜ&3{Gѐٳ0i^.T.v$%Ŋ^,YYYX %,,D5` P|뭟vL.wF֭D/6%Hz2P>anX(-$8XGNLxcKMN~mpRMOԩX#ӓp:]V5m l[B6H&""IN~,o0q47qf mttt:p{55z[vdgeرXƎ}nn`&ShAC:R]m핆߬|S@5]Wנ-((:jjꨭFK:zƍMDhMJ㤦YpfDZ ׯߤ JK+X.b;=g9wFb4ꉌCt8'Lzz"ii Ev ]ȑ2>p8<+(kFe =; 23SHM5KxOk2sBBd.'N р餪*|a*+z!u-ہ_B=d e,!//s8}ʯ|-7ر1~|&E;'3otc 5abfOط0n%E c1eJ;s礴{7K~S2jTjIĉQa*))yO::D".W\y͗hf7+y?O14))V>t[omHHAlѓ̝)Il(n]y"?3%@LPٺpHQ?ƈ$'Gm۷8%RP1{ď!#WU XƍYYO~dsԩY*"Y6 Ɛ/Eɤe.UI QE5yQ8PF&Pf㫸Q6S y(qua8A}kQVCF& FObv 5uz~^q%.+$e,`{lEY={.Cy [k/x1& 2{C H[45(Gd@w 5IENDB`xboard-4.7.3/png/xqwood.png0000644000175000001440000127566112262415351012557 00000000000000PNG  IHDRF{e pHYsHHFk> vpAg+3QIDATxۯ-vW˸kl!"+1V)y)<"E +H `)  '"g.s{U~磵5:wk1jTj[>ooAAyQ4Mu8$ln|>N# 4ϧ뚦뺮(b)ˢq f ֟!44똦z-˺niJ8ss&Md- 9.\Tߘ$]WW_q ,?Gwo#k^q"ˊm0I°iIw]7MEQ#W^#eٔ8v4-ϥ)<ˢտ? ˥ׯ_j{0lƱmniYʒv86M]_4}4y$yΝ+&!8ar~8m1ɲ$ɲ p}f]c|{8NTU_zu8|zs_MS׷[jAeM3Ma8MMSUCQ,1뵪}{zOzc0Vܵm~/ݮ,ot,(e0MQeyΈ1>w׶]7a$M٬V^1clhDZi׾n(8ǦJ08'#a8M0VeQQa8MàigYc2aEQz:a<0,ժj<NoWgEI|n6eM6뵪" m$q\nI0liq<4kt:aO?]7 mqex0[ ?_u5-$(ql[<%%eԶo,m{8 9fwUյkgrYov[g9ujVVY6MAжMS_>bt:,w;mo6`%[j۾o[a^W,??4}%u] CzΪxΏ0DQ?qYn6^隻n9:<˒y^0X׫=,gv[w;fxKúw)Pua80 ,&tR2Qd,iad5+gS{|@͂wnEqB X5'3MuݞrQe,Ԗ/Mu<9xc|~PaF4UU]0hW{Y@2ϖ%0$`mBi$ =lQbd"I@J}VOﳌ%5T{ CyaKiʼ0dLS1>̘mom;i( ۶Q$ndiYaZ$]7m+FY0KTQ~>?y5ۜ|м dY4y2sSz^:Z۪t,G ag4MwAϗ-m;}eX,1M82N`fםA`hۦVql$cH0sqkcf9m (mS,G<~0 CbWl2% G0I44M085C( m6Mef"y4Vo 6?Mq@9AiF0+3ɇ cНv]N}j!:I ,a8ʼnvRvŇGyە%.ڶz77ooc6,ˢ;|׽g,Nby?T?/>I(0wwrAeRЦy~}?R'3APޖĬq =G}m,drdyѸ N_'fV+{[N cEQͅ!&A?]G$˂Oq4>f7xh8eo7>|yk8ϟoUfA@(-`ygVM!hHe*.屴ek (ivl"|< ޝa2U\UMˑ!*ov{ܲV/*)MB ,ȜT/Ȋi9Cmyʟ F/L31A0#VP8)OZ>C[&g1QMs~m`̲ PHma_@QD84Ӥ\o6d(|g&|vl8dDZi.PHܶDN,d9> EQ̣a((l vX`8\?<}-uMNS }QLaHSey yFQ4riڶMm$]$UI45~eDشsq^0v86f=6h-OQ. b4!!x,cz8)`>x4+.l }d>r^ᓅA]s><0 UյO֨^la/f3l'Әa|*e3"-Z~~v˖s%)]eU=V5}]@3e9Qu?Yi:MLN+ui$ |q&l2ço[e%i"-hvS 4][44u]UAqY+f`}rlROpaI8n۾VL|acfE-dY6Àg2}-3$WDتT8 /\b.Cv C0+1 U(buHCjVT沮ڗ,! )ؐQ, .X.s~V:ݛw^v=$@Uͧ4}O*~^oiRiU9U">>+w|~~&b_NkaBz F Ee G]׵ܑ6 .&8-jTIMd:s׵"pFJ=9MqiB( qc]tð8 $fS.i$i׍#6e8[PeYnK@E"= s"掖X(ʲ( %0O J,ZHxѿ="uyPzGQx;Jk\fC|gwE_Ǔו_ߩ(\X`-͗p% ev8]m$~b,6d}c1WqבbNS`N~U`==DpZ^UOH=~Ty;m"3̯ [خKe!Զ>/! Fu*s=fAOϯ<ŇSquPoy 02ܗߎ.}ZeYQ8\zJ8?Ԭg|c4C7 ucW#sTVi:2ҕ/+RKvի(0wn æ!4Pii2^Re?Tx s2 QD:2,$k|t:C]mk X[=ˢvy2w]n|h!44 6IUїeQTa(uyN@YU4(p0, &?M- p5֢۵|ob+ ʆy.ԗ-al&Oy:[Q|p$>ح`)SH{ cg21WS|UP+yR&\h9B-{e8Y$Q$Nv}p8,bًMM:OHlp]W Oa!KTց0>|wE5V. 8ATգ ?GhY%>//у54Y3fQg(k#uir0x( o+%dgI>뒤m 82;qI@ \}Cz*p]E٨q ēR'nUnsYVVԘ3kjL=3ڐj[?)8U122 I<`㘦_nb4,ld?x?(2G`4x'ϒƱ8T~bƩi %LkR--hd&, [vd(_ J' MsϷ-=8!|᷐[ A4|#KϔL}Wm}fNnf~4yS=_? DYG,AE&\Oa-W ]s' lUc^χŞ{82ٹaاYC]"ϕS6{1UXVUl&NO(7mW䩖~̗2yUO{ ڷ"[uxfc#gW;.`<Ɇ4k3xއ gCC_\aOsx/͕g{*%0lt$Xlh%a$C$,|$/-,%ocIȽn!O$) 8KV ؼR: 4|Q?-dl y#PjuaV J7&D-),QZA$IiOǓe8'/NQ~|I dy2%_%8:X12|eYCGl,f-GUec bj[F&vihdOu(8?,۝C_(c ZtJVj͢J_U#1xjI"T;Wř9tI w|NV=cؼk~ȎWUW"ۭ=3[t9Uuj0W (`I) iTԷ ]vO'#H: }H C>Kp)~YmD'hPU`%kr^yoL,Qhm3ccsﵐlCA4oMVb4S;@g[K\i^Y7z~WSVZV=(mgGN'E2U P7\) q,V kY֝^_&IG\?W(j{u hNel偹A#g;l+Yr\ն0ji4oU(ʤ̃Xyϋy]ryOOa0ػ L4z")(sy`?ϼdS{wͯ1{o'\֏1ϟY:e/s VmSXe ai|~edCmvahΎk%\N{y/:]JwjۃLdʀaX&*fnE-kA@Hr1OSsڬw1W/w<+,   /dPhi^/^f/ӟ~||8Te[_꽶,i5vPN^eļq@b(K~-;;o?&:big%9nY[f(Vý$݊>hfVNmO M!}mmɝIfg#]=,b\&юikKxı* ;_C}'/< }4AnphYakUae4slWX7M3曍Y0q4M?_3wFS}Mv٬VqI-B&I6n!˓QnU=m(&vc֝e+j ÐEZ!l_ZMS~i$jri۰0 U;?yvOa}Q$jd$ Wntz߾"*&뚆y-1–#d"g!|v{Yt&u})O]Bq 8b33$I(6>=u=MQ4 MuЉ(mıkM8[juN?v_S,cFw 2c̸ḏ8NFn +JW~N9MCGucTF|v뺮#eO4]|>*M4۶n7sk /y2ài$I&IVz:nIa$)1ZnC ImUqEg6w)`]SQA%,\Zul}8wIJ{ɼ=%IfOkVv|TUQ귅R'7MU1Uu:].uͷ†,fFcQE?L$ˊb]w6)P @Q%In^B>@! vkgPMӶfl6<|UQzYEl,ITyhW+Wp xKnLS>=p8a$ía8xz^U) HaPfKPp9cUU׷O¶rvW|𼬛rfCDqNj߯כڞ4MUQ(~ڶ(M˒1u27or9HGYnNOO?q0( emJe9MpO3랟WEh@u`Qej 3t01 vo|qdJi:qEfSV+r?.,SME{x k)K<ps 7>÷%Rx:MMQЍyNyV0p}'{#^6MN$6Iv\$2Wzږ7M;}7blқzBnURד_>d0atB5,² R"$.$ {pc{ˬW_22'w۝YDVD窾A)n+zE-Su4E,Ůܥ(|}kW8ϧSgebi'C2 \qG}Ԗ)۫A.XrٚLrn{4_@\a4X&KflXM<˲LS=Aum[vsz&G(s~tR=.IV+r7:}VZ8EM*&޾!2P(@83,p"/x@G~ffS\aJ+YNwV9ib.ȢQ% }Br0XF ?:iȢ&l\ek #3OB? o~ǧSbfbӄ4yX!@B˧h0^ @zRZU].҂5g*Ѐ!-\ӑ0d2)z/8)ˢy/$YX'@ @vdð(V+yoe{24 )YG0YQ+&ٚX]2OlXH`ZݴYA\RZj=~Ubx 4T:!R*mTCbǃp`-JaK]4ּfw)q6$ltz I= AUzO{5]tֶ(appYZE=_D CO?{I}ܴ=T}^cK6?1戄y8R&ۻ++ES8Mu]p!v̑g{#rwQ5'M))guj񐞬ݘ+?)XXι=[A[z]">uY'XεsA_臵BAe8['m1R:yoo*[h[ qsI$!ۆj!$Kj5FL2pxxq .Aw3d~ _{yL Ta C3g9o_UlN&RNFzmQ[r ߬p Q|,ʾ9PnffOP1Aay^9 6﵄qH@XJKr퉶:b2&u?t`O}?MjӱJ'|' y%* .R*aZYuܟR$@^qq_eY-Ia0.qٖyI\xY WOʾ˅)gu3؛\ZzrsȁⳤTeT?9J+VFݯagDdӌc2{xKgx*zH8\0I{ݚyn %SAs> v$4>0I 0: J~LӾǺ9\X=_fHƔA*űm B!Z[°ilMV;L^ĿHJU%Y=<}/l ғ cI6 Gl6Z-YPoOߒkߧiLJhHzi,<e3sXqm6M8y9:'-7:t=qdFd)%`fO{#9i)F*QqHLs C6 yNڶ 7( =Zq?_㘥2жEy^gyw :0Eߧ wo!Đi^i!q,%La_{Pvf8!stQRc&GE//{rE6_D)xtmrw݇Uu~]Cy?8}Ua^cQErfbZȩ/aUv1*@quK4hvcQ郠mBݴOa kt. 09.ЅI?β8lء.[ʖy m/F \}U}lzWCaHe C0[~l?/58^.`ʶv X\I Ox䮫x|~6 5~l:J*XIg pAe^Zc+0aZpȲ0RhӡiYb0{j0q91I "h6AF)csMo/n2kw>ݍah[*˚ ;[x$ع:!mm;)1 {RxJ=kCp=B(OU'H:1=KhO~"`݌qzv{vm.i(u_.?{t[S,5I}* $|| ̫{;ї(5`+L2|sFLe:I\3VܹzkZHY&u?XƜtK0X#XB RB]޷e"ϓdD@>(L6Fk"Tœ Jc^Ei^Rf*=nI)cb35IbW_P)6]13h.T? ϻIvsc^_.r=5ʡ~$y=7=s͋QLN 8fjN]v;9~ڼ6,k1)¥i xp_e=k8^ZDT5(l\__" yxGRLK,wg+reYjob]WQt8U뉗!u4*oJZ~dБ,w`CD .OgWy?dqy6AXNTM&]Xv/@°,Eٔ%rAnT? m^ [`IzndA ݆( nvi=?c6a*v}pON'8$6o{|4}Ʀ:Q S~^R m[e^xV8RUui8!Xf8z>njeI(>}Çׯ_B(,s C#xÇ͛j\8NSY=ye5 7ذ_HG'9DnE0TIBƙ,GNdx|߽CyA(; fs>f߯V\-j+Z /1C2inqƽ,vq[ta zV4Mq\aaH\oVFݙ"0 V 宻ȃc06è$J 'PKq 3M@yK|;gMlp4.$xfS]WuMjuu-(0ۍ}OyWg)qQua8 tGWzEtG~%" 6(VQxzW$ci\-(,˲ݎLr>_UX<8kDQv^h6]ӝUӴee4*!ƳۭVQ#UuUB0jgh PW$ D`Ra>/RA(qTN c-ٟBjp(Pz\nDЊ⫪m `Dp`O/i-QK qH~]ʎ 1ۥ?I'ʅX ﮓ҉VGW \$ A{ ɗ6 -[^ ;]}V(6|#O9JE!Z+JS2790c#W`g#M&`a({9,w;2=aXAݒPKMN f #YFb2kߑ^%;9mџ8-)\֨gl|fN4% UݶQ$2/,oR˄JM$ }R0V-\ Ȏmz~dtQPOm~hNTy}M's4Ʃɏlt)G,KC؃`-$iΘyzӔloW!z1yNi{_3 ʬ֔eѥctcBE 3Decn?Vfyi)p<ʏGR:zchYjJ>#qXa7RD /4 !S@CgQO_aV"(C߿z%F/ujqLXB(YDs"#ېMht;Գ8;!%vI;nMDhHw3yb=v'vAr)|֜amIS';(̉6ƲdVkV-Yjܩ*xmoMe)9t8=,̈lꚒ泧UB\+|AΓ4Ͱȿ%hzuܫ Ͻ7iTTs0DW/FꟂT|b#)EMӐxl#30A:ݯlr .O1VX'tggk nkxJS{f(oبW/T_w@g l2Ji.Zj{1ɒA2Au "Fn$Q[{MS׻~9YR@|/گo?i^nZK|>N7ӧfHLO^C1 #^t:=?=|Uu8},}>;x2;;߿{7|Sw8 w=Ϳ^ͿU=?w],/ p/( lL,BWJԵ2 :Xȃ҅.,40M}.)6ox!cP?qhws7@/Y&Bl`{Z.w *8U'n7QBv:B'fw1okf(ÇW"K,[ğsn޿0?=`UZǞF 9?0ڔwO⪶>USrxmP/UEC5 q܌H*[CmIc? ܒ ‡璔l`GC㯐 {r) .˾N1qC %M3ڝΉV+?>˱@l$tF~aq4O:]1yѵ "a@\IFcWO!S&T)PW]&Tfcp95e*?"aؔ)Hʉh>HIm"v0wzy7:XIF8Eitـ+˅%{-EA BAbr%v.U',4{+c~%R + \S'B>eI/%N~n&~;/rf^AZdԾ#4]s3޽m̸KM%KbQP-sAz";.y͆>MسW% s%&L$p86鑙!Dr kQKj6V3oo> ZKhOuX#تWbpM,Q|oYy>o7Yy6>e\ks{eUkamr,@KlƉ"spQG%86ƫPRU:xn'-=^fbǒp1V5?H0qT/jó=4 ᐂ 5cyBX\DZ9pZO ~4A_I9{{ 4^oieN45_rFoq>fC<ݶM9-ţsZEV.{z,z<ˆW,?6岿fMc=e! C']Y|FMo|p9$&xkBFu5rdY'+ 0򔼳,kOldI.4E"0t|wݗhHb+kr6G0(eg L|KGhXGB'R3-Iج5.=f^5 ?褅?YV纃/?G.ŵ9znE%'wjɹ^oZvz HPY( 4jAKjej͛ H΀l2(#*"E}KAs7Rb7)K)Y$]ܜh§i'NOy^,>䳞C2 }/b]?V/m$@5Mh(&,&b~$7dVfT1$–Es{RHhN$sUEryq(Q ".t]3}hŀ 1sd٥Y3X> Ժj ^DfMKT/xYIn[yjF-Ğ34a0Ay;*itdd,agUNOOAPۭvp4V|(5g Ɉrնx=k؁m$1J m[U-[[, Cض-bfR@9M |/663|mi"t41QC+Sʼ>;=~.Z5PX)xZ2K8yy!-=d@^jͣ%g9yB9Iۚggy B̢P,l\D7)˩rVzB؝._PIKH!!%mh(Plj"n%623ߘUU[\<(ܫ?P3)Hۺgzi82 Ϲ4kD#-4M`bZo)=#AFF@)SC4S,|5, ? *{*tb YTg7l3_ڨ )uaHSA |ƽ(ʒk/GDZNl1 8l&*$, ?=G4Sp_T=>ˆyroY.sYiEsG|CY[١6|ey8,S8a\?=;Ooj d+K1}fY%4' D3ЏsdY$s$狯׏x}y+?Վ.hQHjO͛7iz:m&+qâ煮-O0 ׫(.5$Eq8|` ^#\QQ`LVRh_k3:(2J`j~q@LƱr{ov}OWXUð٨) f}Qe <<,c~ЯV> h)n]kh+9,O ^gC; {##|s"0ILғ2BO*Ɔ@8벌f\B\u l,O" 42g$ S‚ =iG&y3" +8Pe˲(v$ ܠVۣٔe:1IR_+%rvUYhaҎ4 @8zg{o~a۞`Cfq_5)U/53Cl>N9Kk>; %=IAދJbLsx|~.K{NsP4}˶GXib?|a$ Y꠼=6 XwEəDFP밆2Zj{EۭyVqXRA\.5apTUYn6y~~~W"4F߈=LQWPg&&aξm>& w5)ׯrywWj-K`$Mi{EwRi\i_RG;—02{f,ĮKAGYew.^^})a'v^f K %{P_/Py)^yqPc;Zd|}5 .}/p=|fwy-34YE,M.[*=ڗD^*Z "ҳH.(I% TAkK2=׼Tq]~(Xk142p~1&gyNq$]׶IBS r9)YMLedJIj|#-/BGoQwݣ-%~`FjAu*V{tN?s_/=K0x˴"|@9GRM؏KsWtFq/1Q0l$_I lco0%vO[+\8C{au>YF~l"ˑcMqA3nNYQb?wS Gyz,ƗpZw<*,~C?Kc[EHΕFC<<}cFy(3|6?d4M]G8Σ~F9BVG0\KK%_ֲƣmVf"}D8lpR tʔ{|{hƫ*͛v3 ,?뼓7IP.AΆv:U{GM馹\fOwrfEXw"pT+dCSiR_!&Xqȍ#ywޑͧ'c姺&ciǓߨ=T3pIJ#$hߧ)~: _ :{wt Qc9SeWkh`w=POG-zp44Qk0}oe\2\ˎQLӺ}ٺVo(O<_<UːeN;d+}Gḛ̇ X_Y%Goo0[b=uQWI@|`[HIӨHT5AVrlVP!w$AQz]Oa(yf]}v;EQ/*Z~y4qݳj`d\@V uO]}iɚpZLx eM}fβ'f h xQ0p-!ezݟn{(C|R>*uMuKQ Yql,1W0R}_+۽ʺ/s Cם糗ZXrݾp4+šĥ@Nsߠo7E2_jxKwgg8lճoQ\İE/w!04L$@-mQ71TNk\-mf:!?+l7eHCI6_Qn$sPNx;#}_QL ps)"+F5&U5\{񟭪˅neyz~Q:Dn%wr>L؇p Yv2nu[S^PyyB"O,|:yuu}똺k{,ENnK6M.% ENzYA,/M NPu Q$MxzI%h2.8(+Lj K=& byݳw. %&Y"Xੈ|-(ٽxjH p˿z!M}{eY*Ȏ0!Οu>a7$f ߨs07R I6(=r6yּxm[MS|{F6MuzJAN%]gy,,Cιiv-۪dgweOZX$ijj=~_>V;\3!*-Kfd/ڼWFU^ {H|)HYv6YJb_NWzii|z.-eu5 2sDq{Gd2 q<&ޘ+ VU]S(;yF| A6мiQ:!i}+\'eE vʕ?Գ%pɔTr$7v>WrcL+\ qrH(SϺS!@w\0~N״vَG,u VUUUK~\E䯿 qOnk&a:q8{̱AǑ6j4 >u8~{4MSUvg^4izLxC |_e]}? Mc@\,s)<0TH}Ҩ nW^F{m'ǩ /=f1\ς4u}*Yׂ6%IKY ~$lRyلaױIdcp<~|o N9iZeZ_ iJ}S]ϑPjSC0 -5b-Ig+ ۶,tJ$nU-\qn=f9Z/9Bߒ5U08:-VRDڎ}/ wxH},nē|IMǗk8䍀Wx(_<1;aw~e'~myà6 Wk[DwYYrg<;^ji  pO; i(X0=/'>C[GB|olײՁEΣ9ʠPVՆMBAm$OTK&Ġ<~(ݿ.oKtdS,_7&Y{mУ99\5G  dܿ! V1=\?[$Q@W RH+m@VW-]WG]/%o_ڶHWkqYI¿ky~w5O8;cvFS2${nM40P@p| ʻR5ze@.e[49SP0 OI#}-iuG}yS;x4jj@Fp@}00^qgD.QC۩f! 72mY:D z53l@lYԟrEQQܣhd-* tj'/i"(7pX1Pj{UafYxtEXx˽&WeWH*x,ka__ B%2T/ fYh(Raӡfl <( PmNmzK1Yv$Qe}\O: ښץg0uWsZ'ŤAkaZq^IܟQ CnV,pXzU+U;/hBL*,D ]'Dqx4=iEQvH}I>*' ?@:(TL=KHb}BT" $Q 5N#+OuPi<8&I]\Нznl&Au!MjoYTx][4 k=: rp8~VckG;ue1 z+iX>|t/d_ݮVl3ؐյPGDI]>O>$u|Yn6Z, 2*وd p0ey8ו;I^֍3Q]W׌?k 7"5x,]M \Zy)I3Y>w>iPhv=}9%aW>>i#lߕͅ4\ՒzZCYm6yo9oɺ\~g.fk~6DEoeIC46Nz8JO]U#B$&P1T'ѐ`;y+,Z=-Xɀ\Щ f"kub[C},&m$8=vRsa,3yC^PmQPMLGm=q5|>c^m,* #JcV;r&^C 7l\Qp}$ey-X'DޕYfّ0,(W8zBf=Ь¥كx4 ZdvAA r!o+m7H(%93@Q)RA*"}_]7MYjp~S׽)-k22E򚞹(}O /OnXVU-; ]1 VS9hmq|ZEY^)| !tBTa5wls<?^ue1M .ߴC>L7MGs!uZY&!"u|nĜ*Lُ1wfb9-@D(~i4MSq5"@:fG3z9jm˩uRtUI$U4S% }kQ}Qwnz #䫯l^Q`QU@1&MH8n8NjpriM<ϟQ@;8M!.oxJDk d(TSUAL%jټ{qĘ1̂EEmEfz!t몒^vn_z; lǏ~px&Moky<=G>Xbf.Gi2+Y?\9aAe=78MP^g)r5$ տя~w__{?G?}go_^u( CO?? r,,ITD+ۧOs#9D>=}wPѓLŘ6ϟ?_185_.?sjz3=aYFVLx(rIR 9z~Vp!6p4"nz~>z֡8ݎKEQ=i|y'jI.ReY94],+S5c vOH9v%"c3wu]Gp(v dlG~Yv#ׯ߽Ӝƒٌ~A&C5 uɜDS),wI3/%XG(\d??*~.|to)oߚrtӜNoG?B%;Q s\f>==nݮVQTQ]??py^}_MXɡ@JӹP(JA\1D 4xɺonh!ϋ5uu>bBd%tz~ox|~GQ%gX*1eB HnCEۭb$Z-3t7".TʒQ]pcC BHӧモ+˲$&~t=y$H?Q)a(KZ&8,K|Ғ 9 48gU k":jEfn5 n02I)_6Wm),;m[*̛\Hޗ7G>'(Qd~D1B0`-5g}a~t}TXRKP׳}4 F3-I[^~.S/tAHprCF@/_VQT^e r꠼YsM;{OX%HySu9)<#;=qSnc@8hsr *v5o/B@&Ħz `L N?jb ]hxvG>"FO3 C[4&/ğul>w=羡MǜDsvA ?rAp!~vOX,|ƒh {u%V(?~ ReƞI<{o-+'˚$R(ԵLkBݒjP5_r"'WY;?~ZryO6ͺy$*`rZ"ϣx`GE44%bƼϼ|5PdphAKmz48n8 cӄoPQ;Mlf*K6II}5 ida. g|M*2;}PZ*WPZ')Ixa;di$eͮIDAT49X xUA ]r)7xe#4q0׵$2;ú&-iӫW޻wg yErc]C{Xx~)) i$Sa^K&`> $K5USiEr_M)d6s3 `N :s*B掮iSrm 02geߨQLSY ZRmKxҳيcםNpJŇV8gS (n(E,Zm5[c9"c*,Sv?}Zꚕt&mL {#!uۂT02_ Җ紒Dђ(v5Mh y7䏨F%;YJnK +ySjP:cJ͟1jƺu% > ni\Uۭ6M=.B%|+_灚U|LDۦ|nvKdCo(ί~]5j7x,VAx%GUy0Kv^/?Q݅b (Vy@) 5MY1B("x7ˁ2vvC!+;@날iD<čA$9ĺ>n76rܑ &r+-՞'o/o!lOsFHrMA۫e4M}t$mS|*a9 ho굒-V|>Dds"ʉTDقNV0L9l. [ ϰiMC]9Vz; Cjb"ma^%9H(8Th#) ?u,p^)1y~8I^[=2y&pqG|_넒siQaYEZUe7|4?441 j pٗ %x ɦi[M,0>'/E( iYeEl OϓeTnᢐ&2"jID wJ;oak_UwE#{\/zZ[IV~ܕL>g7`Ptzzfz va8r)K|^\K+@ w}8iyaީ VALSXPbcLZ aye}8|J-=ůqTyve[:-DJ&(,e{AU7ČVR.3+H̩hsִ/[ť1Ù}30$i |)U6`-()raq$4a{Y&^nCeEѶ]w:tr<>=mk=Bւ`sTUB(~=~em >[YPF99c~Mԧ:G_9#ܘy#S&k!qۙN 5cc<ϯPc 1 hOO'QS,''F鋶ܯ4!NEg:J@;μ|բ.C(V+µi* t4de) n~Tgc&oiv}`7aS@}-`EhyL/l)~ۭ!| klCMГ\t`j@:7J S4H(RV< s,(el!lIцsi Z~BA4/~O$+1c`K0dĹWxEWr9斧|I1y~ܓjjHC wXiy|oh鷅/A_:l,ޭ%ҁۜ-*R̟ 1yR(8kP 'XLPcQ߿l1wc+2 '<ƕ Bn|7@yF,%`, =3VMՀ5KXCd)O_S$mjKIց<#XAm[,say`OnKjQg}:KOmK^BCz{韎,O?uY^o? 2\[b9*)2aM3XPx˿2炥D[~LIjP+0͏ge4-{<묿*/A+  ocSBI(C8.[MD%3ai!oN @lςr*ŷqѱKZw"B!"WȦe{V}N6M?aalz{NK[ĩeoZE(!+@,M?IRiJ{>\G~B;̫BEQg`zH*ˠOIAmOs8ss<{GSٓp+zn\X@I,jY0霚^ǻHeϞ3ޱ$7Nz3ҩ 5,])esfȎ%tSZԫ&: XQsW|)ϒ2saiADgjD̔N5妷N3?} e|t4NFZ;K @ 52MV!fsy6y{isSqS^\lUF2C͛'8O?S5+ltq}kN b#V,k[*MyBHiJ@p RlC|9u{OflWrF0»vK 66aYmه5 u-~tmwv$-_NWɴm+hBYXf(.o\7Y4wX QlfEN@D(l~,4#E&wwŴZuj{V&'TW C2-U({l6Rͦ^9śT#jEjE|:$Sub6Kzu=^A[>'mgpAS8zDH5,j@ K5"{kj\K<$IU].m9w= gfжo??c<+UVQa'MMPMPÀԜ6VZuAϸfCPTioƚ)\TX9^uϖvCym}U, öMS! A'4 5|nۺ @Ω?J4 Λ ]"y?Ij~:(01~[SzTw;iN!}ۊ|x~H@Q좳EqNЦpώcӜN"9,;n7F+<+)4#chwAVU?Ɩ]=Zo u]"KYM8*IHNnYb0ZjJz>9AFd 8Q5qV;qy2j)s^tDjݮ[]4]&hV׀}a/s4,2G0|EiCU-[@X <Β}L=JݤQPV}n zE2+K.=10k)A'QvwVDϮ;#a&(\181RY0,}&䤮W-iXR; 2|>W(( Iks E@{ֺ“X[j6EMPJI] 3Dv@|@QV>w%ryEYJ\&q@ـy]栵=8x"t|xG?"sB:  $ bs%!?_ w~C{RA, S0XrK> I,E1M *p}{?Ǐ,aV}sřgj*@ W R}#mo$dMl6~="I1vV:09}>((H"VxK8fvZyD٤&NllDlWޚ-xjLVMs<& i#8OKsV`i6Ȑzi CCgPVfsvI$e=ɲ ^8dXOMiXk(4#5Ɋ9Ov; Jۆ#Kc],K` q\]w:B޾}f4-K4r|fWz:IڅFAޓ"ڠ1[BP4~^[q>RPk} pޱ%%.4yl}%d݋q,OV$ӿ\Bv`]r,{ t YGԗNlF@2wc˳{j{N̢날mWիi:aIeY:?"vBzM(k]gӿ4qp|Aa@%y4% >ڦH d[}ھ2SZP6Vam ՠ,##sIbW)5 ±o2Jִ6)ʅ^[8\+Ibž9"CpI^"(ovmmY'ˮ0|~7o߇}g8lԻDdkG3;2 z{#w;Ysbh~Y7E@7Ჷ0"zz2J |^G" }zzr(}1E0@ӣqް+Q/u=ڄdI0YU4y a{E1T@rV'6%,H $ $IӲ,KI OA( dY3xzkOJ,)c|&`1iku6W+qK,5o$w. qq hVa@N柕  WuՐJBu+B3g (Ů(PCA#t[zr'a=,gv߾Ԁ2HٱD@sv^OЯl}1Y!G$OUA$D<i/_ň1~4eE'k^?D;ȡ?(9ݫB,Mұ$lsmN:u/`[(Vx{Cr% TOV^B7#][<ϴ3Wu6uX7|/qed.y8#i=O?=Ʒ`'/uNu߫?_*9M 3ev!Y0I2 a}rrb" X}ݝ6|{e͎_ZY~_`n^y(GW>,X߻)}Y^TȉccP~idaK7y_^Z5Hi%mۘYtbD׿1Z|`4,[{| "f#|uA6˦d߽:6`U+5;Ǔ$&P3eq,s4xfYm,xQXe/<{,s:Ѽ6YuUltf}WJd!y£LUTZ6^~m9 #ю4UUAq>8bvpcO]x4q푼!6N:]kn$~Oӷ~7߼yC!C}y <)AaX~nԓRIGNgELjRlϟw;U'4l*/؎ D`RwnѲmUUœ"7ea\hKax<6 PW̗B2f7hc\ SnaG1>ljci"v:==~ׇ,6]?>=UUGCYjY8f%^ի~J>j+eq]C E;<\vn۶ ccD_uN&4MU6ת"<+e 4!LW_aCJM?c^VцÀdC9#eZt>c4l%!?w8t\n&yW$_4zJβ|#-3=#rգZ)K{z6so*4eVx>q CaiK\U4̻h7V,ӆM!IؑK=C`5Zl 4<'rp♢Ӕj)˲) b1U&I mAAfi?MU% "3/1 fzƧ]߯5njUc4@),97W:yPO̞QDv;W@"cx|zz^Ap>s^U5$m*yiu ÖT.QxbzڶigqPé˅W;O/VB?9'*#M$uUdM90, aC^Q}x S3@]g/hr_iR ]}ʶ|fd=s02Jڣ|JE<48De2I(@ I]L˟AHFXd^a)SN\v6d.4No !3R^ ؁L!A#(953J)` cz*1$xjq}ڒVֻꏡWI6KY3!& 1?Gׯ(3l|[j>7)qCǏlO ہ}eǾG\OSlK?A鿅Wx|͛wGc7h?8{.(ϋc_w9lqUe#ehFgj 1&͗7!W@gkܟNEOڼ(_U)R>/ah[MEAp>=V>|r~Xco*ГDɨW<+IbYͻ/[h] 4n7nk >둤8d/K`r[;a` C}DQ]!) 8 HQ@qj>|^hEQU`E+od>fxf'x̚Uu_\PVQȤ|(n%MkJ2*#B](i]ZI>gx8?E`\i|fG$hv:0ӧU(M=&YR)$ds ]z) }gT,;/.'=.= ϥC~[z^F\<;B8 dbsz$ q8r~YIy`!Kgd2sJ Ozɭn9_RUU?T/0ŨU^>)x|z[D4I`s}ou8hSh$%7[뿎okr[|{FW'vQnp(8I޾V4"ıB_+"zLiDv5I2V`$jbX>d )ӱ|b!x\ /gldVg#9i~GZs5n?^2? GLij[O]9'UG Tb{?$ђwWW8Sx/Gx~$/71F-%VlQJ{ĭ,a5wK!£sؒC[-6Jrn^MZeIO^`9^Wy#ʜ!R|`xA+#ΑF;/%93 D(/¯ԗ-k1BT0?>Kp ! M|V`vKm󜻲NI=Glj}͉y&oh u]|92JȜZa"]RG]7 swͫr{fiVSu0nxVOݗZ%i[iC%, KyN+x'E. zE-/ P|qg+s|/K{i"n;IwyR<Zd9sZ(|Ɔ0jt Kw~7˶ǧ'O=/EdYZwmUY)%K`z߇0]qC *75~˿W ,}m( Cje,@ ~Eꕧ1xueAE oH2Ux7PW|kx`]lcU].L,:ݿSUYS<٠4kˇx"[_>^bAwci^F7Ī"H{:aXB +>O``UY#2GA~WGrkǗaʮYu]Ć㟦i:_ͧi@5s(lCoԕ$"Fk<y8s!P<' jܰEׁWr_n@昦5(E/a9سc-tWMSUz*3A L|WRũ/.$n$݆A C-[؄)0#'4sL|*K#h=BB?H+zۇWOJ&J_WuΪ8 iZUVU]8 q^q(c9JE?o\ 1}a\LR67 Bp8^.(>=sKeʬ>f=/!Y/ zQMsB1lǻ}@KR ,o$<߿ɋ2m f#:{]<95,m W?J Woq1m*"^myE'@zLVBpeD( vEYJe[9_{w8l6o|͒a_,;M]$uwY>~8y$,]H<q n'#ɆMtL\?Ăx_Qd)#X_("^Yu,~L*6>nҔ$&ٰE_9σW%ʑg~& hmv*J K3Lse^o6WIyi<HTڿl}ۭIx}CCDr-{K^ej9R,s0iN-  {fس^o0]b!io6=|}YgbJ6 ԀmGs#O 9c]i=qz׍#%2*#`eL'qɯ3V6:QQ[p6 ܹf>293|ww?#}cEt<̖W%Dҕw,xQz]HJgp ^zHO8eaXh0Ţ^`kǬql[)PP>~u L V=,yvU\Qh&2PU 9MAϲT3 &\p]ʆRR^T$4ėKCB;~^"s=dža2_yPwDvzE$QaH^`~ȹ#phqTy|r>ƨ!MGGg%a WO׶؛Rz8>Oܿ\Gp>U?R}1$ضIBUh$mDҸj[l},zdaZ{.2ͲY5~qmg NCuoW{e:}4 Jyi/K]0#l*'j+ lڠնGGlN &5{ڠ{_G*0 w Bej䙅A0)O)A"$`U;FR<So!Tl!LY7VxB{KK e9g5MQg7kct`7jdhKgsb|y4,ԽaӰb?Lt%mQMy>MiS52F?$A %X(97+-){~#9l l@ozմ&$m[U,Ӊ~j!ҳ_Cz77Esf)0ݪ~); Eg=Le0hru.oxW_Ui@WE5g0yМROO߿{ջw~<ӻwëW8*˛D hД٤iYhE$P2\&_e ,QE 8b!ʗtl$RI\rj|P7DZlRBte%^ ީ_4:4e6禑/OԊmR-M$G_ ??Ҵ,&,zyz9x8E`x^AQ̗%ܶ]^Ǐ}'+)σ˪"S2Ჺq튂@ah]W4`h F S#IFna`h4Yfb|Jq0|?QaƭVe@6M|t5 Z2,sbjJM}qUej% 4It' ><ߕ*}Z(h4l*i"G^U6p0C8u'J%랟Y4պ1*zvG2`%kkԶu4Htlu4\믿Wdr %2MDt曟wm/Oox(}֤q<*V"ZͥSRӤDT" ,& 0^1(7klĜQj .\x:Ǭ*z2⧩ӜǺɴ߃?ǠCJƙJiL&6rsߏcQ QaªXM ?Ό@oiN(o'Iu&~OlPPͦG;Z<ښ3KяJh;s*7>okWr>=Ug$LU_ham>?Ϸ[yc`Q8߿[_Hv;BiGښ܈JgYD}s>NOyISA]l7LSQ5ũ%U,7n>hf:*%8ץݶ֖Q*lMӶ4ipȮU~8zjEжf^{zȍVRR=j&9ZJȬkKF%IQ-PMn׫( w,C vgJOztXzUTy4pPu}:N}iz:}]By]_.?Wջw7hVBg߿Y<2OT;ax:1ȗ8>?NfEUe ?dbk@u(}IM& ,P=07ZNFP8M% *zP<aۧOv4v-xR͛(}jmjm;?~|EQGኙ Q ?,긷OQ_ԟKſ;.@!ӴݮVI"[$;\|ݷgx5̢HS1v"U]/A8<{ar>n]gAū(* gm$@J?Y$OlsĪ\=x\$Uz8j%/ U ~(zw?>N7o~]۷_Vt/J z==q}үZrzLJC?=||{>?=}pZRSl - t%J @Ą\!MS_rx/x^xRǏҹo'> =WsMIXu04]$<:#G eZ":Iʲ,+q<Ƕ ,ݎw |78Not]Qxpxni:  XEaWzW6;ȉWa8xw;r,\.J V-RyxTliī°Lx~\7(cQ+Ko/(uI"D%pv9h<1Me?}̑˶=RaT Cloްj|L%M Ibݬa_ Ψϲ&4]Sּ'O)ϿDZJrlIኾ;75$i-D)ơ>ύR CXPH`1(x 8|?sw-DM|\]UcmAapeiuu8d}?nǒhuY7  c}0*$.9TקL4֊fDX8mQqhhLS}ݎyg5q [q,4@`mD[H>X A ui/1zdu8n6 qy~6PoEc"c|AWPD#+[8^'Dzभu*!,Qr XKB$!44/wلd }=٫FY5/k:ϯJK3+?JTDh:8!~:,w,V1̙:'} 4Mbⴭѣ%6?F޶cIB;.DA f3t 3!!$y$q]? zy'Tm{|/B i*b* {-6| :Mm;t2XD%vKkF9b]G-~v;/xs4 g["$0psO#gԦE\/]]>?JDKO#^ Z o4#IJE9U{_G]#p{.ď5EYcI;:⩈~)Pǝx`^f|03,Gޮ"n,D>8'eJb[c }^@A#&/ z-=!,⁉l4ZDEț4,e* Jf@ܪ}'*ߑq"}gNci }y¤L zG&덌1?Īfʢ̇)S׷Bˇl`Tf\Qp ը pQtA@Pdd}6]L$2rs;T!&`͔fI ã@"2Q)AF1繨Sl(p%*|4/iAP=j̣; ASN]ar{-uxDr_yKS?1}IS*8d7,)fA<~Z[>+S◥_&gE_UF[My(5Y\ +q,r?&عF^U}#eJ| OgK7eYv1',|rxEE,m-VkCa^].4GN-Fmʃl_}V96qZjg$^B|kyݥZꑒ@n컿ԃg÷mNXLx fgMSlYb#*9V9y|^l D0T%D6Ru1]@,՗mޘ!n$9^1y/t{L,={$V\{EVө#\46m+`82̄Ld8_Z{OeUh=óW|DfRW4QKAxɟsX(1ϙf`W!x ҜVyz_ة:M}!L!H\Ê]'Qfg.Wd+h#ZAC;-~''r6y-|˔}R o3D;AXS5qG} uPԇއ;^ԇs8o' BnWQ̃ILJ :L۫goAV|3|a1 KSZ }}9{{dnQ ~'1Mm[ðeJz>'`u tvCF_- N %Ĕ0/*+[m[A bW~Y>1E05au n uj+$ ,[4 20MqBky)t19?/iX2d޿ʒe}x<3"y[Uݤ " JMɂ z $,> !* q4G}1R0ӒoW0BcoiSĎen M R8<y&?E͹9~{n^MaG~zhʦg& EZvhMu cX|MnE\e/[)^_.T$SVZ)m*i(y혶}W84l~#rhԊ>sZY[Q?¾N8Mp^9 A}5~]|6GKI R%C0OܷB 'ϡG=#ֲ O/ R F"M+ob*B98$hAߎ5 'ҋ nwC4C2ڋ>E+#B{K%4ff73[~)MaZ!|ՠ" wrgS8/h*?^rH?S:Y?M 8x)7=,eMKzTc q tNv`t3X)p~SLӮ{ʹ뀓+bM)dVkm3tuc|c[o(Q*,5I,qBDtS&G!mo]Gf|{[?S8yLc&m9u>*}4O4KֵeYƣ@|;AjǕ c|}Kpj!>EcV?/=K~x{]%!YC6Yqj k\H fߋlk|VȲ4qޯLoC_Z,EVsUv7bnEsTpϜ>v2ʸ]e:'҇ݳM3ma`URQHzS Sw^ynAh-jFh LL9<dy$97~Jݦ#j5C7r&{W =\GqeR#+ǂryزP5|N e؉?=,Ԅ#+TFOQmEZCűݣnkfwdgfA2ؿߟR,z*K'؄ˁmAtU((B&oLm]̳ym כbAzEM|8jbE݆ϥ싕ƇLŌ U&^VwX?/_E0̖jY>o2q6@5c>BbP-z y0n1*Su}<2u:5yGQy 2ü;O*ĥg+EPn  iW_-1_}*@ENTmK"|4=ɲIǴCR|<"7=Y؀^U,wn_b#Jǫihk0ީee4ë&!0:dAy'L!~cb}K   6a1ib>_1I*tC6z@cgNJ{ذT 75)ShOm뽴uarp4i,~sUu}7a 4B,TJ *V|M ˦^c o%l%X2}*L% bγIqYƕ)A,Om hfU=gh.0*a`KFrH*M'Ie`7ogj¡fc}@`DQߟ]ZmZr9/IJy e^iW=$8Oќ<@yYrb`fPBOŌ#ʤd0ʤ +u%J(ID#OR]Xopn&W5? saz)Gby`> yD{!Y@ٛ, )*kRD}礂,^1S^_|p N^,OFPAZ^VS 1źkIbjf HGq<~ ^a旿{PV9ݏݶ;`G/#Z~\Ǫ",rW3 iǶ68ׯW+rE'|je.T@소\"[x5  { Q:z؏U8!W;4" }wh|Pt*l\,kRwPSVPCx)W8y@Og C 0~cUlZ1ddeD2]؜C<3-|{KCIط{L~ %b|-jUWgNzU(*D5<<գP)[mJ>qgS@iʴ+O4zWNgcLț 7<'~/P+{SY|O90o#eL4֦l38|rC3oGS&o̭bf} iI O6IBf|É2[K\].DP)~|Alc} =ɹt-PS;_NKnHcB 6mjY8Bg{eNbԏ㶕_˹mӽIk3f٣Qr;wNVIZvu19p hi{ӏ$ PtWl^~[l6mY&q\ׇ 5rQ3.>6ۥkv6GK=GM)gΊM8BpTB{ H_aI ^,<7X-)A8CB~҄9qEg6I=XϬ7=>`1B*D]sU!e\p q%;ɨ C |7˒PJq\UO}5-6zQY]r T1gFpEDq*j!d3鷅Dİ~> >U-?4ۿ=Uuw Ru!BrX>,k[vzzQȲ!9myJvOF6lpZgamCe G e ӧ!b1 `dVTn!TJ[!ZU-~])5tf66l&TZf3_)'lS,̤͜3S!z:n%o\[MY cYhF3 |A)Q\}/ނ ͅjWh]㤲a)3ͥkU[$;B8`Y ';4꠿o}(LxL,Hc sXdܨ1%2|M87s*6D5W"0LiE}gf+%;+2NOkPx'"$؛<=օ 3^vf)KNI\ѨzG zOoLb,s>?= MCTDAI0#O4ܺ0d7ϝo"(fòV̓w~"z3 m3V:,3Ȍ!E3?ЬҸoovs?Թyg90ޡKt$W(a "MB>_ V)UfOyLe8g@X G`\k=&gm(WTU$_8d.q.E3f.Ԭh,[&{95sBvAY r Ge *|qY ";ߋA)xzB>q"ӓ ȯG59y^Kx5~Cx}W׉Nϊ)ǰޯ<4A%+F1ԭt~O~ʐI˥tsUVr|9FrJ0 V=jxezOLԯK%QTl6:J1z1.vxlncV05xŎ,Q e¤`QF3Ɣk\Ni 7f/*@+#оUtcf{az$s %t?g^2_.DE[S6% @B CGVf(Mxkù{44q%r CgZ%WU<6G\irMk]X dqwSCiY^2$67?ϙ9_ R9\oHo6NĥEDv>_N!Ց-˲8UqL]kPgh-:մ9>pU}e-fv[s9 t4,}n&&fVEi?ږ{ l,jg:vo'`̂0Mc2`f( I9+K&"nX"`.; i}C }/qj_.X-t[ &t|΁#ݣє75wٶ3@_R>XĈmVYIګТgVhwECVя0uPg9 b.Ĝs)Vd [$qڊ[ef4~;]>ba(MHrnQ ZȢ:ߌ5 C^ynDY>Wg*DqQnYumV[>1dBl]biש# pYM tyg>_կ?_5Lr<^v:}X%9|k|g?\zX g͏,DY2X*HQ^#ydWs%CqN,̡mr^Ecj9n5m[עsϗǑ2',#ʒ5=*|b"d}='Z u y|uޝ{ybF ?.R{pR>357ӏcXY5К:s)EQ称V;cۍo嫯zU]$NW4ډP,?>s쫬j1gK-c]#XN`n4~'|\3Y٬ j@,;YclI0oE<:4/LJ5+Q6!<0qED&"NAzMG.6z=|tz<{N5MvćfX4۷> Z K0h:/M~q(3UUU||ݖ*uUfś7%p5vZAr~5~=qUqZYŎQ4f˥-[WO> D7ϥOo6ecCJ=/a)Lr4YM3ԛ[lB,eeL(Ԇ,fMx-؜v{~߼W<:IV4nd0vs޿\ָ͆^L# |;f_u}>)=Bt9rmMC`|Y7[H^zַ~ǵYR㧧>(CBUjES$Xa57Ds0߬8t~sjD~nIREb^׫0闥ډRZf-%z_{tw7|3j|_o}:M+4i/տGN1ݫWe~Pj_.۶NdK"IVIZhàu- Df6mՊHme`(J>ϘٟٟA _>l k]{?/EМ13@WMHivci}^,?6JVH'(] "ڶ uy_.`٢8/+$[DXeQD!XvcwZ~]7 `oZ[߶| d.e]q92h2STWjiO>y~>td6n(ʂf TIfV"6ØE^EYV~=in}'M|^UχƟP1rk\I Fo8.1t鄣|>KO+jiA~T&ՋKy<"H41j.t-_.>N\?S?X=UUm7JMYR_k{:^]9 S[F qCYUMCf\LS{:WU^wʗg-ӱiCUYOFN}d<')qd4Qdjy'kN228|~$Nu)jFٶJ6 ?ۋiW~g_g:/V+޾:1}ucd󩲐PNZ O 'xf㪔濯;MםDh6%M;ާ|ϸqm XA8,eY5-"Al`yY1^X/۶nwMV`j}X^,Nb紳h܈~C j SP Rя y LV[a%YZh龜?m  %-WYϐ'$qy(a7܍(i$*XU=6$,}O((j۪t씀LSPhh2CkoIT$Iކ(4ϏG/d6n71#gÇ>Gca uHr)bÇ@fp6K~FYqt$Ms^c 8y.fYXo j%SmK.$X$-IfT]sgќ@D̄Pp+)'rҏB1/ź"sCQ@Ni6k"}Z,# xsF")ʲ$9%`!MS!%r"$̇!$hVu}vlF61V}6 dFfFi h.󔠍a:<̆gTLK*%8V˦FrO! 6},`3 2h2rod{YcR EADi;!GBQ\g&oEUUӨNb*2[9~o\*s{T9l=-Btj}" }@HZIrZ A OE2_nM :Dɚz1xnUlnYwUuNrX`! zET([YJ%D9K- w^޶Vff_Nnp0p6/g+i QATWdt4~Wzw &6̲ycT`(糕z%S) 1cǰn$+5{2 r /~ViEd#TUf#y&|= %\Ear^q<2zq{j7aI͂o?&Os8/81.hq)z4:čKZc \#YI !( d0[|dNr-d=-4H/j0PǏ)ylf $`'~4 يG<I*CDv:bW@][kC sZS̹^Mg2!r 7||6P)6EaPP 8C0}J̥/9F&VE<ˉk*zC9:ֲ,w=eeB8ʵcat13Ih#l[X+ ap<}0Pwj"- 61d>bbgϽhl+ŧTM/;"rBDB6|(xGtS/ޓeXMV %|Qt\*M%O^.4ņ9ƞoeYQf{ဪIK:`l6@@'emN?dU$|Xx4Ij3EXzbb]U5˺f|M;ÅVdX"Y23|^6LAoʲz>Aiy1EQr ۗ5dNE"{]If&mp(;h\;?+8y.1&9XSBx8fk-ys˝y8Wiw5̕k`A/oݱ SE/MN^7Ķ+4:ږ([ f0q di 2V~c|4ߩxTz!/is <}'1: ^[kaT2FcpB7Lx5 /5alYs>SC3Ra|ol(|V7p\Ju*jqo74oYf[*yxw6DDsmĥQ^<R88+ [!M۳쿍شoϲϻS華u^ULOK4lH:igh50pQ^NBٝن rLӪ/ BZk}{=;r~Xyrm5vNS8 qGP|<_R$,$$?=$9ĶO y tZ{+^eai~?i'94m)$3TW`((KBb"e@vwak)mh9ޱ9^;ME\0-v/c h}-??Xˤm"T<ꛓ#̫r6ȕyJ)_)݈1vlbCT`h^"f&cb L "PV~,ęRs6Y f qKE@cS"Y~+{f)-> wup˙Z&0IDAT(Rr!ȗǐCP?~|a< fk1XNfo%ol8*gwA<^%5V|Oue'2f1 3ٶy.1M8)OQ5(ie+}r҉Sl<+"-R]Ƭv&=[.aߙ- *Fr$!}d6W*^%d  C.HwY&oeY)2c[l-xArEvExdbjk Cnq1N73iXoʯULQaUg}yhD-I&v߫+\o/3}ꨥ77MyJ^mSfϔBXiI!v󾯪08j}gX3*DH^ϺaM ǜg2.Ϲ 8ŢP5@V(Plrh¦u9ɈGSY_|GQ]||8\e Cå`0\5&) WInVg89q: >˚FTAx!T(G` !v].F,Ҏ8 Gjdm.i[I<6'Uni wPhf7fECi|f27w;\IR4a:+4SreŔgLYTAca`mW:=e6P.f#4 YG5р%Trd'YWIv<բ1W(^!,<$6"g31ij-f}].m A/b12+Af}A8+f/f* 3VM$rM^Ӡpe0=yljEmKjȔ&|> Zk N8J'ؽ/pÃ*˰~ N]Ԫ CU)O-Pj(*E4aE-JFK@u&-;$StƮJSe_6;㥿J}y{P\\bVyq [BF4]P+x7c'R7. 16*ՊlWbRiBdd qersD[]W=H̫?P*|-(` ERD|\ݴi[ ڄ#T$LYJije4uB3\=?:! нhD,!︂~ $ϧ2QMsxGij -/}on̂m9QFo=㡭Bc~1&mtZ شY[$Y1swfw-3?PJVPgx~Vݤ3˄k=$}% n;xMX$%Y@0ʎK85}K\rb闗3Ю $ B=x!Zpw‰LSa=7;vOU8<4PSyΫNm[kC S L}.]oX}<]O/[ lؼ%4g ,I:S'rC=]+ܞ$C&+Y{e+̔Q; "Y9d0>"U~/ Hʼu:J!U߫=ah[Xq*5C03VDNeՍ5#M"HjW"i圆!|g$HSX| c2&OY0V7S_]OE ?!%;tfK{&zZ6t6ZXۆ"9S=쏴muKҺPP_yvi37_0#oGRdΰzS&o_}dΌ SSl>ȝRrrF5N% FnswB$6[Cyh!YU0e6)Oנ}6|]GV,k3H %arGa؇ߞc0ny1"_B٬ߴVk_?jRg<=ڪP!0>" /a4J`l 2M9L5Sf? +c~ōskP ?3gbGJ:5󅺎ܷuNn~OgJJ +u_s 8{b,Fu!Β6իuW";%C$g(p0g$I%^"!;AA8,3V*ho>N3%j bqEQ(fe{zSA,EQX9MNERy#$YkJ1):OsۋEQOMQdWc2'~o|Xlii%lrA1nYon6vkt*@m7jeX1aU~Zyg!y O,)#W>%Z׷]Dt)ؖWv|şr)f)6x^f-px\J2\̕p8 zaz<"mh P̋8^iGӪxd(wnc(m Ca4],p8 9M4kߠ/_w;HkDi+i[CYiN7gv]HG^^>͛ժӵ%f@XT_n\zm!v7]*$ \>J&;;I],[t Q ݯ\ѸVU==-^@L}\]OX)&I]5Wň B]f蚔eivQYgyBMܑ_$ $ϛ5pmx8D+9OzG)e,@ֱm#3~.@{*s{%%>T4VRE662:`C7m:l#'E?$ۧ|m&X705&@,5 Y)  :`ыF4dr fF5`]GQ׭%s! m; $$JO巴("*絮)BNmXC4ޣfnCHyNOR*iOX(ۡ5xDeV z]V N?CoTGlibv؝?>kBPaQ@=if>g ͺn6k(1t2󜂾 ?*2q;- hT|vKnvFV? pPO jY<FR?`2xn7op[sJaջYYE8o[clIޡTS5qYFk&d, -VzjV[PZSz%w'a W ޶u.]uu|{BVUcX\3I e "'tGT6ʃXfTS a}Π g2aҬ`Ī $Ẇ2,CMYPqp<.DgBz<5dJ|{x6g9duc'd((p%Vtٶ N qW6|3֓U K|вp& Øu4bpPm{[4iã,ν,}Ǵ. mǔ4BO+ߣ(M u}9\Z[d^ Tj~bZnGZ|fe)·SB~-V0[q| E-+ hw/AH򁰤4N(yu{|~6|ǂrWMN8ML ^۴gW rk@g=E!j-v2:qN~E5 T(MM5ӿ¨/iυDl5YHZظ-%;(l2  8C~>}=# c4 Ws"> t|]-ц<u1I,YTjӸ9Z:!H~DŽ{6E4szI<.*IwZY,*XB2<?~Ք^z#|:*Y /QkW4=~r^`-`c5 SJcP0xO8٪up<>*q9a?]?6)( +SȞv0GYu?ڶm=::MӬSǷ]?{=ˋmBXVXU$~~tzMp4=]=쒩D( Om%>7݅O*abU-A0SqwTp\ȏq25TfY͆]4WYg xSw+?߽{VX85sV!㝤|G2N;BlemGQX#I/kSPm× GԂ6ͽJbiEA4:wJ! fsd\\JiuNͲ!ۀ}n{ .-1zB c@4V*Q{$rym'+;OM8N,}a;dJ I`྆9NЪ2< Om;=ߏ)Ns.C55 yV ]OS/)kQsEmUM* ﹇u06h֧ jÚVT[xK@b,]租zi祡y˞rQ0wt^/H̲l#`3'_3g=^pa_ݡXUUUǣGL>ٸ )Ҧ)TY2 l9(* [3Σ `v;^pϋp82OvsHE%dEQNIթ-ufc0dsբ/P Wac33SPxI@6IAɰ ǵ[K y()]Yzg)8"V?G̷0;ڎ1d!1=8sܾV͸Gŵ~?G:a  /7eP ?yN>uP4r.iMKS`CYM;+NyrN̷z157R$/Jy>cgxT5BG(a6f^D!W{n@S.HJB(vw[u;,>v;YxZu}>?cm{<_kdm BO&WC^̝]Rs0X<˯0 `UQ"fS  aSY98. /۷u}8|@]c*b8DʚP gib(V(~2wp(Cmб:'8XpgQ'H2鮒btqk{I\ 勵Z:b̥F7ݪ|}{Q͡4<}җބkd"&D~ֵ8@ly8.֓(+ }59yn%4=)+يb>Oك_:(@NW_r^gר@IBˎ/):(SjJԋB9ucz ih{Fs]XU`1MM>9;ٚi\-$X@p^L 9n77SI"%$|ߌ,!m'XTS`6߿}wz 'I `X?o,:~ja¶Z-LۢS&s,4r,?5gmpHozR-9ʫv8a"+wH YL $}~Xx4> ?[U`@AΧT57@Ygtfal^s*)]Oվﰪ}f*pRCUu:y~ &(A=)KK)W~mgD{BFdI}Tageì-ʒz='irGOPqFXvLuu cy80-R:_0$ǣʚĵy>V9.h &dԵZe,wЏGDׯg3v4]G,raډB,0b=~JZjF ([3EnNՊ+cƈEkmSJ88kNi iR hƒ_ 2Őhaavk$>0Q!_~EqRP銵f9鸉ck^!̸\J1 ]܋i8/71n:E=B{Vydp/=5Kas 2]<:\Ag/ xJI{!t"]?̸wio[bt=f5z%{b׽j½faKb⑅sEeomWa ,u󂇆 gTYL]:[gwPSo֯V5"6'Ulif3ygKB3>e4}ɩnOcoCn?r<^.IR9q4d f1 B>& /q.x}p8ν뵮OcX2# 2=z /͌;ԡT|X>;!"k\8gY$+Ӑe[].@d M FFSc(s hFW}ª:{=cN^v=&n 6\ x|iH8. >3M<+?żi EsCs5 :kpiLv̺pHzu9m' KYֶ>uNSQ|㎹SA^m/gֱ"rmOT߬͌.W+M5m6eVz$[=ׁriYK=i;\ls͕NӪ|Y -N E [{K|XLa~C\~>czw]~?_߿˿_ժ뺪.րq)[S=bEQ>8s==}\;)6MxkHAa.^idRS\כj剠wX~G+IPǰgq̝uUѦ#FLU^ бæѸ@?e,WV_S}) Qlv n6oYX}Y˥,{p`TflEU5vXv#SOqvͪ|~v;DB$a(=wϡ3QcBZ"qE*| h}\E m | b+uD+gG!6{Xl68Hdo8޾(45#r>N ͛ׯ?T!ls<_ha}_ NZ$\7“jq~KQo_%Od5 o$j(BF4 'I0}z2߁3͖ ϫQj=ű?6jWL6hmW_I-km{abxs(^j5{ Hr- )_k?"/$s<eUҶjOOd=)iáD9X_>{Ǿf>'@eW°. d2X. qC!RH|Pd<042:ވ=n05.]G"cBDcO:I~(2x廊BMqaʗOlic@Tm >f/FU^`/DQmz|;H1 [zZ͡s~8jeLB>Hex0M(6J[I}28aݦ98C h{׉cDvȴUDԃOWK84_((^LjYӐ79N'6 ?Sn}IIB?.ZVV7[ۘNĸ뜥{$M"Q0<>ګsy?WNOyqIF/W+#4NfHSh78(S.U7܊ѡk]{]nYQ!:&;P׷zO'EaJ~?;3Qޔ ^=o@Ҵ($֘W4jU&S 0\JMS3rv*NյJa"[X*]&I@,ǩ':6@=DT.P$m/_X[UlA)̴ [9O/\6=Y7bc25Xk?or4íTgp 'jeٻwkvq (VqH!<^}~ l%ˍg_.YӜNu= FE7yg)Y/b!N,g'5_`|ȹy,胬arԢLH%1R\6d\׷[ߟϜ6HhI!ۅmgܤPp6v=5>iS);N^QiÐ$%t6Z&u~OS+{FR^>?ϴ׋a^}3km $Ɠe^ f{ oN'Jx$~l ܓóoP&=CaHA*Qka<ߕSʍL{E\xlc>ϐhBk1Geӎ 穳ի$4)! +lAOnʬcBuHeareCd﵌2*~ôWF>3.r(q " +Kgl| &/%2mfAY1VFf1mBSE!`v)cX>Ɲ8ʎu5w\W?d( R1"ޘ#2 15s5Ţhȡ,A1r5-{uN5Nz#p.Ch2phOhkܰg%} =>c8p{sLJ, /l8S;mXþmG{O306+xӭ{\VؚvX6 !6f=BzTUȷeOt

|Juo, +{LwlSl4Aa&~@Ǣ:ݔ @|IP06r1)٢"^`+-Kte0VmQ+rV' -iF-**PJ,cCۼ>#5?FjKWgDwq ?cait ]vHGE7&Q?ju4:XP$I2^>yJPS؛l& yeu%ՊP[H׉59o@]<̴vS?rщ ~ia3䋞 <űOO^}ٛ7_"~ L]|"7nhuGb?w2T}M;ͅ 󒃢:Gs!Sh&{@{dy.<شq}81/`qY?V NVueDM fc%A4x2t I켷(8'}0w\^Fׯ>(\s>ˆtaTG Fiz+/6LU]WUؚeI2 F-ci&M ;.4~)Gv i\j nBB_Lzkml,>ˆAv~VL ^&BӲʸ"ܪ5d4)R}^%l.WIfTthZVGONu@qeX4ťVh oޯ2aѷscqXq G֯ @0gV_{3e!Edzh.> |'8MMgiAGS "1-mku{}B^85I)'r{璈䍵$>i#9܋+`Mtr(6yS&K{JC׳,Iȩ@Z"|fڤBVɣaVcyEM-ʬ9APC"EkNݠ`꺪zx*D>dT600}&Ʀ7ŏEU>yR]޾)G8E5v8sNfCTFOA7r4]'wxȶvk !0(k~o\sb4<}ŚJfmfP 쟣GVNze3mh펨;U`s|(]+X 9}1#v) bS7[+e}ptpdﳌ*YҷYu@F=m7fNBfĊRΜXM{o3#V/w"8q,#!Vc;ƻd?SmG—ŧ{85噧Ce5k*٤EA njoU,Qy>4IޮD=yzN[5f6.V a8SrJ~^U(۪KZe "z$ќBOjc/paٽ9zIh0ْrXyR_c#|svp[q /M pR#S Yc2Xc9/0bxs3 y,c2OM%}7Auo\+w5eP4A;Y H )xjyl+WHc_ǹ4!uif\6sB*j%u ˚+nQ Fd(H%Xm-C֯ )\ jVsNX__5_|zJ$6A7| Hʐ})bf ow[ jbzjnf\UyM""=u-YQ?hwʑudE^UUHxt 6I\U1羍WxΜ0M<q*wQ:*'[쳌[(nV߃_B̏ 8 5]K\YS^]nS[0SSMS: C8į?/˸Cp$FNqrV& du}<]@6ZMMc(EJu;_V}5Uۤ=w.\̫:c};Q,bb6mb/PUt2=]$Q8/l*WTMDt>׵MJcc3Ƿ>x;-Лę7W_}ᄤo7eHhD{_?کA̫-ij!.`Fݻ]^G~.r`H/ ']rYƷۿ~WФVuݚ\'ѰsOu56Bv4ɕۘxW2,BmyS7%J/SCVi1a=]b3q,uf@H^zڶżK*DcϷvsRb^˹Qn?p.}_ƜҘ(lBI! `80 xUZ?l6[,7o/טV9%< 5W+ "4茹r%jݻ/+-ͺBJ&LP]; pU&tوNBX,[Ϗ~g}EL $G$XU|| k{񁄵A˂k!`v\~TYHGY05߲rSd}cΑ`v,`i.Kr'^==yOFs9B9a[k/4F WU=Ez 55$7< XwuyPh#L=Y'I(!Mk̢IgHYy%Rfr~345P%؍Y_ƽ렰FZ(I2ZG 2Ty,k*j2vٌg3!N8yDT+zz3B"ζv^sgNϣhP9LbM6l鶨=޵?seҴ(:d2/-D'1͸,{;H.\.}OYD8KVB4M]_}upi˾)7|sdطRfr|~B -(F'}MH͆!d1 Q;2b^{r.Pe; v2#7{>G/җK}BMo o7Neb*M‡~+'W y5;oI4+"Hiǧcv̢Jʈc#إeX\Ŕ3I=&t?Fb eKf@=G/H~Oi7[@y~|$u _=j-<4!F"$zE 7(>EpxśZ_̒v6ºSv?{*N_^5t[+WE֬Er%KkWΣ#s%%2\&Oގ+!i|tΫۨeM98/W4'Uf %7Ћ09 YThICD1,9FUj [)1jsI(mw?oQ<YP/P u1vC9iic3Jv5nL=ˆܨjxf # y* !>mjI8 l0nmG[-=^^H;22k!LϪ|lejEdo79޵j-*N xJVT1;{Sy U)#f5*^7y81)chC/,A|.r㧖(ϰaxT~_U~ Wvle)2|x6#Ҷ._V5aq({lV.ƔUg5\Q:@s3gɸ>?KH4o$0Zd|0˝Ž),8P\? GàKI%n)^u8{)Mیfzz;8JNH,taC-eߔ#*ۍx6~?yEso"Bı$Mg}|Gv5+ZWO>IӢnPE$fuCb1}@ez`Cs*$}^f|چ{T3 ZǿA|wd;>$:I<!^Uq;yQx"Sh!"+ +?C9͊y8oô]Os,C# n/G;saҸDNCSH/z7l|ʏw%y `pq˕&E=$kc, e0|{?XLHdX}O1SJp}ׅEr"v7foM@nDf~U%ȲlԢD>m@׉ۍ#.H !y5[oBLZMYrcW^ƞlWR("I e Mu= || `cfn^R#k5J*u3`12˺.<{)q]hFh|oz>enw>7fCH5#ˠbz=s$Eud['z3?# gTUǣMcKZjѹ8R- o6xzXϫ=FbSReYuErn|spiV]U(EџdE50rtںDF"962pYv-|}4m{ VS](f$(b|V;F,mE-E! ۓ:u}8~'OO~|0huUnÐyN ]h5ɏjlf^ 2H`qI?nMv%v&ɾGTt ]w|X(Hmzz,+}OJ$ zvkbG]3570>fk;D¶$!6MW$i[( 4iui>l#}ˠw4Q9Ad_.r>c_!)d4~=7vuxcRȁ4 uwW-=eVAyb|Uc2m:сydUO"|Jjlhc.ðzH+RWk \ŲlaסW[LO˿tLqIxw; -uF&oE}LKWh.ϊy<S|:X B ȡhVx}}Ӵ^O)kMC>ɐ8(+y30SNp77Q^19P?楩B> D:i+4-wҎ(1ժ)Jlc}gX}o==2 izmؔ§g," 8 'P0{$=ƨitBii{: }OR)}m¿52w!1]@.NʾEۖeߋA#osX/LK L`U ` 5M/Z_zmJ4|tk=ᒔTAm+͛ׯP+T4|\{?9߽dd?hb@l[r5Mj%rԌGۂv󦡒mVxvo$CMQf9X(V9_[~½ ŗ{<\Y5}6ҘiIROӞEF㨷e1V i@8l%z_'6alt>Ԥ]CUn}Ȱ|LI霦EAZ0dJEIRy&p󴣈,`˥mf8䭨iuP$]$1p]ԎpJގyu) \,ԆEa't #PGFַa@ Z+v%:424_Ii;2DܝP*> 3["T: |/bW94—wE] #g|j< rs@pwfs[6ŰnoޚwӧYy[~_OSD7Y|LbƘR-547<^:MG([@WQ98&TnP*/;~k 乺P[ qC1L{9Ea k)!/.aX( 79bnE:[ H|tVA]}\0XҮ* ֲ#8{] n\r5==ByJA҂2ոF uMYy(CMAH-MsSIfB;W{};Nn}6#8GcoI"-GCt:-Fv˲|alu_fIhY [HCZq$ދݒ~x^f;/h>BLE.sPU_| +wN((fJWe<%\Y$)UѸilmw礫mɗsfvB,i'+"ƌ L nuXaB}tR?#G4P ]@ , `Y7Dl>3y׫<$IiBmaꩿ^~_,nűld[u5ABTrroזLG,H2|?-F{: '͛'#_^00biF̣%8hXGZWӶ6ʫU߃fՊ˒l}wW_{M#U,[,wRKl(ái/|~no{Zf&Mޣ(M$Dnu:e٘ʻ88CԳ_ȑ$Q^yYs+ VO$WͲ߾>+<On7odޑ5a, @HDڶMC$(n7 7}Ok>GoTd.?֑ϣX._ztJ4U%IQg|/җѐnHg[}DHNp>=%CtzVӓлKiwe&M'~q%o3$^RTةg `!MO(Y!/ p^t_!q6)UpctWl+Mo;fKzmApjiI3'Z(׸ ,k}sؕv#??Ҷ5$, pZXH |>Nipɻ Iʚ_a9}߬ne[kӟo] &ϫ]*vم|;~ Fc';^Ag}9֙ׯ+|~~[K̎VV-~C7);o^U.Y`Ǽ\>|xnHʊc_"Dg $իݎ{9gX͕^h q~u,|_|Ͼ?g4FJX>_rˢHQ_yGi\ɂn6O @_' m[T'wJp(3&cR{D L^zRjIuumܐ!~l V(grMSU&e[NMMw_0 X}>?zسmA<j o4MW^"yrkQzΈq ٷHڈ:jo6QT]&$: Q&I]??+@J;׫P}H쏨%3BFOgB_Q$1f"[* hH`1 Αe#ܤ2+XAo&< 4ՃFL#ɘlǝGi 2PC|322YiZ 1 fXQ(=3B†kkat vk|Ul6eYBLL9K]X|=C2%ac~hol>BC@sTА{SDQ@3~ !CU]._} \:x^GUն0Wո=>I0z}~ίQ%C@ô'zx6q`,O3٦Lwu]C7GQ\.\~~FQUф$ { a4SXU 9 m Ƈ5X5dˇ=d%y; D $87,Wl xX_K_oIp|L"80@2$Ćúatn(Jm1/VtCWl?O4fҸcos,8clM%otGf4{avPBlh] ќW6:!e4J-kAE! TmY^҅(vWzJ؛ S'amA}S]8Txt<MVKv#_г栋LQYfC2,];1)u5*5b7$ɸ2 nws_w]ĵ-f}i)q9Ƌ1Pevv^-ᵇ`>Kv˲{fN =xiV1! :/c@7zճHh!N?$Xb K)G]4XǎޠMs'~ Zr>iÁApM*e"2R]dl4JqG7MbC~EN@Oi*@ yytZ,6OS9gt LѪv#MNkfPF&^BV=2!K6z`4Ae,ѓU?i,lۢ9I{` Qٔ0T@èiߛ'w6Sn^$ooWU鶵uÇ~~z(ǥiToG'3v[.TQF'/ύ/lumeu]Us]bkp-_Jìs,kD~nBfxנ-G]7UEW LD!aCې3Nq 2A__C.%3O\q(CfMQR*[^ԈesCU~wz!F$yu|w CINwL@^W?V95-Le1v[j|mڡؘݏmA0%4ɄNu++8p9*Ge冹3Uv~-ƪ^k;ǒUbqHOIPt|.ϨI1KErQvK:&Rض*- &qg'( MlG-p*<: yR{zG>,{ ¦d@IRۍ70ZlD=%LKS2"LJ,k?|c }ix}rjYAҵYSx%S?pq{I*eU1SraC8i~ftq0l;TxOɡ}R7eb6LS;=αGOe;g+$SS )j5NGRr~֏ c/t\.-GR3 7i>.O5Qg&i8lfN|q6=I`)%뺦OU3-7I=.tRDP}B <{q%him[{[fKLp0F1Jr6+3Dc}; S\a۞Na/U7M, oMU%g%~8B2L- FQɊ6z~ 1O czƱMFz-G2WP!L iʲ,W+yxƳJNÊJ w jĉ4o&#gVK <,kpz7ȯ)SZBzf#YYYQ\*<-P& YIvB{ƫ,]l6mY"lT,bMVo5`a^SqG"תZ?_(3 a Mg=$U D"fPqm\}eXeFVB(9.|<oS!*Co)kDXiFģIF]l[$axFNVh,$PB"& F+ۍ7U fPh#N2Od6r=FG45DžV==0 ݤ[96֐C*-9`|}´ǘ(aH6߿d`|xj~yIB;ղWhd]mdl,\sQNo ='H ޮ[rvS.3޹QXyO-x#|96B<`r=We+͡)N[U^|z=o۞Nޡ,BQ%@_ ~B)]c@-C? @k8ghUFM;2^7/̈M￀L4| jD CMmj)0?JKQvs ԕD/_ 3+M~|mq,E; mk 0BPD%uUnrdx}/B3qLgcA8|BRÙ=/(ުoS1'X]2u7xWy:zU%xIZ~%IYמ@¢I)g׫twF|Jc#v:-oN (\Bz(s\L~ 4]GfM*!֭U c* i%’Bd"Zetڶ4MdrHamMrN:]Cү#ۀl0"Q4S}/0Oǣ1a]5+ɀW+e<=/Tg62T؃np8#UXq^wԧUFFj)d5|Y}b"/Yp8- Gsfi*a7jN{"o_ >IDATWʺ:H{`%"wz*b$Ca((J0#b:׈n줌ZY!8T#gv1Xy|T{PGy*j5\Tlnzc,?A)!=b;*7'z5e)zG]i$˥mr`ȚF OKPU8}l͠ق*\D!0 I_Q!-~Ҩ^UB`D0Q-ðݮVtaCYRⷥ%=-,#MCۘF^!j)kCqP"PI!cJL2ܷGm9YM+^!Exם#]. ;rַ[s󹹞aՊr{UƩ+!+Ylʘί|7^dtwI_Cxhpz7frG-Q$u<$;cSh]Nx߹l6|o*ʒD ]NsaOjtn2IŮǐjdLS\O4wiDmTfZϾGe[ߊ\*iJ]rlqCiP6~'_d EQͫWDkMBl.L*٠z8{Fy/ėKRd @((|WO?峋z=/YUT, VSo]c$E^ C0>P%pډlv~A(v8|ݦ oQYl5&A盍hX!_A[Gj@a;zo6U##1>W' ; u:]wLX#>} Evd<}b rct^;dpCϊ`T{ VIEAJӢ/ /gǛABq3`sXVH<$ʚOlJ_~jO힞vxTDlyd@o}aŷgyERl^ߩͦAx8wGb _P_J;ŪW.zs=<)ys=ku$m,Z"a9fn=y) Bj%t<2 vČ:7]j?"q[,N d-ߛ/-|:^l@W3?{ { )UaADM`uV kމW;8# N( 9Z}٫W}Zz0_.O7ﳌhjҔGkm[;Lek3S){zł7o;Q6| ;e ut,nؑ1xQ@2vJ#aLu}8nuF |mٻ8ӓPgUɋ.Ī^Lr}:6 N0XL]emۏѮS+W;^xFh0M)SG5ID$,(9 ↮1_E|z PzP5~!åg]zwZPA#`(biEvq9V]fS1'8na"9*矋":06Aȼ`}XteӨ"yG}]ij+HpnȒPoYiPv_ HM;ܤ/;x6c_h}.Zl񍌼ʒ \](֋4gl{_S ^E+ֳER / XFMͧ$"O<ϲgX0Fݣ;oi]MW(sŔ L(4lVm 1\Wm49UR(ZP,m|bgLqwU FW8v{[{jfXDm-r,|%Rlu]ps'_9Lji)K ̷&NO:}`PϖPhRqYb)d˘/YÝڷќ|+um3ffPb>Tq6ӯ+~+R"sy8dp<kp V :^I7k2U6}XNU %ĵ~W^Q"伬S/x߃*e}_>ScrJ>4M;O a_Wof wi݇L;Ώ!?vp Pfrs](d*#`A1OLi#҆DZdx)Of{$RpY\JdT(XV+ȏ+-2Tz!Ju  jYImSчXl YvbzSa` WPh+ƽYFÍ̷z4 WTµ ̑VX"u en/ĘԋkZX.Lۆ_TUi?ƾd)_BCiu>}f8GLR/;];P.dv,+ee|Qr{Gy3ʿ#OӮk~6aKbb,֮/ҒRiR zm?m`($늝~D/+n6 HW8V"VU$(EƘ$qnY1#q̥\0H#vΗ0C*[y9F~̧\;'@~i6dbQ Qt+|>٬mCV\.oGiV=T6wJ[MƏ,9:iZ8 X%\"'ewщvwwAD g L<t1gTKfy7ԈfdPeOߓ } 7*?'3~鷄yJzVߥ|I2Y(ua0\]|S 9[=59yQ@)|H""SlK}O \AmJ@jЧ,Iԑlv+̣/(?ٝ?6oKex\s% #^fL&+4nm뛽(GQ4;k_1Đجa}K^.nI:۞YeDRxY/nH(! ϒf vʬn}UUS>֢Ӈqfy>Eb[ )E XM!VUES(ti]nUct\0JBiR'o%G5e&Cq{|)SHT6+'o@uJA 3+jP fz,+u4rES+$5~CLw MB2-*DK (|;q_ԩ&hW)KOgM<4_kԜ?S 4R^.{yia2zÜwD|2K۾?ݯ#Ļn[q;(U-Duu7#"aW| g G9XkanQt>_Lƣ:NdOq=jś*;iFh_[Yv]oA5=hΥ x|9,{Er-^x=.y=_R#`kb9!x6|e A(iuwh,[.7$T|U|Or9x7O䒄cd2@5 jȱT6zEhSijH*dH/LkZDI b˥ ^cM)6i=OĦ'c4 0 |.v%RSvUE7)3*IZʎ$%" F {e`Y|g-T;h 4o-hNꝆ̶ amW+}̀6LHaXXW}J<[;qs(6Gc 6{L(׽#_=h\,vNaדV19*w喛$f=Tp:-ڹhD̿@Q?P2?~aw(XC^/*ʼn}W/볓\;pXVЁX ưhdmXL(e`}?'16 C}*fFА53K%v٬{}M#*UA<~W=j@F*kn}Qle  ž׎"q\{ M Sn#ZTaiixW(ײL+}:We[窢k“=Y iǰ톜[vW}mL?$VN%xy_L_$RXMe{$йP>D^Ok_gq/Sr"]_C<=*.+({F.^N;ECeqL0 ׄRE}p@/BS|{~@9 Y?]fQPz#Q p_zl1ߌ[Oߥu1 "RL Ы"\O(x))TÛl̻aQ+iz=}z_}3ޮ?'.&8Qaп,c*I*}ݡv+:Ex^^ e 'Q,^m-OL<c!!R}vit C2aWQӘ`l*HXlֈ5ʀ_J.X(ɏ[=&{ʈ{I7`[gPF SOo׶Q2Mі-6mEDZʲq|'ZkhɨTi g+f3NS ;xM,C kӭALjZwR70vapB7KT)5QFc\ j0vd'nqD9hy0LPzMUlOjnsv, z |F:'<;$鼔ѡb4ڸa'WB̖ugC'nt ׌>39jJAVv&qcc\ks%:  s$CZ11?r(} k,zYzU!-[*]\XފWZ̀'.2Dcg>7)(* ]`']Up:Cb9$4ey) S,481=L]m^~`BdzuÐNd8He?-S:0v?t} ̳`v?ķE}Kl!=M&(4lmeAq 2í[(cA -$=\~&L>em; Jq{Kw9C t<IBe\l)JT2nkyl=ub/QwJv9/a<&V"y,hX L]O ڶﭗ0t|<9dP,Iږ=Aut^zr&Zw)Ӿ YB# +6ybh6pZ0e?îҲn\ОCeҶjeR$ڞxC! zslܺ1:ߘ3Ӝ(M[³̏<9!hEOʴzbKIK9QvYc]&x@>OrDK^0ϻD< Q&8!$DqJ2*Q2%{fz'^+b, jZCey}6ϑPF߄ c}-rM#ʘ\,HOu$Y=7/ooPL_8)fFFd,i,-9F ՔX 8&hMUdf34@:D3T8dSZL1q :p^.OY_.x~υKDcCߣtCQ13u!AiZ>e1/68 {;Tp^HeފC`H|2>FJXuRfǺAlzZPVzX@rb5(9?}DlF+ 'yf#8$Gy'YWXbn2wn,|" A⸮׺߯צai>Hqҟkuclqp:|.fIk.Ͻ@z땦.qθ\,1im_}o{3˶wq͈^{*_$.Fe$#:% ,h$@hCǸ-KFT AB¸\>~wcFdStɝofdČ9g0KkQ3[efI\cӯ>ezUuVt*Y{wEߓQٝj$0].Mú@Yp [sPwEشa7|\y^uz{n<ߘճ\LO_.àa1 ĸl>@^@% Zv;K l 4 i$麪kN(B]9P+ոXT"Z,r^m2Ҧ `(`3-˦^yy]V\GƟ[u d p]Ms8(єUP)1=w=%p췼_5I;""^ en6jS ֛v*#3>N-s\&y`x)Wp@Nz58YG;lV<_.{/χ: ƨ &4ܥZv?=0^aN @ϻϐco,Ci4J" wfY]aHSjKw 5=5 \%oޞP(ֱޯת\,2Hi KFD&4 _X sӗ\{!B ,!s }яՆ4+bnB^A7b{f1njU#;?|טfKӝŏ"xz0~ e3/rQinU33| Ϻ 6VQ0xGןe6pas+1<9OsmwOЗ3Sx3bM9h'usG+N 7-A:kpzPbi`E|i{~DMHSfm= E,6Rgף@_9$*k?A ]4Ա^38Y)yK5 ٞM3ԸøJ-Uب>skcsExnA&h )slP3c4ȇ5aGWQեSSV;^x(gGB__9:㳕dLE~0F5c>EA* V2/ z3 Ly,n1[mKS5(oIaF܊#j_0 \*=4ֳ̯$yP;ao4<5Q_b0AzdOq ;:ͽ P wM_vmy\XD5LL %d|7$Ƥl{Q$86ΘY%"q%gf,lv~y]ߘ h>tnޔ0W?e 1O6MM|Oik%5bgzE,"mCjwX LS=%9{o- JDyϴPFj(,߂iQ)0o7Ԇ}Ez;M?)7!.K(J-pV #^ǧW_նOΠV-,ţLvP}L'(O{^$!nW! "#6G´dwC͍ _?Wgti|riΫsGy&:|wڝPi}NJX'D6; y5s +i*AiرԮ 9ӽ9uIȽ[#L]I{}(i=B%  rOVz]." qm S)3Uh3drҕmm=S:p=VoNw}sq˲j}׭en3 IkAШ8ꌽϏJ1)Ę5#LlBYV^;Y:{:!NFMe(Z,WMSyDU؝zgM\ ZJi2ܳ64ޒL"Gf]=`FZRwmls]Wyh_KID9|LK sV/5%$n\.\uXeu (MK?"zd鯧0]u QA N?*r>0XeӴ{FF n$k<,_!JVHƱxJ[VS?Ja]ƇduEHk`VbבQ:Kϭ Ys0y.mΆޞ%_ Z@3HJU+)IZg 5.-rz&`k\ @: ^bPb4LR4#  sirR[\e:-gN4&DV>7^m[|RȒ)DɌ7LGơOᯇc]f@O!>2KKji 9+FS c(gE#]vYŠ4#l5fT`^aY7gvͨyB/߲c^U9yUbLݏw-8 R,LYy]I"͌u sϊ+yk \?Gy~Cr$2!kI||hkp['`X<)<526C}^Pmca1tD<?<%KB1lFlO^(00Jۭv6g X`A#b ր W"U_ 8N׸z%^w.-p׷@~%ρ7C'O֣'XlJh%4 _f3*Nu 3JT9zz_t\v%+/~N>rT;1\\!c lOy{XU铷32X,cE bMk\<Եy@;,ag׉@ȝ⨪i {t M!leEu -he=8'bLH@9 58⭬kCx:px0]bhڶi2Oߎ8F9c!%W=*YSPh٬VJ@JcҙnBVCV2C&~./5}/>cVzYf۾2,ʼo-b-\ǏUUקtt:|r| lk!4jYi=y=֬0 _О{ow;+TZUoߴ+\Ѫ(s%fX8&Z>Hիipl}ֵ{ו~ .p8hW2ʋ=}ֵ\H{*5ˬ$_Kbo۶=pbˤ, xi$Q+yTUUYQZ,Fn"as DxfdUnh[aX.[4GͧxAׯ6-#*YNǣvMy?k%^vCчǮmLkrluwRJ<}OWz샜W,Dk9 fm7m/,8lK,IT3Pʒb~Z/>TlTUzU"DmۭEl |⡇NVږH9~]gYYW- tNF#M.}1d _0Ϙ&4:B},-F~[qEIp E&/a"#C>KϷ`ea@0hIV!d޺G镳 "_Lx/la60# =~U;T }3Ӣ'khD\.>If璣[oHEj{!yJiL^ˁ#d>Kwrpvb%㓌{l*ZCb}񬑀2oJATfL:_֬J a pUOQqM~>Yt>'_ʧp`, $ 0 X-OIpM NiLr=q4Uy4Bd͏SHf8B$#(P8@+*S~/Eර=Ms޴j 1}cxoo=A;J2>WI-䔘lo.V-i MϷ$ɕx`ܸoLusp:uYQdi޳i?ؔEZJ=nx $n'8Hr{p"nRTږעqd4*W:3kf4[/A_YIsއX0$R ߅h%=55E]boj1h_Y+ە(rМZXxaSdB˻xL5d.fޖ„1;? ?j;gmsq~5<{:0&a2a1@ź֞,i /['+!!R<1E ihbg@Š/a@|y dTb6(NY \7dw9\,û#8yzZ.^fadл.ML`ԎNn cիv.QOB]˹R,9;PJP4Ь4u/YZT\wk zJT&\>;mgF3ze7X| OEY SlIr_-z'ϋ³/k0)>֗Q1J ۺP>t$pō9X:s"%}t<m> 8LY|_kYAM'j4n jۂLƶ;+fh<5R?VQv}P ,C6! ½.MuUe0LL5!KaӝL9do#cd G|{la EWJ dgf}M'r~:ܶD1<#Gg,$?ص~󹪚fF|>J4rጒÎyRĴL#_)HYᝦ!9 5W{I uڑz)?d/%_ы8 (c͉`0ZPǶ-Kc?M|,ɗ]p8:X(ij}Y\s1/T3kL:N?# ӶugYWkA5MPv'lE gyn{<qu}:^YFr9ːj@Q rOW"sCKwmտk^QW\rGR!VTVIleY׉`b8xV6 P Ʉ!\bZ֝PzFܶ֗zs_Wvxh(eqۢMM>[ԭ+jwɐҮg#|'m4$YAP3I|L 6D9 uk~͋wj~d_zpN9I4r0).El6ϑsMSh\17c(m/lBⱛ?2IRۭŐW׫KG8H7LW܈͍#; PkW)=B.C['\{ZK=I1Hzo}Z@w  GGzIRMcA{eoyptUx;E@O1xN{W.׭mCg#Ƀ@DO0ShYbVBj9*E=ϊ1RS4(ۃb]yz|mv(.4u2Wi9$qlY:ިV>/3\V2Ve>P5$T6 )w^w)+ş2Flk-d rB|$J405Ct:⨡FwO=Sda\G Yá,||Yj4m9I6:ǧGjMӶ;dE^O3Gf8ϳC[o78?5y1ǬBDAָ*3ky͋%YEfovy" Gdjퟗx|,c5|)QvGS UŌ!"}#/i)GQRv8¬ϼqItC5bu{}W_a}{|bK-[:?Vv3\=UB^e$ǣA@%T87ĀYt+}/y')ÊNq߃(NeQ4M۲Buu8hXV69Ud%;UOg*D?Qz'IU\w$9o-KSrMQJvye7eXhF)/umWAVCx6;wg>?n6fωbWJzL +!\sQc{OLːu Y3ȚѼNµ@fP-j s.J5 6a,Ե3ͼ+%3VegAr t`aUc.;LmE¹?Nq|{{{oLž0oıP"ffi!.H;xzzp@O,pYBָNeRAR TKmBO#ÀŘ>e1jbTV~$S$$kF !>d`cu mYv;x:5 G6 bR(}/L?CƑ`L UVLͺ<_&ogH\ƻr؇#̘Uu:%n+Չ[#PIyG|El4ؚ燇XV bm.&Lm|$"V.uٌnWI">Op)tI5:wdl[>"A 54ds=,Dį(4(%a^WnTDZZ)PX04S-ifM1nM8bL[X_Qa cg4%YW)T_nm6=7Q@UØ M{5:$˘R]`ͺkI#r3<~ϝR˷bjYx ,4}+xZ!LE֍K\rۉ #a(mKa2{YkiZ2zju uM#дQ*<#ǖ6 pFCpbM|@ ʦ:|Zfƞ ~Ny;-@^\CdЫ (9vB]N{ox?uD$.:BSO>UA PLzˠ{l[e<0޶]gy[0 2{x8&I]o6Y۩;82ak:zۅ@2DUyV)g@ wZ,~\ $@Kvu= 3rb[.i|9,,md4՛9?TXXs-!gU7~Jѐ)KZ>7e0A\=yn;xhE. (ZBkàn(4yϟ|$*ף pꡛT(jUm{V`/ 1ǃ-6e5E~B7|oIfWY LqIJKa8zu.8e5͛2NTb!%,wkZ}6ėF s TcT3+5\3ex3Гj+o Y\2%9rYiJ^5vG\US*˅_UY8!Yt#ϣ(вL߶dy E %\)5DϟɨD 3mq'^Ocn-LUTeEyxr jr{uag|cVUuC][w^U<]Y"hJtz-GRbzD!Iq$rn?_p(Z*AJh;i2ɚuΕ*tPkbA(6M\m'ye->M<Ԟsz:Kcfu6 |V+pP]t FfӐモy4 3:m#ʹ-ˊ:ߚ6B.8G\<7 v"ˣ¦"9|^_?|kP.|}NZ޸|{X@Qhu-.;2>C6y\pEзP3y4){8x1yb|nyDLעH^1 W]Fwz H^gͳ66A>%B1 G`jCcuϠՔM5ϟP7x5VƱ7Z 3K`Y0otϸTtBȇu_SAp&LIoIsMv4m@kGΟvzPSS,˲\Ӕ5n~__;xHjً ޮ씲VLhz!??,(z$rI[/Eyf/y7R uyiXP|T󦁈!"LآЄ*7rľ+C!^v2-8@PKZ#77ߝ4|RQx۹|`EC63'[k/zN8X9 6[~z|erzLߕOGBQ15ij4)Ȫ3 ddre =$U)(kHFjGo?K!%Ʊ}Wt|W8}މTNFYl2bPrVc*$wʼGFai?\XǐPbuW2k@kΥ Zwz׹&qx(e.LB"LZj~<(R LB)z@f 7 s!334ac;)&h|ۖfC6N S@5H4&V]7a WW m}drBC(e)|70ƌ861O<ѶN:m!+͜eb-pN})+W(Wljy)ZKa;LS2+Q oTLz}@_U7‡2 P:Tstt'q]7hDbza. bsNدg{eX3ǴWVQG ]]$-%],><^zOm bgYYѡpHj I_76Iw i*Y\4*ZB|fˈKd"-syRhIϲZdmp ?:}e,GIqc0<ǎhqdr($G_y?gz!f4V#ʾx^j\ 9ѶUԵ;c!G,$N0 ŕ+:TM|Ʃ *WIjU 1=YV-xDeJ|dt&B=;߽LddN]#Ӵ<'_́ig=\R҉6'3^=3Ĺ(Rk :g7thW8$ϧ/E$c]0|?~3^9Vjy/;*֜6lE/~m{@}Aa y\H} UasF#=+&2,drE{4yu]"*-NYֶNWGHo}3p @hRNYC5fg*3BYw*X"[n K:|0!<3Ѥd3"/%S^.^3r*a(V0?j E9?W<! 8Ȥ6 rR y}o\ZÔqLSLv4]׶e(&f%I^R_~'lX,m.15"lB-d:.;(/6?M%ߴ^%xlt/KWٹLIّsh( 5<F@8^,>\(#O2=_?Qbxȵς+K!z`#o闁Loǥj1/M=}?>Ϳwn4;@I6"7EQ[?G^Sϟ 0K灇64-%GBvd.v2N^mܼg||(eAY=`s~btBZ<53B|ALh58P2D4a4O1 J+SBma~2N[5F϶^_o??O^l֬'>C_rhC]ȁ NR$ !2"d2hr[z{u[>w Ci.h2_(<&O4#pn0pbWC^ /ER֣8A?^=чEZ*$MϥOωf#C MTP4!Ifj7Mx<Qv˥pәp dj97X =8MkͰS[= zӈ_&S*1No`A!k.)#$$2~ss4nx|ooDYm[,l<~;2n]7mqgc,hfh,H" FTN<*?fu>u_y.ee@Z ,Ss$Qz34>?PNŤB;LP Yodor(>ˋd<80R6ih)DzŧV1EomǷS%YmJid kpl\dЧi4-"k}fCSs^xΊ\LSֳ)Mϥ(r#v +ܛr0 x@Qd2kWUNsgTa Q4l8^ZjZQ+(I|ßאӗg|],i e)W+χWW^0VeZSȐY1y NOD;M{}ʜu4CڀBk#@~;P5w<*4u)u-K]f?txmm[UcԗiZ?|<$qWӧwH_g oo=窢IįuiYGW5يI?B~;;Xe |Qt*iZ>?|7ooLx|^?$ɩ0P -]$ ,kft}ĩϲ c' 6` qR%<"PB?UY06rSw<_.&Ihf 04fPqu5Sb d4n-).~ v>fDQ]d (9~QcX `2CdI "E p " @G8rūMfsjEub2RZ,!t4Z3l{Z$NsK$Ty16pTm̂bLBb} ZvOpӧY{Pxv"j -0Zi8~d[f]Y,6(ժ,~扐Vui4[V~{o=xTsixj].ݛ cq<Ei¶VDL_~}ӧ?~`iFӹRS׮\ш[{(C%sn4~R kƿO_nj}\WEu]F$:U9Jcr  FL)*r=B{Hm 3@gJi/?dz>5~>:u>dveW\>}"#%+_+D;~ww;x?s v=|BDL!Q,=X{T5=٩"Eł=ϡHӺ^뚜#~(|ϻzߓu %N뷷oQfHʼnw@9ߵILϑeʲ(p ziI%$ rRF!o= d.,yg߾}-W'.x| l4ߡ-JXUf`Q$ ,<{6~[{q)< Ҫ{=;FXpEsҜ٥EvP@惿ϧ䳧R=V+)F髯9?Yq?ASJx_~yGx ߍ< Σ̨=g |dFNW_f9QuyNgsiG+VfNVxO?/5yH蓰M{?~oܔw,MQx|?͆[`OcmDJ~o_xnQD ˆ9ow,#h:mqL2!* ^_gWblwΦntJ2WtE]="!\eXq>u]{(}⅜fЀY$o{7prF e\ʺy?n%U saG8o9zjYĬiKbzeT}qA`<3y]wIiA0Xt]/ ̥ˌ'2SeXh꺪<uwȟ8-]]𙱍03̈n08r*}*)*7+˺zS*]%IƑs.ԸQD+I5MvM\TU_oXiPb=ƕplq*I> W+\,TnEqYK(f %Yֶ!RӠZmr}o!8WtW ʂ^,;! ah 8]YIy՜f`*NuEq(xN7PJ%V.ۆ/uܾɳ]?uֳ[.=:DUj(KHOiv#Fy017LjySӧ(㯿Vi kkE|Y8><2W^|tZX=衠u{ X矅h3[-g; PPY*]|v=c9{E}/ X, JgQWUP׻3/5yZ4iq O̦j̧oa(5E{.f[4Ia8& %=q(HQblI0%4^4s \ˌtO]H\hBM"~aZiv{ZuNl |CݬLd\s.$_0fɣ3qi KNSc ša6y(U;͗vjq\! v̀PR" Я/vZ5-`e$FjdlӜg <7z<,#u(;aj)Kt{м62^UҲn}p8ǬsxqXT4dDgU%iG.pUL84MH_\D_Г1>coıBBh́NgxSЦ,I$`ԙO_>,xWo?/@d%2l1} }i |m&%"ETq z5iԮZtdԗ zHDd>ȹiRsǙPRcR; ߋ,-1sLg:>iQeZΨ9v;&e\r)'bAw_o`qYiZA2F5˲,I.aQCՔx$eT~ ^*0'"ipw(Cǣ) nGcS0.#1AFB%#7";O~QK+mrF!e0g8r,_8֧O_W$˒Qa ;J8NU-V!GD!QYz`,Á煆 |&,}sW \m,(RSV}sEXeyE2,6yXsDe0s$Dx?Ghdjqܶ]cEr)G6?E"r4BxRZL%DDGynqb1rIY=eq, ԏm@(/1x'o?&s/? E,Hh-[-_}< I`ۜb˫E"61bqGåu"e~WKiL#;پl ^XH!$>8gcAZJ˞EC3{h(NI_"wU_!ux: 6:hۼa(45zB))UQ@C^yً6VA(?_ \Ju:RumIMd(u]~'|?Uba5:=M4inm],@5bfl.M3% 7ͨԅǰiƠOO\QI*m4...rI)0%4IRmu~^k SƹT}C=݂jz%I 4>Kc.ވUđŎ#mж@iS\9rd|H|'7PeUUe=<8b R3ep|~cyO[\d{6DZajX^%D֝BW%4u}>XPۧ0Yl[{ 7 Bb2̵x[R%v PGM {f^&xֶufmx 7z7%JC<-c(MPʬ(ixdY!N|"b_t&Kj,ŊS]9bAk_o`2ͬ>s%D+#8P۵yckrKd;iYFϲ4=QqIm7WU2mYV쯌.t~ihk6=w<]ϠㇺmL5t{n-ax-Oe`QmO (IDATl+e#Y)0܍"@c=;珇yo6MC\)9·/md9ĔX{ JrWgw .l$-lBOu%SW5?o]=$SUXqEm~P%n4v%x*^=jY>F]"KfSH 0̉߭ǴeACrFQE|q;!4phۢ"#*6ضeǃ!-x=9h4ƷF!TC+Uv0T9@Uc .$aYP+uk:ȇ՞A ԍ~<~յu$iyE&EK-FJs4z)_}珇)m -p8DZ9=gp) r"&'(Ț2wJx2(݋4`DO}N80\}$5 +O+M˛0#4d[בyV1DE?%_[ngyk|U?jo˥,Ԧ) ckT *GEA3ruzznlcC_pzXAm!kC$۶5j'5 M-E↡7`' c$so*gmaV^b۾^ŋbٻX,&`s3R6aHӮ ju}S4MF#ܶcVEw.In*-x gɕ8]>n&e= em;qe}_׌ T'0$ %jYu:^ƇOv!PtBiL- UAna}|C+NՅFIHӰ3!`afڧ2 ȋڮX6>ZH!x.^r\*/|d(1p8{_[*˲X&_Xʟ##I V3zp8*u 5--jY&w\>lk{`+,ꮾUh:-E)e>S:tx1\t&b2l[ O.H$`\$X(" 93(؂W,D꺮СdvyB փ|ƑYzJY09cjhax%:fՙ>oܙQ"Poy`VV j*mWTֽ+׋jd*,y+Em$$j:gq寁we-;ߕ)W*I3K5q'Vz XP9;R7 `6WY.S-/ B/*H1dm}: ә~&lJ[Ro?x.SAt:Vi1CgYwt+ܿj22vY+(֜jPVٳi{D@'fCkicqGQezP[im~$1#gQ}Z? ^X!AB &-Hc:8Wk{`if[~PtEYtm/K%:a,;]oV+aJ SS9ʪ,6;pOzT"c'Y[{V ODuB@F0Q RM/bRY aJ myP, )6,㯸m/L!9?[v~"Odzzmq̲cڐ-Kݺ8_<:}ϟ/YhBa16r[,ʒ|w'*z< A-Zۖ`>׽iB=|f2b<՜ʅ=xgMHi@w<3++̴iWhG4%rj[ڐT#Mu5LQ[[&_BoaޅV[Ca\Da4|BD8E@(ʲA+8VV3qz*X`5_Vu]g"yI{>MDy:P#"-p-Oc7Nf]W/}׭eZmhykZX3L߷-1+4]cY˥'nu]UdVZ>X,9ϣhY<7_\/ DS?;JH,wǣW#tq<Ge)K˥GJ(Bi*&CV|`Q,@x N^T,91PQD S.][}EhS8_qBbaJSGR|׿?{ʔfq8x@z+3ͿbŢ(vj&hwĦD)`Lǟ'Ur_~@un787O;*4ygHUj>KS+:3z 묨= |<hF˜oo_Wٟw}wA\n~e˥GʩBaEPpyv扴2%p)=iuf2⧓ʭ]Im\dD MԦe^ /_}.EYRx$]wݎ.qnecaK"Me Ow,'}/ǑB$O u "N׾ (qۛMI$J6*}H[< =YZnM:lHa,\rCU h(j[!'R2 yvhʲP,KNahtY!7H|DۮGD&j!8c7Ku/)eY߃bL~+[IwRO!TUgd}˲77׺=y}'Ch8GrA댶A_ 7}YPr#6Ixz<=4 ,\l8_ЃV2cSeQp8c4WNLԶW}5}zݪG#r:_٫LV*ɡ (CȬ(_G8I7(-+ ?Xd` ֱ | HqXb7@eY9b ,) $+zXE^Ǻo@UFWn})l"<)5au(wfzGm.\{\fT L\\& ~Qq,<,ϵ8%:+m0FrtE繜BQE536Y2Iv;_~<$H!ͺUZr PhxynNM]g BN;}0lBELGfqjA}$0h5S-+VeZO2(=B&: <˔}>*u~BQ@no!ɼC@MVwA \<8FQSt%LF͗W2R$!p[7^߼ncA\΋JbhBgI"6.o1,^<'c63#Y!wɷXu=nW+Y)bnd׵z3ao$¸C伸fdǬMO򼟎z"g(8Dgo`!/l41p#a ڼ-"ٽ 8 "L4yCuj%SUsXhۦ!1v{¡Vt>Sn^xhG) īɓܶÿJ)YMthLgh z:FZ!gݡf㩿PnEM$P(5D@5P TBڱ Wb|7 u1ɂRX68JDyhvՊgtK'υ'9;ħL 2Kxx0l=x>,Ma|EQU~OZ(xM7umpi  #·sűJu A6w~Qb0Iy-?76RRo#>'U"M 1> X;̛ VO%4-oCBao!ݣ靆YO $ヽ(YX5zz(r^S~T䑼)XlSRg! eÿ́s+m/Y>䞿Gwg[8>!TD@H m*a\r*IJ9Ӥo /.LRSV/q~fj0qӀ98bv .㍣fH{k߷vU#޾gX!eb{V+Nӓ~͎sÃj1dxj|v&Wp[ԼѿJ6~ sn~9oU:"lmɜN<(xthޝ9^&F>[֝Ȼ{UC69 92{S`zb Cf}/(rR (J,("ZƓߩh[2dg~vI>TF9^ zN~ +9+Ԯ5,OY=[. 5S=䬮Ǣ#@(7dN6Ϲa Q #)OFFRש DžY!|>O_XfUߋۘk[7EӞ⟾3uT pLJ!ٮBE9ou T:aJIZi5Rn{8E奒brTE%B:RL;b G{"i."}@UҴP^[yoI&Ip,e_u ߓ$]Qn4Qub/@ qDW*%$ #PiS#མɢ (x岆}3K8mUjsYĪ\:M) ؑ{ WRtl1Y3L^/{VKucȼJ{JOeN  gsY#Q^gL\$5+z9q򬴤I1[m < Pa :xyA0y޶w҈s.ê_?–2%JS4DA5m_{%z*xp׽D*fc쿥fr̥4$^7eHsP,bm}ֈPd/D_{uH+<3Ivm IJ`Pƍ 0$lж ۳ ů wnZS6lGj,'İ٬b P4؝{]\J,qPvk-і,H|e @"5:ۭ=Fi躪E,t|"xg#u]ߟϞ· jU"Lp@SY\:l#hVMQl)E" ?4Ex$ 7dnvA9}&M4lC} a*R8 hj%hsf|&1_vгJdfN!LBxNҧE1p*{eUF$&3F1A2aP|+msU@}y0.͡h&! = "RwHrYzk׷OS;hx7S%eư5%gLk뜟ǣ)ϯgY jP]G$)5]fJ;[=9tcY"0^ɋ٬&>> 8 ] H΃IV/0`cP(6”xLfm ߃ئwMED|"iK-M>X4H+AE h'l莏Vu:M} 96\~ba~t-4SJ?}Nh *wN鈑{V6\7Dy"| pߨMӶM#(!Aد,㘉k`OҊ|!437+<âox=d`-;)N;v \L%є"u[n+&59~Ӷ[n2Hd0~Cuqd׎e.4Dz9Jr!d(Oy޾c"eϚ뷡sR$8~ƌ5yg6; H(lxOVjs9rnk2zk= %eMi1 M`Ϫaz:{ s!82&T(bw(êPV$V+(3=^/-Tٱx.w*4^Wl(b[w==䯰BYxEQ!cz-m'><P*gG>!p47(w%Nz@GױS{\|^Sydp/i,c~ ?u[i\ó'A,\ĺ;}Ҩe^p.{6,|k` c^VS!$dxN җA]y&rVHU S`"(OKq\hDfJMr_a QR-*2% Ni >?o6Ej,,Kr٨ez{clq(Z/6LRb}Cz:,uMCW]I[u]׵z]>9Ҵ(K%MwmpWhYvhs­.,/HRu/qLgd~iU#}|(:ϬhnRDi[xXe^vPZg D2w#sŽp(&J |>xʣqy>|<=I;9f zkP*_kT݃CYe \̛qY_^0Nżxq=Ͽ/"0%a=R~Zݯ"8 6+KEe ֯}XmqȲL,fqzBrWSQ8նX.U<a>J0cz0L4o嚰z$qHOu@geuG~mV< wEeKh%#bkxrӌ\ iKPH'߆2d#^Y^*/H9'd6}Da eQFdq. _S1(I6S>j}b&&WU-ԱR  h>N74aj*LCe*mZ/{Cҳ\Oǣwdq= ۀk0f9}~B %F'"ڜ("SP 8MEPϦ!8Bq%@CCۊ<X~9<wS./kJ,q5>]FSx\IߚPsc}EbmDH<=g1 ӕKC7';tYΛ| s3y=EN|˭l֢.Y-;l<+0\4:OgcR1'ԙC"a]tX5T6$pF87~~[ h< vKHo!s-CXkszЋF>]xEs,լ4reεU8KD3؀bowO|^-Կ6Q'2@t S*.lv[xQfP*<{ekz ;I̋ݲ~!@eߍ$K{u͂(4ŵrZsD9z{xKee߯V>S!eW}A qU|O3cϓ /NRM10OJNGOOVRQ\mrf6 %Xao[AꠜAŒ<=2,q=h| @sٙ _4dh=lugY.r߰$} .eI,JsJ$Ϗ~Z8s}w>Y.A1J녙mFnj͑ e%?|U4b9f/PU"(pӬJ4B\5k([dt~ͽHv$MQ9PD?Vam俥J4ܐ3Btzw@9~~}8#~Tw|0Wk=;vZ#=s֙W{\)9Oǯz{cNURI>챏Zfygcc24 0d+tM׏|u]fw;V1?v`^(d@O-0I;Sf\VIUz F8:@PV&qon=bu<*f{EuZ1/Sh8n~~t<;}ܵg#ϡW6z](򫯶^WFeW_}`?ƴNӢ`.\is;:f[f]ͻ*ƒs,y(?yj 9n_;¬>het=g}[H(Be舥 )(hטҪtv+{)3ض 3 id,˲<:n;(b qbe<DEu$noۭNYiʣ673͊eNSp<)| F_WPnF*EQ:y1lqh e3 }?}oۺNc!P\PqiZ{AQΊ~W 6Vu=ƶmQLȸf*ln+x,@4AmF>voIfi8NS.VAeah&l4Y{-k4҈_K <: 8wz}b{"?Y}~&4m[P->8*kWb^ȜzE, 1Yg_ uKic$,*&sU_6ؼǗ}3 / ]I O1-`1Áq! j/y̼)uATe |x Lzy=-6MdǍFJӹ_H׫sfGQuމ \唜j &LUSXrsfZC@jSJpB.Tx֜$sko!ILd%!H8Z [_!zUW&{ O8UMy41YsInt/ylPexƫ9 @OVI>^_xj?2Ű'ah_Ql_jL/ЬZMѺ6U+Һ3p|+/n9K$T%qס0Ӡ!s\ k* ~`c=6I|s"8^,0yCv:oJ-L[G~S0ۭ[ׅ$W>b$mQı' y6M<)m4$gCL8D 0\6 !!\mq{52Lk uEX(KJ)@yVH} \}ܡ9(^2)oǑ*+Po} H.Xt˜;XYV!fwi2*I$|~f"V쿮ҚW{By?`ԟ9q9O]ѨPsǣ9}aeZ:Vf +5eHiS1˅7&9M+(٤i]_XzJ| 06-}]m){Kݵ.5YW˲Tb4k |1KEis2•ty5ӕ^Y6uBpgX#N{*c`x<D|扺68`HYWe::xKtE8C3(5h$1ۦDc N$!c iy#Mkѿ_0񢠐&PG響2">Wjh6jTUYF2\a8¦< ÆNI E*yȌzG!B47XT86-JW=c 14tTCtG g3-j=>7wȼȡr|vı@,NtQ:.U%a*6ә2gv7=VQF)[5Οh7gXBV!5fր t?PNUZZ^Se§oۡ w5^|9tBMDl~eRײ"Ygnxg!On,)}YqFygipF׎<3r[s)OaT}쯓-, MH~$KQ[p怇P$SARa+g~s9ى9Z1Y$ < Y6a[з"iO$YpoI/>Uן; ϋ~;/h躲 ,a9Nz<ݺ0Mi+7em&aڶip(Hb6]1ģhnW7'nS'HCO`r[8@w١V}1 D?D$Ca12zݝec:D,+,C!Z0I10EO{avs>)ma[cB4 2#sX؄1Tޡ;&cX[GޗBJX0 d" ^xQUIpDVĚ<[|Mb^i(K)f2]i9u ALjHn0p~/X :5VwlszPd~t+4^8,U9O:$Cń`xݴ}CNutDps |Iܳ7ZEmj-bB~$KZfE-l}9K֝O[--%F g` s1#s6=*K\k$iU@Õat?OXa}OiBC@izP GHj00]x|9\}['[kgN*yLj Y,ST|o[NzFdDeHCSFy}RG-‘ǰcx0]I_`W{ܣ\Oi >LǼk1 ц1i0E3a>QOZdL<3eSm[&4-բH.T N%WGd>;hYnز0?[q+*~ 1gl#j7ANz,<k9:{鵤0I\'@Yimm m42q>X"á!{`-3ni{3vP/TYPYk,Ϝ*)2y4j<1ixwл9lDqݴyIYa5M-Te/)l9}8rp >V"ZQ 7J2??3*_cLo2̫:}K}=W{gqG{Xjwдs8V_,eooޒaϤJ,KP-$'%RqzSڃ28pe]\?`fSQݮVdġn6&ʾgmq<σ8)q_%졊 Izau^Ps>QM %xGI/)4YT|`:myg4Quf|y. mp8<&d 3 Oġ!kHic0^қ`MeD[HG*FkVZ0 {~ ޗJU)G M͐Fԏ? {fEO+iWP3ŏ%Iy]:Uj.vQ AHe[^Y~F_tOS\,9P\."ӆ}lD~;d4r^/fv;9d ?iȟS7Q2Z8jlll^DRחnt DE!7 WMf:p i5SvLS&(~б^e Y7iz:䁙ƲS&h)uY^\-VM+HbA3`@Q[ yF ="x}tq}yM$!Ż&_k2 CK%ZHH$]3E &w;vx<2I60ϻzDZm[Z8ըo<岪WIVUޡݮV\3((8UN6;\"#ٔeQfipĵW,QǺG2Bp<8'>_˲4m;nu\WA?MW>+9x|Q˼nxHl3hFQc׉~v.ݳ,۲dwn$_xy&Ҋڪ?xi) :u}>n%X~_13^5* ޾oiɕ>tϟr5dXj]_GQv:4N'HX$.4)Wj{7@P\Uau޾˥a }YUu>KH0dcj(Z.uuKU5MׅNzmԗ?_.CD@ԯɇ1[Du<d>].w;ùS|^]0ms@m/{FR9$Ѩ ipsK<=(߲,-wHailX2DDҲe)tZ7ʍØd4Ey5t_Q_gIα]gH>M)F`GpJb;JW(h$YwJUصDuF\u,$.49CvK]"<_u&h瘷y#ÊJbA Gٲ<F :3OP)dFX@D9:k<%CXn^0t\ F3!h נ3eQ2"z&sg5ѯ&k F,s$9#Ts+]8n݆D21S!`7F[u4 /3#\g +m; 8<6/cڦr֠WM3PuA{n}֊·(rTRLv7̙+ơi$W0Cݻ< [YY?>cz9PK,.r1Ǘ3gi.jMvd^O*EϔehOu_Y2F~G;>9&0}ן62}3PgCxb)ߺҚY?+][򚊏\/czahڶ{47JPDQ]ry8B题e@}8ƖҴ %cOm7hFa($"궭)5c?uu7 x9_dd2OjuR+KEx#QsFq^,u𪲐PK &(@aʵm MK?Zi y5⚈۔İX(<_~Zf*sv]U i+Eݬy1Ey$Գ-cU-]W}LǺ=w"vRx21ywj+YH3&G&r\.뺪<_7MUIJu0@NL!^s+jP ѱ] Bǣ_uΪ({Q(m׭P\;-wr.}֔ c]llK$BMi6[4F+9>y8"ݮ[a<^.,윭14KԞ7,M)<]$4{YguuHR0Xq8 >1VUESh-2IMs8}|IAZYIEQ}- E2)|Ӵ(~;t0iY jh~Ze<ɶuqvT#ԍ@#:-bۭf+|5 _y'Itk_*rJos58Ҳln5#rH⢀j*yjӴm/7h'[<>;<Gᛆl|(DԵ[_ 1'uEơ-uUyl 姸Kn=vHm=x)LM@aCza}c/9a, iABwI(dScdB~=,K/5NKoz n W#agѭz8^ꓵO}fXҜ)KmM{9B7扩v;wf[,X;*_6W}in(.UK׿<%Ep)#kEL_:ؚVVl1} v[+7hz, TKҸ3i x?ϳl$l'ۥ)!,qzO28k?Y%RPȑݒQj?],d4Y:U׋v+C z"Ǫtr[e0|Ӑ{zTlQaN;kqwR6Mzźq k߳/c o$%+ڴEQ^T"8뺮W-!lIӯbL!]~L?"f* eV$k!W]ȁM gUuP1XũdT ˚cY#uq`K̟_.wCǣ<]6&M^sp[Jܐֶ$")45),] @'GY񎁮A!GV3TS;{]~cj}b9i-N1q._t@fJ-sGFfݒ'w1`a%O l?=$F$R7@$ h㦑Gy24Vd5MiMl훸hu]Z~<ɲϟW(j~"oER@aVfՎo 펦W9ii.rl|6ܿT%/A>Da)C~>UATKi4UnO3+c-QKmӜB&yzjJUXgB[lhBR}ZQ:1^2(RD 󔅻N),[/Q Tr %Dc^bޔӮ\VFdJSIv]յLq-~%Yx?ɱ"1Ϸ/a^=Q A#-"RC3WD'%xܤ) [v1˸oD¼B;$ @OH2W+ r.vOS/tu|ܴE߿wE;wӔTۀ!Mi1!B*R? Tv|ҚD?&`W;:Pgsg&b!I+U>eal4 1(ҩ sElcjn)-97o԰mvΏ |A\D)BS ϗ$]ӤB:CZJrGL 3kTSIhVGFL|\j'Xtp G|b~Ex: u٪46: Ehm% Q}e– O;i,YM ֏#(6`5Yv4XHiķjiks 8捑n8$d㶻Rq9uzijն?{< MC!Lݞe6MP <PF{r?>j^S0$gs\U?K15<,;P r2(fV<[2IMSCږ{2%L`(P%rU,>-487Ld<2I|]. 牞kY E8qL?se9H(,b\I 8V\̲+?,4 +\9๧i߇Hw^WS@VOpk2DXx:x6|ϔum3Hx"HH?k}z}N[-eyn3?xvEQH,8n(uGC,*4o@gfO>¼U\ Ii3 -=l& oo*Ey.Ɛnl;}J(R ks)}i[*T|HĬAVUu4J=$fGbf.)5ao]NWǃkp^ C ˢ8O'$d/Hj*"I!G H.LΊ!q:We*8շ0졀{⓶=0PĎ:Ӏ޾ n @&_QEr3iQBq\.[rXG1'"MYXIIa'}MZ(||>N'3f #=Q4e6M]̕{,SSOۿaka;Bbi۾^);p]lOJ9q $XNY T"4m,Rˈ뱁*0n OY_]%n\cFd14EE1UbV˚}]UMs:qD *Wf)9 B = 3:s/ 5kt 3Uu:=znQti DvRՁ 4N0ӤEwtY CzvN``iD%8`n?g_W|CO7±\Uu3-nׅeuR3S ^p<N& g?ᘪi׌mYJ^f#6 b#G37=',ǧ ;\(OO&5vUKYYLYXNǁs('~r#{MC(u:pE)ƂR2᜞wLij#,P 쯒rmUn}?׿??'EѶȊB4M ݥ^zUyTZFsf#Zo,t ۘy@5˶[V%5p(-4 QDќߞ+6MJVOaGx%b!2r6u"7 vt?\j~x"'Q/}3WSfmM`lo:#g=8Ϊ2e\Z˫=)֤9^e>[<ʶiT6=nTúw e~m;K۶y:$+/tݗªQg<>OsCߎ Gϓy)s7~$NBl9m3e]8 ğ :G[U5,kƹ$3r~;?h̽?dޝWB}%&=G Dj {i5!Y3?'m+y?lJϫ|MXXo^ZD[D1S\6ӳ629ǣ,M\O rNkxM3SwՊ=& (B(5Cӧ˥in< j~tzٳN~\p(7~+zn; t_ZxsJjcb/"Pz]-)+w28V%85}e9 8(a)oVݺV1dndI$D6lIWi)RkZ!0i .?0%;|^,Ƅ@Ьmq\d2^oo|YֶdY(m`DZ(ӧۭ(W)Pה~7ӉRhQ]{oBKQ;i?y1EEUxN! rY}r X3R??'ϟ>i=|_$gUwxI^gSHbv]λX;sFvł먮}'?~<~OY/>ĚkBL]X(\r4뺮(2x8|l YLuoGjBQӟٯ~8Vuڶ̗2$G>|#FQF/ b1F3q`MK]{UryV>i:˥0:`GEWܞ3p@0$LbNo$2o"T{B3+ˣ~,zyEV2Ҹ 8ҾYա1_"׈7~_-5~e~!:u(9>~͞Qhuд<RR3X3&.,n r ^8.}5s(h#$P!=o(ga, ѽn\n+qzu;+ab ym {B7]^L=HHel᠖MVbg&swŅrr]uwjamFvK(H#ؘ'3?ilC7M񈢦Y..|}hyGY5Mmd"l5SaD].^o&YUrdBV=x-ItϡA9t~zeMs:M(M$x ׫">3p%3jB}Πmͱ$}; H<0welz9>q4&7߼ .x Yk &.W+!}PeX.Una)(ۊA}۞׫OFf@QeE?+%r^Z-7)ߟ߆ ǻ#M3e47q:ĈX ^Y'5o#3Ќ[x(:#3^Qv'hJlh[~WޫJ|>qSBB2'-tXڬDBkw|Fi>ۤ =e8V` )HrN Ǟ"V!4-r9w{<6}fjniHǝ<\{& ꟩=}eLeR5J_HJ>Os$qgD=:vkxYTh+]/I"}(2 c]|Ǐ/r`2mus<ݾ/g+Eo`ƊP3MPA+rR<NUèzSNϜ'5>"fbHMlR;\+qy[T *nHI{J)sisZm6YF~(m,nR;?B30lʸOg\pg*i?z^3RV~COXGi$LBS ?&~O(Y^ܳ\Bf}Yp8W*M#1N]6r jZQ؟C$5Bz>W2 J}S0Z߂ya/_.o>4 ({zyFÒP/t[5 ^22w).4*[zOjq ߤ ?ՊϜ<|Ʒ{%/˿iŜߦߒMi[A6k\RG\t5aP_oA1uISap,)$p2hEsd^ k6pWsskFO 㩙IkhH, +VRJ ||W"(2:tTİuIRb{,H2_Ǯ#w5|gm:F(Iq5^rDCrIRVh<4=f̜7>0\NBFE?&p-/swM⪦eWa5U=c=F&˔}m;grExn.'k<틅9= UYзsοi[+;' )OyYeyc_ZTRhls;e.__.W΃ =g_(vpS'炥,1Ң( @ȡ>ϵ%䟸A/<%zꚹT"ZB6Wx)Uݎʲ$[\_Q12sRTƱ|C{P]7ھҨ)+=S#aYfht*EqJD}gq:7c΀|ٯ٢ 2/˲O?ҲiۦYdo7vju>nHOh8#AȲ, TP>,r#bRvq陦iQ,5?u}V?_~|!gDZe<#?o?f)_.h^+K9D=8[6x+YM߿~ݘk@d⅖9zm["0|YcT=Mklv6 nXMIRy^]*c&Ҩ~A6 [ʵniZ>~x$FrnG1=4OdwFn^%L֨VNys!9 [=~}{SK~Ǐ&{(ok|o@Yĭݭ-*2bn7O?l8j^HbxPk$8p8N\H2M4L`JJPo0^(,GoM8JꇪCjKWy3зv1R!q٤)]HE/o4}ړDz ?]'-༣)ʮ&Ϋ_K.lwxl&ıGof7t1纞,SGߕ`pR"$sIDATrfD^w^{.Q)0YW+8d#%] ksz!ՙa c d*rKX)?m ŒۃQ_8JgjzM9IPQJ\j-܁9t~?˼IOP-Lzo7 H\zrQ%vſ+@W4H Va'x5J TD<ܶJ3,AwdžO%g:Bv2q: fU[xtIhz6"qc; #W@o;p(5 aRuWiZbFbLjEi\x:N6 +xqFB6 $;Ht]׽Wa ]-o Vѯpx؏LW+Jdy,"Z%QeaqOZbZI3q ff,n"pE+| T?@ܠ&C㪄4RД^*f,c”%˗5!\wnԦ/̹ĭZeYUOE=(ɜQL)M z,/_>}#!,cS)B:Hd$F}߇Yt %9ϋÇ^߰Z% BY)v4y0ZjLj˲(-Q9`("?+!Z]G1X½oQжyZqzߗedڶҶlV.IҴ,MY~hU,tD\k D;M~׻W!rizC׶M#qYߛ: YGdzAB3Crp8V+FN E${yU_~z¹lY'%NX! IqEF~+hѼ?v[U?-> gw]{qxF%f efc&ϋ³CzӜw]SܓKa;n篨Җګ9vl>XXE<+O9^ڢjX=g4M@M 8usUC)scPD,|}+["nۆyNLxm6sA8P3M^ "CB=;ݲ"ON,<$ Wl?|?˒ݿL2 oap)ug!8<7ЪfӾKs4%WK]DZ%= ݶ4NI)ˢ`o/=O3`30p>DQ-16aް*pgxaKd(9@,]'T5i: sàt=&x4a挢n 1MM]0o%'E5cf{KG%iS?KHydFymPa5_#ErJwZț }`X:p7WXTؘBhQ-?;9:CC'߷Re4ΥJ~[Y_6CI hmx<\3DT3gg#Q0DQ3OTRgNt.2nKcg5s 0=?ߜ6>ަ199<_Ւ.>@w|r,y7Q4 hQ'_bEZppfY_{wg9ft(2HV֪~ThJVS=R^x7 }r:Fx90VŸyBɹ_eR]o.'XP}~,m]j|[}ؘe_̋J!6b*,ѣmk [xqB>2ml]Vr sDcjkk 6{.# WmmGӴ͎9NA m{>gYDF_DLDf(LiHeߡ닅"$$"B.\ J&rllT˘<oF (8=Αʮ#9UnxԴl'}e}=һ%Q կcޒTMSm+HtJv` q,Əcw 44$EanW{YlyHCkugE4Y=fh ],jfF`ɵmlXEEa-Re?bdtɓb٢*]di[ JY#/VmU͹#9Hů>ܠUK(*z:Ϧ51ǡ2{vC)"Z5ʲ(^l']]Fc/Mm^=ت۰YL`|HK= ([eD+5vJޚ>O s] %Iizv;=~[߳W!2M?wsdƚ;f0n3EEIU|kInWHoټ[M>ˈ,3BK5;r. LjEi=}}2Z{ٰclٳáRy3~_,70Y$ nm'i8C0X8┢3h7d7s]M166- (b*m[te7 !cPGkT!f]*0!hlն7Ue:a9˅:zx|T~ CsDVa(4Ļ0 jۺC vYVYT+1&n%jW*O}Q_;^ޟYuLPUMWB6W ѶjgEls3ZY`6NB>H_wefXGLD¬4%z-Dv1O_hV_3P!5Tz=>ÏL_):'hl` Mi›Wے\KO\l/Vԣs{X !~E -L{do#ö\.i]ei <7I+u<DQvm-HpVՊW C86i٢`̨pJy+&W[e.6y(W0q+F=[R+ )7+#9 Kph/%>QEUh uxKejz01./Hˎd(b{u]jjY!xIbKޫ2[t+:tBc"gq5sfseA W^GjNNWΨWhӐ*~\^87KE5\֒6=[${O[53Lґefcv7T *g(IQʐk>kyw_Te%0#3+|Ma)R|= -zs\|IҐJ4{^F/WeܡIToB4u7δ(2He _ܒ 6o55n)ԀYeÀ[0f$)Zs|҅Ti/0RL1MDnuqe&SȂ|4-WAR\9UĜړA× hk.>[0lݖYFB]ND@|Yuk"SVP,*ߦ1;kIaɡMOKieh% azyŲorx?(36C%A8XmͧbU"}F.\3 ïWb [C(O_³3z^ӧ)<(18_8595k-*k9`jLCU~Tl2QY-1&j&Z$/<\F!K{,QRC(8C4Ί_7t*]W4zVWE9ay=? $,{.3%R` Qi3F&%",Ķ٧U9^I^2~(+#}(,]9WבZ>'  zP6k;5uW>)@rxi:[BagP&MZ11jZ]+ ڍM<[?@!y&64UDǃ8F]Qp<~OYsm_"g;-, ŽF(v6z_nARp*I4i$O>Lxcј@OSKABh=sfQ?? iNKgΟ/rv2ATUHwBpa:9 w|Ҋ3x<< "2VVȡiFu^kf,S/cZUY #6VQцHϟ/~%dJtɘ/ôJUTU,\k>'^]n(r f4$_|k ʘX# 5hzQ-LC.K|ɺFN?|??vh^ 妉cЙ|ۖqlPq*|,Y3Rs(N_~7O~z5$LG j[[>>'e?JI(YOQqrqZׯ}NMS]zm*RTe+vm⛫g󢄾< Sd% & 36QggMAǨlM{1UH$ F= >Oө,뢀vkGJ6Hsħ7J4kaMmXk4, 2HbMJJN0$o+FLCD)~ѶmPF޴,̲qd71P6vs =ZVDXՖo>LYi`0Ҩ:]9` kR5.I/E&Ȳ- YTB_=_F#(kmTAo^pX,S޶m;k|qLPW'c5TٶY^O^vi}Uz:JCmQ̏YG_OP|x{EXZVCf [7uo&\nMӶfu,f{˒Ա/ƒ0 6cJ!O1xgےH뵮߱| oUGQsVEͨ1۶/j<1źR,I6%bFC P]{}o:<@ %ƴ(GU=SD$ e{ )*tHh>I|hzN'9gXޕ"oHzR߃"c*XO_(D#C57cɺElqAר&8|̞(O\:@xt@!J"dPK|,CtL [ãxqN=fo}J%S_4DoWKm{ =X?J]F9m߭.Zie=< qK.E_|,G] n=;`AƓ=?/ |>[ZDJûE#,&BGy.%v2ͬ`cٯe$`(E}5AfCv6kIF AH:tp9@=Dqþ_Į("O~ǤҞs/}47p Z){Cb\nZEO@zp8(%y}<4ǀkrKw/#v^PN61<"԰oO3Q”y3!>̣~B+ƈK5ΙR4V$g6% u+Ƙ"yFAϧu9h;Jʶ4P5ۏ.U5z^Ey;l&(EE')xj[ҏ/9>nG?=T; Y̖4Mȗ@?BvY&|qםN\M&茓o<>1p~:URgPI?=qR˶֫oJD4<1H|][$[vѬGF# h⛅,Bl[¾NY lDmJ$IYE pQK=5ٻk @jPPsh1K4›H?@”,5u5ENC~5V(ʶ1%g$"6|=r#d>BtuqkO NHrX3XkUiLS]D^G rY(($j[-u`G(7LT]8aؒ0iQEd^[\9gL#SE˿.iBH`&O'be X}245 KD{q% x"ca#_]x$c>QyY标AW3׷g.TYQiRv&Mcc7L.W~ 26?L 9\tJ[17\;.gʜҏW~6äq'˜3M/JQ6M h.KU&H4d LSsV)ZP]x#m^ ͞{ *) ^D6Yx-8uPi{Kon('^=?}xͅۉgW0￷¸0%xDh]a}6ý[ ~==t ωGt n۪{nG*6ImߛƔL!n${:Ǐ?7s|!oh?t&m~"%o&Z#I<Wƃgd70 rU }4L?$0N!\(T]wr'F7͝ un'g?~T#zFD;_?i4MbUu[UvC[!f8 K]çO?{Ti*:~A M,xN0V??u8}KF6NSIp* ]PF4mт浛-MvzEq|G4~^kѺm[ )窦ҐeIfcגS[*o E|\Rs=ZaOsj^,Ӥl9j&rp\Qۻz]C=I>ᨓPfÂWUQyci o z]EtKMm׼K%+?H!\vFoa[w)iEB>~ڶmg|sKq.:`3'F[;\[)~oCE4VM4Y +7 }w+QU}xnjQ|Fo5ҟٗUTw]9r]W+z*Y<c]ɲsLJ9O?Y\i"lXWʋ1FҖ>M8GJ_MψC+ǣujuwAzwKY~? )Ѷoo/]}Fĭ,f/K @pnahFo<kra6s4]}Um;"Xn[:V=PHzf#[OoDۍjUm~iyD SK" RcM-$KUggg_D6%|]w$/[zmiqO e\qqRT7#OT?G!DL Opvm(5FGIH/gBh 8j >zA3$8koI=Ӟ2I Sw^jEAď$EqmKb@[K{I<>^nvnyJK*2a_j:mڢdZ؀\SȍjSY?)i(΄I2F.%L]mXamP%Q眠0O)ueR1&;l'b^ZU{)=: jIeLzyE,b`߉U"3d];j{}s$z{V(mJ>rM}Gߟ3yԎ7Kä&ְ|-ohg:Vb{oKЙ;С榹}Ӕ$m; ]pZ&4bn:M>좞Am_Jǘd 7}N<]k@{o~xN;2RN" bK.Vq8D<+JϢy.gns!>/i񪶒\}YϦM u$jT2t|*_W<(bۏG^.>*j*l{xBfAbm (d].q1হӅ&'E9;G]N_ܷqI(~bw!K")~7>mzNY m#Є 'va rg26.K~N`CQ!\\ gBq_MpX"_ed7n< AQ0mZ&jg?w[{z'|Lʿkv^хwgMۚEHwK | uY][;Üz]+O n wF$Gl,/3nAz050bV=+QAO9=կX Rhig_h;x> ]n> m{~t-y |2Oc}fgascU/Ե%7Ws.gN>V~ & u8t<`}a]1e--yQUeq\UfVV% @9!%;07 R"T0么S# b9- θXmN2yNJ4jⷭx/ųP /ɺ!_Qtz{9 sM08V >xO쀢~m׿^~}oPF#jn,ŰEBC}uV(:z~\<OM!O}W !U~ڻV=pLu P#Z21>UJ=w5X VxaS>`+dH#pO-qfԺ:MQ;Vv x.iq>/Ha =5{(ou=X?ER/r֢%xjZ R kyIv]:hξ"5SzXǧeA^~Ч5i4C}+'8%XЉwq &KQ|Om*]ҧƸ/[ձl%H EJ(%=j5 pWal~yE#]a8^|~Ic ;bvFh33*ֆnH'cNi+ew-U{2M5ΟN.l9cgl6/XGo =I2앟SU*})Qѩ),<"aaiLoU?8yUdg ^a '.Uzȁ47սi|<@P#EF~~^\2k,ؤVXUi^Q(y._˰il<}:J,ToRq|9ݞW!(c!mQҁ!^DZېՌ牆_|mramlxlT5zzj l1O`WNn"Y@2uh07Dž08(AטVRLP\? M|*6Zc-{s%|Yj܉qeċsZͩ!ݪG%O*\,3H oI˫IW\u}gmn9v;ֲ4@~z aY6]Q dzc:yisuQXHC$u6A S8˃ ֋f|h~THcڣq.g=/Sk."IkGk%sӷ1n=<< ʶ:I"W[4s<kǪ‰,QM+k+[jđOMΖ9LYQ ab4kEHaO)0g%Zx%[q8x?P2s"iO1vuıw *20sIҶ e8GB|áĹ [mu!h@]ƴj=cJ};m!TW?5e;|8i颵_ZS[izNN^7M_W#>>/-8b0ma|:3_ÇÁ'3}{)1؍0|bdYUonI2M1~8h-ԲdI߃:Om"3eYrn6,K!q8l=|f'Y8P,o'Ů'#&cz0,$=]BE hnJO,8L ,QEIq>9Nа;|61|1IQc(,\4Ge}U4M(:4T籘RXv#e5x b~ଘ]GU=QݖW+tz|5Um9a+x<2?Mee4)Ĺy#B+AUUU1hm?ZB( ˹xƯ_ޚfg@ $.ǺiY*C2yx)iV^$I!ap5Mp B bf^sT4;Dtݾ|qh(!I(;ܕGg!ׯo1 D,QDd5 R!׬m7 mKjCP,(.`Y_};cZGS:ap^F~>kK`8~=ÇQJ &8`uo~D18Uu<tՃHTUiRyZ(v;UFlq_O'?y MV^6kUosT<hMvb8NEmaeXCBIz:SıӼ"LQl׫Ř<*2T~Zq Be׺=;]Ok,S^q(R[AHzYCi`<`GBLM'TRymeG48 qyEۭΥ; 9rQq=R(vâyCI7Prȭ/K)3[=,dYq{e]7~4ѧUJr9CiGQѶ^Z( 8GeJ%' M,ֆz'Ő)꯮^`iSo2Q_n,mq1vRſvDȘ4"]u T0"F0k }=t (\`'#x1OP&,V<-{YA8k(jt7s _Mx-iQ $ au 3I-[뎢(B$8,<~ 8I[DAǬAGQdi؊-[2m|KUMS M fJSu''Rq6IÇqᵮhWp7M*HZJEE IiW"~9V=I&P؎ |otڦ2 2 6y=tRV+|U=Fb\dJp=8NݔJ89vGlJ{A%XT-1l$ɲlꗁߚ.7 V˭ūCa"0#[Zc.Y$Z-ޡdbqe3&90,z56~'*<B2t˜ǷqϏWOZ\C\N$+ *IPTBru9ݒVeO{՘G݌pr9qq&Tʹz8B4C'+uY*Dބ+ow4WOȷw_mhBD4 a GQT*gSyՃ|53.{z ~iؗ| ,:9T|HwPΩaJjϝ{sie9"0)0E8ﳌ٫fX™eᚷ3|}ѿ$ؓ\uixWO_UZP>i)0~gFZF=<=ǭXmFsg=gcz"8K-pQVE4& ܨn6TcN"dQ:O*1$E)6uJzO"R-uIBv(2YzpY^~LJiıTsD.Ԉ\ȐIbFI%%hs4 d{K4ڴm҂~'m% wςF(a0,c],t. $R<+1 qozWP2PbGE-nB T2|7{XB!ےF2 JFv>3T7:4hDwTөTh]TLW[*ٽ3k$=eXH4"jV![>c DOB[[@,̹iexHR}1whD˫|n۲)9W{#Y/Z~ңjQk2qժmm1+vT&3u4홦yN4@ 6/}T/KZ/f2#ҳZp(`<H._̡Dq_>œN~,sry,>\/*_عƛ09"%} uw,nAYK=;D!09D>u.GʶhWqbLv~Wԍ4i*zj 6C/bsU4w,}6xp}9gֿ}. ,ŠPYWN?/99tH"XR\68Z 7owK|$8K/]/6\,!zV,g Ygt1Lw _)Ԙ/y; hU#DOAY&"'-,ov?rCǘd.iIc$n^% T^n>=i6f+t?d.|O6dK#YgIckQ}Uճl7$VB+Rnzn<-c^ػAzgO+omh? (x*"EI-*d01bVp~,8q,ybǠh`MQSUu8*Mҭ*?>1MXC10_w{ \ƻ8^ppH8D-̄bef  5./毰_*@xܩzU40҉QT&+򚃅}woq[slUٗ0ln*J[ YM]/Ѧ¶%bies4>q>EN\M|yqg YǠ%GȮyJjsږʰƼ>>j%R*/ %3ǚ.OGp,a<ٽ upB$Wmۍ(`Uielx؇wҵu ߔ@{EC+CѾ-1!Lk)ſ/rra!X _^UCq׈5l"QA?D>-OAE"YMa[PQ&)&3m1] Cۊ^+mb@~KB;<┯N,| E[Cә U<v 􍅂=V +qg tI|&2 smߋ]/T6IoP3Nx-j {"<9R AI|2Jm1(ba28=)ʙ~"y|9,~&H"8T98[o:ӞtuӒK1< Yyh| 1Ot5.~tw ˮGÊw- _}!>Y>F[o9|,,ogr o|Rhe_2MPj>}JN!dAH}&,XFM^u|F!8@˲[\iX0P&1iDk%#ЁGPovWw8Tg^8oUpgE;Dð,ғJhy?֮rRp@Ѧ@gGE3^0 yκ&ј[KKWy:_j?DZmuFG i|,uq&58;ǯ˕''`Ր E-s)V-EQ4-@8p/&T4n\/ߤ6aV+HDJX Uo~ݜKSwf .p|Hfd"i:N)dBxbrjV1 S]"D+UUKOH(l؅·Jbq0|Aݖv6'R 6/԰EB`; -`00a*,,%Y8 0\8wn:˸ЫY&ݮצw-²d)eOwVT,zcQey8|E#qǰ1Mw]&IӤi*Sj]}= !ݹ e)2Ec`ǗYJZ3B0KF#ǥa}X]Pz`XxSs$-ⲢP!Öe[Y wں}^^\%% q7w{]l gףם'MDh@$r BhK&w|gHO wZH%їȓ"vlFgt')92lY!ʐf(NtosRr{En8.aɖ.2ЖƗ-?Rvzs* ˒#_0Bl.y}ZxTN8>^&:XV [T w"E4oK|WI@*YIۦWUÐ4Xn7=q4][}i*˪ki2KU8ۯt'bwoo})_m_RxVrO2]INSXW, ^! }Mg  's~ jy/AHR0i%Py&jYms6HiaQ=z"!n ׷t[2sz#cɣ(ږ!|, ńb]cXMc mIW=^XvC%mAد\ D̈+rHFj kĞ!%);M J k ^"}z%'x{ne$ѺYFOεL3k/%$}c5^"8"RugY.23T!D,S-eTuYfA{vF o%q=Yl[?eyiZټlW:Od۝k1o .4(K RlPJF쒴F#܊;gz> mjZ S+_9H)k⩚HX~_%U 6! o$np/y6Q\ԐÝedlYj5 gW]_^#˒ٚp'\$lsM+B HMi+"W+zZջP!in1qweE#F&HZuΪ6,^z ;DzW;8}J ȦN1Z򱂤y[^EUGoI`){{^EWmӔLxwÍ\r=2KM\ߴ($e|ŽeDӶϲ BdV~9gmu{Y荱ͽ-ku3z#r7K&&lXiq(13>-4luUǏ?yo6I6CҬhZEl[m7^jb޼VT>{~a 1B!da)-d, 6BN6wf#%oEuȰl|[楠\K(>K"tQdO$PD\k$r̄)ieec3OE q@ʈ@iPӶE!:Ceܸ0N<,@͖Eh8Ƣo4ۭYv!{S畆7^_Iu!RgVv-M=wnw7 8m)7U,{:Q_ FJJٴPHAnKc 3.ʢ%CO.%)qE.xEm2-I4W!Oۊ倿n{X ww_Ng K:E 6‰>!tImg24MBWhZNؕ} N0HmNNSCR')h}y"M\^ӿۖ=O%QY#7Tn4ysλ>bGP {iqe=%-\:T* c@xfI$ĶJX &C%Rקoa }NV V4n%+jISZ Ceu؜O9y\Ӌt,Y{{ZeK^,wN/mxexlT{.R] 5׳]"G)-IKƣ"t8 =п_Cűq3+$_=jpLtP\$71ֲV n!}䩧諤=fq9 Jg*'㔂‡C2p4Zy3uu-G\C}u'7,+ b5-s* B] I/e!az#Pԉ{b|qC2 sCQY V[:EzDVWFSOgTc-ç>4{m QSLd -94`Ob}Db,CQP1#v0Q+eKlf$R!BB 4Tx\>#vaS4)^ ÃUx\rS&"Uʤ=o$r̵y"9tS$gX $,mshbav5,E3sEo4e߅7;Cm Xv2(nC{[-QߖW@yT\!/=^X Poa?$nE*,IX(3Gz׼fhGc_4mū%(&o2yyvHP6%ǃϪ-{:cC@zWO{!`vv'歈gߊJBI Vj0Y1P<ݥuT=?<=sAǷjβuc+,)vX?:Ϸ}g6q4⿦197i+pka%E*ynl;7}V$QI#B 5SuI]MPקJq1E980H}X [L,4~јj8N SҶ"0 5{~UEbT+5S+ݭF^T@|s(2Cܔd9K5cLJCNIbVƇһ~GdžJBdX'wԟ xKVmB+I<DO`d^66ssS>*b08[}pϣ)>f #^~bFҨ⊙+>oU|ji)u{V|, ?M}Ib,YRWHn1"F7M5 (JX^EcuZb%8>tJ3Mb$&6gN|UF; #ij`eXR]"O#Xq\>ظXBVBSL({} )I0L~5Ip颙=#HA~S T 0zrxb,)}(Y?Yr)P9*KH%m3)٧܏ȆX4C;;k4S@M];s`C~ xж~3؂ʽz,;MiwÈAYj}ƓZck[lφ}:ALɡ&:V`iJC$Wh!C !8 Oz9m{>׼ *lN#-NEʪo0]XYI>)I8c2I%`/h?(u$wTz"n}BC] Mj5$zLUoäcM8.q$1Ė-fRzi,ߗ9NDJ`6Q*~%7be1&!t/yQ,I@,U8M^Rr`5zw'wWp[T'TLdsp[uÐeꮫ4$2"YI⢕&RׯSy:v4GTωzZf,&<m{>VK'D ȑ@˿:IQV? y8ZLꪮcvH?ÙHӢ8WSɲu Zk~?L,|4].>eٔ8m]$7F 9Pvv>w?4 C m&u;/v{8<xrQKr-}a(w!湱yw 8if(z{7v}4fCҁ1JqZ.ZqpLlLO۹yL qTsx?T4ux~d`>1vIRʎ<ʰmw*FEuit]ih#j+K)0'+%-T)^(7dz]Py҇ܣmuMcI*smj?!} 6U=j E,c%c X/ M9m84a/xJB- *Xl,}~gυAY]u &$iwu *׋iYVp8,N<0 'XUO1,R2:Z)v;s2qn +p8|(Ҕ_c@LA)6ϧJKz=abNi4ӆ;J\T|,2ܯUZ1C?,v"B%\RbIDATľ < G?k$!gɗ`57W7:Z}~ڃ*&UV ^X<@&$G įemuie]t^l!|R^,—*6&246 vXyXZ#>˥Vu ]]VE^+o8䲤)O YWMEEoxX-u%Qdrpk!ifO??p?p?Mei!a Ijek4=QqE?_ ~G2dR:QSIkȏP|g"FUA}v"B(IMC.ݮi_A(?Ϳo[ݹiM6ŷ<qQVJ YHYO~_4- v[w~!9je$d!J7?Wt7oߟ%&!kTiEAu$0Oum96'?EFNoޞLT_yZ8%D 1)?^a/_џ dPzdRUEؓ1&9 EQxAVu>'pJ̅tIa$` /?|^~^{|MӶ>O|szk0t~osklmxN /_~w>>~O_W?O.'K8G Rܰ~>5W}:-˗z?)ov>?VumJQzjМ#<&8տw_zp8fܢm-???'o3/D 8.YfruP_}|:鹬?](iv*0f?_xzsOpbz*|LFR6> M7ڍ#Y]Y^# .R󑀊l/?ZC* ,ϧ<1￉H$|]7Msq$ĦJ :aFQ2MN,v f>`jۺV:MeG\׊YRų(J %r%Le~\{]W)q\rW"ޡdա+vNUgr$LF45ijY&8FU,0s,\tT۾XB&3J:9F$,BD(.ᯯ*yqTb"DbroO;^ WqLfUf~-8W.nL,yg+9_}{{=3E_) %yP C2J%4EmKwrV#%s$tmPqC;wY5]5h)W&٢Ԗ̜+.HkȞ;~~)b鋶Wƛڄ2 n6zmTM_gwx.8i,4P?R:(6F7T+f1T@%Qͪjw)n@֘XNtRjT@8dP C(|pHӲl^"Q֭zW j\ Ek] \F(%ه!Ҵ/)Xq =H{a탐"qIy޶u-h?7=/x:,˥ݤ}qosFÐ_!+h<'.I=e(/Q$Gz'Gk[Z^H-E":H<\)M2L݈6;;iN+\O$5хtx+׌tV#o*iD壪[ GNDTgOڜ[Bv E=Վ_SCE޸\Z;!M$K (,2G$V}W'\?zm'ZŦi 6WPnRDR-T0*g~.>R޴X6fyk Gxa =7ўcBge JE1:4YɺT\I!Ӓ- ?E"r obTcH8Rr3qS[xR6,k^yH4s8j֞/>L{bj~~m1F+,lZh⒣jJCR{J%_pp\`PC3ږh$,˴|<(b9{4|uW4\\(OzPznDʺ'V k섬Qyk1M[ZYȲ-BِW}V}an6#iXBt3UF믷,'^'UZx #oˉj̲V+χS1+^ɇXa۪2mN<0ODߞ둕[ܛ-0'l׳^el,9USΟ3jC,>RQݕ8-mQ9@~K^yQ86eC Qe$(h'7M]͡ߋ}:MAp7) gJPrP B626az7Lus*-(7~5׽6ݽ$v璩Ws>┰/{G3)"v {3\LS64U% 4ep'@##K)m;67w<9)l[|W?4-4WI*^4ζ}ae)3E8뜶U޲lIS_7e~aRO|D?sWfl-%+ϨDdH@O|m*<˜r*r]:YW3?pN8|X_Rq8n? 0(R1> <Jbz_+ǴD,pQ- x# T,j^mL%^#JرKXsP"&* Y`*ڶJ~Yvw) ^+?xAbsIcĽi,k0ׇkRWOt^i䵈MYW%lH zMyNT{!,ySY;CM>ݲcM <\pʧؙ7AJJrYo}ܙ7G8{Y&I"hlv@a j=^뚄5>w#CO ziȇCU\OIaHͦ(%gӴ\|M]~:)PWKoc0Z bm$uy j'^" K(c Ӵ(e)E"F J;[~Ԟ7.ˌa(p(ܿJ2%(R\<|)y7]$ iы*9)0  εPqdPM(GAbR1b5s&\+{fN==K-JK7$B^dj0`7s_< \g.ݭ?G~\]džsUD:jCE-/*O6>LIBQ.@6{.qQ6wn`k(Tu}ABG0} R$޻>1mNzlzZ25eO3wɱЍ2v>RnE<؀+66@zB 5:Sۂ$avH߅ĢbἰE,O헨WWQd~5H߱c`Q5)߯ׯ_W+sYZnxXl|[InkO3DQםN5(2A0-ehÉsowض8n|i(tݲ:6á,Z\VݢR<\tU~/JK1 z˦+G`1YI(V&tI %6M&'րY]QTs"^$;ЃspKnW܉'Jqĉe5Eu(UZqE+}C粿ޒ#JL/r5i=4\֎wQ-74~4L؛0J gƦWn\M;it~A^("$>IڏO-LZ(xBRS8FQ].J ; e8IOm}nMCqng=Q$㓄\Lz~/?t5.foK jն@QIy!R6$7ﶁi*_XI,W^.͆\Q4 rp|z4ju) _o~O[B F{\+ʡdSgX A$4 e :%'\@*3 j>/x/+ϩs@IWFdvN1EaZRi2p=13e"y3$Gj5 (aHZ%;V Yxk=Ix*QjҮڜ(N ޱԐdU-qf" {r!kߗPxّeqLt7]Z{ӗgQy]7oTmHVYh%o(uD]sEo ~SQmceaT}ʰ՜"քm{x,vZAŦbR1pdmCހ_FmƟ|e4vLƏ0rtV+o՞ t&Ɏ\:ÿ7}\sZaQ漆 %E!}FȒdgu,;}wiy)~Hw~Z /N TOh#'G.i|>B?o {Y,\g {0&r}D#Pڍ/>4 'ۖBiz<mCOYt(hUnz>Nf }8'J~3q 8] xLU(-RP/?ޮg7D-(a\ܖ(j~bzdͅ*I,WF//]VkKʄ޶vNȢMXpy^Dq,M_*9ضڞq86( sm5H|z4շ&0YhXW}D'*wR֊tmb2b-uBbgڲl8y.HIV+$z\9Cf <ݷG<s 0)f\AOn`%$F 肈`xRԺ!ӟ>{B(˲DB/oܨ/!k\# ]&HT Dn J5Y/2c~M3:ωEHsƗ0cd74%9V-gԍq& mI[;:{H(q\ߙM4B eQmM^a2fexVB>fR -92$?0&\W44IUhEx0k"UJV|}o4$E|)/ch~;!+un{ ΃s![JTU@=|<.&0;5hEm_(~㢨(RJw9D FNŲ,Kp#,{R+jʨDa4&/^l 2W,$-Yt>0Vu8?|EKz{bQu]NJFWSAcq5Ad (va& ~b%~V( ^k~E=; ǧO?H9e$=fY6Qm60$(tM9py/Zv]UYOk?rW^קF./l2OQD81-r%Iݲ+v!t&^βAC%vږT}$hͭ=tE ,KfX4M,}Qh=*e&hn%&s1lp8ij5(D$V2MC,и2\aVD8r҉+ycv`^`cbQC0DȬ%A"{x4`G-]ľy2SN5*64%"2]@yPݚmpYn=ha@&I(1Myeu wɈFf -Eժ -v T9a#LJ zdE@q DzTqD5lk`w\kzFE!jjHYTDVq]M+-bT=VQdmO'9v޶Pme/_VaX=; ّIg7\lqC*1*f=H$1IDQVR D=RMξ8j⸮n ?A[8Ê={61%(E,nud(Y,mƶmSGvkv+(N]aџ[Lbu;<;|Dmv;Űub$'`QF:tJ%{h%(0ҧýu4DՙMmv:1=*Ӵpe0$"ypuZZTA Suգ1i#uj?hdɛ!vDWaԭVEۙg׳ș aei*wh[ >Q $5T>4 ILHRŎy+}<"1If%s%u `&$oAJg5%(0prҡaHF =,o>&cI3&(e%8iqtS>C&fNhQ)p7Yy[(bP ?e|zo_!<\Ц ̲wNWoUDr*`k- TyBeoKr(ݿw(\hia!RFV,gĿ3D!*A238xPHuP>|f]_}I.c\r.Yu֌1gPZ8~*cF|Cn(FEh+Kܩ^Kr F͡T,1K ArW: [|xKB2#E(X>s]us%v٥y3ZSs]Ӄ6=2HF82@lP=ȯމ [`^'5!/`k}6qbFp_OaQ{ߐfUVԨRAXeEމ: LR[⹾R盍J+M9t+~W4LpIҶ* +uxt vTY힧~y,fQr) 榛Ͱ$_OɜE{ >zLԶ$Č7~ڈ5ljD tWI SiG[:(,/r*vɕH<`t?DnidrxБ!fyDϫyU }B*m¨2MtcReYv6N,d+GF՛rqC1S*R8>EB|q)i2<|]ҚJKOrRGhwSxDW74'vUQM)d5K@@3~7됺(wHT9:Q`kOd8 *>4D6I\hIyWcn!AɚA-Ζz{ΐ, .IYaNeYfr-m9$F)dO0?<.j5M4e Lq'c6 4HLCggek*vO /؝ljaM7 D_d-m$N;eo2*AȲ(wVF>]9 xiԩWBܟf8v]۾yK댉4KAPPϵz- q+Sd״sڪb&{h'\ x(5˺.#kJ9LeYUu MjidRr6+.Y|2*9OӉc5rjU. 5ZVEaJr瞵4v}Hc G=wp)&P,)J2Ie * ,p].{.P)eu|ª̨`;~8um!Ia ѣ: d/ |Kiq I(:i~T8ǗJ\ sTۭqy-z[(I},8׷PhDvYV(1ʌʒb,2ƁjHHVXQE햦8ÏG^WJ]_L454 ܛ&!_qD9~%A?X,ܹvzn+;Ex tck]]YBfd(z+am8¿.|0{R5E;2ʻ^xĒPψx_8[Ip{&1zqo$ &[ `g2+'EGԼ/ji xsY3ss֯/9ZfiHf`l ZM`88T!ZԳ(.4,#=BvԇfT#G&y"-8,R.%$ %LbԯyTvSD2u-/b!o^◤rҔs_9C]_.BmUQӶH[qM#lu28a׸kdlTa4E&$LPw r{ 'N0"5Q/T=ih%&[ <`5f)-K%_p"cV Iiuv[Dj=*5Ӡ$Rض{JaþQQ2hKfڧ_Q( lPсF #0I}U+TvfHE9  `lOʈ${sFM("ZZC ͼZ_Mf=r|ǾBߌ"9dq"wfeUXR4 1k[=qӉ{^￟NBTL3޲Y`ңƏb#n˾PQͨoPzG3Zh2G~(zn_=u AǨ=kAQ'nB36zx)2'8őc`S"ij[>S9s+Ac`'(=qJޚ.0 oLDez纾^A2xQLI=PuQj)Y,z5 yWQ)ܫ>Yz| Ɵ1#=mbD'&D",?xNoj0-CO6 uiz?2+a14J?LjqŔImuwBoUe* -b~K _ Rr,({;d=/u4^1hs's 3=07&Lgiaht}Dz\u%ԏGs}B %B{%jCUe y^}ݷO+|B^Po00jDouQUMyb.ToXUE)K3y~Ѣ=ÄOY(fXylcYma;v"Sm~g*Rsш5Z(@7ld2MlV+x&$ pPMuqF%26,[9m/).͢-!RI*Ѳ: 儿f1M@@ e9z%`+<-cr8P_i%xӳ$k(|B3wUScdaq]>",ȷ pH l8 _MbyhSIM>zyQXyD#>9NRAjC&y\ H]:"qFLj 3B,Q 8!M~ '1n@C 70.V=/%%]ecާ5hQ-E.me E|%\fA2s{_}h10-N Rյ>ӵW_m][?k!3Y?Wט1'Rh-2|"@ "/Rڈ<.{հ1`~2ŸI0x]Psq< r(a fi?w,|=gg42Oiûx;uK{`n*ƯZ%Ocߨ<?p7/S^ FLk;V.U﨨 6W%wk97j-98_8veP+9Mfyt]ܚ4: hكa]|\vrF~%]h(*ls?9Zsk)\ Rh)r!M4eF[f3MSEQt:]~ߗ:]BQ1ӆ/M-r$CJmo7nkqB0eMr1t0H'VX"q%$RQbR1еҴB!#ji1;Һ\iBo%bĐ*'[YK͜Ohc$4v$dlժqӏq4粌cq4TЈ G(fc5*=_׷w޿^mڴM9 d 7:׌>}%\T5MR ڐ Ox&jר{,etʲQݮפgY$:?o?OԗǏ4B~~%8& E4"KN+ϲK`=G% ç$앬MU lmW->H4ۥ8~-K>Mt=3ezmJ)yYz7}fTq|8)ӐɅ26Tz"w YUP~;񀶩i vsd:wXzx^AJy/xd~m-) Du&ܭC(lԵ|$l/ >U(W2SjEj|% dJQ&gBN,̋(|c݉P,qcY,DCU&wi`bW^o6~1;y&mKae >xV_(lҴ!MkEi ēx[1X"}}Z=IPXq\s*Ru=NjIwQOUVIb7SQ&Lt8Z*oRUĢs<XeU?JroJ{*sH%g+3?UO`}wp=HŒCij S1aF"#>dƪUJ{I;Dy^ eR ZA5QXW+RTF󬔜KՆ&̾* BqȁnH22i9-|3J7ВXI0|(, UuM#b2zv'jAV՜ ((㈞?ˊb~[!W8z|ult{<\zs@MJ|pnS )#;TШ+㑴gU[#Sگ)7 ".zh^l)[5zSDca-9"Û\FaPjO /9vԗq,|:ubYU-M/4M~aW7Ch$&$א6$8\zeR 햾G:]3XV*u9 x"__s*gif<ۥjgSE|arawpф)c-0=E휁jؘɹА]v ÷LȎqiie2]7vthSlSO]3o G* @nھjN׽ wx d]"Hq:0+.,SCEk]DO?hcɲ%la8ls Uj/rZzBF*/ah>t:cOۿmn}QEU=DJ`ciw*E aΕ%qL[eU8m<0Gl@, Z[k4u;Ҷy޶}$?;6u2Ҕ$Քa:sSA#CF)% gSt1(SjMs?B-(Թm_iC`v΁LQFNb:8. HRC_yNqw8|yN)"[v^$(3v¸z6PPX$4evKCa,3М:6cXc>[ʛ5x)-xW왋<Ǖ^?4, Z<}" ꋦX Av9j[D6ZZ 2:e)GF/ŷG ۴\m{-g(s.(v;z7 v]CTlR,]˜&#d",t-92rN]'U{-б?'ZԨ)%;R (Zg}S&HvxӔH)[Hp}zW}7M3mT/ <0:. /|UX,Jϫj~h'_ol͗-VI/;[6oa>wzO1j8+5Z"%CnH(Id!EoT{Sc{\w,V490>N*GТ])`H.a:导!s,vv G89=CY]0z ŤkTO/J#!4}Oip젗b=UZV(~+`(01+Rszp!DԖ2 }/ d޷ҢLV-O2?^øs#5b,SZ6-ZpǾn}/Z(:SХ&g2e* Z=OX B$1(jǀ-8EO6 eCDy·JmˣT^lu{Nn6MYqkaCжY1/5?"pn3 6(i4h)6jW 3}o1O( 7;I%0vv'l.-Sr!k@. [ҰugxeHHW mҷp*9αz5JS95Eu- +O0vYxxDeY4 E0ϣ *~@4Z׫0 n߃}}h4,BLǒIhe@_ÊM}1) w Ot&"7Z PJS63il2itqR8w4yםόJ\ʽC!~vxqFX!9]G~,DX",?--"Կ"マp+܆v!͆N.4Tp9R;Oh߳ג[黟vhTuSN̙fB)@8#Ĥ{KKM4.l{DsC;!Yq.C{[rQuvd\.aԩ4K5l+|[=JYaJpQk( ,Sq|Uxa\ 43`UI4)M6GpX|j "6}„0}R&*IkdzJs%:0 Gݧ v ?OhcQVͰH%TVY Mct9v˥g_ZkQUifCQoz R<_JT.pOEQ!:C(/r~}2+o;(X̎&E%c Syac<߶+ίM则=KE$g_b<| C5ŗQ'}iˁw<){UE [\ 9LAވxy@1Qq<*6ߔ ͋?-OUfeLusL ٿRXFs. acqnY~u(-pQ.3O446p/be n]OK3C7٥*}!wӛis\pJO sbgJ?*9}'?5M/*9W>fX e.:3 i OK ~2/`gH$ɽR3NC=kѝSFOh [x^S;tϥ>Q@i"nr|EPJxXΈg-eVjJ-m`6KtseO&-"/CR:-!Z׆x7+ZӲ_1D@~TB0YĨ{ 'R[*5J188ʃm{NjeRg)}-Wu4'-_غm4yP aiQFϓShwlH#EÅ{>.`2+FP&`lva#0}a8>nh \;'&n ,LEniKyt߷2u}_䬸>\*eUUvē6L<gILÏc϶_寑5r >+Teaz_XGlvDHooT nd.*YP}Xe *MݓUÑ$D|/G w>sf5dFhҧ~cXzGeen μ-DQK8LidΣ< G u}e{nx fw]۾ #6ztsM $m+K/8,˶[hz_#̈xz/죶% NG.Jo8( m_Y=OU/Сg޳?MDxg'Ki:F`AnildE1 B:rN|JE˗?U \rfKE~ +6VDJY!0/*<:V] *&4WCRh(0ªрfB;87dE"u!OLAwܰR*e cHn"?|Es§|sN%zр|s#d@rJ_Ad@r9HQQۤLx\믿F?*M+AS0Mĥ}KBcF ds"sXÇA&B*% xJ:(:ުj"\`hCWUY OCSՊ|RJ <@\XϢH ѫX=a_A6Gӏ~oΨ`l gBfWO/lV5w)3 Ҕ Es>Q]=0 Ćf G6TUUƶBN7oUqPq۳$z^fEl'ňiILbv>n'QN^n!Kqpz+hQ+ղ<]UcImǏG˯;#S.,z*Ia2sffs%^Y'ƛh]Bƣ,K~PI VxvmS{k䞵m5%qE &$L2f90VCY$U&lFm$]IӢ'%+WAi'4q:M~) YU%0Z$Eͤ%q|E$"4L:!PgEf(ߠ(c7iFkEŨ[At+a[e~ei:vUy~g@C[(ʅE]#E@$cq.!@XȊ1 Ƙ֚}]\oU;.iϽ=xs8DXﺆ.eS-\nw 8\y^?VC^]>eUſG)MaJp̮iJ,Y%V4}ƚ)%H-)1 ё'`;oV𮞊PXeͰܘGǶrEyrvpST4p3 #_b) ʦC%*΋o=k+&(&0o~/LtzNqԶ>m7^ΫB>^k|pط ׈J(WDM|MmUhp@M,e~Vr:I:S3N eBV̀թNs2V㷞]M](] y_#S|O8p W2rKJ6_v+;4A0,g+[UsD+wcIlMSQSN.ի:i'92)FBOn6iǻzMܪ:^Wn^1jֶĉ=y8v&1ʗVMzTzqda`~~GXTRhEulbExAi.gleJš|^Hl_5$nzE|R `{m{,s[e# aCQhhǩgʖp|(bpJh_[Pf G 2X((QZ! Qi($?sB=027k]C?7*>e{-H x~|;Et.S`:!"p&!4TUTd#Wii|I{J NMv:+Y[} 8(FrU@|^GGRxr֔%{F'zD,OiV+E٘Srvi6«2w0z~,3Q9 lv7}M&"FL&,1_z/gWL2w$)KltV Ɩ`Xv{n~8,_ȶ̲BF?S\T׷#zIY#۶__rp [m y9,u)?|ts3`w܇ig~s$IV72C-e#ᴶ͋5G$hw K!%heouIm6s| LY V瓀x_eP qBVa{MP*fNtB&R UL-Meb]G G#)fA..#r>=Px{3{ԉ*]f} v@k.Txo&&bi^ $׿Ȁ$o'τQ}SKHT?U0x]1&zLa&{?@$q}`LFժ(|7gY# oLfqY<6{[6>#&t64n=4ȁN8n[_!b;QuqmR8J}}^.bim/qpUĸ?&֜W/}vgDO^xgr^ӀQTU):p8*Kv=m{>{nȥv|0ֽ:Vn8` Gf2jYBRl/vnT`;ψ꺌Zמҷ,يr(7lx^Rk4s) Q|./.!>H07/t,ZGΓ}%-;,6@z$Fl%˶\M] L$W.yS+?l?O։U,[x[UsT4j itmma,f+U.5hO]jckHU^"a$yDq ߨ'I-i oG (v+y߯eAUve=fJh6 ^Y'@hDE{VqWvt ί(0nqw/3GY(%Xi5O^JVR*ݎ fp_̎Wò$ԐF0 *QD2I!tBPӹ(_-)CA$ҟ}24Gm<*/Ljm=%$ۼ+L !Mx<{SF^ [eLW\piqg3a|I81fa8 i(e0tV -$YHբ*M)Z%e8V?Խn{QĹ:~\p:իwvk ۃ}O]Gtz}}}{WFL]0#C y/}R m1$ ?񡂍 be?rù'se'pxlWԁnZ%?pC1S ҲX)'IJ0 $FBڲn|`Ce\]ri. =ޢǿ(,f% byu}>AܶT{IQ揄=wf5ϙ2ְqކpYFn2ipRm͞AA< khTPwdrm%Gn:򶎕3X5dyki. ?kºbְ^{,n^sl%k%UL$ZQ$Q˻(C(cŤ4FkTUKRHi6iL$C6ͣR3$g8Std,ʷ(^O'/K$)+˅%&~ADR]w]r|$ě {aasp3Iœf,3Vԡ-]UeCӠZH5d^~UZaw.׏V{Yl#|K.$s}hiې;Bm"l= ߡCu,mŖ%KTȫd<_]zs[[VzVq(pe8}mkE@fܬV([  2o|H.k ƅ%hK^Oܧ=0pR k?,("Q³,%? aoIK Kj[: 2Lo>e"|A•'r`Q$p7Y㕐T9h"Tj3 e(v]Ӑ{wz5-M4J9 9bMj!!oM?> UA OHGK"8qE6J]?9_( r?P^=[ȁ6&V!BO?O>fȗ O!Er_UW{ f(ſ+ c :d+*ٔeGLω*7iNQ{/mA6McY`L] Yʲ(*][stdsL &48~(dp0fs<~_:<2w)5_˷dh<ˏ 4ДeBH-ʲȜ>D~_UYfKّѶ}4i+Z sPZ ̈́4M\D'Y$)Kʤq$ 15>{g_~WE#w 8AԳ~fk EQǣo{`yCuyǹlxT0\Pe\f__OlvPXR8V,E]U} {6.Q4 +^ `{$R;X z(X`/OtbvLȼ] |K~S>yLh7q}o?|0fCL]Ni`5T-KDVwW!|k+zBSD7CY͏6bai;He {=.QһRUUD؍9ዿE =!+fn'0 y.j-ur}Yaz-gs?.Ye6 |Vwqz O*>ֶ@$ Q2 l4#6p-s06)h^ TvOmxiG܇Aoo뫲qE_msA0K~V>g}'pX"B) $ N`΁CBV1}az}̳/u]-\WkL̟#E1o$M܇u.)X X%yS,^axӨ=KaGϢ߶|$WV-*KJA<|9*FG'gpGm4[Xˑx E=7NY#0 ٥yUZfM=1٬kĹ&l),-|!"[l] ,S럈O:/b:ym=<12Cl6޷J]  E`84^ ܳ"!Lomk=mKNoH [Q$tTst ĄwG#8 `dsXI[(fۄ%nzZ"NHz 7BO)&>Rl#ri-;&aQș8wE.σyPжn]C{kFГ @F*eC7&4V7ӶV+OU^җ42jA3>m8nIQ4//ďUg=вN! yNF#{uzd\w' S,x[M?D(Yu : 9n5v#ڗΥH7w:`_f`d clb{N$G~^gPq(@GO@z|mӐ@˒붵Paɏ9#AkecBp@܇uRmf!3R ̻YTYU(i]c%##CVЭϔcMȋ_y93J_DмEQDL|UyDy>n6i*]uzߚU <ЉniEha{ e8$ &HꔐgtI\U pIf^G%&-(@ d}bR>o$QwDpMh,昹}X"kp%y^U>y{QrӗTUDz ^eWgI`H>Yֿ,*GP c1Y2/4uLU ePjmXAcH1lPA|$Ǟ0m{>Kzw11LՖe{ WwV*$;W/>j0u è)3s.]FOD\!yK ^n+}k D{0Db{c}@{i곕%֭+,-\^;0;>~R|Ke0@ l#Q>NfToom}mIRc.H\r>nS,`(X,뺺xEzDzcZ7y:};4QbhZ% 03+zGXu2:Bt*SxbmT3DV/q8*1H$P)ܳ,ny^~KF(kVI߰Wyxx23I3 A!K\v^fصe=i?$xEl),1cH6ijUlɆ/ԟ/s8iL7p~$A`YJy+=ԯ8E8 %g)ZӃ38iRQvyp.A N/.h{3Z\=t;D(*rdy8?ң {PC0,X{v;=kȓw>iz7kۘiE! q#eUUndEL3GW4?쟭%\65ӄgyMgǎy!)\Z-rDlB 9Ĩðdv\dj~?K8v[O?K wջ!i\E$rZ9-­6r15jxu*[G- Qn{0\.}z˧ItG%4vsE5 vwkiRUŽ=n'\fi_?e?'~(߼w^kS!L0 ƙJ oDZmztX*mb\ ^ԓ}yHOHFC)-f GDZ<-3r{$ ^V=޻aNvq*m (;y??O_ѩaZe 1z!ڲHy[ol%fLd0|g,R,76 ?51<m˟xD9;(K9D!̠ Y0db"$HiEM~ʘE[Z)Z}P%iE=%S=ӡt \b+G',u]ߣH+y0;|n=^Kwz='3 c.}5\:;ځ*K10٥7.c=1Z%գh&pM2WNޜeF3UO6%lٮ.YGk;:\U@m Y=t{qcodtⷪל3<Jq%"{+Mn[aOgحaa~ +cVJe2zy'_[:c"}}^ ͞FG0yp_IDAT(L ׂvr3ڞ̸{sut!엇_mǑʆ}{L Q&֭auH_ěa*8 χA( $X$uz[K3XگUyL{_K6'eKt81LZiuI$0Dt!)R׏0(ʺeG;y, 5Ȳ$Qn\>CcugD?WuC󍾁l$g&`RW (ym:ƿ[khf"b뉐F%EGox 6"9/{<&vq4Z-w5[>o$ d#G +["~İY7;ϩ?7}װFY6wƘ4#%oЂ4jց2PEk@IzŵGTwu OF:~~4*!|wR kg׭UɲC_Қ!6LWuhxP +|iU sy4.i[hMj=qgD*؛jDQez `pDʗnM%z3QUetl{Ƚ_z@?_܃dYGը;+bvxN%l2Cf=GQI# ⨒SeE: Z%1,Kו%,uu]ס9MZ љ1 v^옏}[JdL `rIYFnGѨ,ZGW~"o68tfȿ.{dv0ՅG _ʟuSn&Fe]Wp@8I(yyǢX6KXh[jeu$_:a]ʺ:8Exl(-BUrtdfٜ 8>M\f_ ^6P^vb,+K'ͧTP?߯>0{NL0xds!+c|M3ǁ_ti[hi^FWvao^'F$59,i>|s@NMQaZDsx$ >8Mw,KSӔ7Mmv)viǷO]%v;"lwe]Ѕ\WƤٍ4uyUQm9K,[}4/L{O}x`lY:x*u>h4dPvkN6s#,WUP7~([X2!4LaU}bMÌ/eYдF.y GM%f6',eӔ~y`8K5'Tq3'K>7t4+rWt4-"agiS&n2RUy7Hfڶqz,㺾\N>\&;Eodj:K}$M(梩QjAT}a?a(M|M\'ighKo%@_U_މAӤni |-i9d8Z%jv$vVBqIGWz,j,"m=McI3YM{Jr(Q-b~VBd`Z/dY K2p椽(NW`sGZtʯ>2 4X% ,+:Yp˔'[&;̬rܝNuZE#Y d+pX|_鬨*Z舾E!іmk n5mp_wQ=Ma S"QUIҶ 0ux &1&X'=]>ᥑ}-;g[M)X_X*0}/j8{ !1YEQ!˔]AdV"I'ޟV>Ԑ6rb\Mz]UUn^sBCmI-69aӒDt-m}qPy8AÒO- &|鹔2y<⠚&5a58rڒD vy^z?Y@PkZC=縖ȉƂ3y^$ ꓥiSߔb9%מe Ii \AC%_҈`(FfjmG!4Ӛ,c'-XJ,WfުZCgT1q.\F[:F.) A\j3R\ X<d7:hDpjNЬ% R`ˣ*Qt( wf\{쇶dhQmv#ddž~b<.x:q[u8l6=L)2ˣ}6rײtLJ}=?% s KKw%N c㢐O[cbݲʼSaw)1笉p A-\5ĭA{"1qGI+Wdρ[ ScCNI{jko|^DW,I qdƒa| beU}]Nސ'O\?~r'Gq? C d4Jڮx<*˲LPyWU8{% ]I%<5^ met]M= rT%)GQ 8İ/]:su8w!'|7_ۿ?G÷XHIQ5C^`/CWCdQ21 10Ma}?,,_SWص~~7yEQIMs>NRnt۟ᄏP/`5X*r'-35%|Ui*N r}4fcRwHJϊl/_5Zż~f,S-w~f#AK&s].u(gyqy 5egQ׼-C~Eiاi3?gw=Ǚ绝2(,;Hhu3S(m(^tіnC=He@QÇoAz0MSnx}?_#'b3Pvm}+?SKeOC{fs'-Z 5-6Çk?$Ⱥ#~l6OGœnx"wT~OywQy~8x 3zk= v7̡?oЦ//u3#wn٨?,{g<1v0%{i3X FX?|=f4C$"q*\Vгꢨ*_|.(㘦_̿4/7LSG !5oor<}:Ma:z F9Z< o(݉Y_t4 M#ܢ}W_}_mz'_|7\.8Ss+C6 OHoi׺.>+KVUQK)Mrf3M[۪жXޡF*MvУM Cy}v2߫U`NJ5<< we,wv^RKJ~?T86fSx:20 ?4-Q!$fm!O&N`~ى"»a{T-|\ L>1Kz^r9K\u}>f%(BGu|q%S^u4z[vm#C}/_+˿__8njw|^54UgPD8Xo7JvD@(Oʊ-,< ԰eZ;Z>}8DQf\u`+A ;ͱYp3|S~XVVQӌc0t]HeCƍOZW5_FQב}W>A(3L ,:/+ThQ  ѡ?ع(AKe$|i[* >%XUh)Azj3϶lƱ( 0gح~}&&ѓ 8}S!YfIv}#kv@Ubv-PooMCEb9UCbc(~?%ع$`(`YP.rQkaؒj Wll-#Sɞjԅ$Tj[ΔN@ʣ:fʾpm{ޟNB1ϓ ߭:> x_RB㨰7Mi3dˡ CvsK3R#D)Ixq)2c=@4r!ӏ3@;-8&rQ$ڑ8hM^IߟNm{>eӬV*=PD!TՊcDZ2\R[rb*42y&eWGS樂#Bx¡a߱8ySq[O g<,W&5I|iw(_0QW"fMo-Z6x7?(twl O3ʡ-}}?&?F)*q#txCD-XHZuqL B]Om7IB%m~'lS@eqבM7z~+&$e[(qR;.Ǯg~~5nt`,3m;%#X|ߓ-')gM$,()~K.r1KVPF˾<*14f-|q1e&w!?W^{=_qVdoXF?oZ|I-ϋ^#/ 8Bu3_uE$/z&e&ڶ,%HjoNlΥmHߟ8MK.iҦ 鑽`]r'ӗ)#ܕڽHX>bWFاtl{rWꜪ;4@'Ec0 }Po!5BS1æ3RVמϗ 3`9(WK%DKdkL~`Ly /g}wrkO?Yơۨ='Ӫ@f| :8Y] iR',3r? >$^JzҘ~EHT\+| k]!c+tm#0LV8<Wke8,o Ś_:xx(9`9 8 d0[IuÀ izG)B:͸߳) #eaoqyr[MI]JX dGb巭r@']߷l|%UN?=ޚ^P 50Ҩ Uq\NҦi[N[Kۖ!ᵾĢj箘В^>α0J"LV,bW0Q^}}}9Uϭ,C,j.^(6!LyśPމJRPt\n X@|DKSAD!V 3|o'Gs~-1y{ߟ~ UUQT 欪XcJ"^cH13JsnۍO Ijg3`ȺHW(hqhOрjT緔|'##`}yiYs/՘j7m ٷq2+iߎ&5njyX`nq 9<6wz'KFGS%N$I ~z- e34mR?3.QVḡvJ1eC%Ϲc䳀-˯ea"nK'_`HPT`V-O$:MO;}X+,kՊ,E\P,A$,q|{ghi,Áܳ7.rNS|SSLﵶթcJ9{YaE,f7|V_j`Mv-Y+' KVSy)ޓiQw zYЃh<y]:Gj J&}\__Mbd+&nE0Uu8׷?~ w?R$J9s`>"!U%8]F88!<敢8߽{N.~oy7A.]IZx}yOS0Z,|>?yIBuIm7~X 3籧~WF\P$, y;s,DEh ٫k~zp :NА6XQz=Xe\f}YxVyУeR|ɞyBod٤rfyުCgQ=;iv)oay z?Rs֎GEZaȵ>me3Zs~|}IߩEU Zp w[iQNKQHÚm 9,%]jFfsԾ׶?_$ӡSS,A9zpђB~7ofֶ|>XrNKTE!χ7U'gsFf2]/1+7o$_mu}&IQvuoutqͻ=z>'?~{ z,yН}srY*uo/hL⨖8@;$L/K/Wβi1d(JL9yE ;;Kt?LU}#QT>tqŦ'g 6W5CKELw|N(SYbP?jSKE7P"xEC9}Gg⪗e~lP>FeVfӝdX~^ OB ib|mG\BdրL4-*,C.#q]}zil`[zБVx! -lOekDņ__^Kw=>lKJ}",pmH X`ȓGyVpE,M/߳\cXX% ȿn}`}cd9NN+l8VUg\JTaϳD57Zru,V~vlJJw`n,<!w=|"z p2gFDR%4U'\kɷÂjRAK]p En98!ޚy/gӇ藗tz}H{v:ql $-b Ϸ0m n,Kqis}fi޿g^# 9AxDq{(oG6RQ=\n[2ǛMQ@ R2h+댟u1~ w E(*K90p}ojE m6Wv[V^__?|x=ضiEWz7 끹$*FB'GwU}`l|kezT6]߲߳@"jTۇJ^,'7px\__WU@_7'x﫪=.Om(iMSnMS>sZ ֜ A`B}߶"6QӕVQw:`yX\:tm 0)ZG1j+Ӂ9tE`N Jct"djƱЭM-0Q5a6E޾ZEy]z꺪@̧\34֦2cFB0jKT=EY\rخ,*Fu iȯvBGs| kyLW56#VdxDŽ %H=KAr<(xHe\.M hN$\ 3+Iˆ*a`F/I'v?_RsK8Uizz2hXa…; sABYYq_.N9ӂ2;v6iK$ϫ]^ႝ>@#\zV=XrC.wXHs. {׊@=|đZaY$n٩˲,=VOs Fk1iNSq_h)d-gzS2MN#OZq?Ӕem-0X WxG0 0#Vc)W+Z);h$9@0\lj|_Qo6R.17 %7m☄iڶm[Ugj#H]]uAGPJ/x"ݢ㾟wv#ߦϴ^ZE%]*[kjaيnB0i&IY‚~O/$_4WQ]-~OL>gwnط['ȱe կmWݎR-NIhdTѫ`XicwUMݒ$Qq 7YVU2`ciICDOe<@V1&u Z@/G^g 9QÚe֝:G ye E7B[B9=QCc|+&hJ~448j`P9՗#5/KN_y:=YɌzZl<߲1+jcs%tr"'Y3l4%ܪsmx (k ~Kh-P60T&q.@ca!ubE`q" |5H^S% p|)~ 2,SP*Ǟ`#&.&(v;rN3Gd➖.$&|0 Msef^ACc9l6]fË̪,5ELiQU1s6afYUk2\~U__x|y ~OpǖW-]I֐ x;01ԩ׳a:Yp#T/}YڒG? rabq cɣax>OׇDZTH+3K)א*[.ˌc̙zJ~)"H;<EP$P<DZ|w=euMs:&by}rneb*qceƑt>'I#, ۶aV8z2 ۲8pX8 NHqãJ]Jq]hsoY0ijdXa(ض SgYByx9y㢐ksA{GTs5iuv(OIG$SLa+y=_/0ȯds'R!>G.,<i<9φx[ǷgPOO1^_?|3D`Nsr. }ٚ ""+ARo|G 07[[DHeR74E^0[a4(lz'sJ c"`(aQK(b~OSYRʑ8, >.Ap s\hv벝T-|s/ٔV qN{Zi#F[jR+9<{),F(HܷW2L]v>R=DsTgϫO>^#5̓=|񗼵gcB͖31[42+s7 $5fEС/&OI,Omj\VUUU&`o! 8azNr;gC _/Z!5?ވW Ȓ\l^*,1$؊wID9*6MiL@\c5c;7Yf3+W]w:d 4\.<++X羙q<(3Mw,<$_0KNir iG&vx *ɏ8rqRJ r9! Y|nC}E n mmEQYO 3 ܘ*B?IdX9o={n;ƏJl]‹i4rttD/Ƥ.]s& ;tG{%(ӄ#ūjʴgU((ɹȢC8ݠq5E߿ =ȃ 8%q4n'Im^:~UH ]GceȘ\Cq+ac4@@ϒMץ)l냭l =gL-hؤ)$y{2χܒ(33| ݺFY^LtgPIJ'5w S1[B+;ba5I D;)wNcC~2u}*O >Mt㳪B%*u +մ<*)ɧ- ey8| &z<%MGWD,^hzuHO}@Rc+cI5/;cNVhu<؛rgA DѣDw5ֺP*SOE)Y3יRĊ[<"ɂy&"B::qOn~ͮeG`'pxy9'YQ@6}Ѷs*d(|ð4M+TSh:M|,7O\8d&Vit&pi1;5 8g+i:lKEކm.EɧRI5?hC깖 +?\}Y1Zu~EU1iP'К5/'zPuѓ^CC\S,k5'J94Ϯ~>\, C8#r_i/ې^N#d,LhNJE(eH071 i V<vk۶iGy1a>`Qُ4a!wg|d;ݜO4b-KO~4jАETAC6 i%{̖egJV; s 3IByDűTd$ fݡ[_p׍$ya=4QG\y͗ɷq#VQV4@@R$YgWWb7zFLn-eHzQov)fH 3g66[Hӛ(ܥv o[9춹מyԇkvfHT2bYe.K@eC/MVE+qxFP;Z\YožVU-FmjV!EMs/z4nGI|֚X ye\WZ<~Rϲ/=À>&~t7G-Raby Ȝ#BErztRoȧ11Sӈ1M3륃(e=,(XV"\ WD,*مI |A_Z^?\.4>O61 ˎ[s?@S%L& -\`XEDzv=$̉<.Ĥi}=w 3盔Ғ$$9!MD -2&a&VxJ8~z Z 0t]ס Flx(\N'Iy,^,/>l^XIJ=ʎBZ^g!N E_ؼ=:ĿKJsS/U.8^dtjڼ*cAaXne@yP==rreamQ? 7,QGI)9 ΥDi8 ?Z#(;bЧdoV ;%_.w۶iN'־Jݻql[1C*k."|VK;+[Kj1ooLvsoWr~=|ݻw~gFv;QJS FmC#em7LCI @@K_?BGg~#)w أ88Z u)Qi3*P 3jΚLg%"BD{ä Py8`P:j{3⤏ =tz{3Ug$eP[lT[2gԙǀ=h+iq,pbUS/ˌw2:5*:=ʣ9qZoA;{[Wq?'}1"֛l|0Wv;NJI~tx/g;ӾgYju8`Cg =*em^_)c^.u |H SYZwQ3[ҧNԉI:e8 .z}wS|oغx<!O~߯לΌkӜN:mr|~}2YZzJum[}yW454f:܊j)vfO~ ~zaL%(<6@ux9*/vYM?ڶ@0{Vuja@^LP/ +xyxn):SJ" B8)hyG5/~i)T2ۈI b]7 t7rMژ =\tGL,?^E|\j(H22m HL+3%4R.'<ɠg]nT!!~7^y~ #G1@C!(:&f@EXbn<(`_XW~Y#0R3PK2ېyq< C9@]EP*]w^.}_~9?j[^W:R+n+*1._ Wր_aV<":=ij5iq. M1Mu-XHJFQYRR g8|IXx Y~U\.خcrR{NY?-UNX=זf.ՑXŬn?MRT^c<%yPT3H u2V6k(d6*3N(JEFv;Ȁ`q55gjOar:gߣH՚l_i咦yVgXF,u-8 8QQt:Ϸ[Q?]UV#ޓɲ+Ky&%j餥5Myd"fg\̾V$m1iڶ qRQZy2L[ҡC SIE`-v1_d^0|T*qXv-qW|m6tu>GVi-!D@.D1o M>| A*"'?-,3[IYƷ&6$j3r%<@&ʝQQ3NKEĿdv[I Yq|٧H;7)innrdo}+ 2j]1NW'f0Jet^nۨ>a#\R+q|:E<6ru?;TNj[{HM+,ŷfJvGT}/$g-w_ٱWr JMS߫P}ok2ۭ{FlYe+L 4xy+lzW0I;piB,,V=nɗ4PhTݹWmiυNI'jE6j3ɌcpkյԄc(쑬M9$? U]u]\S$)4U1xH=gjoEߋ5l@ K8^=qqhuŴd\~-?/;nV(h-\ǚEiĆ!}h܏柳# 1E5)|gj9\za~DsI,e|}YZg8Rg!v6r ee~UPi ~zdd?B^s创?*GZG<,3h<,R0a}8vS+\CHzp|}$X-8_X}qն$mz:\H}Al>KH1<Y/ڑI L\5n[#)0ha>-(?rxOY^,{kl$F簱cY"eI߃ðeZUyE;(1-t6|ie qڶi^^> #:=~{RhpnrXےvpC8ъ:56aE±V~w jl˲( "_'YP̓ʲ\w.Q>s豽b9\y{G=鷓iڒЕ\5# A志@Cbmi?tȔЮ4>M"/ w>ͨrko>F+SEUU% fT~?A/Y-cE,$II= S)IQ9d<]q;.d}/>B|A e殘'LڽJ|y"Cd+lϩ' ̟J`bAD?$9N~+􀏣9 D3%@1g@-61m۶;7Y|j5,:_][8?o6Po*Fܻbms֬V~6e)ʔsX6ЁJ]s>i@[cjj1=W2}m2oiwMfÕ$9ܧΙZ+#* {6eQzJ'6jj*Nm0#o$ˠj_R^vmʲyG(̲̲zK5[ICdjy8{Dl%} T J%3>Pm틗IZ f(ޫ;T6" L6{-ejעҒ7Z}O FLc_6Z`( J;u">o(PdMӶ>lnb?#%iOawem^`P~'!uTińF+7,jd9PMVFyJߋ:bMZh *箉XI Brx´0+WeDh{L/̂TlH+ ^~/,1Tk8,CH-J L|;8Ԧ=סQoqXn0Gѫa;s+4QXgy UL^qnX>_as,Z[,0 /H^N 7?~?&B`Ϩr ^˒Kyg'ЈEJx.-S^Wdg{Aaio @LSXϦT"8 ̚@PV_HV};DedfJ"6GyքHUUYși)?3'xY `Z@ĦNl n蜎*a65ox--A/RS1E 5y|L`t1%-qQv5žQH ٛ,á/8/G60^<:)Z&ɗTޠ#=ܭQ{eg*'9W$)K__g=MjKܶu+y>ۭ/DmM3i@"#Q- 4<Ҕ84ZY}ջEq[vO$aEz]_iR * $>?7#H~?ɡ\+$7`ȜOZ}׵aN7v^*ͱfQ),1a>O݋ʎ0/ed$\y~Q#)*x5CK5׾5k+o ڕESgy: ϕG~[Uh8>*[W~i]:y Bi*TUUpZ^,.czN8 0K1ݷȷHl r f%GhސN |+{<_OHYfIJ5ѹٔϣѧۋPOg8G#fs'$fC'7yxMy+&\g75V-b|we9"Eѣ EwOXFpUȝh[)K>M$Η0o4 o=G{[ 1˞J홏gU}#_8%2Ff4qz_z~P?[6E>#+=Ó>e}gjQ6bܬg/M|\o]V%T8Ƒ2\zk?9 ; lR ER>XEh >yd .lUewj\l3;Rm(Dy6pioYU5MG[X4A Ms O, >6%r 4/R/(aV懨8_u0rSqN>(rQ$dь1lcɣ:Iv;j+/ꫯj\H%x F"G@åad0vf#NDE}O G砈E{*U%S q,oa9怟luSS}|1}9J|;L ^&U\1_,P_gfntagqxv?G6K0,itY^z!˥D$ y8t?&?=~dXXGiWWmY؃V²a|z,x Ϝ 2r#ߗCMp㤴 zLT3~sB4t2 QjnijYl4qD( e[ gm^|>]>Ms3WnAr[9@89!`.41T?ο"`\Y.xV TUë'՘<": *.!7*4~Y)ܣ3NS PiN-^_x22DB@,CayȘͷP\Q+86D7O6OIL Xv$,q|8p|׻z]U d AȪ L0]IR/Cg4oo  g3/3IuM;$RU +EaG;IJn=`sPUES*9A~=)Fp-J˂8\Bi 6߁J9ZUB2I@.?jJyQT 4GlS'Whz^ [XDo@ , jio|Qߣ VU~߲,rYk(T/?y qfjˌ2wN% !9`H+ЬfB2\\Q^bs)rNFrǮ;^_?|`[??}/[|Rae}|&Gh[R]RRE k&D6ZTd-a%hڷx*<ՍDտ KS|9EGƘ@oLcn|V٨[6bf'+L^UxLժ8!!s_4&Q`fW/vlRNdJa j\޺*;nЇ; X k]3YU//=7_px}}U+ fyO>sm|k`F}k-@~_I12H1xHd:96+#$2jt{Q8'"fN8^_zn?D84,o믿βw~8Tv4U$ Yx<iR59?܅on(8v駛 9!0$(fir>|iR80?tjۺ&3lla-(zy쳗PN (jme) ݮWlcp'bNRyL~ρ@l^ыheYQF@LLYeMuD~eY |"}\ŝ p(ÁW/ON bxQ扝c3oB5Chtm `+2IL! !9eǡ߳b3`īj)^L' !Xk8OɻhR8n;#7}W_} ]M@,7ݻx@n[(c ey:]{Yɲ[P{B@A |^aY8)^_ɓaEQUu;72n9޳L4"AaJ`v0Qt>N) fN%5̳81:%Ðvk6z5ah%r*d84uS&o~Oӹe9EHq^}ߘ*(#*ϬF#}{:P'|ˋfSdcw@pݻk54_|W4qOSׁ,x]v;pTXT&ҬV$x;45q|8!-+簤41=e~/.14z^T>v2Gp߯g De}Dv.Y}:\F cQ0׉>9LhɤյN,e5P-+mpdT(em5D{ev;owƱC_ iTTnJu}Gk$ k=ϓDN_߫CL.7ђliZ[^34gm:k3|  V2/"C#=483aBh9sf#XLR;4 iDB]B{ ܚC ";3h% ri}xUƏ4V`'m&am;FiGi{H ء$O 5/Bij[sE6shUY-־hO,{x}(KHR|"M2= }eK A'XѨγqIa+␳YۼEsR9BqPfm}߶RxA` |4 kc^,~<6!,dCm=t.$OCi6=5 r&'WqЙb A`K"&=Y8TQ/K;[@LDOa':-4ɲΫ}B)㜢uD#1!wl,`ut YLK՛iFیcuR~KIr-ׄ&i&&FE &=H2Nj1OgY!_!?n.hQ=^|{{{aw\&8s/}%_"E8לIc0JÐev*!穀ֳKz~+]uYVUu8秞iȣ5$?Fϙ[G:X]DN4t Eab ja3JK5j;Q۪wۃdv:MSp"Ǒj,f=5eUiDQ\)옵}vT`D^ ΫlE08av,[\+CB)esul .0VVCɝGD]G]Jrg’S>jB*3Wa3ȿ"'rIÿooVҪ.6r1͑?^j$$ݚ@7~;MM `lf6 "NP?b/[@8O6AYB6kБ/{LWQׅ^~|wxTlcXxVGyij 8fihzY-b9$k6, Brei `H5Wh13J(:lkGLG69hwVaNncI^Q }& T(Z+aMPy<4w~/kLEGNl\, lPZH&q ~H@ǫEض}}i"pZà>R1Wݾi*mRGt|zw^]9Ƕ.|*~\v/\m2sJ$̌m]ic1ln+#8Ⰶ0 d>$jӉrwBfb91>!ŏwP +8: {kDcT`U"3o^ N298FՄC)V uZ?_uKKΧSC4]1Fޘ;HVQ_3;+P}HCfk1-8~uVcI.ag<6*9ɂ11b_ߠ6!ۭ߉~ZeIG2xVme}_U5rE=z1T-΄Tzdl|F8QV Rco0v~ꭘ+)Gʾ} ueO5 oߟYF.׭ Ѩʲ,_^=n~p(y8ϏlbL=tpF"f$mv] ϬݮBbLҺV{ #fH[{K/û\X99ǛEQP$ضsãB9л]Q(s#YPo :pxiJKӷ7aFi|>\g_B qu',ض0l=CτGra ܴ*s==@{ C.V2{ 634c m= ZȴÜH ̑R<q޶˹lHqy 0OL+CFe L#R(3+ Z.ghwmҬțۭw;o}?`^.Ͻἰ!25-cbr.dU~`\yd<!@YӸU9տ8ϔ@BRpS? ׫!uLRfmngnj3+Sџ8[\3-koǶpJdه*8ֵO$||n*')cɍrǚ 5tj[Q} ͙:Q儆5sqR,7agJ -]>  |p'(U[ߴ7Frj [^ҵV+6uB](NLJ y.c2.w}QPXO=(;LpVY⚐I^\nTI|ݻw~K[ \t0<*lid,+]UaCr]Z,y+ǯa_=sۛh1K,z%?S` ^g1O^d,k웽dEMSwe:F>HSnUV V$+ z=$2 p|bK(d_ޭϯD"d;ﲰ}$^uB Fy{+*][ĂPDq\@^Nה&Kv B³_go%B>oH9q.vcvzy4He̪|ݚFj -><-ނ>^[H+n v נ`  h Xc['qq%œ=gާ:[!re8t9WetÇqdR7z8eUq8vQ3`P<]-SYe1oI3!&C35MRK_U=m%z4墬j%&)RDcFxly&q\qD$5ڿu}>Sŝ;'}v^wIE qܶYFeӪZiɺfѡ4>yA12vvݎv"Px\c̎gBZ4Z̙H3[;K6i6Rdbg+Km+Jr LSBoqCj% Cf8&'/qS`Jqu}>CoCRۤ|h\[{(>鹷e m~Wmy.2Ԭà *Shr-oXՆ$s$ooBLlF~nq4a&N+qW_~^9sn@Z05tS-OhEQe{"Ő8=HQn??N1/ޮ;!QQC& c'ꤥ^ܞR#̶!FiۼNkTxꑔ;ﴞm?m1d8r# au]_9$ YS3ゑA+rAC;?j 8(G0ʜ&c0ZUfdsB9]B0@eKrl.<gC|_֞ πZƥ}3,gz跦 ƈaZԏ,"KR㎇.إ "%qx?Bhu4vSE.EIHqEu|˹).uf3}I;kNKHR狟$) V8sLN.F L<YPk Qkk'#Q̟"\6M2¬v3UJn;/GuZ]ϥ} s,/7%YDgc}ynT9T}φAyD#t-$n}k}͊ Vk,[DIiBe$tcQzJ_"hlh"ZGPA~AQ,1k%cD|sJ'Mѕ6Nв`y' Uːdm˷+G_*{T>m[})(=mnLzDAdidzeWq:kw9fX3=LǤ$!1Àq@1H~p\ sMCDIDATdqE(wqU|5̋y?sE]1N'#ܣ떃crJ7"M~|cC51FpBoDzlE*s'`jbAQ\{-i*d tӇ+I[rBhkeCWWӴmϘþh^9C7%eC >~bQoݦ9ьj J@7FfDx<Eamߓ_dw;&O0Rw;e@E?nri5B-STvmcΠ GiR <y4PĚ8K4p'.yPQN̼~8q|A* {n> ^,[JBH&x;㸪laO4uksvaGI5|I r Jlq8Ϸ^* !|px >AFcҼx٦vI݃c7Vn B [tk~k ^o6PAӢǙlж>I|6 QdjˏIÑ<Cioz"/%tgs\m(IY< EY)¨P0{vUՏM~e!2|c;=Y6H#1jrifڪ6=|O;Yz bp&)s`Lekа qs-oñVt/^ $uY= 04k]4eu k5ox82%sJ!N&?աl H{jN!'9|rYxBi)shw;o SstCSl)\UUUU⯨E'Yf=ϿDB&g$l=ӎ@k;O=X2 ;!wh$gϾdüGw4Nbܼ2*f}#e+&;2£RݶQ޿3t-Cq\bef3>*u|]^* 1By$5փ sխr*oo дih.7M0Ϩ%[$G#v\z?pUkvzӰ7KmCi۫DeQ}O(X'GAnuYl;l"pOeϔ|yf)fXKMS|i|~>f ?JZv 狝 ~ x u[CvWZ8^9|,<Ηf$ hHGkj!F 3'>O@8r~K]ʑnb+L%̒ 6vP./Hؖ]joۄPCtEy@}U"Pyc)Zn F*nΕY|~J^B a#$vao8tx }zhV ;P-jK6ha( l24-˪.%9#ScWE {SP幸0)qL_rSx^ K_}yL(hi_1 Ms>{ 0_LY~ԃļ B|*ap>S٫5ϧį40ve|ʈϤ"1s*H| 0Q$eqꜵp\{I)PiY%GK%Xr!51WTG| 1hʜӔԃJtL2G,ޓ|gR60^{ܠ`g}_DpijZsO6s߆4@̔(Cs"Ɓ`Ee:IآȲ湎r(\5K: ftdfG7?g9z+.Wc <@&9ѷ//QGxvioi-:}coyDy OjPoƣpvEm 3]vZ:py/M{# u/t1%ht~kؾF8NS_ߧ0rknq¶{XN;Yex,r_cU-sMQNf3q>_Bdo6A6y95`z{DA)u`2y9yY̕7ŹPĺ>> ȏ;o |4t_y0^`Ēhͤ)=o3Ǥ /0Zm{~Dyo./ oEq yQ Cm ^cZ?(b&|>G{%Uu1B&)i_ݮBBql[m6Mn6|߷adz.WjY|N[~g_6fMy$+һ^nJS!3 k H|y) hw3j]7M38Ѷ̮+jmS\mU3}~˥iItss3k "?8w;6!~8r+(JYa(ˮZs$׈ugtN8 C/<NF~_GlzKB>ÚMaVO)1EpsJ˝ʈPP2,? w¶m2w]=@n6)CN(p9 GWUMcE7Jʼe;ٮdvu5hiAQCZU u+Z%bXy n(Z t hvXU׭VMSy^ ~Ppָ=\ᒈ 5^TNt(sYyKˬiw}9ftmfYJV(-.jJW(O__W48cYn6Icf*6te Q> ;{nz]P)l&a ܳuVXH>VsjQ i"sȎ3"t Uahi m9xQd!zVₚo:I>==Ϸ8VDzp3%Eh[UI糕LyԵo9 p`Q(d@8Io:`P6ϋI4m뵦_+l|d^!nԆqſ?_ѡ$ -vS&шRu?|ynuޅ!n !k-:d=k[O" otme#G.GY}{335 X1W(>]}Zvz13I'P.eB޶ueY5ݭ9Ҥ'7w2(u]۞Kto_k< 3fޛ,q7V/wQJH[_gſo٨m6 FXv"㸮mǑcz;%p>2+Hw㉢^YyUZI< Qo6O;S,;NՊ6v|ل6eΈu& {;(jj( Ƥ,JZ>asp}Q Y.~o-6G,r3Y\N]@䷡iZD-Z*I._݉V<Ί?xtz{l -V4з3@}/.rv`(ύt{e$({םNl[G[ J v7~xK0M cՊY%#innIfGS^^ 4͒d >깗JLIaۚ c{Cr<#Ҝ8yR_0&9 Q{nsI\(n TAvmtč~eђEAN뺎\hPjj5 >~_1˲vI*_j[ !n+^J%N0,Dߊ O( cjg3(TzgZ3J曾qݠ6|>u+@3bw#tf0 ~Nn۶}} R}61Ç4-A9vqo58"07q<%WY ֪Dwl Cp'5e1RsKe5ǰj̦ϑVq $7[u,74vS؝[;>ÇoԬQ eܟ\?~r'O\˫~UsMw4JRס饎iɭT&R Lm[UzMޘ,5DXK2rQ~!>A%4zi"i\UD^~"뵮'B)O(O>|w=җ2 #2yjɾi>e/jx^^on駛2:sr7|ݿ׌'?w# "#@i iФDZAdx,>dTw~w~~g( r}QEXDQ" cf˅Ʃ8NuZ% .!+C_'߿8N5.@1M]wyڶ^OOXKGO'^?GRW0Ka֋ *hOKk'|I_9 Z |[Qt_.Uu8|fe/ȣC_~y<~7߼ω(g? opKǪ}?O_c4޿olQ}/5puϳݼT_Tw@S_f!k#d)i1^V@#g)?G~AqwQØTneoy\&ݣ]-4|[/ꫯ>|q1I$)='K7M"RaN}B#6MXwTK(?W~w5Vg@|^t~ۿ__iN'/^^>|[Iyjtn)9q|MMu}h~ujt E: ʶ&qlMծvq<u.)M&^@حEQU&_.B!pzÖ́*xIQUu<ӱ(<>,yap7IͰTnoۺ6Xm]‰sM?Ml8hяk ؇KUL$a$srGBI{RI I~G3b%͊2 +$SŅM4Xꗉ!Kj8[Mf(2Fryh?摘WQxMأi`K/t-W_><,m뺮F(wH¿Tq tTz$oRs em6MB:岜8&J[N*M9>~?+`e A6Lnr(ib 7ME//|Zv$0B@ $!C)V΢HSFy$)ӀYբ,Dqy{\n7^q,1P͟F"-DZ]\ҷK5h;= : !-ț2}?k"5M8LLZV38|D>k0vӲnyd1yi{q(?~ɨY3"9$ 0g .|8fhh. /U]jy*|O{˧unFgpax{ ';`& =nq9E?~o9桰.8_]WCv\КqZUn^NPj@ r0L(g0Eq:[DFp4400Ƅ`M (ˌP]VIp*[Ob;%ru$j4M]S1!:G 0nf4˅;* mMC3m;ooMq*wY1}^N>|-'Az-c%a YvsK?3N+lV8&?gXkA#5X,KmTx_#Tbұ4[ E=]h}-8>kWRJ½C4fɚl1i#>X׍*c(a)SqZm|nZNyn$[b2Hrni벌N1%Pm"|?㑔i@(MIs CۊbDlUPi; zL,Et™:u"t9 @hVN`aYEHV,ϥA5M/}yj}2.aQuF@kk8T0lCI4^X] nUUUW ܟժFt lNr'z[+K30HGqϵpw{Ϳw6,C1%|~o7fj6M$| I];}o!7)yE,;"-W >l鳕RjiblPplIky#Ls?K}WY{suI/Ǔ S/ .O$V](t<ZKvk܍PXN-84ⓧpJVTUUUUյ`Xiz$Iߢ@ƚ!hW2hY^ paDk/'>b9_.wD¹m1 ;'!4{c.fI*F-//*/i4cʵ?~l=٩:i_[ \oXS7ia8V,(DۤY@My_^UY(MhQb9xmk3kGi- e95T0؟*ϕ 7FeF c1VvN,(l'i>FqAfQ8jn?_}7^v+YW,%8_ЩjmY78_sewV+\$/"*)"q e2i˯jϰ1,<yJa`zNu= ooȝS2]W:8QI^q1"VeD]P܂Jzl٨n0٩cR? Tf.]h!m/99ղCesi(x%٢9T]=*dRsJbdD77K9m)kM&}#bByWt%l~ڃT'N zy()w#ME9FgāeDíw'//  [Pl5x/וm%VXHn?WoQa C޶cJ )r- nkGb)AAdKx]扥I7bi>KW,uњ;˷xLbE|rf,L$gU0 }Ae}_aXjj-?dѳ,i[P,(há40xX#炢 5 PH_s!wܾ)[RYpȉZQǷmeX ~^iJfH^4nmKUhgFp#dV+Zg2ժhA5 ׫FRhldR4;@L?(Rb!hMK !eǪK_GĂ[X d*E'm6EnHW/ij :XIl!)}/xܱZq!UU 64y{+I'_^yiSL$& -XA" 6 (Oxfْ xD@6HCel{;"2#2=ǵvD-Þ1{nvVfdĎ^o}__ oS.MR1-+y Y ڏ mwS'^ Xj^fV@،%BGU 3PТȘ=$yQAvú `=!4%-ż:R0MlEz/HAu{)?MOBmthEQꍉoJMixQN'uPV5EĻaFbB[] C3 %]|gK5R}Nf5!_^;sS2)?7tvPtߞx$z CVٌvv 9˲p eI>L@HyO/5yq:k!$J d :VbY~ 1z_)q(HNV"MH4sn@4|J&5cɽ{ضƘ~}ƿO>YNɸElj")I' ;.!ܿV}o+{f]_a{S{9ٍovI;{V9utz5LKz% IB ʧd %.46޷?<qe(kw a1b:r{[Ɉaj" :ENUeDBvR\uUP}#+Kbm3f~|<[B|cl) qVi/Eݮi`/#Ө:V s,a >%l 70pRak>ǦbIph Xܥ_/6qYfp F4\X(]SVmJ Pb2\C~8|cw>+I0x?a+" =`2yAeEpY);8u"~e`]8l_@ \}9+ڕLk_aO%~[SX^02z"a4|t[Nн SO=( |dWu6t,l6z% {+]Vf8t9?iZUP\`F)xwS2+cڗS1eI3$-sK{Uh#ơ2۱N$E^|5nAP|9Z(>EfF}5J=k#X@xQklp V5pIe94cm> @V ':T}?fr6Jev犼=+$&9 Spj*̱U%lNa}/^qf[6NӴ(8@Aq C5Du(T:MV YCmOOKg6ݦO'{<=!D7ZXt3L۲CEDw0+FϜtjo|ZX*iGy..Ǒ炥cXޝ¸+|c8NM쎰ơh%Z-*ˆ!T9wq:`W#elPn'd#7C mZ_eJx ھY6VsUZvL^bjxpK\j"| qaIL~P"Uĥ `Qͳ[qUyFlʾwkV:Wȿ2s6Fc;uvg,ACNDu70 [yG60c%kh巴~E VE+TD"$ cbcx/fדqYVR$эEtj[ƛ. /gѳuI@-vty*>KpP[.@W"\_]}| g240l]YnE<}_":/zx@O|5 ^e䞻N/eQԶtJ $1Z E2%iZe^!Lž8'aW >mOOj咬}QJ#`OțoI%R8ja1E,U2,꜍("Ki A}"-1_O45e?\4{JM{^vKS;LwG>M0WF|$Rb*U0M%}# Nױ UG8_4p㩈’}}!Mɧ044JkKKDgݷjϪ(PAM 9O/_.` ,MiDLS8^X R1}<W^(HJw,UXDI'YTv)rKdrɲD.d0f\08\8. "'rR'4 S:o7joρ: ëOI4XTbd'}2JxAv8[e Q,28L\ 2,+h$]XBՂs iw|`+e)nls2NɾY4Zձ}g;>]kYV`䟀@G. 3vVH/i:xXvYB03n& 3I095#`{TˑuCVgIl?y0/@zЈ#O`ncnz10= ;BXߙ:L{B?Wy 3y߫׌TwAUy2l嗋";4;Mch:hծ!0d|vt85߱+$Y6ehC0xa2ܝJ0^LΒ՘JBn̂8w{*"xhjk>k#j"cMMaǃ}" s nw"2 ?%l׽1徴+eu [v2!n28gyJ?R6PjС6Ж~Vd}k+$M_S2'!lq?)2a)NA/:y+Ytdd2(}wD30c+(I\a_Ǚ %5yOZ2g6ȴjMdTX?u`s5x>T?ψ}_-qkbq<ݨy|_[{ 5h =8Ozq EwSUaOHdBI?nPȝ|fU2z=imޑfѸ޵wӘ6@mL!L<'5ZNB',vĻAP-4 8y+OɒPυk<7(^Eb}ChB(GT\mKP ۛu:@eqc/WjK‹,$Ey68^rӜ/k@LlyNǂ!QG'!asq1<Ƿ]¢'K~D %&*,S$L=q >9Bi3i7Z ><ں6pw+NO0Ihyzl??nhޗq (\'0:Lu~[e?d.E{e*er(M‘!| ]T<4[Oa,3uÎfeS7ԇa` sFx`de8%h]+W±V& +dX6v;Iy \,_?bqT-G\_ټ߾^U|<xPN |TJVW-Dy,UUw>gYߓsdvrתQա"1} 59c|ri6ʽ`]1kXI('UzEs=s}A (r}9ٹ-ZjΘI6Kgکcdye=+bin~ڸ#5"J2H_M\SK,,AIV4$m{F FD`+w;o%GRƵ,0G˩2p'uv7 ^L;Bn"隔e]טxDeˋ_?>͠mc׃SU姗LtŅ9 ɜ+n0u4$TNJa>1et,%3kDuHXY]lۚ.*IS |]J$g%gVwQ'2 tb8`tzpNZcS~'Ս04ŮL\Ew\zvzU)e ,Ͻ y8[zsFYdh"` y(}ҲoߴLac5 y&!l ߴe\XtNgZ?v K0/.oD"jddz&a`c",qa|}u7wv ˣ 4sSĮ^)cKUi v~\IZӄtځur:~}h,'.Y:ϽYEUkHVNC<9WT8f̯֡ 3vrsw0czo$ ќF6v=AzQHCo4U_4|]MjE<`B$.J ى\K%xc8Jw]r/6;z~U*,GM?{>$2JԂF2xk4֏\>Cs8䄔 )ѿ\Nz%̕+Է Ugn޷ӵׅpϫz 6UwaނWy2>jzd."e]fAkVlUz$}`6*2 "&:>Ͽ wvG35ܪB+̓u(B4<X˞+NOYUo[Q2cS|>{R09fȀr!(2S~5jPgYާ3f $e! {{$dEn )Oz>M:?#6T1Wݢ)ƃOn.زo!~.Dry"X`*;o}%%+l} //xĂQ5w'$e.C9-w'~z C0m2{3>qfPos{֏_ﺮ39F*dsoLV+|3C9s7 x\5-1z.$HUt׼4桧2i vkνbtÙneX!Ѱӆ!l wKշ^1 ԕhp(;HL1<__ң]O0TJ>uXPIg$jV}zt =I ޠ> ۦQAN qS:pLwgIŢ"SSPt lj/(CB\$1* '+T#,.4w+61B|5_D7USo"׍"zsSQcrcɣ0޺S{x.iHO3&BP1L-ZjʲUeFν-Lq==p s9́D o^Ro]lp.?|)y߃+Ny#|ClnZ鳪<EAyOǃ53m|y9 y. JC2 T1H  q)I2C:geyICH୶2B}+˟_~Pq{0ki > |B4 5:W|ǁ0B؎>y0cPs Cl[)gQx4n#Q#loiJtL޺ TLZΑѠP\s 3 O,Pך&Őy$=^.ͷiEQ"K2ĔSnxGcj%LU=?Iʒ{bԡߪЏʲl/Jl7{||4]V+e+)aLJw~s?T>{bz|3\n V0*$yxRd&QD?"uOOﱢ^DŤ0M ORz{avsBQˣ8n҈wLUQwI Ӎ>9y@ v_8cCG[L]0)Ls" '6pυIfw[~,U$;ضаwa0zP6e .'fу%i{>>JP,i>~J,%>} -w>Gыr: C><@g<6 WWfn7:Qa‘g=OHv^ZV2po>:ngBܢX-L:V,Yf" m]:CkKk^*Ad)Q矯VnQ2%맧իGfn絡qYp};?o3ͭ:QUmC70fYY;οy}ŋox^tzxx*շql6 |_|!U>x6 z]/ڜϏEwOOhp?BujTFMEx8<=);?c?wrͽNŢ㸮 M*G}|ۺZ8-Kufj^x=*Y;>xf>/$2h~V[hʕ"+BnH|^.MjN&&%IY.(|hK}޽{nVłjlfľ<=[.sVUU6n%mMnb r0׋ZeBfeOnf2IDQ= VU뺮$?M]4mf>w; ?{/N>NӼs @9:=MXC902 #G q< M3,ubXka.Ad4MۮU\dDӪ{m{xey>'Is/({:) j|- zE2|\gd|ȬTl6&O<ˠ"1<̱1IM`8tT3)ʋDK4Gc:#!K$_.kXJIZThb#fdCI,H˺g]8Y[!T2<$iC8PЈS]?kQ22[G|dj3&f%%Piy8Dv*ɒ:-oZ(BIPe読cm$Mg$IS9D!mw01-p/{Sso:S"要i<" "$ Q>Kߢ,O=3Vr cNC;_3Ona{Y,꺮:5xz|_EY~;//3h矠p|fV1ϛP  Ւ;Ləs@E|fn'B2ِ;yWt"Ѡmj[^< MCp_֐Jj'v:9y`mX2vbm<C{蟈̚zEqu (ٱFv>CUJVy,s?aqY={|3BL_%f<ˮa+B׏kw!@O$U⮫4MSd]8MiQE0ı|Rz:uMcMB̀ 8:_ZG 0l6ϖ>RJ@> %5]{8\E!>IxlYVUA'?%i8JSRqB; Jإ%!bRӽgTY|Jʶs؁߯4UXϪPȗτrp%[?;) %[D_|{{?8E~]43Tw1W'yuF$>Ѝ5ADx6p(?}p\(ޗG_gHRỉӔ0vO=Taj1TO@^ƿ9~%dܼTTkV?o1F!/N=PLb}ʧdƜl;Aї`͘"`VeFJ5 ޲ Uoǹ[IC1P׵p} ]a!dm"h+{ (iݎ"[{+u}jgdơwj=_kx,JuߏӝmPVng@2enOfbc2W5 澈j~+lrͲ1_ s~ F\~Lp̬f ê}/oa9%hbVj']Q lMxEE#ia+v/bWhSv{:qmHڶiS3wi :ۥ֠y'ࡹtsҼ8 ɩZWsƵնܰoY{\KV*⸪eBz犧}و"c*p-ASt*[.,ʽ-L2 璳~KqJR3&P.%wlQ6Bch|`~U?e} ێ8;َ0}3 WEmk;e9f1Bm:(eT ]Q.!,_.f^#?6T|d#10YFi-;la.L%Oy_A).sݟfv$/^dP [:wen[lhg2_oWk2FW#\WeU-e]gYUIרcu>FQ"; V)=?QK諍jX+-p \>dHi2r{8HV16'i#fg̙uhfG-nV";f?o7l LEu?#umٰH4Iw|/8f\9RbP!O{a"Bh pZJi y|6ǔKwba>X5Of%(BW&Iڈ߭ĩ˦ӽϳ;%W @DWs` {R!EFRx0JB+&Nm\f~Q[RWrZ_V2x\~M쳯?{ev hv>'Q秓RB-3.sx<ʘ\yV^׬Ƿoy端6OZ,p^?|톡@81-O+ ~?.C\mi[=9\LQX㲎H ɪs%OBr]cȅ Zm=Y3Ϟ*62hӃ_("+gsN_'f"EUћXӔ2UZqUVФ5&2ږ8V+ s$2=_[AYXP8hG:YS'咵/&IQVTϼ;hL&!g:bGKWأEtU'i+de`'9 s01P&I`#f06}^[?qCyyKOyUbGQۆM6T<ĎF4"-5;+c1MWikE3>aoIZWNhcj'Q k0[Nh[|F4Ұ4i٠Bh."^ 4ֆ\,E$I%sa\3905EkuR%j$^r8V4|&s%AiaQ>ŬXۦ(#~1n dזJx ?PAzzT" d5{LXcYs&>yz}[ri&:r{iZpWJ$r #}&b m`=_}46Cq\, 8Zx i`"; ϟȝLԪ"}/^@_>& 2IBֶOc=yHnmUcy_u FYHe5uW_D@ ḃ=|PjuW@u0qojnkxtMR>1JeIllݶldOŚD r 2O USUu͞ ?|vm{:-~t*00<0yms:ZINM8)ߘ^!sO=c~8!LqR>9-r>}E<3yԶ2?خ '> saKǗ1:Is3&/J{5(}QTe;eŸM\E)޳c$; :=,Ls¼]Y=|L؜]=,NqΊ2kbq'˒U۪<զ)h*]IO#*\撩f3n360! KbSbE1ˋ'@M O%`^7u|!Ciʯ*hǸ5X8xKcCR+O C|ojUU 5 }8sMYq$qh9?k֨Ԓ ܤsz~qR+!_϶1u^ {KaoO,bVc(^)TΨG!U4)EY)=8>@X"e+}Ƒ*P^ 0|FToXFgX ]DXk˧>b~3%0.FL4Q4xW>5Fɔdxg^0J%vdGZ=4tlՆm4^aiq0đt6+׊]OPu@{$fƯn@0"e@4eBډU:G*3q[UPVcha|%j"'R5pCy>ݩ!Lw즘4 ݆siKCkgh\%r*? vz"/0\r7?ʫG 'PC9!*GUJpUxv ֿ_>!pĨH6S ɐ2;X6AO}NN@$YFӃ!O YfwKMS f8Qf  oC|%f!8+𐦖iVrj!uw}7G+j !GGrOWO;݊^evy5m JZ=>xa3$\>[URqylg{Pޱ{98z>W,O"V5ydM*P.A98 NuiӀlC*%~`:|ZL|p+QdFrWѢqy'zܑ05jۭa8nϣi͆[,(燇A՗8le?EqYKEh)N":Aȹ<:^ ٖBƪ"#E, ]v?) @1w޽jEѶ6Zve gqeYFzgGsOQdjFŸ_xqK:FK1OAQn7q zFkYDaDy^UEbVUyС\iZU>9:%څS(p^'Iߠ#hz%Llàff)K2>(g:.iwc EaWRAm5HXCoF(D^GO\ qZ,7o#̳._w~qlmv GFnh2ҠZ-EEr/׏˥<_\/,p׹ݺQچo3c {sfUYU[] C$մ瓤,_`$<͜=.d_S O2{}:-wGY^.UEuf?#lij|߽ZЎN>p~2{ujI5χ7>xCW| Jce`ۯ)9IԴ뢨ml6&;A(_3.X;oW*Wж ӮC jV~84l`c4/Ȑ8|>gNO2L4 >ua(K[8p/JVf.fn$2(LBL~\.vMEfTrW_}׶ǣ\F M`}_O/{=|UڦiZoH(-塞YV׊'c\s%՞QUIkɪ&eYV|/ۭCv,~K|07SFIؒÇq%GȧXŴ>MIJnqތDZ쯄)j.mӀSLt:ȠqG4o(}4w #A_Wu<+8xg19Wyһ\BvvKKAZ/^~||7oc֒7˿ԯ@/Qa餬IX;#Hm%M)[cVrZa3\s-[+oe֚Y/@3aQ6kHc`  c >{ֺ.,#Lu6?}'c1F/Jg:+ҴﹶqY^Nl{}^(T3(U]?> Z,>C4tr~e><Ɖқ-KsOʿ7p2^(hvV}HeɌRe|*&+"gV[|4*(K HC 1k9fz^%]''g+h_*-y>yȿ/G2EP$ĸ^矫w]>&$=6)M0^eYU&{RyP[$Q8TtR4jD34ޑ'|uJewYx"N4BF$-2l.)iY,K2I*IB68HKTq\u409c.I44"}<mojZj2SE,ah[):2T9\=S~{Qj=rLU<(*%bH)@.4Fk]d,(y*CrlṤ,?>lc -o:p 7#evK(3zCM]qkq͎p(}Rj|M9|2D/ma]n*cY{pw,:U]k?7lri5Uȶ&8 ĤYɮJ4JBˁ;&IWsynz9"MX E`ʔޒz缞g30 Yz@QOn"s,{^@JIs9-v;rMJJY=ί>ٸĂ\m; m{DB82yJOcvF"yZߟp˥U=eI]vO'x?I^ eyֶcY.WՊ]I%UBw!7jӧ?=aM,FPis9|~b1Mi[,,*k+Ό#SP(5k>ix}5<=h ,g3B䭌,ʛǭ9> m˔2Yd/++`%F Fb6t`hƿ8e-S6]YU< n%${2WàF6E5^Їk0!b3.qGB)x)o(!cǰ򾶇a8=W2tWQic_. ˼UOaL"(VOjE~o8e+fO̚뵮نaٜB=Ȯn={j:x=ƽorwl%:) 0d4%^g7\"c(+eoP6ui h W͍xl[f>(GOeqL7Q|saLqG=G[Z |9ʱo&놀AFvt3?~U1 "q(by'¨ߧ4b}iEO J(gh,>5)<f8׏*{r8Fg+eL /ؘ,x<#+탵tw]bDiq$݆q\Y.nHVp/❒Pگf06 wrCu]$waGL2b2*/N]FwtoI%\Y6(*+J~ŶCr3 Y&7(ICPoB&[Q3y.m4B|hs='%KۢN(%TH[ x E+; EQH;* >vv~sܽyӨ< eQ5rYF>nr,NN"`^.r,DC mFN%jB%_>GC>= Υa;2nE삈!X\N]4ً*)rڈ= QvǓ].0` ٿqA16*n]y_U4tn4p<2v0QYqӀW=}Ϯ$ 7~badfKzȡ@x6xlE;5'[lB4"%iWB>. l ~FlTPW}պX_䮦'f=-c%,"{ߺvOBuy) }rNJ> NkOwӂ֯F+oFc̡d`YvnvvK$rI[4~7i0q/^VE۪yŃd~(1̝HE"bdupbsS۶="g,kUE\lW4!?6^nEA$M!$!@sOQ}` 4W-%UU(H¥k|^iJIl*˾7Ii W E}nd.P.V$@h1ZJOO &zBp'X,EZ/⡾G9p\"f~4amU&2i1y~8dYr+! spz=pK^{&9EF,%9=mv7d!r"MNVR)Gd< B[Eʮ n869VbBPTp-REQעDyvÊ:m˟ 7i麖Á C:D׫W C@k9Z;,̖TnIDAT9QRl[@5,wG-˼:s~4ϱ0bYiE801RIroD,>u䧙w\aj17Ygr'01v%!kH*khy:n]f_n߫C/|^U@OӺ~5MIb+omm0,:íV ˺J!(ͧD^C DR O^\aVY]׶D$'a0ز]> e8F{pb'"^ 뱁a*itZL!,MacJF#rr(9!:}dp+<52S«çL:Ռ{Q'&q})`MgVttsM)`\{&wja{!a{+:w2Ip(= GP: ;޹geڸ-84j*VP뎜 j9 Q!m۬Jȋ*|eq/U0]]\조3I\_lcǞ3 u~]{[{}zr%ިd4Ŝ. -.nisj57 6SU4Ɋ@Q@ Sk#O)m#+&]3QR)2I G/S>sߩ믎9ax%' /^Akk*%\=U;dLjz${uqG4:"KT=)$윦+؋j>A0vOO8!igAGQy3Naa;nr.qKS2D#B GC)Mž8%N1 PPQ $gsC4Tlb4V_e 4}:I!Mשʦ(@ge$tP0yt_y"V?_:5s2}Sx TSiUU>!Y6{BZG) ^ep-x%w䉙XU#kV4[ĪZ.!2ftu앷`\F,>qL$Gԡi*>$^q$ k:lv< /?I=W_\׬YnŞj(rQ35Mu 5jI-YҸuw{;j&3vIpA>WD9l(Mz"ne'߼TlËlVULkbcSDgvk"1upGAO5A'TBTv{0ak*X1qÁY:a*+h9YvG%BR,-!}[${_|g -,k&#XyYY0iǏkVr d>WnwCOdsdT"A4]9JJдߗK$ŦqStTIqvaUvȂY/*쌼SNBliI2-&q㰒/3p8{~^*} w7%xi:OsyY5e(Jǻoa VIZ2fSR޳R\+9a O 4m||ӆ,d2}JSXL9~/x58ՋuZ=<7/^ڻB DT&M?E,8 N3WU SqEr~jJӢef!\6aҔ=4}i=_y^סE胋 b1Zbok5Afʚ|:%#D /!gY*B\R-v\{8ʒ9kY\qPћX6EIܬ5o"sf+H1pS⣺^.{k*2e3A3\(CKz{|C}^G$i Xmo)#=Hm14ڒ:iGp#(ׯs9sTl>~H]fKcF o,a5)` i[T=3}U#Yl, ,ǯtI8ʘQۤ9^,, $˰Z=>}ʬ;eR$6BO1FEZLd!ֱ^x*Z0Cs}NHq)c)egaqG ƦAX}iL E_@9jע<TAg/,(PB3- g.}>R&4UrΜek{:Hν'Lj׮cqUy860V+m"uzbcNyt03\8gQ6I_'C1eҞsŝbjXs^~uu?t>mJ?HeJq8yQӦ#2$۞ ʊ":qڵ${F?2QsM#5Q$~/q)rx|A}rjCՖ٬gxV-!IcTb bˈӇAUYbx 9gAND;~QvsSlW߂{R }Vt?_|?$ึ{Vsgaa Pɦ0lIvke5ݮiT2.SщSݶu=WOzkzv\7ԟc c/^.iSIAxT/v+Z4Qxaҧ:LWeˊ"#EخzEzm^MBhi: ,R9tÇosmoᡪ6bS|k4pBOU}i*Z'MQaELY@f$ ⱳN+ "WD %EiW_nYMCBN$7:C0͢= xr麦4-@b;/?^~-i^*jr*y].S$iP/qtlիp`Q~xsev@(=cf=DIcU!'_,ĪwXtylOO9W Wk_~8`S]2:Qgrqy8.$Wş3 8p2+3E^_~_Eq(\UV/Eɛ+9/á(vyG9#wGMr/l֍_MG]G;Zt:mÐeeZө5O7 dZT4 O)Xq%R2 fDׄ/~B@?Ah{1.aqJd lz$ S%cl=93>ʙ|ܥd庄2sG>P t]\l 7RP^&KwgGMd)?><,pj8OĿb8V|~ k7&K>[janY9az|\Vzy.lsȅ9>~^iV扷Z~=2+#G懲 7 uFã%4![{="&yGKu(<}d㲕qHZ=!׏ dHFF#eŕoXٌ=KE"b.++1ǣ~J-^MIC^iʄ Χ¨\Hy%?|oU:˪;M8:L3=0> afJ !zEf%I"7>~nl"# 4 1iM`Vvyf3RcHXYg 4L:|f WSa^hy6M93)3Yf(+{{gF!YLMp#tkU-j{al, 2":x<w$LOc UBF&ܣO,h۶=Y_dl^xN;JeU) !^] fQ H*p42Mch:ږ P8dCCal m벀j; Y&1uSnߟN1 ?ڽ\w?ϙL"d~ud$\cdG[NF@rֵeq6.<2ΖQ$ѷsO3twؐw-Ssd/? 8!0gdKܣ1}k)I&=X*ON<> ](|Z@ ۛ`(,ũF4k~oȱTQo#'i2[t_S~Dԁke?` .q,>9LKd,ݗs(܊&'yLq襩'DYoD9h\g}Yo@bdH8Tdd(U{/!Kɉ6,ϵeUYU,˟Po7XݚrQD%B<6 9⾠٬phin<B.Qm:Z(d#.OfBUhy*" F^l8cX7m+H1M͉V(r==k4K2\yg:O|nVC?{1%k6g'gUMs:}7$?`u(F`lV3Äk(S?C|[bfiz |#5Smg7 5 ؚ1V&[%H`'" O5~-e\_>w4eU朗uu]] ƈWf̍ےt~vݧy Ѵ(Lҹ\_s;p(ƔEBmw;hp,;35Z4Z(D?.Hn`.4FXgПA aCy[Sk2yާ!_7uhSu2girW6ZwE"UtmVNoe ' g8D^a#nϻނϝ<ߣG_mKmHF;*ҿl^iUIȜ_$ 4f<,osD` UN'jƀJ䡾*v(1\56.Kk( LUdߖܟz1K "(3:|U!I`ˋ8,^) bԼ7)G>a p՚ VI\Ϭ1ѵTAęY9zMS42O*RW޶]W_EQYDu8Mټ{WY6׵mй=*Q,#~{tky~WU!V+!AY.hlaݪ*˲ii몂eSϐ!򹼩oӨǍJrǫUH <iKpEoJ&, Ab#um]w}~=?~~zu'0Rg1:Y)4:9\I^yć:܊YHܒٌ||ӢyKҀRQR "0)3JQt^qZy4 I(T4J8DvwL ~nȆpUDaI|-ͤh 2rB~,ٟ&euwg(eٱ(!2rnM(%,,üQ(zvC0ۺ.Mx!8%2 QC+Z&@xCDbfs<^m \[U3B`&^[/hj=c%kD2aX9"(tQۭDؿ( si33a1124]dT  0=Z~cطdO]:d!xPE2W <Ag*f.k)tR^8Ą ePWfih2ϗPɏ'.K?¤8!&4;EzcW<<+ۇ"oҞ~k@1a~36y+ۍ>YAL[׫U߷-Ms:I]w>VobL#FCk*M:!c>Qhp2!)L)ڶ>T`0uJD5{Z{_>})n 9^Qr־sSCL7wW[_%0& >mam0N_s\.g3f082 >WF[GR+e4eaJ ƒPiHu¯aH_eO7]],ey)i!2gY?لOoq>M>+,Qk!:`PvF8a:ӸA_gR8b嵑[\dl08m6-$/ b(*W1+?7ǟ}lP-pc| k&ی#K z$YO?=O?=c}^bX.pRy@>pgGc;7o޼3<޽q?~\?FJ؊S_uiXm-bW~w~^߿qӶ)!I +?ׯ_)vv^_#O eGϏnw:il\V4,l&)c_pnB.oMfY{%_ p=rBvwhOGR8~zaA.?#ݻ/V($;ʹx@/~8j[=sFf|#h)5/bXq5_.5:Lu]UܝY]{Դ/,G޷-+}8 ]x^$eb +DZN t:mUâvcs KtrZ}~4kYޒc]_b}u<!V{&ij(:̟UM]ͦ47>TXj^fCz׺վ??мUEQ[:һ}P]R' [Fշ11co-,gz>kwp.$źV^%gN}T6F˶radp&" ;C]NӔEUθLpE\?r2P2iv (=T2)sh(kca) YŶp>96VZaLosu:Q4; ATN2ZBr9 ]}Unp^ 9+kxe?T3'V/F3 ip`@nnϳ.BSV7S,s\n;)I)icQ53gN]׶>ә$^6+(n=i]mӐh#]+>O")*IhѨV|(7 4-|,v߿?B>bpyxvi+y,sj90}{4V&u(JQ $h]|L^^O җ ]|G37  ds~>nǴ~wChx.jxњM1"w 1bTU11!lЕk3RT#[6J@KO"xq]k<}>yo^ i>قPrZ#hYOq7]pE;6`-m]Od\]׵v.},@NjҴ-Y2 ψ͛l aPcw:vۭ\8sPC&ZS9f=tI}fg24 w#ʾaؘJ[sʨKR 5bbH>Watxx>7XX(_xqJSon߲ߕoP,Ýe6:+aPJ(CJQQ}?BBJ揷ʬq0l|)Ko=)I~w_o3yF>)쭔XwtF|㮧SgQExh4XfVZ6Wj.V˾,TCeplW x3pq,ܨߥY~ߠmۏh-Jgv8H ɰ׫Rc )"IX݋˗ud-o46a̷0*E+Ua)wKvQo]TLi"(Δ=DlH~8tj,[,kd7׾(l>+mֆ4FdVUneXMr:==H r4(υFi5$73V5H;i%C]e|Z)lg '>!T$[MQc|/yǎM_??:oz|` ۻwwwp{g"9CmKg {ǀ.9ms#Fы%4Sf~rUaK:^kN6 y~끽s֟r9Híu8N\*4]v{u,V;^̦3ӟ)_!!OQb3:E#s5l|I} o?v#c'`"E;/ GSCe}_J҆2_Ċ⌺( ޶z[S0qMˮmMZ{mqv_W&4P;^mWl솬X-\޺\h6*{*ϖcLhNy!5>Mxta$C83q()iĶ<ͭŁ8w>ϡ?0 M2oq G*Fe!J\IP0⤌" {?tgim&`Q=8mqL 3mOIYO_-G2s6`x>ΥoXOIj;dk9xr*`ꇑ?sd_H>q\Y{q{kBtaM0 >*ɺBf2'h+4oK>,OҷNci"$bʿݽ_0vjAN폀jfUJ%"ez $Ðc ^"! s"DUxO9FH񎞣 HlL=ܾiEJi6%Iƒ1ě|UYj|Q\#DʲCxDlb1E9TnDa@I[^P;fRV&J/bnfb %BgG\7+ q;JSj"׉v _}aZ"o8;Yb4K!wOiN$7ֽuJlyܘdX=:{~9N[3Č %ś-A)‚Ty^mZQEҭVPSsoZ*YEs7-o쿚-\bkfg{~4s~t7ֶdٻq"xƢ eӘe R A?WޑհW<}Y;FzYʎD?7^!_k1,NE p[ۡeDxNhT^KQ0%SB`d>T_<h.˾,)MCQI*U<ꚭ2\fVld@ Sasa4:6{vOh̾ɕ)M B${@7ԣu[)6i[J·v˯hy V(H40ʞ [V"W(D0P*O{,!< WXW\F,_׋]ܯł|0-?Q|RpGL]ך'3cwh8Sch6SiZSc,uA_r<Rub8w @ѶMs8{'G+TK(X&X9vKZSz*]I?pr69KqzmpV225UÐey",aڶm6p>妎\M1B~zUP 4EM1 Q\|sxXX/~FOm|waba\4M4|bQה%A/469KqL>i(OǙ[y=/:kdN,%c2گx¨FzXޗ;8YSc{v7$˃k9ez'S}ES>wЏi[AX% m}D_o(:xHH_IFK35ZWь/ ‹\w?V+h\CNIܷtxg232s)@dl6 R[[TTKKm!j f&?IO槙 evgW(Z& m۶OOQ]3r.CD6{6q1VV=#&%Hᡪd͆UU; 8VX5|J3h@~GVcz)ZX6ɟ_4=շ}Z]CCFLMFҪ ]gLy|/5鷦Hcִf ؊ҎF5@ƙ> .χrm 3O1254O~{}1BefVQI> xn!劆$ǽ<@Yљbx0{kOTx]Dm' 2zRĕ3anz 6ڕe߇Ep]/L<1/ V6zH]+S6?-`O{cb~_}p!_8VH8&GFY߶m[FRxȏտCYl`ǟZq 6;΅e,n0Wm=޹ ףgQtMl`[l7+WOm?݇*#1}u7Űw1bL6 ܌OxÅi'6';$2و1y 4~^ 95¦.Ox&v;H2<vN$@FQQZa}.o|aǓw/.lPY=>iE$Σ҃Bڨ1GWQz~Cҗgr`p4oJ!dBv Pw*~$obj{EfJӋ8|'6H|0dvсϘ([9 0wݖw¬(^S%>'*NM>u8$=[FS&dL˦$ M%|na{d@mnYsE}cv0H̲ؐRN#i$~>spKo1Pz,oQbKCXph.ˠ"B!W)R oFɔ$E*eՊk p P9IROUUU7;iPgA~ {98}g FSE@pydzٟ3"Ӿ?ž(525w֮܋ʼn&,+gQ_7o_SA5 /}T1ld|HCWv$ b`q.6ބvm=)ւv1#&fz$_(q0bjmv{!;(L U#O57f!;U.ZZ =[91,{-  UӘmFd"\dw>GϐrMa]OC\`;gWVvsYoXw,lA\OͧQDa=ޭ;|'o z!bFdJ[ ?n8^.aOѩ/s>Eb = &u}84Mx8YbS*a{_WYJ>ͮ8~|daYN+nkwg-~W1nضz5%$Lj Ch+aX!2gt?cS07oOY-U؇>~?ߧPg1G`e޿j0өj~PnV$M3vV*/Uq$u]U8+jсx|β(:,]w~ȈqPo˲{n nrlʸGr޽{ @UϴߟNۭ)b/Oi0b%9ɢX,oXܒ`4/7XϋlN[i,*m9B;餦%$mUmѩݶQW#I1hmׇvb>eXO2 IVQD5%i*KÇ͛?xhámKTr9>|867?!$Y8Vp^߼yf Ѡoz||V) +oX{ /qk|km0e]w<x,}<70VUQa CQl6m{7o>;mxt\(TÇ~].6նgY*^( 3LuvWD駚GQD3$y&ERbytPQlj+&+LerNv p($5iqextJ$IS`B?b ^H$9/( >rdzSM YG)\D!*ILt(LWF,Es&}{,-3^O +jxrѫ{4m%N^|?[}_y>+pEP\V kZMe^09q-M4nuJ,Ǿ4UUZ% #l w/>wn4!YlU%Wrtqp@U)_6pf& m6=JzTHeRUMND˦I2wSf !-Z'I6疳(Ep)K$IUjiF$\>>˄Ć' ˋ lEsc|xHA*}m6Hʙ?E2JDÇӉ}j*:ΖϪnÐ$jȪ)Di z6\I<d~͛7vC X^|[ 7NWv(چ")h(Ň)7c+wzz & Cy'@ D[4=]d}2hYueWCIҦS?6atB̟N2H)nVcxω1zn12^iI'}^]wBfH qUj^QfZ{ɁCC씺^9 r>g9*4QMna4 >V5z~Eۏ W7;BpZ 7T`38K͌%Q6j\OWe|)1!Ԙyc~ߐ7\4ȹ|?) ef6<4·a.Ko(f\%_MMJh} gØ ]0:I:Xy;EeD8̒kxXJ'2ͧs8j&AES#iĭ9~)pY#i)8lv\M}\f8xOOy(kLEB5af"}hg<&"&@3uoum@j4v-=Ai.?<ִڋqNyjIJSd6,dqw]׶#q*ܶNS~Wq,l̟_O<%z6[fytk/I m[b.͘`-VU4lۿkeү6;aa,o|~>'rZ=ZѯU@׺TaZvxfh.\ޗeV;ԉ3SR6j,W[iX o"AG|ޱjiBV8eOW!7{ a?/EHW_=i VsUE0/u=e gr}dUNX 4Γ(?G5 _K&u ?Vbgem{~ Dφ4a:9ۧ' CH/۶mh%j9쾙CtC K5tG@,Qy*P9Z"G|t$ldk`<+|D /8[o:Y^ȸMY&A5d3 :9A#ϝ&zqLk9'z <}ϱM[0~QN)9|ނ$3Yж,_r|Muk=1H! x7Ze%/ {}yqv\8K`lBq-IˑܖXS0߶8?o%*Jr ?eӼJ-uӛ[Oz0K vi .#]"}sSrЩh֗hA4C!+vx̲8!-:B^Ęuà6bL5&fEǙu@{oĻ~?ǧ<; Bot&{KN,z2ʞe*f VfyNL6}羾 ]lX<<`-yr] Kg_EQ"a!\We\V0/ qbQU1H_UNW@UvH2p>~V(rfY:q$ic?7%orBa9ؖh8y}aQ.A_e9`%9T|( jnw~W~Wbd|e؊>ׯW|ʹ9Is n %A!ER`bp4:"C7Mx0/ϣȤn/Rsl Mi B߂W{}.?٢V?x_I K@x-(n7ʱz[\.ޢ9M3S Վؑ/iiJ®fk`{|ӬTDeKmB~{V] ,ٻv+̫v2Q{z]Mhiǩ,Q :@0e(90^Yu "pr5p +*[l k3Dl^q1׸=㬲IR%s/1$) f٢E 은W|,Ja<7i{<E^u'=2v#|sJs]XȻ_w?=x`z=ت&ámYT*A͜NPCǂd {M# ~W\!(g\TE 4w7Fq4~ynSW9kj˲˥DQZGJ] e37 4&LZD i&ib<܋:tޒ$IY8S)a>;cJ<-%|˟{zmMqYL"#x2<^8V1E\}>ϱ? O>˅Ggq4p9?ݩǧ>|3hKkLZ^n!NA9VGyꮱ9h?ssDwx_kc+'ts\?z;(r,i=;Xh>Ϗ$x@_88^x%0g=h3Ҍ6x#dݼ3n Ѭs5cu3x0{U/ˏ vw=D繼ixe6Rݷ{^͞ǹyE%gD5y7pW}Kq;T6 i*D j4Vta5H`x)Smf Mtn4(:*cv?Cr c,Ub7,i[i8iDn@ɓJ85z+z:[I^{ oA/}à&e D3Yv>W(Ξ`sB]44iJ\{d:-@}ؽ^V_)bm^On6ӕQ !fez ${CYoV5x&ryoОHWhۭmxHݙZxmiiMZrgZ4e#=c $i'|>- p8 s9Epm,zn7o^^HY)P 7<A/dow  Q2e>IbSH7['wViK$hmsֶ̓(RkMC|ߟߔNrq5Y:xeDǽ^zeB}o}5\BA b뺖bQ,r0d+WWNdzs h^ r*j0"b_ҦBv]w_.TSa$/׶䇻vp]'v\Z#V`+kv3؏EC H `q@g!.xvvIqQXGDg i=A}T:M|-6V '&*a;ε1qLjdMp ':QOҠ7uG U^5J]׵RB5Y?)Ւ|U2&3iH>nJ(sxYluz08y/جJVyFZ$\)l&.[8PGf3k(!K'I 仴,c9 ʐFqD8\zs‰mUQ^s}UbY@SE\* %\<,Z-OṢ6ar۶iGIޟfDiFJ'NZtu-BAGFsC-;TuoM"=j1 Ώۄɬ`/&dM H|>OSJ5>zZD՗q!B\fr((i0Q֌3%\b,kIS/qaRcVl>26f(GeEAMӶd;nT|^:>׋D6+pÇ <|hh[6\[)ɹ?+ YI5̹m/4eTj%\.E;}ʛqZP\Y1{KW0`Q/3+kD<6BPeF;7v˥>L,[ch$"v0ι;=kX}oOԵ\5V}&9?zŔ05/kM6\^x''1] r=w4* CgG" g w9O b`0ҔAXtFoMe0i ;ƍ$eڃ9sbI}\ac|%Ej%υ|ڞÞVe d/(Rbi5p{U?\Uð\D'HqQ[RQTגV-*3]!,_xJK}@~EĔlaSmL\g,3$zf> #z:ǴyG9^Y1&?Pͪ%ቅ-MO _h?AÈ 0owxUE(dxRkZA}RO*ey+iz={@x"Fh 'F%q ZeU>eGs<xƊ$ep<<6:^ \WhaMSc\.~O#SԞųAPIXPDKA:l4'ICKBXv;7'=x 00o2Lz 4;3=q˽{dݍ6NcLT#-;,ί̐7sQAzfۍ5I)Irn [gH3An֯eQUu>7M CU1u98UV|anۦꚝBLpr!!#/! Whzѵ =S lxPQb)iMC2@֠,5Y.t/1m7F3FZ PK~>Ot0ͳsd+/x|/˜Us6 82:9M$>6#$ ۶>|_|ig|]aB"24\a 4}5HtC87o19,9>}68(BE۷_|s?GFRxR4hqAQGSsU֜z?ƌ9w͏rje(2+q ${ƭ.DI<m(3)oeY|ݿK8b9=Upghacu`va s>XUr rQzg[z 3VN>X$2|sKh4sT<RoO.D]9|3*z[fK<וnQiB8+uwZPMɸkvZ(v .F$h Tw,Eqv^uK]D~g8ԞLFmRț3C9E,ˢ^{om۶o7Z |ח mbqv^J>V_.u/Eq:Ȇ.y"YXȦz\' w4$S`m #yG0@UUUn""RY$(H2bR-i ΦB'5$!+x фV\U,ŋ„Fk"fQP h>jq[|>7 =$MCuy~>LFá@~ɵv G]c\nMQ<4*g뺮qX>EAXww`20iJ5M}׶mЬQU6 A3-20}UUUϸ\x|xYEL}m s>ۧ𘃐_EU56Em`׶,M0V@D.V-VY q"1 r9B ͸ѠsʰV% #Y6<ǒ Ns"(QU5 Ueޏ\C%]>o9IB ¸mk HVlJ_.F8#m f;ܻ(/L.zei.ejGf|>CVA7 ,VgC0[tDQ2&zkvVNWq>q>u۷o-ds$ uwEj%8fddCDџx%udrqÀpKs\4Yi{8|a2Ç?'*s4|M8lWze#Va85ZQg& '% 19䟖:B!n`wILI*Bh4eu8!Pz{mҌ;[5N|_{-m2HSk*.?%noqfmFq[N6Hiڊ2Mߣ1Ӿ˞0J/Hk}ׇN{8~??b7qNa o7h DŘ6Nd"m!X<ǭQk|*zН,Ӹ7 WRCyevm&IQ\|3?+2Ջ3^zyD(Lʒfpn(1yU\&Iں,{L#[@ b;X m 8ju!f>gӴ|η bļ2>Ym1XOLg:B2 قomS+ ޞSPψDU:l;3h=߿?DbȔ9R7lr),*a[GUZ]J/pKy]I?Xw !,?m5멗X5R #HTm3z {qer6bxOž௄0[iY&I?ZJ4+i K.8!vz_)<䕃25vijO &ᒻO*q9k32؞ o;*/;ͨ)>"7eñᄱ!-C<sJYvu6yWz4̛蕋qUt]U6m"؉ϗ0d"F4)%/q|[w?+C*9޼jWE CiZfLgoϲE-)^ Z+{;`2,W(`z*?&[N\/yeOink1a劫dA]?糞  uU3oτfCb5F~ 3p4ㅼZM ; ^zj)ԴV(ފ : PaTZd 6S*N j~ga>"2JO\;O=h7b~>L}I:A4bf;ڗMFջ.Mo}ӲنRBp࿢FRjc[,f]WjU]4!oz3߬kk_#]G<%ZM,̦&3삮%Is\^za"y-Hء }^c}UZ*ijeJ}$uU@E%Їܖ\Q^ 8k+{VYJjn+XkSG/yK>v4=Ryolynr&Vs;DSh&P5FIe zz%'#(!,J 2kϻd3}}@m L{ƹB\5g,)~o%M_}Sw( VJt,%0ŒܦiG 4>t:!E$:> j\e_bz**FLcf{k\R¹\pAҔg&'ж=d˳YU1VlM ٥rӤL3VUc Gju.~) KU;7foY} $6-L-Xݸ/` $ڪN܅ridJjZ[!uͲ5p>80!2ܣt[@4˥j}cn%E0mm-TI%Z(`IGgoY | B9jH6m\̞_S] lS뚦W/Nb|>) 1jԃxcG CrX,Ҵ(!eYbAhɽ\Bb3O uÐ\=HcvÃ:(MC@ ℷ8r1WUZy8)1XD=w;" ;6ZMH~iUMA W+fYQ#!:D'nz%d?V Է&:-y.J8Nb}zĤin͛7o|>sIfl6/^~Ʈ"ٲ!d\ Z7N^1؆_N8rLE52~eJt/ ի/{1\y޶Mv"H L7sԵЇǏMUV4K{K9 1mP?sOO1=MbS].LRzȵ} |\U>_]WT+Eq#u[5ma<-dUU0iۅ )d-S޳CE^}8TUY.1]EIoboйB.z=8Vk,GyR+$e`<;o[d%I JVAشa6kUdVa=]R,˞AO_1jv».rۧi*C rh̲Z.q(E+1nl8Aʢ빮=>~]פt5m+^{>+_cJ# ֵjVfl$qѤQeW 8X7%8&oty~J)Mn@Opڙcg >g^/%zI#L;w1*f,fK\Ox6 QUUHz=NA]IJ"mfS̬#yTYE]'P SqvPUUQ/bx-Lt̶BMv;(~͋ûw?b6>1@>c7yEN/)M("F0|h]ePpS9gYVILVZעʗ2)oeȚ&l0w?IN&37֭Dǧ0m_FQU};_'ۍܧ [2@C_Nwa o6 #`(ږQ}B|-V%I}#˷~w/k6w#zݡVbkmg6t |!xzҨ|KhDPnN60aA6iv1ۍ+S[uͶrj&xX c[C GAQ|>YTqaf:.cd3yq N8IX)g*;]R|A߶>n}7zE4m6͗_=,!!SDWÜwUZPPQt!cEsVN:6?Hmgh3C Q]|k8>%rY˥` ~4vW/ { ^$6HM!Bg-Y>!n8O's!2*,4L$&9C)J[[[BRMVcۂH&qIcTd?\-Kx#0T`/Mz0< ˮeV$EHp Cc`/PϗzEf'4$yCxOQ ӶҐ-_9BI,{"ψ'<*i;!Ccng?wt8Nh{^Y{QLr԰)>GDOa܉3oCFa^߃%|BOdr2Me@A"c#˩9!/X@bX'9>vxjǦCA 9h>yʏſoUz wy;Z2%m f^U/_>=vG*hE&:sx}:}_khz2p$F,rM]izp߽gׯIYxYǧ:p\pn,+ 98!UQ!#a/p8y&fp4i(vJ*С{nj6[.߼1B 1;yϿ߽ba^w>>~۷_|upr[6Za KXN]?~mq2+Bcٌ, /Dz5BߘtfO Cּ(ŋ7e۲oQ? T&\) 0t/u}죏x`Έw>tߛ'wfdĊ͘c|z㱪eIZ刺/?~ ~IoAic5CiY G30~KNڼEҔ#ڥk2<V ߓw6dwIA"X] ̣(Gȥ'YgƱJGd"ϷQ\O)lUu>g}}edڼ"v$'hxR qЯ CVŒomͿ'R5A4 rKn6B#"!y`]ErGQo>Y،ƛ~{ lGx(,|>N~>\?>|kOe @wI9<0 '9y)Į =/uOǚH+}7+_0[ V@SU$1?xN GPCOp(M{qIB5M, buw/T24aʽ#z<ǣ(6v|"PTחo ò<| [ Hľ?Wx&zqlL*]bbcCҫkENӾWUӜzFz<*$ǣ yd]?eID %Ϳ^/N~ޏ" Mb^4$d[=hZi^1 m[C~iOOtl5R=/JM1z].ز0nϲ0n{= =N'I%ؗlz"# 3|?dz\(=2=%.ˈ&Y._-,خVyE%g49ȾGoaWSּ97뜥"«>3sV,Nx'I{m zʌhQldKB_ ʣPs آ[as>%\,z; ߦ\l f&%Ң!/ 4i({ྟ,S9`p|Y6#&u$iq,Ӵ^ Ap>Ï"n4񌧩iL6H@@*3*IºQC0tahY$n(Xbq8wOȘv]8 q< }OgZG୴cjmn`e<S5yFCw]Agb QuL+.Y!t֧q7[+'FKh9(gt9~ 4ZQd 1Pj EMIL"R&4E0q<33#aq`sPKPV(4bjD/ێmtO±2'uGS Z%]w8,Z1(Mk@,Dž5kƽqNiڶ wo0-4n8lw9 :a8lj0Ӈ%BK3L CXAg4k[ fH*I;3a@ hHW#q\k.!j9 =ޞy^ax:}Pd^QۄEqc̯˥1. v)*X#}@Auԙ5_'=$2MEۭt֐vp+yh? g&zFQ؊< EeB~kCݩ/{=|5_1p7~fWkJ9"-ε.f%I<(v<+q/޵q캥\twt >k$:Կ9ʀmDa9sʓ5pmAXM}fnCNİ[ȽEtl<ߛ&_lun@(0LW|czsٻ~=8\$@Fq^Q!XHèKsZ@ܮqQt5?Ԉ]E1A3`][Z9ng̅v/A~ׇ y>bz{Fڣ}9;u dIi LdAa)͍z!J|MI{Y# .T^%mv˴MVKX,\DX3ip%FN*4W[ǃ0pq(شRyB]ẩ=(MP1 }oBybX~=q1aAV#e0,+.Hъk̲Le2xsu]ח j"dVY14`٢lFs/0 m3ORt*s'-21-&2䒮3kSl_2!K>|pV@ڬ0e UuJ#moW)2SO)<4{\R 8,sIC3? ,3w&^=Ǯ#2ߌUfݛSa6 Ys'RhIEX6~ѨлP^276zNê&~7ѷq_}al1}LSqٟ')O&,i6yh юsj>a0ޕkkû"K 9~5&ijTKMv{r7o7 /Hu> =kږ9Ӝpc핀ܷ'{-,޻xd;,Uif6TUgYUnu- :?~dS|^d;iSsPAݔv]l{ֵ ~PP/1 yo[@/k oG5`84VNMKdTLlO곬(v;jkQSQdYKD݃.=2,er۔f#/̿:<{Az x.whT1OmW^s^i\L?`z:S*X{Ȓvoԓ0uU\IED1g*)IIzz5M=#oaeAY,{]- 9#NF φuGX峼#_?"CPuX `<=oZ?Aƒ;w;E+l_.i WJ鹃l^NSשGAF0@dD`C4o=HLG ^v^?S^i CbOwRM0# &BB!Uw,ٲ>((Rn?<4b]cS ugHI 8D\)[kcۖe/hͤsiP{5f+=MIVE>-]{K/0S_$WνD' jK^X4sG0 Rn>K<FQ5-K\ϺspV!̺XM/pr4aPz(#J M-MG_p(ތEX<;߶m[U"~!i[Jԯ#a%RTjOa%NP&ɘw;hӯ햵,m'elNe%PkUu^ 8?-=s},Ŗc=rC4Cr}(6v_}E0xG[rx/FEMuxc4|%$A =tQ.1Qfd9kt:TNd-KQU0G~Dp6SQ\Kk˱날ilI# 7Āyb-8fJTTF\1+q:}Lǔ76ǣ`IGC"`x+˲DUYAWQ^OQT՚,/q|>$9 |`D8&& 9iiD(va)|sw~{AX\k]yA♚^ ֽ !t2"A_ׇn2P}As.g8ZYqLٺXe\wͩ82ϯ1Ot'e.i4 cPzDߤ7zpׂE,Eu{"C,TĿuߓăsYeq*WI8^ 7{Y=?i^$*#aQT_2XƲ C,sfмדP>'{Y&lQ H7 }mKgׯgYKuJ~ZJked,(K>%ʜH͓,{F|EEhiY4U`7KzF"VNq8u\*þ'V]$|4~uu} %4d8̵5U9,28omg|#G+pnGoT'D(j7LYC<h MJǰ{bw牙p*8*]`z,tƣ~{;bn% CBmtΔO3KxQ9$(dKuNI|1}yfē^r*)xa(+8&IsLCd:&u:e0Le;PO\U&:DO2dqlJER;/ *!ih[pϧCnے" Q"PUh4h2MB yG?VuN7Y*zݠ$ Lf!k -͇R0E~#6n.ȢX|:tX}Ͻ>FI4U635S PoG &QDeU;rDYtn7\+$0= 45 M]k}]Za 57$ƼRaԕD׮CcbYS âͅn-q*a q2O<Oy{ǻY$ɯ<_MH$ -7S䵨Q$jHӢHx2D= _a|V3TvwcPT?[ޞ} ǚv09 Xks¤́f+kTV`\Nx:EQY| ǔN*jH$H!7so)K<:񐁾\^4 t~h)@o x0EY8>iѯ0 4QeN'Θ"yWh;C3wī`%JOG̺`߄K$4qϳJHg>PhFoNIaZ04oL905IFEq}@oEelh6P[FB;,ks('P^Q1k0Skqs`6 7,9X,H $DbM!M ߃UsT4MpY5yq຅4߂綯{aTfȞ5MU5:X[Eђ*s4_lǹ\w'P?O'5MӰixҐ.UQkf}ka[\u}Kɼ R1WV By9+q;>ZW  ՘3۹{wzZ4ω-D: , #" z-ݾ5Y V77=noa-ђMA:AuڦGG=4_nz/kĻV%5hu$~¢{O6vr\|昅Jw`0(sGf9=E{w Pq߉H] +3%6e)xIfȚ+tROϦQ-Cp1w(DZiġrk5/Rjh3 ]43TΉ`&Uoĕ$g(a|{!WD>I)v[cDg~FRB,7ycX$hx _o xݞ= s[&H9Z[;sX}qtnKg0ZQ^xikv|̚rm,k_Xeq|-:`isr6: [~-Dk1쵍5!SÉm*IvR] kwݫ}_OSz}w Cä׬P{M0vURq,ZVΰTC-9oN٨Kdg"/LSbi2!sO&GB22~7+)n|퓒iBxiʲV|7Qt8z5Abѝx೦mlf}$Qt\Qkj7ry{nhF ⸮ze (/lda(܂%X604%vD=Y89>@ bbJE$>To+%{Po0Eۙe$F?i(v;:0ThQ8$ 9+v{8(g[wl/1ӏdӕp> aHۂ5h2X~>hL8$|y(ҔSu}>8%cVkY|͇U_| zfS#hkH,͆ufߗ ZLl{M* *hw {fJr`[ra*ƃÁf^@FÇolK5fX^S5E, "˄ qM.0GAeYUQ[^lId M^Ul0Zn$=M]Wi $,dveu|S"6x<>~dT \m{`WU{{'mcQPM]Zm0(,9TC rUXV ;&Wx|XPβ$@%͚<ZY<T$'HݮaPs=\%?t^J.o@v5Nrk}#k!Xު~$F>i>k͋n:>;?6K@2&k%U%DSِ@f:^]5~$03{+μhϣ-ֿA}#X%m,Dg<“u{pm矋W7 KPPmk3䇺b+sw?Qg&|C|>⸕;"fZ.EשksZyӽaa1 :<ݚuZ9ãg0g@ baO ].Bm,3k..6 sxn0tB"µX+ c^Mv/5F>:vүD܈B׳}袤zz jKzwGaث`⯯Xw|&fkA4\94U}̴]!hma2Hl:Aw9 r*j l&dqYWvKCDY[r0p*y˷<:= ڝ7W8$~Kk MoNN"g}L @lO*AZD&kroQJOȅgn yR<⯭PSŇEFѶ\$),MRyi>CL/ј<q6Z.nbң{יEcXaIz%J%4:Lf۶-d]h Ѩ j%9S&OF"x< yF!I¢ &ؓKVq)\:'M!ǀ4jR)FUuЇƌ59^T>W f@^ݏoE-_)#IOkgYNV][v )#.c1P?9& Y{Daph7y6H&W+kƑ}Zl$d0ձUNH)~ӤϘ)ZbxiՓ~kcI,wӉ+,{X)HC)8M(MwCKgvh*)I m#<|%29ޜ{V9 ~86a?O7x]TR}AP8\`=}E aϳ,$8.=$GXоd8 ^Tnm]V(Xm;IٰJ}[Hݺ˺ip\ 9 Y~Vwy \أ+;0cdR:WЇ8Ԇn+AVk;Ђ1]$Ekȓ,ˢ|&LUijVc{sm]7_9MQzq\g묪*$)K.ʴ̷1o[Όk?'^e⸪3W%]u[8LQߤ;$ZA}XoI߷L0k;Ѝ\>3(D QǾ\9$cx2E>|_k>?qU~9n4qLbg3wxږYJϚޔӢ-Lg{Cx^4rIQ2s~ STkUV:gk!ߥ-DCCE맛f8 ê~1EڪK0 ijvt:_yZ71xP$JMD XUi ` &avo"jo6sI(ʲ/owZ̺tnIQV?~_]Rc;[CYۦi+{!mk&/vHBd~wdI~Q`]/չu0IxOzKı5ʬ>1Gi1=f|U\f.J?\0gDW:T մ|p4"l@Qwk}do<bf 09O<`a<\]k] JomX!;PxLCK0ŜB1z~v]3g0#}`Ug&58@4ʖ_iz)MoFU4Ѷ99zy9Fꋙ=6Mt$y$7LLbDL{T\@J ՘cY.9m95r:T .FX °i\DGѣ0beuݧO"cÕAFƱm!jfM[/dl{~WઘW :v1+N575KSa]ʛ1̂cA vX>xȓ<[x;%k{RɭC+)0*jdTyh-d{PUYc|5bs4WeTP}g uwOcDFyPhO%v f%,V,d=,|9MfBެoݖG %(`0)"Kz73a{Wp+_YY5<,ådd}gj܈DQV1MP{ݸ3'dQ `;]vSw&[>r g$~F5USJ6q4Ҽ4uNŴvqd>G>t.ɉ8+pⰲ6V('c6Qz/{vj^7&;X02_3e2g$Vrx=##x1wpZ:[0QضݑeWt֍qS}wfV(IT[[{{4 ,1c@Dlw h˶eJ+Nh#TFs, uFW>װ^}=_ޗ$grUr[ Sn>!{W1,$iۺfs;Z iZh̵ܛ6fn)4)!^^5sϮv7|Fj#nMHOF}-ݹpIfٯȾ°*jطz_t*+[y2ӧrQ_r($9GHOFq 󣢤|yÍݑo7YnʉBxձ.q4j(`hi5vqb){&g&Tv{>j׷7=Q"ۭ=X펢&>b.Ʊ({&{\ɵl*&֊jl%(AOǘ,,@oew Fnu}>a}KEB֥NBb[ w> i?CUuW_Kx`{|^DP:IGmUwfodži.~w^#]vt:-wG~jR&Ndcx-Y?%SߍJ~U]g?nk$Y~#}幯2XYlRuBvW_PNfV{ 'I12s]a8 Gi$mp@n)P'' GUW4eqܶ'#1=]WmIHtbCm=R1[{!5Zj(XG$d[Wӻhi1Lu/i&X% [0mMeM]M v[yt5RUYm/~8J>|_T~C{n]C}m6ys r麪z>i~1I9V˪XW5M7(R Cx}-g|> ҒC:!$a\O~: oߟN_|q>v{:}HO42e`4Ǒ_aP_t# %I>Eؘ$IӢ(iz>m[EI42Μ$imܨB=pw$!~a@Q>Y4t ku}o6_|q88zUNcbYsO?].?4}Ç_~ nRY#Fman7x>ov}_|>N*p<I;{ٶ6Ͼ 躾OfS(J͆u: Nw1Y`0IOi]"y8cm$!A rahF%д BCL:ώw6lP'Pwt'Iyw[TCume`IX]?M*Jz=MàPB8c~᧟6q^pjka8Y⧟/~~gꫮ3v͆h8ڶQiMIS!v8w(S I+#ߟNz'In8Ƴ =,fCiO|,+ı-eI g֩b)+fCOn~J(_8 ̨<2TvѲqKD;糮t]*Uնhm6XV%>^w53 5ֳ[tnP}BD4@RmU)05'RHlk4UNbN|"Bk]_}O')8t'`<Ի2|a OFW|O{>Q]+צF}<B2x{>}⓿;~oVH{ePEfׇ4v,3㨺 VDպ^ڰҵ_4X͜#9{9!3m=AgYlߞp$9vvOֆFiu'2{)hio*<(K7ϋBHM$Fu7ֽ7Ӊaة~'؞CTC0qSE9qDj#aXX@rf'}3UaK>$A:ˊr=?𗎣Cf'i[bC{=&0$i\d>P6Ef#ϏOSDO:O32v=2= %s6NĦؽz՗ICy{lfWc˫ϕX|]/Kxa}f]$}4٧$QXz>,g5KIкJ>4yQ0C鏥 na(55Υf|kNof;WҒ:JDyC 䀈R+t7|:4 u,_gc=R+~qOH?wxfz跧 O)םɭ;u$qwn˝q Rĵ? Z7Qזmi}k/Oi4k?mhKgM/#S+ȤKHMmWUM |br)9yEnA~hR9L q,2 a$g}txa" Ƅ|'] 4g7H7{N̪Rvz\KƱ@Mԋ#* GcAY#9K)Q4EQ]c]26~XR>lzS)!6瘑H> ;5?0C!3;ʾϗ^VaDوTgD>M!(Wlݢ,)â 1 G/!EQn.qiX]n8]|xn n鯡Uv?eթȳiێ#9<(ENΥM낟mzpH IBGM3 f#UnF)M t?-A*- <-kt7ت;nٯw1"4oG(\{ӚM@Л(N5 |zVwQ&c;ay{:w׷Un3]$Nr-F"LE"Fخ8׽*(/ѿצ +r-Ix f܌C5̠ +DbOŭ(@)׳&e |obްWr9+AxZLGfF8utK~)҂r[e|x<OZ8@d-v0&uLǣYqQ GĭG|nu=>q~ NpR^.u}PJ+&HLRʶCJU2a˅;lTy,{xASh\8 en+m蟬JJZš6/o!J1P$ 7pbp!xvoOZ3}@rL:nK~uxL֯Q2mw-^02$mKVTvj>}v<h+ Cm}/oNLן@;tiAo847H! >)UBh josHJI f $:|A][Xǣ柳b7K3N~v u]nxx#MEU=ڤ'˾7y_7R#ǻwd*v"evT]\:MtjȨ#Q5$]y*mKhQˊZB靋>I/#a%dLNM*rdvyl`ql]4)1/O#]c0x,*8"'s?wp81W̛&gܙ'F,@Pwꚦ%Oo(=2iClaC`vȽ[x،(G*㨅DcK\[0NyMQphtdvw2ro;o9tCS܃-hl$Á\C`tCLf0i5f2ܣDZ"8fbP1BD/0+˫\ȼlf$4_|#y֠0 uQpoo@c8vدq =ը$׶B@}]C(#ϗ%aflٯ4iw{- Ru $hc2k䮨 y/CM, s JR¹~rr939ۡ!Xۭ6lP)+GDEiz&=)SZ AnY;nR~>iϲk@BO[Q4nU5Mf524y;$ZHMk. P3sT%ӞR! Z\ϏyVb_fMwu}47 ֊p>4 V]׵D%sI3bMv{>w%dBsnBCG}rMf>gē !LSL<6"ؽmKdP3p=Ut#ko#b $̥ (1AnzSЃQv7 طe\R &$Ug*s+PYR# /]heڠz5MjND)&[dRK_ٺ^Ǿ*P׉H :5Iۭb{R*86z3뺖'%9Կ@)EO3jsY{bޝ[k qPA!vN~K\y GUU% eЫж/.ets;[ᰞ45OA B$x|kYfd¹{ e CX?5a-- LN&8WZ`4],%,n!]i]yñ~G3t,y.I$_ϛe:&ousc=(kKId[Z\^re*J̯\| 7Mq,7Qh/k)_GNLSht(uힰwMOGGi9&ad\t,UXwH/ܤY 5'ϰ! nѯO([Bkf3l2c{T9__;5T9$ħ"f&O@ĬB,`QEig/k%ZzCz>#h]R&3Ŋ.WFFCMnϔut| ;ynuCR;%'an}_JPQbL&phmSz )%*fңGD;zE9q|ȝ0u^=H-ҹjL,#u)ɲTiAhPt]n~aK',BJ &GkM I?1~q {Wq>pA8NXv? CqXl}\.iR'~GRӔ0TϧUXLσwp5%+g7 'r:}@ xTjzG$ 47h<[r*iT,I=y_u6 w <ǮzTQ5a@4M-gJGvB{[L514F&S2^&T7+;> ij7XifO0R/_ 5-(k=I(r%+76'fV}.떗y\q~l];Us_9"`=!I}/K}`w3P2(zoaQ;U.E|lٳl`][Uįewvh*xxW$VUg e״;hvJ`Y,$CfyX[XW@t>S{VVjrmisy,[&(Cwn+w'g= :%9p^QpiprI1.| S8 QWI0(ۨm7,S_S )tQ&@NPc3$ CםANra->õ+9l12M3Uu89Cs^B!͘i#@9MxyBqeYz5uT6(~\, 2lEq>uo(R'@A^.3xMeۭQp<=%#i8l_r UuqZCj쮫~uM 6W4D`󾘛+̲>EMsEׄfǑqlNћcal6%JFԲ>КU6$Q8;qش}Ia+' ]j9M= .S3 \I]AO61&ETKWjPKaR,y$pW, 5=;tT3 Aжns/<=ʷ quM79uE=$^O~:i*KAI<ˊ94ǧO?Eij0?Ja6$ldY+An-Dkę뺪g<^iov]tkz(FX_m; 4jJq7/?8I°,{>OQ@@.&,AG<'Z84Ɉ|C8 I҇r!TK:,n\4Mv -h($2uzBm~/z>Te pGi |4)jQhۮn?!mfkؐF & 0vE1e&[.wǦr#0@4-G9{t"0QmY~3`S%7"SF!E@4MUc= 8 Q51%F]ga'QĨ`%ʲfs:muMcvEgz3OEq$($Y+0\Yf#~<}|6MUuR8'I Ƒ4qӝ&t>vÇ4- #altfYF;w ~tEAȼٚ$MQ?~i߳({򭜙8)4?~`$Á_Ҭ 0kΉD,+ 9N x eCmq!:E%? àld8c8>m4EAXHSD^mn>-9j bnCQv қyo6dVj[AǏv:}0r󃀹~nfM|uI2tUG\QZi$y-;4cz5w4ѭKqFfÐlnx;+!^+%I7@ '6goq,M׹n[F8|1髮sIGyI"OYZ8{nxϷ6٠zEfv$6a[U, 0[qDޥ%B+iZHbgfۡl#镾k"%:q!wZAfC`0{Hiؿ*v#R[<lGCG [ u1l5)2_x1!(.8fvWpٱa| :ttfikج` wY[Qcׅ9{ZhUv+ozz lz|o҄^Fu I8Cq6MUm+x 9x꽵acCFޯ{i4]wq]-&"A#$ɲ0sox*nUP_;\<[R =4w0S+E~3'yFc>D d|G1)zX@_AmB@'j8"vߧZԮ߮^*pXF^5)CEq\=50@>'#Yu#~^.Zuco Df_BZNvl\ '?XexjyVEf.vf*B79斊g-m_4 q/|*YR gON|J-cDȼV9e]J hmL5y(ݑ`~8Rro&~biC+=@F~OM7!ay/7~gj] WWDī:FZVot|JZQ~7KnY*Alqe-c\Iݹ~L92d+(Аh,{ IG$ϣsǓe_t%(qVeMܕr7*%Y{J_2g$RMeq|jc?IZφm^lBʏ4JbN{K>V2M!^.r)W髳ѽ3rIt&"a9:Z>#ea]/h@o7Cz3nVeA|"l 3$I񨀿d/KY# 7&1kK?(N'}^T㈜+sfǣ`edoP*"jQdOLbU 8ϝ]{]c)w d L( ka_5 C?4]Q-Y%. ̯kjSjo^X8+Tns=n^QÚq EDa]ϼi`ō# U関_\{SR\^]{Q5h!ִӉ)Y" LӴAt&jQ纗F$CdLW"Q6gbk_/0ѝʑ)C˥iW =8®+ aw;u8kZ0qaDYT]gna˥%ݨ*IcZ~O$Q:=W^q+ruE۵x@h'#Gy4w:s(ϚYD6 U3A嫺E\Di}fX瓑ƽi3~݉=ck\+t:=_foJ=YWw(Y_}u<~€k9 iZ uv~0%ދ4:XMFf%uvGoxN8'+̗m]F O2Dk:5]9뉎8 mb=_.fm[D[|fHqɘf^x>{UW[q}Q'x<@=Kگ1@"͐t)78Ր'>E7xh4( K@*kF-Q֛MWn͗\:k^oA!wXz"1 O0\[]Mb}xm B[eh*[ߩMp Y}# vԯVOퟩ͡WH3GCX'4| m\^,G#ݯcү#r>7Qؾ@v׶NaN6oaK(u]9V6XxYk Lվ^Ubo,6_5.;i-Jxk:WeYܵ'yשf.`q}uP\_yw=-wgːѤ)V ,q./oY?߮ 2QslsJ>]ۊij_9vyn\ tmB7.^0K0)3o[R"Me}?M p<5 C5[M xmE mYg셱#yuqWgY|#\÷,I.<'#ۊ6:ڄ % a7%$ALJIFɲ9gD,&)8od뺪O,?"5)2ن5oR"0`1#sQm!hӈb#]F 2Ԥq\e9߂Oy}WĚC׫Ty̟i[AXi7u[4~)fuF*EꞦE æ& /Mx~0)&XwdA e?ge "{aiV! 3q EuOܪB)7Aaۍ0[k 8np(>Ns`)EsfG{Z^YN1m{noo4 b0DZiT sTX', ˞eIeWY"C^tܣ<8,p53 Zv7{-<x>w JENZNƲF(\$) 8H=f>JERpy=y}FJ8M3̕l${xh p h"LI;]D{C2I1 4ou;rLKUN&/uua i\e=r4D<4?h,_%-QC`4M>(o֝$4GQExO=U,ԏ qffʼk$P6\VYF=8.gUVz{%&E3il|Vv5z}<.WQQ"'/^FK!-,ӈCN7W| ^){dBr\IfjQ+|^ 9Ts1 7Tj5oy!,w7w,PG %<&N5X0T%tEXtdate:create2012-10-24T09:28:02+02:00[6%tEXtdate:modify2012-10-24T09:27:48+02:00`IENDB`xboard-4.7.3/png/wood_d.png0000644000175000001440000010365112262415351012475 00000000000000PNG  IHDR8RD pHYsHHFk> vpAg~IDATx}ɯl{ߵ&bG{{n2+3U.d%0e,-$0fF%,"rI!o``$&rf*۟qΉvG~o|΋gnV_O?}?IF)ˢ(`4q2}߷>g<~H8qq"mq°ڶ(|EQuy^F;N;NTUnvY7i7y^ A:EyUuyoۖe۾8r eY\u]AAYVZ=lq|? m۶۶,Ҷmުj۶=8O} C׍(v<y擼8ppsj2L,۶m0h2 J?eʲv,˲0 4hlv~\n5~~#mlvyyu庾oMSU]-Ϯ,O²[ !F1WUUUUٶmSApJ"7]]wXr#Q80,{(ϋxD^9<l4MáGQm'tf,v;˪kCU6ev.r4r,GT+:MWrxxH(4sʌ)8 :Q?9}ߟL&ɤ3^Muu}.&ϑrZq|u'0~[|AU5MQmYfYY6 ˋ 9y#B_m+4 jAYuZ7{yAENH\Sd& 7F1g- R; QQyol6f?릩*&l6rl!j۪jB-k4.t:Ns_no۶|?˲ UUQQ4Mow;2 EQvݲ<(1C!^h0LS"$c wg4ɟ8 \cn𰌰".XP-иQ@Ua5o  64ye=3oWMs8E0TWC\svݦ)msVTǣ"^/ۭu uA8<,b=Wj<ǎ]___?y"*o3qL[u-U`,8<ֶm; =tf(uuh0+<w,CG< pxG nuUuS&4kHr-McFl$mBxީ*xȺ1MHL{{Shoxo4=-Lć>{=PuyIENu]K#VuIMz4}y4MuiʥyQH2m+gEuzeq>u4MCyTD",mcN+@ضa{^IUp/Q05"e1Ǔ w&Lx<[ו<)=+"ĶQ>}xc -G>%g.../uI/:uM8X$A`ۃAfMS؏8&"&sSB'g #qLu$8 %@I2K1MG%O<}krՄeEV!~-F1M1dy^m{<vkR^:]6WIyY+qǔ#維* o ԂNmIpmϫ(,d21Up~8cF=PiL;F)$%ԵgF8T]w#QLZgoGÁY={ueIKR@CnB-ض|^(iʒ4nf=QM6q呙P+8e7DqҮu3DѮ3߮Ueb,*kjX(Jd:MI-/˪BWD\ {"]&-F4Muׇfn'`p~>-j}@4n3xvT#!bI)lQM&eYD EyU4M3 nTxƲYy$">UD?p]VsƛyfYӔmo\7 -k<&_ÕON?Qó0Ou] .]m[Yg-$< 6̶}F$U毰RKf۞cϫk'7yyyeIL7C[,B?0bί@LV)@[ p7t`<*t`6a.hzvmkJ1ma]{^1WIl|Oy^gg҄ҌuݦBhB(YU!}tݮs5Ʋ$@8 ʡVZHGJ%%c/99 "SwauKB}2wcFkk̏<0#.mrZe>ǑG4uuYe}QTUۆ!Ʈ;"WP6Vf`Ax8:~Mdust뺪B IȎt;IAZW-UFL&c ' }-KaP-}IChPf*?0"?}*☰WtmXRjۺ:1R _7tQaQ5间F 9RUDx,=ݎFƩ_^-9&ޘ,ӅT\vWgYfbpwN&I"faa6 t:m6z]œUYy5 dB<׵8ǣfuRuoj@'BerHve-]-`||tw!~O;h`ש-hE=PYb?P]J "#mN9$V &X~;msr\$E I;iZUi"H#O}]dDz,k0H8Q!"d2bqcD?`MPu~EU*QU庈;"ðbƕ ^@=1|q-Ѐ`xGfd^d~\x{]w{&D<i15]cJ#Ծ%q#m5anc1u. hB2AHue❪4[t59V#"}nvt$?u!n4 Җp" -qCϛN}?G#Bl+vrjDm?IFC ओAr,!ėLYVե[l&aZ_ZjXѠ'2?TfH8 HPC|jSYV]UIjkLIz0E[mo2"Bl'Nij$ K*!F+W@wx2Iؿ* R/: qO!:2ZǀL՞?x+H:үb:uww{-b݇сfFYՎc `lHaAbn,1U)߷c|_ %ɘ.y1gB-˲/զdZhlOG">>~?7i_[~88uZt:7SwN'z$OQlAL&AVՊB<8\ʾ~/i9&frWAWwu3iI}T)]de9~]H3+@`&dʲ,04}xl4쏗tዢ(;#|Pڶ R [ ֍$Iއi]̲Ia(ҁwy ]2pG 1yה^fK\(KkN]& b{'fZ7_5-ahۛjeqǣnw8ߟ9Xr2 3% =Ui (&Mԓ;ZnǻpwCE~"^KV|i\nqqZtvNgK|G_\,W+ƣ'4/...$yNf6@ 7zÜI9-ϴ?/FMcZDE eYf\.(xbiq+ϣHTBHɛumO9fcAlcqX8 M7w4MIr]ߗ3SglLecS7H|yIFb) :U%խ FdEeӴe%ľ,eƈOmM':(Ԗmǣ aV~߶[U ggggtz8P,;TPڻζ, ǶiG AΗF~4* @ A%TIhݻ??C Gg!t \?Uh8I"G4ߟ6֣@E*v!n\l61Arp7Lan( iѼN],:I&sW %Ekui*jLVU zXѲg+f=0ahLEi 8n_vI2\\5fQ1ߟyӧ[ ꉌ]h~ShW$iEr\rtΤu8l6 }N\gYCm WU6 M$bbpwؙH][=JL ތ<* JYSϦyQHA_h!H; f?>T|L5 ~O(T @AN&( {{Jji1i=O"w&pݮ`Xdb{=5tTAk4M⟞"" МGX ӨxS"ԣB$O~8)ww]׶NC( 2'& h"|tT=>C4`lv~>mS 7 y 'fMX]x3;ߑ  ӧ/?ЮP]WU]j&<js=%Jш9&a<6+d}iXqUu8jh{號Zڨ?GL4 ^]X|IuRKgZ'ө>O=ȸM0P cPGT==DJ Dw3M{$ }JXJ¤E`@ΎCBiBtJaDPZM5I..y3!EºRv@ggWWH|{Td{R9fHl6t*G'<3LF@7I E߶7Ч1aVlF({Oˆ"J )D [6Kx2<ĝLɜLQIDq=?`!,V:`m6-:X8B/Z?{v(/!Da8nj_rQvq=WIe\;?}eYݦnw<aҷY(>ۇr z2{4x76[8@ 0v ` E쟲յ?9?xxxX.˦%n#BUACiێ3L& %?æ!bo{mی)h0p]<&hniۺ„qf '١um T]CaXEQ׎㺐S6MY-~ݻ߿'t v۞8YVTx\[ σcr<ʶm?P\k]7$W}wx{<q~aPar̮sYeҶ$UE N#%-np]a9bQɆ Dn6b QB&&|iyX(Pm<՛./􌄉J HW?Rn!d[3], D6Ʉx9PΜ@{Exx϶Gh™:x$<}4me ںnJ3aQTU@uy|`*߂E,mEYyEA|jtk;^8{ݻrHpUn[GP#Ϣ !d&|XLpݦz_u`0 kH4):Y4' EI㺇C˲mq?,sͰ,i*p$J9R lbi]3Q r+pVt{"d2CU! 9l_~ D3)2?9˯./ɎmYl8%`Y7fƸ(IGΟ\0ĝR_?=^Z  Ӵ1vWK6MLG^ԅgRaJS|~\3=NвNgA*12wy9_\saTh9/'\ KzVU%. AL-M}2鋎I[nk8#bq~>#vRq%[[zokDXk%px,.-5z&i2_.W.xv6_^R;1"U%c*4>M+==N&)yV(wL#VΟkY?' eԽږE 49 8q:%Pgz:2#7 0?89lbGo'3h.[:AEBt\Q\پ]G9x<'RŧD"u 4gáp(|;%FAtʝה09<ׅl[Yv@@KCer: 'r,I0+4m *yeYg5)8JMݮ;x}=y:N'W^z5C+CA@=eoRR}sL77ٟz5s\X ;%2/7$qF<>hIa ,#?bC]V~@{lI  Lf>BrVm:XB(M4HutN@,&iut Ǩh4A>g^ptWk^VL)0q'9}DQp9 33JSMʹf ԄO2Irv=xA>ӲnLDĝ EI|qtzorx`"3, I@7dgYQ4Ex9w0pB&9r? &k.K"fCt!(2ײ7R`AT@ ;GD'ș PSwЍe|ꕄoWvիW^dQhsng?dǧ>~^,OSA"X}E;;;dY]3Ip)LJslUi4CWW9!/o# Zet+-z˗A0B뀇e,P&!nEs EXnoQ6Mۋ|>ŋ/8,l%m G9|6N|>_\՞i/ig9%KY) 7 VfٓyljDv*l) <{vqAc WWbM+qǴn&w>|-ѹL 30![ԣH&!6 B*L8S8v}|X չ+Q.`"nWci Ck`W$saǒSDǏwwTT^ Tp(G+gDz-2UYv8Եl 1SEE8IBAښe nWUyn:w٬#wiv M5nFq6&HCď*F $1tͱ,B |x<A^0 xQQyX˗/_>{fy.KLЈ1&:5fW% 4W׵mi":L3ڗb+` ۑz~xղm 4 Iv97۾t2]wv6J=GfQC)(?hB`0hXΠr-?׆9sH,h AXY!}~bʹjPz^#ˑhWM&I;lAF .'軡/.ϯu[7yi%?S!rLJ H'O^ur0_ƇwwȻ(`E젘(JJW]P :֕IIOil{8c',{0]"!Í{7*XeI^^%ǞgۦpV$&n 0NܩS3 ś9(bqw'szBy ,lBh YVK!|GeuR;ϙî;dPCn;n5f^Eْ]0LgT 7F$zgzٺvKOrZ۪UeY 3ǗWWODCa*Gpﳌ^Pgo<>.0/_>{vsÉjZ6bgt"<ȍ8^gځj2Qd[e4'M^~|믇C"i)ƅ6w80"SVU%yeb!RM'HI^ʨE8fA6E(ED- ?QEmk >IC |hFPb&˒7!S'0iMCDA AY~IfAV9n7親*KOPH`Sò?*P%2?&6ixOxqZ1)5{ڕDauvu_'(ȵ#Ozi6>  D7tL{yZ]C  K6b< =Hk XUpIqips֤_Q #2 5)m9 2x//=#5A#R,ĈbVuG#;A_->؊_.YAEDՇm<ϳRs16~ZXdR(XXSij#YÇF$ CX0ĔObYOB=~lYz0?tZ?l[C_Hut?z )eM&3 2Ƃ? 3p(B=TŏJ@B% 9//c`md! <`Kݙ!I>ūWR4E$vwz66ł 82҃|/M8܈EXV61#as]c{*r'TxT9ћn2Ah4>4hd"^%IӢ꺲d=bY ~:<*,O4 +ϗˇ6ㄙN* ҭ@wFeNmSE_bCLFHVphJļ__7UUׇ_^__dQy>E"g$PI8p0c6gcp H`HMPGIYi .Fk0@ƶ8!-k:Sk꺲lf7bZ Kv03|/[1 6)PAdT('~ g8<tg"v;KLp0\* fXwjzi@3ڃ3/4AH!  8OR_SO0C>s.ֵv2< ݲyj]jڴ8?OC0q A4N'zYT7Ar"+O<{&.:⊞oP>h(*hgnn>rzıfl>h: \g* f@tUm]Ctu .1ٶmlyYZ>mqXNDYֶEn*/A#5|R @RDa<`~0q<X/_A痗Σ΄e.Jo̧-4=͌ɢAk 3( $vpo?~|߶EqsAMsF_ׂOy^&4xb``i;X׀?[:2Xvv8m})Lu@oESP ;QO-? =>w|?CԂ`ww>-Pԃ% 1~_9CI@APs'JDzQ-c:Nd2yV=SEj|~qqy Š)Ef9~`19=%c|%ACo:=; ADGZ>tCx}׊rr>|{#R[ 彩Vi#zl()e 8BzO\]x +i:F*xiu]WUA຀ KlQttǀF9ь,tXMr䕰G#˲4p:=;K?Ad(U=f_GGFGt(;]ݷ[~P<70K@i[^l =k聮7@!96l̜VDt c%ZXlJ?G#y+Q8淯vm!9[ErǓ Yu OWcgۙc RRȇ.1smI2DyRK7C(j  A5#ngQ@i~P3ˀy_sv=V2ipʣ߿8;H)M ;z`J(-ڣqT4o67M>[!pׯ_[,V뫫?/A !n& pqϞ=yr}Gj46ʬùHDO'B0swwww{B*h]~2E'(c??ŦiuO%LXwr(ww#9uP$(JnDy ^iB+gZ t@W'oqd %WaJ篮2!AX߸5+YzZRKߧ@PEghK(oPvyeieT3yŋ|$ UH۶#g9g~VTgp p#%0!Ln8nW!*&7ݮm7p1MezG(UiH%ɲ$^Yp=qGY "TQ'MOme23fI xo~(:[a|ŋo߼yFҶ+ GG&!@P+Ś '7@m4&؋ʞS ;PR0[,}}qquVGZ1iz8686԰gFbb>!mm#{ }rr¾b^i_0'Dhl$MZtO)XptUJㄡ,G9^iڋG5*U3J` AjE$u$LK)GU4p=]Cwaϧj7iN"UMz(VPЗeoI Y|#s||Cv߰^B&ѭ(k7[K/-r1&C-<dI>TՃZx&\ϮKOd̈́mx<><[+ _F2iYm;M& L5 H!ˊo]B=e!r2͝LPocߏ"fӴI2B`@݆-J|8Gxl@ZF TVhO㋲$@m}H&r&PR a}ubu<G~R+:eEi2AnױT!OLF#pAԒI Zij 㗋܇f \QDd3#):LVN&}wU` ^s \ -\]M&-yeCVrbyLW5MU"[,GPc0FX[ݢ^ 1VcYl6]]k\?FSJO 6m#5!~U鿣1Hz3$K$jkGZ;}=5\ǙgY-z*hV|f;ʒ&cW%kqL 5Y'kM2g9WWOfsX#l6l>"t`%<gCo4//j`9 I΍$KЩjv`挽_zONKiITE׃zQ6L jف)a v@#2[ͷ}/g+W$}z ew3A/ن=V/L\{$5 QSj%2% 'ێӔ/!0Qb/Ƴ$\o_B""Loή>nt:jQ#_ܶi [&_ܲVZDD?d "F dcyL( ^z2fQ| d ǷQjrH,sY%tl`ɰpG(AXMN*?<_m5j|_}Uu]UMYLy myQ4MlY(P3;l6/ J0,v0Qʮc؀G7hmu&RvPx |f8LS3,bґ=߷,׭*YkY$|.v:aՊalll޼ cHU%G,׵hSnB7o޼y6IcɬĎJWdM;y^cn{bHf4 0 S"^ =9OAƚ0t^벤ExZΓ1b%cpyj򼮇C70<uQx|~ve L-߻.ܷW Sw!)3e4x}q@ l,vC!]'#b-L|a7zf٩:?'5( K=Dz 1㎻]QSA0lzsǁ8@o8>;C1$E4̘v%H=IYBO%6K7 Rwj}1m+8ey8ı Iyx,qn-"qtWol @CzȵSZ[Qۂ*KebW[ѡFR?A>j p\X=yNpe2auũ3nq ¼tD 5r(n6\![w}%^' *J(]<w{ʌE׵&lDv;G`6#쑦T& ; l\r8pm5c#@I{l]Qɲ~㋋'Obo6}[|fAnG㉵OU4Irv6B"%8&aC3"4MO2?]2vw*&Lo)<(>|R"}]"e :<' ۩Tz#<r\uI(EMg"ƒ*0?v z(tMæwH2ncs|WyMs}%=%c8//ϯtv$ϔQcٿEFEL<惐i0' 3EF=\ t܌4]@j}#?1˲{LЅaL>(:˶uH jrN&hD0Hdh M!Lh4Jm ]kvCeb;,)JFN˝Aŏf@x4hq-(ǟ$xg44Z=tK;OǏ޽_m+ )}Di<<@'ݾ$fXX{>'[F;l-զ[^nFv "A?$fK Ʉ\6j3T 0ː4o~ʗ ,KЎ1WHt %ŀt:ikC,~ Ik+}%z(Ɨ$XV!,B: `YY%L˱I+x!<"#e}u|Rkf1"?0SmCO z"v8<>fF苢mKNg}F Ԇ";DbH%(bf^?<`Wb8Cxuϐɝ4`PAzSszCaյU n]tKXBR>Cc]⺳l&{qm([#~\M=Ҩ( <}T`S#@ d\)8% ¦ER!yJ ;c>oD"D3zQ9/MxYۡUEJ˶=0t32T,q֣(3k7}2oJ4mAvLF@noJy=4}ږzQ N7{-5Y>V IY@24@h((hgWЛЈ۸`vx<aǰks-m\-ڮjץO#c6iá)s;k\&Vo|/nEt]C6igL/*M- >m_M=ֈv>oN/6~`зѫDwH#1o˘}hMˋ\ÇO4Vl ڑMDՀ2pV%4 03 AMʒ5JKɣ"|!5 BTphAoi =1M?0bn%~ǣpw?bgsx:G# ~= U#+*1ˠz8A:Oٞ痗|RSkFӼ#c=behV)_"?} uqqvvv2"wh0" gDFV}'LZ,%7XC`L[`R̓41g^x,6r,F[i(n۶E]1ꏏ%Ժ>%r }!)L>Zǡu4F2;tQ/1ltmI4x82h1GL0,[z&(㢧STHHI]sF4n Rvi)Ocwͤ1u3L`vYJݎ0z Vނ. }lLۖe?3Lt|_CH)}mFb^3k9C NB!"Zj ښT"{ B4=/u]$sI_Ora18o_}EDoL53,@%FMft:]\a(?0LAu4>{w>miǁu2ƨ5 m ;ʲxeYYx"{pЎPGWdQn/ ({^1h>=UBN79f:e- Cfg)H_|59g8# StJt'8]X_@_;Zz̆u@@no71VNU9;g37(jDTvpЍ<#*y9P/ih^]]]I OCtNt9*3,Pӵ2r!z;\] N!p?ٿW*v&cm6;yu[5OT?ZA(alx<";#ֲEoCͧڶ($󝯾v>B 9"09]6eR']T?P`aOFw:I5 +3h龜/~1,e"'z9y&-iWWWWBwvQ+ET,Pg0~[S/w 炸 4dERn#jIrv6&jU Uy R$)Kxd]69ʃ@Uҩ7o޼llbJ`$9;#nKmhR-L^$g(.<If"OIb=hJ>wK!B`4rS%EAT~9bmfD](p$¯$qy $酳n)ep8r?$juyyy9h߽g]]?O gO>}b<}ַدfe,XX:wjG.\?r\XaMOp(hUW|s4 ؇@YpϋV9Fu]Yeu!@*؉ '^-B >Jd:zI Ko5Lq~B )0Ld%]sLKu&;›qu $h {K=Ѡ^_Ae%JL&IK8/ui'X7!g}D/DwҸBl٪ŝ4o/{Y' LK#p87zרvWWl~~M /TPvJ#Q&':bJ- ^}4)h2Lt]>lZLAW^Jpw׶uSv]bAOPFO;"ra!L>10Ej0>Hö4ineYFHZvA?nS~4#VX,k[!<~DE|f$LK=̃b6 -o_2K@Lzڇ}o]7_^^_y͛7ׯ^zB6*xqs`p.#*zl@h ۵u/|:./ .ðg7cꄡ U >|x\˿'D p"ZxR-ϋ""-=ȲQqO$(:.zE4=w;3zj (AZ9$a<áe"$T|RQEIBua8qLJ UP/^<{=x|<Ho;4Lϩi:={ 6ߐSAX_}5{$N`)BJiVf&xݗpsSǃdBL5Ayp&^7d:~!Lh,°!QLT-m>Ag0 U4+ <*q)j UQȌ(I0g^8(R/bFhg1fWWA?>V۷oߢ6p:ЖU8M`Џx1 `KSMAE Bl΋ijnίH7uCJӴ#tCmJDAäad8Y2( qTIMa1o q$q "oc_B ҆UքNّ(G痗':] ӳ$FVWa{}=Fp%giϙ Zbn=GaND4Yܬ$~˗_(t D&ݻJ1O3t]] ?Af@$kl#u}<5Xq$ϟ 7My&c˪*k[A޴?8D!4֢Z-;$xd:0-9h4KM FLcu0@9#dR9d I1cMC!( `4YuqAݱb7^\f-DֲS[Jve䡪lmQB U>ײϠէ)*]mWWϟAi:۷o9 >IxZmfa)xՕaQPbCAkN>ʟ?:cʲp8{xWŋ_}kwaㄡ,!L!C4HCqs<ׯ^&i]OYgS C'JN'sVƷ6QHiC)g H)mHeu:8,am3Ŗ$5HM2[l6v//gLjr>O9dMӇ($!`یD`iT)T czS{B~n6myKxIqL&&tԄp,{x8l6XS3DТbCptUX[U4r%1 Nzbt",bYuԨŎ[Fΰ q?m#<^/=t `жi Jq,  u]ӄm{ }lXzSY C-eYFez~ .//.d"?dgiz}?LMyV{-JcH51FgΫW||rHρ ;v~3*iQq}ӧ/? FBHo 8=i;jfץt[#0}9in(Ѐ5aq,Yt~6DZ,!7?yU|\iq u]v7p躲b_`L֗f%eDyO %⌹Kͯ~7\77O"]}Eq:r,4 f=$ F6i7cQqVEE!b(/B$}ϓrZeyΎuO CSoD`(M]9S0`3ˢ#]n]]' `ccEuIby^)%Qdj>D!u]YK"N0XH`YeJЅa'X1 IIB'1(ǣ+y,9)$i70D]0=?Qty)u׼8M+;H<(۪551:hNcټ(p#jۦ!Cmf^N3-?.vq<]q,;%BLEQwPL`6Z$]lv#{>РUl.FzŖqəN' 42Rb ^|3}If6<=;S&BSu]Ӹ.41"eM1k͸*PѶk!F#+ KHJRǠӧz}PD#nLFC/aqZfG!x>w._ItF] y>iW^zzO{/ٳ:X$Ẕgww]Y%](뫫//u&_Wӧ/_~MǏ>{'!S|NgOu[X92q9 vtOفg@T Ih4P>?~ى/hȢA1w=>n6YjR:N7o޾}F|lvqy}3RPBbYVl6\]u網 .=iC/,OsqkHueT\៫d6Oq<^+tFM=}S᤼:=fXHR' ;: ж~iV=C@1N O."!= Lx2.wm6㣮% ^V|~qi]|}$D0yH0?)# zTv z]~<9^I2}D2&We"eǦX Fsr\m\'? TT",4eU5N]Sj( ?+`~Nayrq޿ɉZ+ :`GY{<4lϏ%i1*$ Cݻw>yf3ZƇu _]2SD}]/3"^H(@SnJtR'` qc?%?~i/j8`Hkt!_UBhQ*խ@$$[3pOcPh:k@.< p5v:jiu`uȻuCi 4\pOx-=L߆{֘">8OWc^HIsP-7WC4MUٶ~Du4]=i'>-DϫkY@m hjX,KSݛ$^NKnVX29Lz!q[Mswld2hwoi'gr00<(_Yշ[hVi Qʒ %HxL6!#uZK hj[t,b~\ueG! ']KЏ=4zqTV!",:?vˤkuuHar][X`Ulҷ-S8՟? CQm;Xh@xZIŅ,?2ţeZ?>~ Փ'L zV$ & , ǵhlD9fVq8$f TT= -dEuZ-euBZut*x*jnil転(g3a6NTA9ΐXV"f# ?^>nF; NR8+)[=&_5"Si }G#" B *uK41tEvr`rǏO\4} i`pgp T8'˲LE7L!OLF Ґ$%%b' 6;4E"˖KqpYfY]Y\bƤVqv C8EA:|m8CcL!eY/^~]v[l6m,w<v;]M,P49VAۮכMr\(nlv;z|4(AJ;z/hdy^\f"W:El{2ɲ,[.1p@a׶QP( 1 8Ulﺶgn6p8 gg JP=lL|<>;p8F\vض>~ssswKOȡC *THUh0д:-s*+ .&".p #-jv{<\> -$][%?C/̂:9+FK@vݮww$i"7|`Po|~v5չS?ymP,ѶY/YAg_>*u]]]]^fxR2qXGEd[Un'jt]emv3lvlvZR4%zS@Βk>!oPa<CB&JKd:mUZ'jP,v+Smu=U, ʯ=ff@u5ˎG݌Fi^,%;VFpI!6כ'}@>ab氌NGz^IV=%6IkĻ`twS<4MäTp4٭!<2S L&aOS⚩4B}b/Xmt6;? t O>D 6#t.X7K8@5a8Iuyv.3@fd[eI-%$c<f]z/A`nw8<*}vacџ^|."մ^jwkӘP}IQG!aJbJ.bh,bY qoiX`0`@IJfs'vmJ]#~LB.(|R6ϳuijw%w|2,AVZofr"|c8Pӌw*y2[a4Diu ov*&2"˿~/g,S:-Z <0Fo H}:e$fNSuE<4eZ- a7D]޿I[r2(k?{dYIն&,10|0}_z#k2c*f/aQEz]c˒3k'=7߼{\jr^!x"=c/p($mqyC' -rYUwQh,B Y;NffߓAI=]U%tEXtdate:create2012-10-04T12:02:12+02:00弲%tEXtdate:modify2012-10-04T12:02:12+02:00IENDB`xboard-4.7.3/png/WhiteElephant.png0000644000175000001440000000743712262415351013770 00000000000000PNG  IHDR@@iqbKGDIDATx[iTTWTIAAZ8@vLi5F}dlc/jW JVH 1N E@D@ֽ(R̠U^jq>g35m@t+pC `(tn nuRsG"j&N8.֔01Qu &<9xxZ@u:wwxyy˫{ 7o#/22Ν*,+1 v))LZ{s6z+M3gN`xc7oޅ 3&Ǒf>t'mI?@y[q&?5xp֭+g".nV`ڴqUTTt}!UfJZ,^4n\d@JjbDD<ŋse[aORRUu),=Y8;ysjs!<226X'fMcɒ*%i1:QcDWW22ѳذG<;wwgCUUYNp @TCYX0l ͻОPUյHHXCgՀS`2Caa:}0־SPS.3g5jl "mb۶a )7|7ֺ SU5P\\ 볣qV _XLO=KR;I+^bzƲlx`2'=}bڴq((؍?^OOfEu:- @uNPaA|| cUgLR'!8zjk%'y0AUa&A{xyy͑#uMgP b9}P\\5j@CjjL?N(,5{1nΙ ylVpe0 CDtp&;vT<8rrr!I8g;)(q,+GߝA@w8k~wЋ.upe`*U9"''T;9 GlBzc<-YUsg%IƪU8q,Mh |5ۺ!n6k%1!""'&09sBr?BAeM8xp nOnKQXx-<<\1eJ[a}e}# ``yKɭ H98sNAe}Hel-`?bϰ9Z3g2y_>Q5)SXX -nbx6RZ3d„iIp*1))Q52&WQV1P4qYX|+DZr"RS#50ӏ=;bĈʶm*dYYMɇ @}YSLo߾eҤJDQi}bz򾆇k=ka]XCjeY K2&??zVO^d sDM1qn.GTYh*3Q^ 8u Jʲ2-X̺4" 2<#f+Ç@MD1$uV[ I{8lCzhE!;l rsGYYelٲ9ER_ EQ~=6;n 6+봭eV5lH@G^4[ ZgOM$%w%tB>kXy)$ds"d<]aذamZ`*[8ۻHDF|+ k ɭ2NJ Џ?'"#ME=IxbʕH2` r޸FDF7o*t|ZC=`rnnGsZ0}̐!}s"KNŋ ˗Byy&^y%1xpU̜\4zhDtۧOGeť,[אZk>jnV@``ש/[dM5dXѷoIFSyy&d:FO?Ez=D{QWÆu~h«~6iBCn3fL(Ҵ"2RI!0E.B;о}kkw^OHg|A,gM[^z nh5ee}AbG!1]?aPYy'&?_N'QǏ8u*55&DEYMO..8P`2I`ykaկ YӊoΝ9 O(4-]"LK555jeCN{))ی/5<,,hgٳ}N\W?""Ri鿉Htbڵd?}jؼl |ܿUvrJd$Mˡ5kcK%%lbh ״yNf^S=b3:1q9:q#23e5s=zZ`02o=,/p+Wv#য়ZW>>[c0׬Y`3ZUOѠAԩ`ҥ蘘Ȃ,"2Y.yٓBd$+ι:ۻwÆ t'SDFp!\\ ˲ɳ!!p់ޝ;'wkΑ&;Odݻ˲˚< z ע١= ҹs'ƧD,h0 6X۾}uOe%K ش 2[ݶa 0ڡC_P&L9s&SuQ"2҉[!ϲ'A?*tfq&OOw9%}5iZ9*,L۷Һu g~y֯_5tH2xyU-+{DD5ee>>1v`9bO>a61+eٓeY~ժkQWDhh,pyn:߈XVQQZ``ii]CA-0|x8;4ĉKϕ$u'MuLƋ`駝vL,8_!,Ɇ0uu>rrRD{bzx,[{;BHz־Lf=ztT;,jt'wRA^RvdRXy$Jt'4QJԵk4|qjq`p,᝶m  ּ``/~d^^*4Dɢ&c$(W_}JJsAϞ^n2ܹ`!44>>\*)9>} {?4u^E~A4f&X׵DI0zfOFJxL0aNh3g.CbbDQۑ]ZX] 1 P5M?_\|lK/ N,[gT ;{5@5?[~kn{9-NUfe13W,vIMXɻvO?=`s38} AE9Rf~HV: B>JNN3BHjA|S~icaҤ*674-i~8/ir:ZjN@@K\\Y,TUhq<$j.vƍۍ_߻amIA$ RdIh k7۷Mt66S]$,~&  ۣuk?{; Y hbJ 4m`>9„`e?ށXPZYЪU /B#F<8={vキwLdMIo2ıj2QPPY oo/ W'0a߰|&̜9KNwn4-@8-kPNy DZf biHiiaǎ}yHP 0xSHIy;Q t18B `i:8I/_>S4/!1q9s\ +G~9޽dYtIoUXb3>`;#? ޶*:vFv%3cƘOi۸q7ƍ1u麮U . wΜzFvoo/\6`͚0rj|dddR;qiwZjBTUYek` g /8ؼy->E^SB:Ī*KtX6Zu iaڬ̙n0e{ 4GCU=dw:l.dmڴV!YNx<~С,͵m1<5M]( q綴<5L Xpb> dH?EIon*_>t3x7Zhnϝg,\Rm|RO4:|X$I6zC Jx -6_\zYM>L8I;t3jѝ-{ڠ; @߷6[c!V6-PWVVs 9srşT[h_KR3U} (͹ޞDGի@0kxgzZNS|/EAQ"(HϨQCDDD(*Ra@pi8On}ҭ[`{lh=4(Fv*}d8^gDQ^G*II:jj"OK^8kM46<79iRzN=@94Ng, rE\\~(#!a2g/aժ9.wM!#cضmrwE ځ3 ijώ6[O8 qJ!;vXvha8C@^G^V7nåKe88!yΝ)SƋ3& 40z%0>Hv><~۷C6p`nnZ]}F7sNV@[,q^G _#9y@>9S]:Nx9Th4CgR,JZQk﨨N+܏sljjmY#e%`NNXXP+&'<`AHHWfX|2ZF2DTTKoy~Q:#9ye)퐜M :ut[Νeeۥ#*'OPsۿ$&S}a""B'w{\dKv8$bbۭ/4˥KWYEÁy6WsrI",;c E@4e̘a׋x22R?\Euf/_΂We3v,77#%e@^9wwwƎ}B@0Ξ-<2c<1F\$%%'emmЍaOԭ[T뀷ZM 7HLKٓE@cg[SR)yVӧ/ȕ+HK.7;x-!<>+f.ۓEI¦M{ei9C\\uu,(xRSSǦM},o -Xܶm`4 嶛=9[4_1oއÝ; >]ݻXq-6l)[i=qY[ q ߢfKF%&>'⢅ș3dEZXW hZ _RtH׷͍ѣSāG$1؈#-ۆo=ֲ7N0Wʾ6iŦi2=rrWn!4:)8@h'5޳ __0m-Vbh`YzzRE&cC,v+ Չ*C.zM]uH '&SO?],bb::m.5;l} %65Gs7_BLlзonnG L{l]zzqނ~,VSJ{E], #x>};@ch5쁍y#80FDGA@Hzz2q8w쪳$F8zD}@Um˥/tjFGPh ܱ/lKεQCʲ˞kJT 3UJydJ+bc{{-zm tt\DVR� T#Cxeƌlݱ?YuaYI𭔔D`cl;Fܹa@x\RX8EE9JXRLCQ7=}5u=FxDD5hNMpL DݺKMM|$ڏ?kkk;kqFKo 11ۻYv Tx}2]hT&AI6z5++}0f_0Y %33f9=23`n/DHL ::R`k2@|||?^vjv,O8;vucG(OxD,(xʞ)Gl.K̴YˊV;FD!B7'2yyiIENDB`xboard-4.7.3/png/marble_l.png0000644000175000001440000013505412262415351013001 00000000000000PNG  IHDR8RD pHYsHHFk> vpAg~IDATxlYmiZއy^{=|NStU5(2&DA@  a_XCpHVʎ|ᰌl@ fꡪNթs293^睅!;+s}}畿_,C4 Y6ϋB,˲,%)xf, 0TU]W3 E%I$IEQEOLӲL CQ C$˲(N$,,u]UuߑeI$Z㨪,eYU}}_uݶuMuEQ8oAefU4}/^,2˶ٳG޲ C CUYFQYǛN&4Ea8v]]z׷a7}U}Uu]QlYV]WגmYaeQuKivLp_u]UI:YaY6x߲$ݥMi)R#qҋW $xqݦ%6erdYM IJL,BD`M~#oӧOon+q]>8?9Բl44e0^U]\i2MF4m%IBMӲTU۶$IU$UUu}/I}umTUTU5 Kk:NG#M4Y,no󺮪 LdYQdѶǶӿm۶i4M,KTCUEGu}_}/I[}_u](m{b$qE_׾;}bx\UEeeێc4if}p8aX*Po6au,.YnۦQM,˲}BE[Ӵ,u]wݽ=î{!a8Nfy/+PMmr8=q7M]+ i*WV CdM&Imڐ)ij۶mʲi*)Qēߦa%hѠi,_ C450ӓ^zSf٬VY$Qd΅XVYuHRV|Zm6oY]i庾`Y\mm2^"eyn=O44-0LSQ,-4F!%}OnӴmU:Eβ<7 MӴb͚,m,tn}0p_z:=::9y,KU9Tˍ F#}ŋk-KQ,qPUM08N<"]7MM[8Mqu5-KXe$I$͍Ze yeEA$heYApp?<k/ǓtS+ 0N2ϣ,*Mw?<<::=$ ægjHw߆aYlJ6ap萾,H ,,憈8yAYeQVv+˒D㺮uEo[I"$ U~'_Y,W^y7fk9ɫ4}߶/.?͊"M7# % i,Sz;YeyBJȲv_,S(YfCɲ,ۖmWrj`00 0(Bܶue4Mm[QN( `0 ^tiv(E4Uնr9p޻Ǖa:Eu߫*98A0kmwmm6ie?N&I,8G$E$Mbۮ[UEEMӶMCrisVն]7[UUU{Yn[M ˲˲m,={|뛛(r]۶l6dYQ\(G,keIRשtzppxuiYE$IY$zeiY(zn,i",Kӣh8],8H(u۶m2 S,*kߛX?ܡj"YeKj,|wsWp# u}0mۮ벬k],}q|8}M$ɲ?G>o'u]4(lqUe A0EשmmSf,7777ڿw{oO}_ /Jevm6 7ZVW(PwP um02MCw6 ˃} ~s8|U5 V9%ڶ" C.BQ=/ A@@dYm۲T^ ]W9(˦q%]4=o29:꺺sRf9<<99]QUӔeUYIr]߷mYul[pZK˚N Cq\WU˲(dy:x/VpJ߫j%I4 p5i`u]y]G>8'{Oǃt D7wa88p:v$IE$9uDN$6MeYeͿK K 믿{{pIcܶy\.giMva1,' GiVU=<^qX滅/Ijh"rFQlm۶]E$.hazM¥hۜN4}(2yNjEu) $ 88[e44V]JQ(Juwq*p_m* ˊPz8xps3]]ѧ4 U5I(baiwOrnfE]뺢i$UaTzʜda1,i0Ieq>NZ.(RmM#=W}ϭK}0 :%˒D?XĄ*N@с 3MY. ๲u {IRզ:(eI95# Vly.,P&"0X?@*McY'5(if^oy.SvqDDȮ!zbE^,E08.(ʲi,˲؃ahEQYA`_ɗ|ё`|}٧?=[UiEPW?aa"A~Ib]^})i67oͲ(z6㑋lYMk8NW(-A7/[}?(,DZZedi*IeS,ip^UIׁ4M9, "'lTx^LGGف}? aVbetj"U5 ȲpeQ) RUcJeF]eYQugiZ{Y= m0]O-v]}' 7Mp2HEQqdΣ,+}{{1IkԿ4%5"2ju]= mK]g uGj^r]X3п'(biiz1}4if$Փ'}Tm4>xprÇM1O>y왦VU]R$e<&PUM2Um괮x($ɲHpeqe'ȲiQhZjE31Jg1} DYBg*mU5P¬ݦm6L Sۮ*Y>UBD=b4 EUib). 6{Si{oWlq&wIȊ#@Dl6=/ %I-+4y50%ϓd0"N-+ve"LQJ,ˆu'ǐqEQTggggY4 -Ȳd.?qe#_RUHXϞ]_yp7>=?ԧzr\w0PU3GGgg/DEePMY` VVBdQU(k0 0d۽x_ Peq<648Mp2y!&@*%IQ.Q_GxS|?D:$ ,8+ wWX']WUΏ$pIw$qEvPy`:˒ӴiB0`YQT ܈ǿ#޻DOH8N[\8__G{#~e$˦ :$)wRv_\muY&IӰ(v) ~ = P,Nz6-aZMx> U-KxTLZvd$RUz=R4&@, Tm۶_x|0ӻ{24M)Yx7,!fssOD44sЛIݮTYֵ$;ᡢ`psssZf%+:G#mTDw>_|/ߟep9amQ5Pi4 vǏ?fC2K 6ϣr:NӇ_zgmk,s5W,mK[,j^/A `緷x<rYFQVpakY`:!T5L&^/h+gg$M^Pۖe.g?jrIR˲i6X|%,Vtt|XXi(,8aHbkҶ44%3MpݲL( |0h[. п㣣4Ͳ}Oݻ^e׿;)==e*!؆^fVm) {]Wն7($T4m[Q :rQqU!EumI6憌;l[ש'"ϗKHZd4lqjJT)y ak]<}ǏEeβp0 ƃDc9e!WA9/(jMGQ((=t3 ^~ٳs@1} ( z0p݃+(!,t]`%SF&ٲҶ=OQXdIrss{a8ڀDQU~UmE)Ãl}UƤQ:ߕepյψ{뒴\.i[elkЍ0V8 gLʲ,hCq1/qMKH~- ys:p8ıi1<6I[E( n264M35Cń"Oו%i넞7,i .&w}E^w]hbXV7777{{?#Ow !5,z'd]iY `nH ʲ,B+w]Q-pXzG~{}o۪``qĕ 6S4 󨨩l۲>$#UJJei a(xٶi)uqڶi%?dy0i7ٳˋ ,P ,˲[p08=w 6HKV( 4Ͳf _#]WU|u]ײڄ2 OW*lUuXڏOE$A2/E!jVIݺ59a|Us??? D>(||7^ uuuu5_]]_xN$[4TPCZiF)l6uQTUmQ6M4Mk,"F%Xeɲr>Iz7|,w{8#'I#&* &%y,/{2ϻ0 4]q\@):nxO~t:!cEI >v@E]vl}@ }XfPM0&MA6`AyA8ueEd9/A $$TP4׳p8޿x{Hճ,ϹfM8^.@e,4z (803Q] ΑFNhN/I' k臝"ivwaԵ$mQleYmFXFHOfi]g:EQU 'tl>x_onnn^{|s2999;ur6kޞ)v sMU8?S{ޥ;"Zx,p9п`MEO<!2]WU¼fl}Çk,!?۶kZy iZ)H .q/QݚtǑx֚&pc}uoBжn:XehgE۱0H0c$l[@{>Y]WUMۖO+ hDD]y4MYEC7WLu=4Mׅ1"<]'7 ] (!>WFfY v`%u>| etQ8/x.uh$J']V"%V\q)a؅tكl-;tm$`yA0t̳gϞ=~vK/ T]'˿ ,z`G,u˲(☻$i숀um DܶB?!}r|g6}zRDR(F4j$DFHL&!Wtzt4mUql6E!Y˲h̕%,M vƐ*]qвzF?<Ϸ[IRg~@=;?W~u] &0izM3Mϣ ,nGJ 4U\׷|X9\TU")4Ðe!#VMÃpq,I|~s3f?I$>oO|n4BSfA DM$l:z}E)EIB|@\(yi"t<~'3]w0{^}5 W0;I8N 8/4xj;G+>M`z-$ao(h\MW4 ~r''p~x7`lV]W׆a8|n,XH`vJ2A(@麞XFFIi GӐ1ւIZm6](ɦM@?x~em4I 0*B_QPUug[U$5_hցZy6s]cp#$ТxV"z8<<::9<׵4Mr y$ɲ徇X7jiB2_~3[PU':SVp>5ΞQ4JpEQ,p8k>԰H[,VMfSy^\-^ш*B3W䬪ڙkHiiw.Jh& M.7M]1v:;;>ȋ;K?M>0)]ΛuMxTGWv]:YUeu]W2ILAw45 ڲlY",0 pm&HVQeFsh.uڶ>?>1%EQUTe R^EwZIE{  YQhUe;&qtcxG&(dou; .GJ!)BX**[#:<8n;` (wAھOF)24nu "wYg],,˲dImU \UimXۖnkQVZVv-m. hj3)'OElBn6, }U$j(b 1cFIu#MSUu"6 OGs,sdhمL̝,/VU7l(']MzwĪfScPe)LO *uIיfUkPc24Fám>3W<޼X^,D!":5Мcc5,>!U,]'_,^eZzϢ݁;N_fl8@ [泳clˮ+Ktgax{{s^NĄZ'[ ) |]㦺iVF$_X50 }fl%q2GLFoBRA;ڽ6v2,60 i:d$SxDaBe}|b |Ye)9dGfsss}-|={vuuyy$o6h-tntP܄Aבn6z^`຾߶LwWqp]S? U:#@rϛ[IR`o#ff)$t9Ǡ+acq6KR1*z 09>LwuRƆE.eVm5VizppxxrO<BuHU' x2W6w7?ɷ޲mkO8\ 888: CϳgϞ>0 6Iu0Wy_Ǐ=oxw}ッ|[[9QAGšiqd]1G-9>>>_U/ۦff3G$M޽p8{D,Ie&I! grt:ܻQ\r!(n]wwFp|uE |? 9HS'x8\8Iq (J?Hv,e.M#ȨI;X!{L3W!0wp뺪}#Rw4MY8?" *hgڶU :2 xIh`b/(TDDn$pە;CEINQA|F+UAd󘕩rvvvF 5wY|/˾oeۭuS%knڋ/k" \BQUNx:>Jeu i­`(3 PlEa>8OQ׷ }/!!IhW?tYY1@`"m-& l<;?p"u1JMH49 JRu:B~-c1yٳ0iDFuг|߶9sE|4u]5ż<1XW#뤕y'@Ѳ1 Ms]1e Y;†'"a>B,,ᅍ1Yu]pҢ CQJ#"&qͰ;=iKm%1\vyו.:8A?.|10@a{LwE*pyBƄCt-~^Q(U5IJe9wf4}xɓHfn\ߏ׊M]ųh$_^^]޿va(e&@?= LI4B !g ʁ8\K1 w{ #xE`@+0c$N(*躢`*}K,] ގv׾\vn9ABQeZe:v^f 7M|^Q$d-6U0а33㪪,c(b:Cf;݀FzfӴH$H$HiVUS@8麞7:BtlRhk5C1E[~7X577C_d,kTyM'l6tvs4m; =OUmU4D`jUs}$zA9sZqrXe HYVy޶uM0^$Rp΄Nh dY1 w`W8X-ieI8n9sV96; qpՊ>dR)6>R]%/N5: OĀne‰oyO wӲTղ/3MLQ |(puN<{(F$L2ʲ@p̀kBLU dYQm ۻQK<t!$GBp(Ԗueʲ\L)419a|FHL 0 zO~׏NN!el6i[{+Z߻wttЛ D}zi[ȝy Dڶb\M <:N=o6l6~V1E$t$|v"mv(,Y6Yrpl ->6ie83@NB0ziB 4V\M#qrY@DI P[a@m%X 5pa<.9ZT |đ: >p'}ctF{-B1zm:8YeI; zI4t^4 L8ERfS/gA!`ຆ!5q 5m MeD!pݻw/!hDjWvLGGs7ܝqTID ƿ놡9hwOo޵[ީb+G3A>QT}Yn6lFA*º$&WB 5٘Ip-"F$"ɂ1akBD~p0p00FD4wsݿzzvưna.M7eGY1gݷ$I[Cfs$UbxͲ*,`p\ѽ{GGaȖ?<&,\|%*wK]Uc5%d[[~VkeYW m$L *;\T1 k&uw wb(+`KZb<6C$tFr\FQ]WUswuS 8idˮ; |5 sq4TU]{{bXFk8qbVN?G3Dprִ8n$k,>|5*&FyU W4"/5IlDضib&4U`O(I~||||\Txm<I:BQ^oh X9\q,۪j8Ʋ4M7bz?c?C?4Sx,˟pR}<>:z3AYCA1&G<S^G#+ 6 S \'N]8*_042%?q4]*!"B랗e . W󯮻h 0^L=R0 C^^Uex,&L&IE纮mgYU˔s^ۯ|_}5M׽wV+tmQQHRMF *8!23> #Nv8Kk|EA0FGGݿoeYU?{qL u=(ʒWtx::VDuQx^H-$ OIYDȪV吏&o/K>* &GÄ?1([tȿcN$mIR\XfJz$FH4#LQq$bZE@~$ZY68uGxYū'O..D`@:q7J~],[UuqD)KẸ:Nʲ @?a33R$A7  a8BuC t*&Ix"堁 cљ }$˒MC%@Ԅ5nq0e8 2qǫXcl;Ouuyؖp:եilۆq3Z2>r\pn#мsd n6 }LN):4 tɰ@DknIK溚f"A.efZ=k>ñ~&jWtEdYUA2$8eRFN:bb'oQeM$5{rr|+@>!/<C4<0>< (6 l&6j\s0UP8̘wP2?Ƕw`1NL]'DTAP׈oh >>Cٌxﺐޱڑeg W* FW.@VYܶe)/Og?K"ZcUlbOS͒m0A^IARo?u]ׅ ܘd"IXL0\PR`9ESmX n|Z.ɰIUq\*uUEQA?'O&^\LA3,KӢ|ɓ"}?hyHKӤi]32>Q /,˲}? dl,g4"ٶmk_׾vssu\~Ot:B#d-d">`I2Dk 6*բuFSmm]o6q\i<m]6 ш'G%V ځ1w4fYà8tg nA Y,uU)@MSB(UHb8Ǎنy3ig-tjL AŋkԈ߿|{QhLAWkt}ۇRY?m߆ӧ`AD[ۭv݊J]/(*ˢpݾ$13*Ŷn9}qbKYVjG#4֫QQWŗh;D'T||OIhZ xeIr}VUGSQ߶mYjamKC^e;' R"K(:qFqTUQ0I$ϳGpZl VU 'ń5Pv_FnL"u1T_sh ƫPT Rz1˲X-}뷮Ve\__\F8^DO%)̇nnV(f4N.<2SԧD=~%p6WbfQIEYv}}sݻ'gϟxq}}ttrr| W^{ 1 x^z,+[\eYQǬk1m˷iXi]DŽ4]G6EDvS$Ъj/Og?\,.5Ks7}D_F}LTk| t4Q+ȯoؑPщ Jȃx4MSZ'| 16. qWUEaL_C EspcfQiaf贴mQ<ׅ'MN EtzpPUy]'tG F),&gv,5;P"T͉ ,2ˠ a#S;h@0e("8sǑ$ELB+A<$خEg~mEL;­<h0`x^e2r/|.ۜʪ{/d ~7 `hI&#pc(acu]vlSu!V;,{GtX=w|lhpȕ$IUN&?nvP8s!xIfA#(ʲ"?1՞tĆ (d݆!0w;9=iU5:Tky޶ K،KeIkQ-%˒$Tml6Q}pg`%3s 5"K8y-iY&R6yYi* קS 5sgA"jYB_e|Wa=k6fH=LSq@AiEr5 z>O:.zDcN -I*K]wݏsnĄ]{߶o݂mΨPx1QTbk{[ήjJ5peUvZ% x'{qc}w8kQ~YW1ZBcE8MtL[m*= yOX]6_OOONEWI’c f'|N8ean!6IpB)w?D+Í<fE6U$LLh[@ՠc¤0],EQ؄I3,]߯.KF$iۢ`Y9u}Z]˲{! M4= ( ;ywDb !]=p`jVU9t 7HWPט *_Dhnrp7vLD#>!I}޿?1x4m[U à@ (vu : qȕ8xv`^P)@EQD>sw*)wW&-"|iAJA?8f P D)(>xpͲ(kh8Q"56ɚ;N%/t„MREUktEQD}?2Jmc*hPa1 n8}"]LSվǗ67f8mpy)+  J_ׅi.*d;84s]+JgYQ?ccA8w] <8==99<hn9ķ$Zq;Z-] h r9}(yU9s!nv۶m!fHkYRcfًt ?ڶYtQHzfPI*qYnYum /4dmiE+.'=d\yE!$*l؉f")S@ |l`x r:Yn<[ 72: J0<d2>~O`eN#7>n2-RѮ,z6$jUU><;e)feYـ6,Cn8i{{ ai+ QCTTUE!)ˌvlẌ.QUնz~91C ~`Hniw^\<>5MUqepd#0`5},r1BH#m[NdX'HM$꺆'vFr 2ĪUQL6%Pq#%&t9t󚆡o]'i8LQ0.Ҭ9R׻~_K/ݿrr 2pω .//w 'ONI/,ehokb4t]8I[Cv[U7!AdK@v྽8NSfx}EQ *˶Cpe}KGt3ڶZw?X>˲nDipm䑻 & n,G. K\T FSܺa @2&"Zb0-(4USӜ[}&oO`@1FA7Ai R.K&Ǵ} ۦiYCX(w޽3|DDu5cBQ$hY J$Y.ӽtcm˒Q,]Ӏ%&Զ`q@jM2,*xB[Ҷey{;fu|Cp[%len1kǶu>|P_/?{<0,UUUƶ=]aǂ&>ϕDtnmLCKuuMW0/hF[tF 8H˜h#ȶ*M -?zw`S%zDυo7c&hoiܥ)(ФrppxpȎ0'i$[ k(_?__"n/} _@Y"rdzD NӺ2 tooonf31G|.|߲nog)f6(vlwrø7)NG UUUFuIeoۯz8»GGGG bApصӧ ֲNNo?m]"[p%g ۢmgYU-& z9AIU v-KQ,Ky4>@Sbh ֲHʀHWӋ>gpy5 !kcs)?(kX _ #[) R4Yv]akx(<ȸm[UHIŧYVל-VXfYz\2!⫯+xE~sv a80*e)pG/ɟ秧T` I:6(lԅܟHU8^(9퉖UE{ޮmf8zF11]|>Kv$a,%aD& $ɲl4w~oŸ_~f9!mԑ"I0 Ms:4 1}K ^`꺎3HXXd"uxyahh0ݯ?'zG0Ѫ]i`0Ћ, ]n =p˲$EQvyuuT%whu^Q]]Ow!<~&$EYפFl^3@u~?c u7{1U$@@<.zdoGL| #O@9m +­>ͺDy\3F\V,:Qiy rrG>2""մ$qL&*Jhm+fܓMӦɲt<ߧ'po6iǓIKnWznizsC'* !Mkx(2 |W'Z,=,kWA 899999J4Ͳhiq=bziZGfOZA{2eRv!@+ofAFi=N8yR Widc܍h] &O;fVmjOE+%φ>xLS^ KA/&uM&,fe;i^__]fAx*`@Wz\U].onVkվeI$ ?j,O_9rf3BXc(׿B0ck*M/ iY?]U-v6|Me76ERQ^^ʿ=x$I$twiP<`Bnk3o, Ehiae  ,[,eco$Y& Ĝ$9XOSt8vza8` 4]$m[m+}'QKP@. zvGUr Ht=JuF{ў;=C(NÈr6 x<a8Ny/ $nۦISU(pa-C_UIяoʯ/ޮB3\^^^]8=‰G`7A2!9 $IܞgϮU200 ?~==}t8 0n>y|@Ԑwl6f|}}qEB=.ˈEvDŅ-ʢ`ط`bj/L)wlAdҐgA e Gw;wm2vxNTUq)8kjieQt{!z-j\7o"6T(?yA8xBS!S*HÕAk Npe1B:z"z7|<GYb%0q1ZXH$ K #!29 L`HlYoo Z-Y^?yGqn6߻&IY\V䓳Mâ(ϛ=%> Bz pu!!1zו&.10d9 }_Uw,sI/986|һhqq lֵW{v{fFy.>r1\9__7|߶q+lDqÜ WMx< lW|Ao6 {"kLS G#6.$ANs]305MG*ܛ7(r೬כ s$Yy\e!Z@0zxp~BE_ev4l$QR %y^מ:D)=x~~~ٳgϮ^x5|qtɓ'Ox8.fϕI=G/ ;:]> їMDhaxxhe('f`؇maKL+Cs=+[u]WzU% ' "4˒dϣWp8u]{ڮQts͋$&I=Ϊ\sP?0UIҜ(.&p /~~ݦiṹr yQQ[0I뚆bpf`n6HR O&ތ$j[\Y섺@`:.E2`u]ߣuC_gXfS:ZG*M4l&Xl9lHu0&є݄Qp)fd[*(x჆Fd<)^uPh^.uM %)VU'Ɵ@,aH# atE$k<E TjF@3Q^_fr &˶۫gXP6)nץa( (zͲg4:<<< `77/^+w&L{V YFc㺎I;i#3*DT f9eEvEDm[l{l湰iaeY|8Fx<,$L1emӚw# ")D6vQ#;D{B"'u=z[oO{UE"I tè*YNӶ-K޽H\HR"Vnk[`EaQ D6)T fҫ., 6~r^C,.ESe]U5d:N> ,,R=a0F4{{{{/^<bZ-XS-77O>}zq/1ݔ ww [I"]AT8ͳhAϺm{8V'I6ٌʓ@!2nYaeiz{(KpiU0~V CY3$aw]1F,F^>fh0<<4жmaDlvu5hd='>꫐pvU,lw_4H qlDL1D׆aA`ۼaeg rx5цRE1aL ~xq"z6Cpr2 J8NS2\P]*߇kJ9(2klHS 8qv 侯*j?+*kYi|#r}q~]Nf[J:$UEl!(D#l8;;IΩ.w.D7MƍDUuGfu \F/nN_?ӟYVbX,(HDi)T7SuE*2t\XuO% ݶX& e.@<ӁdrX, ᫌP6g">)!h2Lf3 iժNxra8ǔ!G{4`2oB O %2Ǝ%ڲ4u`.9[IDATg6!ύ7!xp2a%iϳ,Y&' l6̾KS:-I$iUvǐHXJrSv/fwvI$c۶$%IUI= D=x`t:ɲ,k?c?O"S(QU4k$ !mux3ZX´qXL PU·PC"<hikI0ـo)E7 zEI4mE(iy f4bq}=.4 R[d21UXV i,0 :fűh3ٶas,"f8Bz6Zi1H75~ xibLc4̓d:/b1(p803ne]Ә) 'uqX!F@$EѶLd؉^"*l2ip::ϙ$jUd 7#)`<cCE ǐ#IJ fp:` j,`&63EBb I:NxL@i*PmyO>ygϞ]\|_XYV<|y^I-ϗ˫+:bh4QWV< Jਈ*) GMS׈5K_??s0E-Ue;|+Oh9kCIfчA_-L$ Mg]KN|>@l4huy!ޠp\+k<߶$}x/{U}N(@FmFHV]QȲрWM݂|&(jiᔶ-,% alYBbr-e(hA"ǘ 4(@l6Dg(B%Lb(^y^!??ɩ l 0-]2lԠRs%8DN$ $ÃPe`o;?-|4Nt:Na*յd@w3 4Q"ZQ$n6EI<j#409­U LUtvvz:ܬIaȴV(MSw2k/rDBm8VEQG tնE!t՟7q)8ȴU]F^Vw.H]g,,Z!հmB C~+$37pz F:'(Qv6;? 'Ʉj4}["p躲(eeeوuL0'_^H Ks d2Lp2.G>SeP2q T (>ٸ,7j\&BX.,1l&8iZ 6bfb3 S{Y4#wV #p$ۆn0 5β$MQ (DMHqbe٬V77Tbpc&{A[PkMu24uEHNYVU蓡OaK[-"g7m<υ&g>d2!U"Dž0N&G %DU!=Ȳa hW s1R 6; ~tttb;IZ, G}zB;;;;C:ǣ`m{* WYpCz695?ܩri‚j,#0,KU՟nK.nd8ejZζۢ*m\8QQ$ue1wY6ef8Ӂ AjY.ooy)f]@pBVv^%x<>lx]Y6 HP7bHɀ NdY!o6hwzX.xj`8L1x2myMFQ?` 3 ra (MSUK^׋18 a; qnh L8>hhT (gT,}@y*l>+jTw? ?PUaAImQBJͥRv(A2a8㪪X繮#m"dQ$eYYSaaN&$0E:AmI,GY׿{koWկ~7777A x)9}7!c.M+ˮca6uS-Wp]q 0t}Y._tu6cml ,˶ie LңG_Ǐd2> &b >ȑ%qO.M?6Ip8R*KfL yAuflq1nG E5ʓW8RU0$M4Ƕi5d IRUJ_$1 @N__?>M`<>8x:MŲp8v^a%lTL0@5wG<1c]u--KyEi:% =϶qnOzq~3=ot4>u4?~S,f=°)K}0jڶt5"r Дbmji!<"p ,ʶ$1 &:|wO V(D0Ҷ G V_򚻧( #Ax(Z׷ Xጼzb2NON؜`D Am|f-cm`  N<}(J{t]UgP/M}_/.^+4me*\8L}0F2R4qCe]_ł. z<8VǖeϞxq}Mo0cNݒDZ.np$wvZ77utbtS?`q Npǜ=Ԧi); |,< ;mWf&G <EnG|{bGG$Kc'3rI|Pa8iL{'pF$IHxr???w` ۶mM:pJFDn,f>=C? I\ CeK2}ѣrn;ǶeR2F róPN}8IADHg1,c+_–`p8|yd!东ϗ/h2} prrp^lVb>_u}"״Sg#Dx .C'ȺȌeYUaێª,5:,IP/&º,>ʲ8q90$Y= CGI L(*ˠnasbtOϟ=0 vc~?#`"u]]s6r? c6[ Ð$mKoXׅU77ai͕gYG5čtu=OL 0Lfho`: CWy_›C~e 0t\!!.)=ֽ®%NUшqTlckY$?M>0$_DlUUߣG= F#QYakYº>IpVU!RmEtB󾪰~w}poW఻Wq''GGčj>pٳs,I[K/SEQU ggPSk2EQE!˖U׸DQQzXIӿz}IYUH.՝,(4IQiױ4La xm.BP@ /faww]wǃt̬eqو/|eۋ$gǫ]U}fgwxJDQPNo4/rQ"^ D;#z!ǀ&3tw\]O_îd}=%UkUmbރ,?y(T4AL[U-GUy(s"x }w)tȺnDP֊ (O], pJ׋"MW4M8uqa [r>eYU]eYm6ލFO?154Ѩmc{gIj+z}~~ym Р&"-M$vvYb?MFe&EISh`H(cxS'^{f݊dnFWWq캃Ay`4=Oiՠ7$qiJ&$itPA,<.}(SZU)8LϹkqXjZ=zĕa@u}>?<ϛ,OOc|-}Mb4l **}Բ 1.TEoG&i:,F m3Vӓ`u g;xn:?3 b?xENYP͆wKO'elYB^4A6eIY4!NKR8ٶ'Y$m*MEKel)IQTngYYU(U2۲8M$R 1[t:5tE}FňZ2=IeuA ``yޚfM,VEt o>|$ 4e^_x{L0<v۪*+2?CI|%8 ?ߟN//8G;7U]<4BE`" ӇC׽yh>qdY⽦(yB @An7RJHɻ̩kYUhu,ONn߾}E[UQ׿o~3fx05ڲ,WzyݻpMҴ,{(F`m3.sI9T9 ֩*vEif:$po*E,nd Dlۮ 18@рǂl6,G0pdYQw$MGwo~}ُ|-Q$3 hS}ĪE5Og_o+_bgahZ C\U4@Tx l9<ж(87 EnӴ(pC )$/Mahmw&nB JS}mnnjaYb1z<4e_寑B@LF{ B 6`v4Tb DXrٽ{mugu3T\?,4]Ӕ ~[qzc3d"q ª~0`e_p4)tMS} UݍO~]6T%Ťi8GK LYD5/3pn6qruuD e:|{ [D0Lq}x>9zx|,B !yL1ĕJU)ƆCv8(}=<5 Bĕ*V P(\m5-JȋGE&Ye%׀>@Ʀc׫f3riF#y$j\.9p(KXI6 첨|}#w8}O?Hr78XJ*0a͋Y_KD0˶adzMxFOp Ć1?0$Oȶw;U804q7MO?hTM?ӳ&y0Lບ&"벜L:4=TOSjgC2I4{(2%Ѳ_QTyDQֲ1gA1=,4bېc<`r}}}4Z0 <=:V+UiJ8L3|,˶1 Eqo z? Ό6:I2C(4/Mffe{:,. e9Lryu! ɧ{ݧ}?<i(hc}pY- Ē3:lẦ)3o^nݹs|,.)hLAY}"s-WCߗ* \Q ;j^'IQ0|ֶp2s ]l3a1DKaxzzzvFY5(;>k(כɓFM^_a#0p 漤adcq˰8^\7uA0 CN:%La$4Aٌl;ʪ:::::>[vap躮\^_G_dXv8:NSc^F+tb)I,G#םLĀY|̄;xX2qdIx<m4U,s\L{@ aaW7C( ]/K ș,k0޶1) Y‰2MI[ hQ<^.<0݋vM_7GYb֎"V$RיzbeaLSK*컞KF# ZO EN|L ;.VxKROVD<\W!dRsr JEľߧm} q7^yDjۃΤ#L`3L_3gq]'!itY!uq9}8$y$q>ԭ[7n<̇?sO"X@u'3GU˒K_vM1ͭ8Q(*.{e`HCb " nsh 0*Xly^?)m;cͿO3>]d9:s_׿/|>Y\ `CJMKQu- .׶(~=;U n4gQ{Sa@:(JQ4 nQ YfMRu]XZ\YMÏ+o^)2j|DѕOd _(u ɲb6;9_]Vj8N!ykgggg'O|Sb+Rh{Eڶ rE6Va5 ɕiJBPPXSǟ)d4U|4Yz#PT}{կRcJj1zxlR uay!;"w: Ͳw1DS6O /m19ldw>^Dzk {?5 NCZo. BB#f ͕œ3D"P3$H1lM+mȂ89o wcQ8O&`u}}yyuemC/| 8fE%tb0iYr%{-%b3V:!i8p(+D6Eߺuƍwz!>RKfeU)J]vD2[ԜO%D!a',iD q]gXRUۭ.I'f8"ˀXYivBj2 x݃!$DG$rp״%<0Q HRg F&VH38EgYw)=i(A~ |?Id"I]0 1(@fQ~q"%5"{ZaB +"MGў€Hm U) ˲(M&M7fULDzF#@WriÜR!;mrsO#4DB4pֵXoi9'o)T<)f;[44m{2Y.///.(}")`28IV+龲,cdl{N)|ƒF2FiJnO>y.o%hR 9<,wyp6}>yszdY$ (z7(ޏPQ:Wi?+iXv42KArƵXH |϶2vy湨h mYt1ɢ !LLhL؝:A5 4۶%h8#Ԯ[kTY((Dg8 ߗ6y0"yk7q薅(KCQrpeOf4&y (?Jǁ.wYEɲ2Q5"Plr27 //YPoσOj] 4aEpdQ(h֔i%tEXtdate:create2012-10-24T09:28:02+02:00[6%tEXtdate:modify2012-10-24T09:27:48+02:00`IENDB`xboard-4.7.3/png/WhiteNightrider.png0000644000175000001440000000555612262415351014327 00000000000000PNG  IHDR@@iqbKGD #IDATx}TTea````dD t@ XHm'SkMJsYOTZU9ծDc0ai}Xkbj)b._Gawy}s>< 75tysWF y2PT1]Ե/+P| t6$ ݮWڰ38X+N#_>7?0PD^SM ,vX)⢚\c 0믟[ 렯)Di2!^qa6G| ^BŅvl P_^[7_Xr` cРdfOX&uA Oz]3VbBB~HMMe F [Geh jvMW*'9BB$Z5=F`E.ƌ~|"{Q[{:?%mݾX sg c0':C%j.xGlߊ7ߜ#~qyD\=ΝGaY.V3(g0eYrL$innh?'+55uر/{t@F]NwcP*/a6 |C®]퇎|W_3[2y2$&]ame`Ԩ!hjv@|Wx&ش3B7VBTT_$/o22 ?QRRNUi[YYbc=|**QUh444\Do=ZYh4*Cy bqt5j˖{ :{Zĉ 腗oG|`̙P 55)YEzX(..bI"=Ǐc:` ɵތ-p-_qB2e ϜeڏijH6*&MLZo 2#ɠ ݻVޫ_:Ӄ]^*RA=466QR 'hLڛ+noqĻ {KKPJ@";;{r'<([L˙3Kv._0yf`kH}Rnc۶/1bGT"55 F)ْ$1b {3yC::Yp2 vTVd߾# WuV `Kz->wW$IBr!``?*[9.9|r-*1s BW&,8  1]}MHƏJfZ?yȅ Y~O .~ܥP8"W\jL/'J%ÆM}-{VsX9s^y5x3"ڎHNKKlv+SRS?ȫSe2@"d֭Xjnv=[Ga,)nE.a?@icS6ӄRh7>nDE8yȑg6[CE-{%KmU20PWd_|+HݺcٷoOrtطG*+vYn o4#?D=g3g撒SyNu Mț8ŕ.=ZgyQ+}6'"Bٳ!?1AArj㣏v*ȋb$`^S5昹`+|$Ib~SS3חRQ3!ؾ}<0 !A`?($ɼa[1[]seM{O?zZ[mTWš51c! =Cض ghm@3OtݻWpvΝk=-411!G CSyr&MKkxy#fS\topzt`w#@w[ZR466<܋^G YÍ+V}rR -djt_ޗefݖqriw`I66dz=vCS|Fl v[񱥥ee"--Ś߄yŘRKTHPZ.V(ƨQ#";;c#TvСׯؿ~]1>p7.v))H}̞z`K5l)k==~EEEss ^mh89sV#5AFSɆ w:d]m'Y%%󝽟ݼyΎĉphϴC~Ƽye}<:Jv~ɓ` =[@,snr-&پ@20(GرsEQ rkt*+( `B Ʈ u@vhp45p~Il"Xc@) =:7ƔAl9@ǯ;Dhoթ_y=so )}~e~cvvuG 0 ׮tiWGz}Nq}-@_ `pS Vxz[U/ɓ&ef̸ a(*:L5lXoϗ|gf 6 c_Nh%7wP&Nx>ܻv+7.oS>H} ܇rv #LfNڝy+ 0uxzl6 Pɻ"q4a΀L=ԩSK(_((+oD}d,GMӃuj#2ە}!`:b@##Mdgc^fcǾz<'g(ŋ+6M@0 X}q5(\ܹljÙ $`w=1@2iufͼy3;v8NZZ0.6oޥ_j3E np=1 rU`yd{l~̻IIIE}}N""LZؿV}ߴi'nqa2(@+ \c}45%2vp \х"dɲy _/(_ C  zESE&C ܑ&Yrx<#}$ ʰa)V^O:JV\*ͅrF2DQV] x`\d?H\\Bed {ߗ]r=FZ-55;dѢ9WyQT:Wz-b*vM2H: ӧO!)#Fu@,E'F-yy: ?1|˗/-b0ڞUrz_"m ʺuyi dd 'u-PѨf[#+V<#Ɨ ҲO *K^29u 8ddР$!o=G|BֈFёއC~7ɩSh@,%ͅ &S9m=g߾>{h4HssaHG\~|Dy@0+,Ѩ}K^|R,/\+[$"ʵBOi?Ⱥuyԑvr`p20!C"IJ@rrFMDlc<]!lٯя}若 fb3Y_:nL 66>8)AGee-_|mPA #=5ɓHM܂^eWyP'B*@xX|J4)ToQz-o2j(ݽAJLg&:ߟ=.nMn8ۃ6mГ\yyUD2bDCLq$&ƒOBB4^Nd2R)#PDp8\</ M4R]]Ouuuqℽ%-fzPbaʔIO5GiiTUQVVIq VnOLij0GC~1 rРd4TUq?(((b۶}>]O/ΧssMʶ[o-sʨQCBӃ1fd ٳwyNʶWܖIFYt  ̼O@@RR/]ezrD&eKHH!-Jj FŌ޶v8،᤾ 1@9 zb8JZͰaIvv:#G&5JD 8N.^l"N@54ih4Ֆlhhn/ȑSWˏ◼Q܀Vqͽb1sto;^8N_f4+iiHK1?aܸtcg"6lΝx>z@Q$6"3g-2})(ky{]@!44S]pt&<ƣ\R\n_(cOPrnSx #⤨ rRl,_bs),xVWu;CN~.-5(+3M?PRseP?HB9rcF9QBQw(K (U(( (񿬑%,IENDB`xboard-4.7.3/png/BlackCrownedBishop.png0000644000175000001440000000300112262415351014711 00000000000000PNG  IHDR@@iqbKGDIDATx[lTU@L әvj< b} $DAcb@8FCD1ILMC*VT"-* e<;3~{Vf;c+9ΝsGY~Kb9)lҙH vHj}@ c 2[$)82c>,$)i6\^EZ8 i1f'q` *z ˊx3 &0d]QWʣx&f4P<5 CcrxʛadzN뿶MSS=^o-^(Pg/21olU)Ya$\vc͚,[py~eةZPǸkfW*bCcdž8>@0" qRA}}^EKK3Kҥx<5) ʛ2AXn%ҋU9$pfREU-N`v޾46zihPS㢡@ H8% .344)ԾFPm(\|)I0HLs8r|.cg)m0 qD;(BGa2}y|K(d BmHͭGi>tsN6DAc OZz_MZk\$4~deV$쌒arDqbDF(0ֲ#]<*yf$pT[u&i /dS2W::C O!E7U8I/dHDg4}9AɿiEP}GX n'C^ʗIH'lϾfء}LvU-$VsJoUIENDB`xboard-4.7.3/png/BlackArchbishop.png0000644000175000001440000000350012262415351014231 00000000000000PNG  IHDR@@iqbKGDIDATx[LW  + >4&Hl@ͧ"5M%xCBZkj^"1D%m5(D۴EX[k7]vدvvwaw)ON3;q̜)bŕCЧ"xzOG\Qh Aؿ @SI;\& mFA$5¾Yoa\^aiv;\2쭒3[T&gO.^lsMSWjM@!|spPJ.]:B/)m[i(c'HRBO eeKI:zۏY= BY`{U[$ 1@H7Bhn>@CLǨ(!470OiǞl/ ƅ}@s8NBUUY` xt%5?^FrIF?/&61o}J 6z(/'fp{czL5mެBp/64obyM1jZ  454c>a[=DVyj0c)Ǹ`is6Z#|ϡ_T_ ڼRM1~+k˱Ay7_@d#dh޼2(_nXIt? 4^.lY@0o,._!Wi;LB?!,k~'. D>'19%)06f j U3NUA+P)P *}_;g̯A>S+f}&J>KUeN }$2Z|qнYֿ|]=-}'RqJu %! XW$"T|ɖ6qp?u6psr ԋ~%+qfȻ)Xg2>{awp&qJ99_SL1 @ܗm%IENDB`xboard-4.7.3/backend.c0000644000175000001440000224737112262562252011500 00000000000000/* * backend.c -- Common back end for X and Windows NT versions of * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* [AS] Also useful here for debugging */ #ifdef WIN32 #include int flock(int f, int code); #define LOCK_EX 2 #define SLASH '\\' #else #include #define SLASH '/' #endif #include "config.h" #include #include #include #include #include #include #include #include #if STDC_HEADERS # include # include # include #else /* not STDC_HEADERS */ # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_SYS_FCNTL_H # include #else /* not HAVE_SYS_FCNTL_H */ # if HAVE_FCNTL_H # include # endif /* HAVE_FCNTL_H */ #endif /* not HAVE_SYS_FCNTL_H */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if defined(_amigados) && !defined(__GNUC__) struct timezone { int tz_minuteswest; int tz_dsttime; }; extern int gettimeofday(struct timeval *, struct timezone *); #endif #if HAVE_UNISTD_H # include #endif #include "common.h" #include "frontend.h" #include "backend.h" #include "parser.h" #include "moves.h" #if ZIPPY # include "zippy.h" #endif #include "backendz.h" #include "evalgraph.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) # define T_(s) gettext(s) #else # ifdef WIN32 # define _(s) T_(s) # define N_(s) s # else # define _(s) (s) # define N_(s) s # define T_(s) s # endif #endif int establish P((void)); void read_from_player P((InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error)); void read_from_ics P((InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error)); void SendToICS P((char *s)); void SendToICSDelayed P((char *s, long msdelay)); void SendMoveToICS P((ChessMove moveType, int fromX, int fromY, int toX, int toY, char promoChar)); void HandleMachineMove P((char *message, ChessProgramState *cps)); int AutoPlayOneMove P((void)); int LoadGameOneMove P((ChessMove readAhead)); int LoadGameFromFile P((char *filename, int n, char *title, int useList)); int LoadPositionFromFile P((char *filename, int n, char *title)); int SavePositionToFile P((char *filename)); void MakeMove P((int fromX, int fromY, int toX, int toY, int promoChar)); void ShowMove P((int fromX, int fromY, int toX, int toY)); int FinishMove P((ChessMove moveType, int fromX, int fromY, int toX, int toY, /*char*/int promoChar)); void BackwardInner P((int target)); void ForwardInner P((int target)); int Adjudicate P((ChessProgramState *cps)); void GameEnds P((ChessMove result, char *resultDetails, int whosays)); void EditPositionDone P((Boolean fakeRights)); void PrintOpponents P((FILE *fp)); void PrintPosition P((FILE *fp, int move)); void StartChessProgram P((ChessProgramState *cps)); void SendToProgram P((char *message, ChessProgramState *cps)); void SendMoveToProgram P((int moveNum, ChessProgramState *cps)); void ReceiveFromProgram P((InputSourceRef isr, VOIDSTAR closure, char *buf, int count, int error)); void SendTimeControl P((ChessProgramState *cps, int mps, long tc, int inc, int sd, int st)); char *TimeControlTagValue P((void)); void Attention P((ChessProgramState *cps)); void FeedMovesToProgram P((ChessProgramState *cps, int upto)); int ResurrectChessProgram P((void)); void DisplayComment P((int moveNumber, char *text)); void DisplayMove P((int moveNumber)); void ParseGameHistory P((char *game)); void ParseBoard12 P((char *string)); void KeepAlive P((void)); void StartClocks P((void)); void SwitchClocks P((int nr)); void StopClocks P((void)); void ResetClocks P((void)); char *PGNDate P((void)); void SetGameInfo P((void)); int RegisterMove P((void)); void MakeRegisteredMove P((void)); void TruncateGame P((void)); int looking_at P((char *, int *, char *)); void CopyPlayerNameIntoFileName P((char **, char *)); char *SavePart P((char *)); int SaveGameOldStyle P((FILE *)); int SaveGamePGN P((FILE *)); int CheckFlags P((void)); long NextTickLength P((long)); void CheckTimeControl P((void)); void show_bytes P((FILE *, char *, int)); int string_to_rating P((char *str)); void ParseFeatures P((char* args, ChessProgramState *cps)); void InitBackEnd3 P((void)); void FeatureDone P((ChessProgramState* cps, int val)); void InitChessProgram P((ChessProgramState *cps, int setup)); void OutputKibitz(int window, char *text); int PerpetualChase(int first, int last); int EngineOutputIsUp(); void InitDrawingSizes(int x, int y); void NextMatchGame P((void)); int NextTourneyGame P((int nr, int *swap)); int Pairing P((int nr, int nPlayers, int *w, int *b, int *sync)); FILE *WriteTourneyFile P((char *results, FILE *f)); void DisplayTwoMachinesTitle P(()); static void ExcludeClick P((int index)); void ToggleSecond P((void)); void PauseEngine P((ChessProgramState *cps)); static int NonStandardBoardSize P((void)); #ifdef WIN32 extern void ConsoleCreate(); #endif ChessProgramState *WhitePlayer(); void InsertIntoMemo P((int which, char *text)); // [HGM] kibitz: in engineo.c int VerifyDisplayMode P(()); char *GetInfoFromComment( int, char * ); // [HGM] PV time: returns stripped comment void InitEngineUCI( const char * iniDir, ChessProgramState * cps ); // [HGM] moved here from winboard.c char *ProbeBook P((int moveNr, char *book)); // [HGM] book: returns a book move char *SendMoveToBookUser P((int nr, ChessProgramState *cps, int initial)); // [HGM] book void ics_update_width P((int new_width)); extern char installDir[MSG_SIZ]; VariantClass startVariant; /* [HGM] nicks: initial variant */ Boolean abortMatch; extern int tinyLayout, smallLayout; ChessProgramStats programStats; char lastPV[2][2*MSG_SIZ]; /* [HGM] pv: last PV in thinking output of each engine */ int endPV = -1; static int exiting = 0; /* [HGM] moved to top */ static int setboardSpoiledMachineBlack = 0 /*, errorExitFlag = 0*/; int startedFromPositionFile = FALSE; Board filePosition; /* [HGM] loadPos */ Board partnerBoard; /* [HGM] bughouse: for peeking at partner game */ int partnerHighlight[2]; Boolean partnerBoardValid = 0; char partnerStatus[MSG_SIZ]; Boolean partnerUp; Boolean originalFlip; Boolean twoBoards = 0; char endingGame = 0; /* [HGM] crash: flag to prevent recursion of GameEnds() */ int whiteNPS, blackNPS; /* [HGM] nps: for easily making clocks aware of NPS */ VariantClass currentlyInitializedVariant; /* [HGM] variantswitch */ int lastIndex = 0; /* [HGM] autoinc: last game/position used in match mode */ Boolean connectionAlive;/* [HGM] alive: ICS connection status from probing */ int opponentKibitzes; int lastSavedGame; /* [HGM] save: ID of game */ char chatPartner[MAX_CHAT][MSG_SIZ]; /* [HGM] chat: list of chatting partners */ extern int chatCount; int chattingPartner; char marker[BOARD_RANKS][BOARD_FILES]; /* [HGM] marks for target squares */ char lastMsg[MSG_SIZ]; ChessSquare pieceSweep = EmptySquare; ChessSquare promoSweep = EmptySquare, defaultPromoChoice; int promoDefaultAltered; int keepInfo = 0; /* [HGM] to protect PGN tags in auto-step game analysis */ /* States for ics_getting_history */ #define H_FALSE 0 #define H_REQUESTED 1 #define H_GOT_REQ_HEADER 2 #define H_GOT_UNREQ_HEADER 3 #define H_GETTING_MOVES 4 #define H_GOT_UNWANTED_HEADER 5 /* whosays values for GameEnds */ #define GE_ICS 0 #define GE_ENGINE 1 #define GE_PLAYER 2 #define GE_FILE 3 #define GE_XBOARD 4 #define GE_ENGINE1 5 #define GE_ENGINE2 6 /* Maximum number of games in a cmail message */ #define CMAIL_MAX_GAMES 20 /* Different types of move when calling RegisterMove */ #define CMAIL_MOVE 0 #define CMAIL_RESIGN 1 #define CMAIL_DRAW 2 #define CMAIL_ACCEPT 3 /* Different types of result to remember for each game */ #define CMAIL_NOT_RESULT 0 #define CMAIL_OLD_RESULT 1 #define CMAIL_NEW_RESULT 2 /* Telnet protocol constants */ #define TN_WILL 0373 #define TN_WONT 0374 #define TN_DO 0375 #define TN_DONT 0376 #define TN_IAC 0377 #define TN_ECHO 0001 #define TN_SGA 0003 #define TN_PORT 23 char* safeStrCpy (char *dst, const char *src, size_t count) { // [HGM] made safe int i; assert( dst != NULL ); assert( src != NULL ); assert( count > 0 ); for(i=0; i=10) ChessSquare ShogiArray[2][BOARD_FILES] = { { WhiteQueen, WhiteKnight, WhiteFerz, WhiteWazir, WhiteKing, WhiteWazir, WhiteFerz, WhiteKnight, WhiteQueen }, { BlackQueen, BlackKnight, BlackFerz, BlackWazir, BlackKing, BlackWazir, BlackFerz, BlackKnight, BlackQueen } }; ChessSquare XiangqiArray[2][BOARD_FILES] = { { WhiteRook, WhiteKnight, WhiteAlfil, WhiteFerz, WhiteWazir, WhiteFerz, WhiteAlfil, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackAlfil, BlackFerz, BlackWazir, BlackFerz, BlackAlfil, BlackKnight, BlackRook } }; ChessSquare CapablancaArray[2][BOARD_FILES] = { { WhiteRook, WhiteKnight, WhiteAngel, WhiteBishop, WhiteQueen, WhiteKing, WhiteBishop, WhiteMarshall, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackAngel, BlackBishop, BlackQueen, BlackKing, BlackBishop, BlackMarshall, BlackKnight, BlackRook } }; ChessSquare GreatArray[2][BOARD_FILES] = { { WhiteDragon, WhiteKnight, WhiteAlfil, WhiteGrasshopper, WhiteKing, WhiteSilver, WhiteCardinal, WhiteAlfil, WhiteKnight, WhiteDragon }, { BlackDragon, BlackKnight, BlackAlfil, BlackGrasshopper, BlackKing, BlackSilver, BlackCardinal, BlackAlfil, BlackKnight, BlackDragon }, }; ChessSquare JanusArray[2][BOARD_FILES] = { { WhiteRook, WhiteAngel, WhiteKnight, WhiteBishop, WhiteKing, WhiteQueen, WhiteBishop, WhiteKnight, WhiteAngel, WhiteRook }, { BlackRook, BlackAngel, BlackKnight, BlackBishop, BlackKing, BlackQueen, BlackBishop, BlackKnight, BlackAngel, BlackRook } }; ChessSquare GrandArray[2][BOARD_FILES] = { { EmptySquare, WhiteKnight, WhiteBishop, WhiteQueen, WhiteKing, WhiteMarshall, WhiteAngel, WhiteBishop, WhiteKnight, EmptySquare }, { EmptySquare, BlackKnight, BlackBishop, BlackQueen, BlackKing, BlackMarshall, BlackAngel, BlackBishop, BlackKnight, EmptySquare } }; #ifdef GOTHIC ChessSquare GothicArray[2][BOARD_FILES] = { { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, WhiteMarshall, WhiteKing, WhiteAngel, WhiteBishop, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackBishop, BlackQueen, BlackMarshall, BlackKing, BlackAngel, BlackBishop, BlackKnight, BlackRook } }; #else // !GOTHIC #define GothicArray CapablancaArray #endif // !GOTHIC #ifdef FALCON ChessSquare FalconArray[2][BOARD_FILES] = { { WhiteRook, WhiteKnight, WhiteBishop, WhiteFalcon, WhiteQueen, WhiteKing, WhiteFalcon, WhiteBishop, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackBishop, BlackFalcon, BlackQueen, BlackKing, BlackFalcon, BlackBishop, BlackKnight, BlackRook } }; #else // !FALCON #define FalconArray CapablancaArray #endif // !FALCON #else // !(BOARD_FILES>=10) #define XiangqiPosition FIDEArray #define CapablancaArray FIDEArray #define GothicArray FIDEArray #define GreatArray FIDEArray #endif // !(BOARD_FILES>=10) #if (BOARD_FILES>=12) ChessSquare CourierArray[2][BOARD_FILES] = { { WhiteRook, WhiteKnight, WhiteAlfil, WhiteBishop, WhiteMan, WhiteKing, WhiteFerz, WhiteWazir, WhiteBishop, WhiteAlfil, WhiteKnight, WhiteRook }, { BlackRook, BlackKnight, BlackAlfil, BlackBishop, BlackMan, BlackKing, BlackFerz, BlackWazir, BlackBishop, BlackAlfil, BlackKnight, BlackRook } }; #else // !(BOARD_FILES>=12) #define CourierArray CapablancaArray #endif // !(BOARD_FILES>=12) Board initialPosition; /* Convert str to a rating. Checks for special cases of "----", "++++", etc. Also strips ()'s */ int string_to_rating (char *str) { while(*str && !isdigit(*str)) ++str; if (!*str) return 0; /* One of the special "no rating" cases */ else return atoi(str); } void ClearProgramStats () { /* Init programStats */ programStats.movelist[0] = 0; programStats.depth = 0; programStats.nr_moves = 0; programStats.moves_left = 0; programStats.nodes = 0; programStats.time = -1; // [HGM] PGNtime: make invalid to recognize engine output programStats.score = 0; programStats.got_only_move = 0; programStats.got_fail = 0; programStats.line_is_book = 0; } void CommonEngineInit () { // [HGM] moved some code here from InitBackend1 that has to be done after both engines have contributed their settings if (appData.firstPlaysBlack) { first.twoMachinesColor = "black\n"; second.twoMachinesColor = "white\n"; } else { first.twoMachinesColor = "white\n"; second.twoMachinesColor = "black\n"; } first.other = &second; second.other = &first; { float norm = 1; if(appData.timeOddsMode) { norm = appData.timeOdds[0]; if(norm > appData.timeOdds[1]) norm = appData.timeOdds[1]; } first.timeOdds = appData.timeOdds[0]/norm; second.timeOdds = appData.timeOdds[1]/norm; } if(programVersion) free(programVersion); if (appData.noChessProgram) { programVersion = (char*) malloc(5 + strlen(PACKAGE_STRING)); sprintf(programVersion, "%s", PACKAGE_STRING); } else { /* [HGM] tidy: use tidy name, in stead of full pathname (which was probably a bug due to / vs \ ) */ programVersion = (char*) malloc(8 + strlen(PACKAGE_STRING) + strlen(first.tidy)); sprintf(programVersion, "%s + %s", PACKAGE_STRING, first.tidy); } } void UnloadEngine (ChessProgramState *cps) { /* Kill off first chess program */ if (cps->isr != NULL) RemoveInputSource(cps->isr); cps->isr = NULL; if (cps->pr != NoProc) { ExitAnalyzeMode(); DoSleep( appData.delayBeforeQuit ); SendToProgram("quit\n", cps); DoSleep( appData.delayAfterQuit ); DestroyChildProcess(cps->pr, cps->useSigterm); } cps->pr = NoProc; if(appData.debugMode) fprintf(debugFP, "Unload %s\n", cps->which); } void ClearOptions (ChessProgramState *cps) { int i; cps->nrOptions = cps->comboCnt = 0; for(i=0; ioption[i].min = cps->option[i].max = cps->option[i].value = 0; cps->option[i].textValue = 0; } } char *engineNames[] = { /* TRANSLATORS: "first" is the first of possible two chess engines. It is inserted into strings such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing */ N_("first"), /* TRANSLATORS: "second" is the second of possible two chess engines. It is inserted into strings such as "%s engine" / "%s chess program" / "%s machine" - all meaning the same thing */ N_("second") }; void InitEngine (ChessProgramState *cps, int n) { // [HGM] all engine initialiation put in a function that does one engine ClearOptions(cps); cps->which = engineNames[n]; cps->maybeThinking = FALSE; cps->pr = NoProc; cps->isr = NULL; cps->sendTime = 2; cps->sendDrawOffers = 1; cps->program = appData.chessProgram[n]; cps->host = appData.host[n]; cps->dir = appData.directory[n]; cps->initString = appData.engInitString[n]; cps->computerString = appData.computerString[n]; cps->useSigint = TRUE; cps->useSigterm = TRUE; cps->reuse = appData.reuse[n]; cps->nps = appData.NPS[n]; // [HGM] nps: copy nodes per second cps->useSetboard = FALSE; cps->useSAN = FALSE; cps->usePing = FALSE; cps->lastPing = 0; cps->lastPong = 0; cps->usePlayother = FALSE; cps->useColors = TRUE; cps->useUsermove = FALSE; cps->sendICS = FALSE; cps->sendName = appData.icsActive; cps->sdKludge = FALSE; cps->stKludge = FALSE; if(cps->tidy == NULL) cps->tidy = (char*) malloc(MSG_SIZ); TidyProgramName(cps->program, cps->host, cps->tidy); cps->matchWins = 0; ASSIGN(cps->variants, appData.variant); cps->analysisSupport = 2; /* detect */ cps->analyzing = FALSE; cps->initDone = FALSE; cps->reload = FALSE; /* New features added by Tord: */ cps->useFEN960 = FALSE; cps->useOOCastle = TRUE; /* End of new features added by Tord. */ cps->fenOverride = appData.fenOverride[n]; /* [HGM] time odds: set factor for each machine */ cps->timeOdds = appData.timeOdds[n]; /* [HGM] secondary TC: how to handle sessions that do not fit in 'level'*/ cps->accumulateTC = appData.accumulateTC[n]; cps->maxNrOfSessions = 1; /* [HGM] debug */ cps->debug = FALSE; cps->supportsNPS = UNKNOWN; cps->memSize = FALSE; cps->maxCores = FALSE; ASSIGN(cps->egtFormats, ""); /* [HGM] options */ cps->optionSettings = appData.engOptions[n]; cps->scoreIsAbsolute = appData.scoreIsAbsolute[n]; /* [AS] */ cps->isUCI = appData.isUCI[n]; /* [AS] */ cps->hasOwnBookUCI = appData.hasOwnBookUCI[n]; /* [AS] */ if (appData.protocolVersion[n] > PROTOVER || appData.protocolVersion[n] < 1) { char buf[MSG_SIZ]; int len; len = snprintf(buf, MSG_SIZ, _("protocol version %d not supported"), appData.protocolVersion[n]); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitBackEnd1: buffer truncated.\n"); DisplayFatalError(buf, 0, 2); } else { cps->protocolVersion = appData.protocolVersion[n]; } InitEngineUCI( installDir, cps ); // [HGM] moved here from winboard.c, to make available in xboard ParseFeatures(appData.featureDefaults, cps); } ChessProgramState *savCps; GameMode oldMode; void LoadEngine () { int i; if(WaitForEngine(savCps, LoadEngine)) return; CommonEngineInit(); // recalculate time odds if(gameInfo.variant != StringToVariant(appData.variant)) { // we changed variant when loading the engine; this forces us to reset Reset(TRUE, savCps != &first); oldMode = BeginningOfGame; // to prevent restoring old mode } InitChessProgram(savCps, FALSE); if(gameMode == EditGame) SendToProgram("force\n", savCps); // in EditGame mode engine must be in force mode DisplayMessage("", ""); if (startedFromSetupPosition) SendBoard(savCps, backwardMostMove); for (i = backwardMostMove; i < currentMove; i++) SendMoveToProgram(i, savCps); ThawUI(); SetGNUMode(); if(oldMode == AnalyzeMode) AnalyzeModeEvent(); } void ReplaceEngine (ChessProgramState *cps, int n) { oldMode = gameMode; // remember mode, so it can be restored after loading sequence is complete keepInfo = 1; if(oldMode != BeginningOfGame) EditGameEvent(); keepInfo = 0; UnloadEngine(cps); appData.noChessProgram = FALSE; appData.clockMode = TRUE; InitEngine(cps, n); UpdateLogos(TRUE); if(n) return; // only startup first engine immediately; second can wait savCps = cps; // parameter to LoadEngine passed as globals, to allow scheduled calling :-( LoadEngine(); } extern char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params; extern Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick; static char resetOptions[] = "-reuse -firstIsUCI false -firstHasOwnBookUCI true -firstTimeOdds 1 " "-firstInitString \"" INIT_STRING "\" -firstComputerString \"" COMPUTER_STRING "\" " "-firstFeatures \"\" -firstLogo \"\" -firstAccumulateTC 1 " "-firstOptions \"\" -firstNPS -1 -fn \"\" -firstScoreAbs false"; void FloatToFront(char **list, char *engineLine) { char buf[MSG_SIZ], tidy[MSG_SIZ], *p = buf, *q, *r = buf; int i=0; if(appData.recentEngines <= 0) return; TidyProgramName(engineLine, "localhost", tidy+1); tidy[0] = buf[0] = '\n'; strcat(tidy, "\n"); strncpy(buf+1, *list, MSG_SIZ-50); if(p = strstr(buf, tidy)) { // tidy name appears in list q = strchr(++p, '\n'); if(q == NULL) return; // malformed, don't touch while(*p++ = *++q); // squeeze out } strcat(tidy, buf+1); // put list behind tidy name p = tidy + 1; while(q = strchr(p, '\n')) i++, r = p, p = q + 1; // count entries in new list if(i > appData.recentEngines) *r = NULLCHAR; // if maximum rached, strip off last ASSIGN(*list, tidy+1); } char *insert, *wbOptions; // point in ChessProgramNames were we should insert new engine void Load (ChessProgramState *cps, int i) { char *p, *q, buf[MSG_SIZ], command[MSG_SIZ], buf2[MSG_SIZ]; if(engineLine && engineLine[0]) { // an engine was selected from the combo box snprintf(buf, MSG_SIZ, "-fcp %s", engineLine); SwapEngines(i); // kludge to parse -f* / -first* like it is -s* / -second* ParseArgsFromString(resetOptions); appData.pvSAN[0] = FALSE; FREE(appData.fenOverride[0]); appData.fenOverride[0] = NULL; appData.firstProtocolVersion = PROTOVER; ParseArgsFromString(buf); SwapEngines(i); ReplaceEngine(cps, i); FloatToFront(&appData.recentEngineList, engineLine); return; } p = engineName; while(q = strchr(p, SLASH)) p = q+1; if(*p== NULLCHAR) { DisplayError(_("You did not specify the engine executable"), 0); return; } if(engineDir[0] != NULLCHAR) { ASSIGN(appData.directory[i], engineDir); p = engineName; } else if(p != engineName) { // derive directory from engine path, when not given p[-1] = 0; ASSIGN(appData.directory[i], engineName); p[-1] = SLASH; if(SLASH == '/' && p - engineName > 1) *(p -= 2) = '.'; // for XBoard use ./exeName as command after split! } else { ASSIGN(appData.directory[i], "."); } if(params[0]) { if(strchr(p, ' ') && !strchr(p, '"')) snprintf(buf2, MSG_SIZ, "\"%s\"", p), p = buf2; // quote if it contains spaces snprintf(command, MSG_SIZ, "%s %s", p, params); p = command; } ASSIGN(appData.chessProgram[i], p); appData.isUCI[i] = isUCI; appData.protocolVersion[i] = v1 ? 1 : PROTOVER; appData.hasOwnBookUCI[i] = hasBook; if(!nickName[0]) useNick = FALSE; if(useNick) ASSIGN(appData.pgnName[i], nickName); if(addToList) { int len; char quote; q = firstChessProgramNames; if(nickName[0]) snprintf(buf, MSG_SIZ, "\"%s\" -fcp ", nickName); else buf[0] = NULLCHAR; quote = strchr(p, '"') ? '\'' : '"'; // use single quotes around engine command if it contains double quotes snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), "%c%s%c -fd \"%s\"%s%s%s%s%s%s%s%s\n", quote, p, quote, appData.directory[i], useNick ? " -fn \"" : "", useNick ? nickName : "", useNick ? "\"" : "", v1 ? " -firstProtocolVersion 1" : "", hasBook ? "" : " -fNoOwnBookUCI", isUCI ? (isUCI == TRUE ? " -fUCI" : gameInfo.variant == VariantShogi ? " -fUSI" : " -fUCCI") : "", storeVariant ? " -variant " : "", storeVariant ? VariantName(gameInfo.variant) : ""); if(wbOptions && wbOptions[0]) snprintf(buf+strlen(buf)-1, MSG_SIZ-strlen(buf), " %s\n", wbOptions); firstChessProgramNames = malloc(len = strlen(q) + strlen(buf) + 1); if(insert != q) insert[-1] = NULLCHAR; snprintf(firstChessProgramNames, len, "%s\n%s%s", q, buf, insert); if(q) free(q); FloatToFront(&appData.recentEngineList, buf); } ReplaceEngine(cps, i); } void InitTimeControls () { int matched, min, sec; /* * Parse timeControl resource */ if (!ParseTimeControl(appData.timeControl, appData.timeIncrement, appData.movesPerSession)) { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), _("bad timeControl option %s"), appData.timeControl); DisplayFatalError(buf, 0, 2); } /* * Parse searchTime resource */ if (*appData.searchTime != NULLCHAR) { matched = sscanf(appData.searchTime, "%d:%d", &min, &sec); if (matched == 1) { searchTime = min * 60; } else if (matched == 2) { searchTime = min * 60 + sec; } else { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), _("bad searchTime option %s"), appData.searchTime); DisplayFatalError(buf, 0, 2); } } } void InitBackEnd1 () { ShowThinkingEvent(); // [HGM] thinking: make sure post/nopost state is set according to options startVariant = StringToVariant(appData.variant); // [HGM] nicks: remember original variant GetTimeMark(&programStartTime); srandom((programStartTime.ms + 1000*programStartTime.sec)*0x1001001); // [HGM] book: makes sure random is unpredictabe to msec level appData.seedBase = random() + (random()<<15); pauseStart = programStartTime; pauseStart.sec -= 100; // [HGM] matchpause: fake a pause that has long since ended ClearProgramStats(); programStats.ok_to_send = 1; programStats.seen_stat = 0; /* * Initialize game list */ ListNew(&gameList); /* * Internet chess server status */ if (appData.icsActive) { appData.matchMode = FALSE; appData.matchGames = 0; #if ZIPPY appData.noChessProgram = !appData.zippyPlay; #else appData.zippyPlay = FALSE; appData.zippyTalk = FALSE; appData.noChessProgram = TRUE; #endif if (*appData.icsHelper != NULLCHAR) { appData.useTelnet = TRUE; appData.telnetProgram = appData.icsHelper; } } else { appData.zippyTalk = appData.zippyPlay = FALSE; } /* [AS] Initialize pv info list [HGM] and game state */ { int i, j; for( i=0; i<=framePtr; i++ ) { pvInfoList[i].depth = -1; boards[i][EP_STATUS] = EP_NONE; for( j=0; j= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitBackEnd1: buffer truncated.\n"); DisplayFatalError(buf, 0, 2); return; case VariantUnknown: case VariantLoadable: case Variant29: case Variant30: case Variant31: case Variant32: case Variant33: case Variant34: case Variant35: case Variant36: default: len = snprintf(buf, MSG_SIZ, _("Unknown variant name %s"), appData.variant); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitBackEnd1: buffer truncated.\n"); DisplayFatalError(buf, 0, 2); return; case VariantXiangqi: /* [HGM] repetition rules not implemented */ case VariantFairy: /* [HGM] TestLegality definitely off! */ case VariantGothic: /* [HGM] should work */ case VariantCapablanca: /* [HGM] should work */ case VariantCourier: /* [HGM] initial forced moves not implemented */ case VariantShogi: /* [HGM] could still mate with pawn drop */ case VariantKnightmate: /* [HGM] should work */ case VariantCylinder: /* [HGM] untested */ case VariantFalcon: /* [HGM] untested */ case VariantCrazyhouse: /* holdings not shown, ([HGM] fixed that!) offboard interposition not understood */ case VariantNormal: /* definitely works! */ case VariantWildCastle: /* pieces not automatically shuffled */ case VariantNoCastle: /* pieces not automatically shuffled */ case VariantFischeRandom: /* [HGM] works and shuffles pieces */ case VariantLosers: /* should work except for win condition, and doesn't know captures are mandatory */ case VariantSuicide: /* should work except for win condition, and doesn't know captures are mandatory */ case VariantGiveaway: /* should work except for win condition, and doesn't know captures are mandatory */ case VariantTwoKings: /* should work */ case VariantAtomic: /* should work except for win condition */ case Variant3Check: /* should work except for win condition */ case VariantShatranj: /* should work except for all win conditions */ case VariantMakruk: /* should work except for draw countdown */ case VariantBerolina: /* might work if TestLegality is off */ case VariantCapaRandom: /* should work */ case VariantJanus: /* should work */ case VariantSuper: /* experimental */ case VariantGreat: /* experimental, requires legality testing to be off */ case VariantSChess: /* S-Chess, should work */ case VariantGrand: /* should work */ case VariantSpartan: /* should work */ break; } } } int NextIntegerFromString (char ** str, long * value) { int result = -1; char * s = *str; while( *s == ' ' || *s == '\t' ) { s++; } *value = 0; if( *s >= '0' && *s <= '9' ) { while( *s >= '0' && *s <= '9' ) { *value = *value * 10 + (*s - '0'); s++; } result = 0; } *str = s; return result; } int NextTimeControlFromString (char ** str, long * value) { long temp; int result = NextIntegerFromString( str, &temp ); if( result == 0 ) { *value = temp * 60; /* Minutes */ if( **str == ':' ) { (*str)++; result = NextIntegerFromString( str, &temp ); *value += temp; /* Seconds */ } } return result; } int NextSessionFromString (char ** str, int *moves, long * tc, long *inc, int *incType) { /* [HGM] routine added to read '+moves/time' for secondary time control. */ int result = -1, type = 0; long temp, temp2; if(**str != ':') return -1; // old params remain in force! (*str)++; if(**str == '*') type = *(*str)++, temp = 0; // sandclock TC if( NextIntegerFromString( str, &temp ) ) return -1; if(type) { *moves = 0; *tc = temp * 500; *inc = temp * 1000; *incType = '*'; return 0; } if(**str != '/') { /* time only: incremental or sudden-death time control */ if(**str == '+') { /* increment follows; read it */ (*str)++; if(**str == '!') type = *(*str)++; // Bronstein TC if(result = NextIntegerFromString( str, &temp2)) return -1; *inc = temp2 * 1000; if(**str == '.') { // read fraction of increment char *start = ++(*str); if(result = NextIntegerFromString( str, &temp2)) return -1; temp2 *= 1000; while(start++ < *str) temp2 /= 10; *inc += temp2; } } else *inc = 0; *moves = 0; *tc = temp * 1000; *incType = type; return 0; } (*str)++; /* classical time control */ result = NextIntegerFromString( str, &temp2); // NOTE: already converted to seconds by ParseTimeControl() if(result == 0) { *moves = temp; *tc = temp2 * 1000; *inc = 0; *incType = type; } return result; } int GetTimeQuota (int movenr, int lastUsed, char *tcString) { /* [HGM] get time to add from the multi-session time-control string */ int incType, moves=1; /* kludge to force reading of first session */ long time, increment; char *s = tcString; if(!s || !*s) return 0; // empty TC string means we ran out of the last sudden-death version do { if(moves) NextSessionFromString(&s, &moves, &time, &increment, &incType); nextSession = s; suddenDeath = moves == 0 && increment == 0; if(movenr == -1) return time; /* last move before new session */ if(incType == '*') increment = 0; else // for sandclock, time is added while not thinking if(incType == '!' && lastUsed < increment) increment = lastUsed; if(!moves) return increment; /* current session is incremental */ if(movenr >= 0) movenr -= moves; /* we already finished this session */ } while(movenr >= -1); /* try again for next session */ return 0; // no new time quota on this move } int ParseTimeControl (char *tc, float ti, int mps) { long tc1; long tc2; char buf[MSG_SIZ], buf2[MSG_SIZ], *mytc = tc; int min, sec=0; if(ti >= 0 && !strchr(tc, '+') && !strchr(tc, '/') ) mps = 0; if(!strchr(tc, '+') && !strchr(tc, '/') && sscanf(tc, "%d:%d", &min, &sec) >= 1) sprintf(mytc=buf2, "%d", 60*min+sec); // convert 'classical' min:sec tc string to seconds if(ti > 0) { if(mps) snprintf(buf, MSG_SIZ, ":%d/%s+%g", mps, mytc, ti); else snprintf(buf, MSG_SIZ, ":%s+%g", mytc, ti); } else { if(mps) snprintf(buf, MSG_SIZ, ":%d/%s", mps, mytc); else snprintf(buf, MSG_SIZ, ":%s", mytc); } fullTimeControlString = StrSave(buf); // this should now be in PGN format if( NextTimeControlFromString( &tc, &tc1 ) != 0 ) { return FALSE; } if( *tc == '/' ) { /* Parse second time control */ tc++; if( NextTimeControlFromString( &tc, &tc2 ) != 0 ) { return FALSE; } if( tc2 == 0 ) { return FALSE; } timeControl_2 = tc2 * 1000; } else { timeControl_2 = 0; } if( tc1 == 0 ) { return FALSE; } timeControl = tc1 * 1000; if (ti >= 0) { timeIncrement = ti * 1000; /* convert to ms */ movesPerSession = 0; } else { timeIncrement = 0; movesPerSession = mps; } return TRUE; } void InitBackEnd2 () { if (appData.debugMode) { # ifdef __GIT_VERSION fprintf(debugFP, "Version: %s (%s)\n", programVersion, __GIT_VERSION); # else fprintf(debugFP, "Version: %s\n", programVersion); # endif } ASSIGN(currentDebugFile, appData.nameOfDebugFile); // [HGM] debug split: remember initial name in use set_cont_sequence(appData.wrapContSeq); if (appData.matchGames > 0) { appData.matchMode = TRUE; } else if (appData.matchMode) { appData.matchGames = 1; } if(appData.matchMode && appData.sameColorGames > 0) /* [HGM] alternate: overrule matchGames */ appData.matchGames = appData.sameColorGames; if(appData.rewindIndex > 1) { /* [HGM] autoinc: rewind implies auto-increment and overrules given index */ if(appData.loadPositionIndex >= 0) appData.loadPositionIndex = -1; if(appData.loadGameIndex >= 0) appData.loadGameIndex = -1; } Reset(TRUE, FALSE); if (appData.noChessProgram || first.protocolVersion == 1) { InitBackEnd3(); } else { /* kludge: allow timeout for initial "feature" commands */ FreezeUI(); DisplayMessage("", _("Starting chess program")); ScheduleDelayedEvent(InitBackEnd3, FEATURE_TIMEOUT); } } int CalculateIndex (int index, int gameNr) { // [HGM] autoinc: absolute way to determine load index from game number (taking auto-inc and rewind into account) int res; if(index > 0) return index; // fixed nmber if(index == 0) return 1; res = (index == -1 ? gameNr : (gameNr-1)/2 + 1); // autoinc if(appData.rewindIndex > 0) res = (res-1) % appData.rewindIndex + 1; // rewind return res; } int LoadGameOrPosition (int gameNr) { // [HGM] taken out of MatchEvent and NextMatchGame (to combine it) if (*appData.loadGameFile != NULLCHAR) { if (!LoadGameFromFile(appData.loadGameFile, CalculateIndex(appData.loadGameIndex, gameNr), appData.loadGameFile, FALSE)) { DisplayFatalError(_("Bad game file"), 0, 1); return 0; } } else if (*appData.loadPositionFile != NULLCHAR) { if (!LoadPositionFromFile(appData.loadPositionFile, CalculateIndex(appData.loadPositionIndex, gameNr), appData.loadPositionFile)) { DisplayFatalError(_("Bad position file"), 0, 1); return 0; } } return 1; } void ReserveGame (int gameNr, char resChar) { FILE *tf = fopen(appData.tourneyFile, "r+"); char *p, *q, c, buf[MSG_SIZ]; if(tf == NULL) { nextGame = appData.matchGames + 1; return; } // kludge to terminate match safeStrCpy(buf, lastMsg, MSG_SIZ); DisplayMessage(_("Pick new game"), ""); flock(fileno(tf), LOCK_EX); // lock the tourney file while we are messing with it ParseArgsFromFile(tf); p = q = appData.results; if(appData.debugMode) { char *r = appData.participants; fprintf(debugFP, "results = '%s'\n", p); while(*r) fprintf(debugFP, *r >= ' ' ? "%c" : "\\%03o", *r), r++; fprintf(debugFP, "\n"); } while(*q && *q != ' ') q++; // get first un-played game (could be beyond end!) nextGame = q - p; q = malloc(strlen(p) + 2); // could be arbitrary long, but allow to extend by one! safeStrCpy(q, p, strlen(p) + 2); if(gameNr >= 0) q[gameNr] = resChar; // replace '*' with result if(appData.debugMode) fprintf(debugFP, "pick next game from '%s': %d\n", q, nextGame); if(nextGame <= appData.matchGames && resChar != ' ' && !abortMatch) { // reserve next game if tourney not yet done if(q[nextGame] == NULLCHAR) q[nextGame+1] = NULLCHAR; // append one char q[nextGame] = '*'; } fseek(tf, -(strlen(p)+4), SEEK_END); c = fgetc(tf); if(c != '"') // depending on DOS or Unix line endings we can be one off fseek(tf, -(strlen(p)+2), SEEK_END); else fseek(tf, -(strlen(p)+3), SEEK_END); fprintf(tf, "%s\"\n", q); fclose(tf); // update, and flush by closing DisplayMessage(buf, ""); free(p); appData.results = q; if(nextGame <= appData.matchGames && resChar != ' ' && !abortMatch && (gameNr < 0 || nextGame / appData.defaultMatchGames != gameNr / appData.defaultMatchGames)) { int round = appData.defaultMatchGames * appData.tourneyType; if(gameNr < 0 || appData.tourneyType < 1 || // gauntlet engine can always stay loaded as first engine appData.tourneyType > 1 && nextGame/round != gameNr/round) // in multi-gauntlet change only after round UnloadEngine(&first); // next game belongs to other pairing; UnloadEngine(&second); // already unload the engines, so TwoMachinesEvent will load new ones. } if(appData.debugMode) fprintf(debugFP, "Reserved, next=%d, nr=%d\n", nextGame, gameNr); } void MatchEvent (int mode) { // [HGM] moved out of InitBackend3, to make it callable when match starts through menu int dummy; if(matchMode) { // already in match mode: switch it off abortMatch = TRUE; if(!appData.tourneyFile[0]) appData.matchGames = matchGame; // kludge to let match terminate after next game. return; } // if(gameMode != BeginningOfGame) { // DisplayError(_("You can only start a match from the initial position."), 0); // return; // } abortMatch = FALSE; if(mode == 2) appData.matchGames = appData.defaultMatchGames; /* Set up machine vs. machine match */ nextGame = 0; NextTourneyGame(-1, &dummy); // sets appData.matchGames if this is tourney, to make sure ReserveGame knows it if(appData.tourneyFile[0]) { ReserveGame(-1, 0); if(nextGame > appData.matchGames) { char buf[MSG_SIZ]; if(strchr(appData.results, '*') == NULL) { FILE *f; appData.tourneyCycles++; if(f = WriteTourneyFile(appData.results, NULL)) { // make a tourney file with increased number of cycles fclose(f); NextTourneyGame(-1, &dummy); ReserveGame(-1, 0); if(nextGame <= appData.matchGames) { DisplayNote(_("You restarted an already completed tourney\nOne more cycle will now be added to it\nGames commence in 10 sec")); matchMode = mode; ScheduleDelayedEvent(NextMatchGame, 10000); return; } } } snprintf(buf, MSG_SIZ, _("All games in tourney '%s' are already played or playing"), appData.tourneyFile); DisplayError(buf, 0); appData.tourneyFile[0] = 0; return; } } else if (appData.noChessProgram) { // [HGM] in tourney engines are loaded automatically DisplayFatalError(_("Can't have a match with no chess programs"), 0, 2); return; } matchMode = mode; matchGame = roundNr = 1; first.matchWins = second.matchWins = 0; // [HGM] match: needed in later matches NextMatchGame(); } char *comboLine = NULL; // [HGM] recent: WinBoard's first-engine combobox line void InitBackEnd3 P((void)) { GameMode initialMode; char buf[MSG_SIZ]; int err, len; InitChessProgram(&first, startedFromSetupPosition); if(!appData.noChessProgram) { /* [HGM] tidy: redo program version to use name from myname feature */ free(programVersion); programVersion = (char*) malloc(8 + strlen(PACKAGE_STRING) + strlen(first.tidy)); sprintf(programVersion, "%s + %s", PACKAGE_STRING, first.tidy); FloatToFront(&appData.recentEngineList, comboLine ? comboLine : appData.firstChessProgram); } if (appData.icsActive) { #ifdef WIN32 /* [DM] Make a console window if needed [HGM] merged ifs */ ConsoleCreate(); #endif err = establish(); if (err != 0) { if (*appData.icsCommPort != NULLCHAR) len = snprintf(buf, MSG_SIZ, _("Could not open comm port %s"), appData.icsCommPort); else len = snprintf(buf, MSG_SIZ, _("Could not connect to host %s, port %s"), appData.icsHost, appData.icsPort); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitBackEnd3: buffer truncated.\n"); DisplayFatalError(buf, err, 1); return; } SetICSMode(); telnetISR = AddInputSource(icsPR, FALSE, read_from_ics, &telnetISR); fromUserISR = AddInputSource(NoProc, FALSE, read_from_player, &fromUserISR); if(appData.keepAlive) // [HGM] alive: schedule sending of dummy 'date' command ScheduleDelayedEvent(KeepAlive, appData.keepAlive*60*1000); } else if (appData.noChessProgram) { SetNCPMode(); } else { SetGNUMode(); } if (*appData.cmailGameName != NULLCHAR) { SetCmailMode(); OpenLoopback(&cmailPR); cmailISR = AddInputSource(cmailPR, FALSE, CmailSigHandlerCallBack, &cmailISR); } ThawUI(); DisplayMessage("", ""); if (StrCaseCmp(appData.initialMode, "") == 0) { initialMode = BeginningOfGame; if(!appData.icsActive && appData.noChessProgram) { // [HGM] could be fall-back gameMode = MachinePlaysBlack; // "Machine Black" might have been implicitly highlighted ModeHighlight(); // make sure XBoard knows it is highlighted, so it will un-highlight it gameMode = BeginningOfGame; // in case BeginningOfGame now means "Edit Position" ModeHighlight(); } } else if (StrCaseCmp(appData.initialMode, "TwoMachines") == 0) { initialMode = TwoMachinesPlay; } else if (StrCaseCmp(appData.initialMode, "AnalyzeFile") == 0) { initialMode = AnalyzeFile; } else if (StrCaseCmp(appData.initialMode, "Analysis") == 0) { initialMode = AnalyzeMode; } else if (StrCaseCmp(appData.initialMode, "MachineWhite") == 0) { initialMode = MachinePlaysWhite; } else if (StrCaseCmp(appData.initialMode, "MachineBlack") == 0) { initialMode = MachinePlaysBlack; } else if (StrCaseCmp(appData.initialMode, "EditGame") == 0) { initialMode = EditGame; } else if (StrCaseCmp(appData.initialMode, "EditPosition") == 0) { initialMode = EditPosition; } else if (StrCaseCmp(appData.initialMode, "Training") == 0) { initialMode = Training; } else { len = snprintf(buf, MSG_SIZ, _("Unknown initialMode %s"), appData.initialMode); if( (len >= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "InitBackEnd3: buffer truncated.\n"); DisplayFatalError(buf, 0, 2); return; } if (appData.matchMode) { if(appData.tourneyFile[0]) { // start tourney from command line FILE *f; if(f = fopen(appData.tourneyFile, "r")) { ParseArgsFromFile(f); // make sure tourney parmeters re known fclose(f); appData.clockMode = TRUE; SetGNUMode(); } else appData.tourneyFile[0] = NULLCHAR; // for now ignore bad tourney file } MatchEvent(TRUE); } else if (*appData.cmailGameName != NULLCHAR) { /* Set up cmail mode */ ReloadCmailMsgEvent(TRUE); } else { /* Set up other modes */ if (initialMode == AnalyzeFile) { if (*appData.loadGameFile == NULLCHAR) { DisplayFatalError(_("AnalyzeFile mode requires a game file"), 0, 1); return; } } if (*appData.loadGameFile != NULLCHAR) { (void) LoadGameFromFile(appData.loadGameFile, appData.loadGameIndex, appData.loadGameFile, TRUE); } else if (*appData.loadPositionFile != NULLCHAR) { (void) LoadPositionFromFile(appData.loadPositionFile, appData.loadPositionIndex, appData.loadPositionFile); /* [HGM] try to make self-starting even after FEN load */ /* to allow automatic setup of fairy variants with wtm */ if(initialMode == BeginningOfGame && !blackPlaysFirst) { gameMode = BeginningOfGame; setboardSpoiledMachineBlack = 1; } /* [HGM] loadPos: make that every new game uses the setup */ /* from file as long as we do not switch variant */ if(!blackPlaysFirst) { startedFromPositionFile = TRUE; CopyBoard(filePosition, boards[0]); } } if (initialMode == AnalyzeMode) { if (appData.noChessProgram) { DisplayFatalError(_("Analysis mode requires a chess engine"), 0, 2); return; } if (appData.icsActive) { DisplayFatalError(_("Analysis mode does not work with ICS mode"),0,2); return; } AnalyzeModeEvent(); } else if (initialMode == AnalyzeFile) { appData.showThinking = TRUE; // [HGM] thinking: moved out of ShowThinkingEvent ShowThinkingEvent(); AnalyzeFileEvent(); AnalysisPeriodicEvent(1); } else if (initialMode == MachinePlaysWhite) { if (appData.noChessProgram) { DisplayFatalError(_("MachineWhite mode requires a chess engine"), 0, 2); return; } if (appData.icsActive) { DisplayFatalError(_("MachineWhite mode does not work with ICS mode"), 0, 2); return; } MachineWhiteEvent(); } else if (initialMode == MachinePlaysBlack) { if (appData.noChessProgram) { DisplayFatalError(_("MachineBlack mode requires a chess engine"), 0, 2); return; } if (appData.icsActive) { DisplayFatalError(_("MachineBlack mode does not work with ICS mode"), 0, 2); return; } MachineBlackEvent(); } else if (initialMode == TwoMachinesPlay) { if (appData.noChessProgram) { DisplayFatalError(_("TwoMachines mode requires a chess engine"), 0, 2); return; } if (appData.icsActive) { DisplayFatalError(_("TwoMachines mode does not work with ICS mode"), 0, 2); return; } TwoMachinesEvent(); } else if (initialMode == EditGame) { EditGameEvent(); } else if (initialMode == EditPosition) { EditPositionEvent(); } else if (initialMode == Training) { if (*appData.loadGameFile == NULLCHAR) { DisplayFatalError(_("Training mode requires a game file"), 0, 2); return; } TrainingEvent(); } } } void HistorySet (char movelist[][2*MOVE_LEN], int first, int last, int current) { DisplayBook(current+1); MoveHistorySet( movelist, first, last, current, pvInfoList ); EvalGraphSet( first, last, current, pvInfoList ); MakeEngineOutputTitle(); } /* * Establish will establish a contact to a remote host.port. * Sets icsPR to a ProcRef for a process (or pseudo-process) * used to talk to the host. * Returns 0 if okay, error code if not. */ int establish () { char buf[MSG_SIZ]; if (*appData.icsCommPort != NULLCHAR) { /* Talk to the host through a serial comm port */ return OpenCommPort(appData.icsCommPort, &icsPR); } else if (*appData.gateway != NULLCHAR) { if (*appData.remoteShell == NULLCHAR) { /* Use the rcmd protocol to run telnet program on a gateway host */ snprintf(buf, sizeof(buf), "%s %s %s", appData.telnetProgram, appData.icsHost, appData.icsPort); return OpenRcmd(appData.gateway, appData.remoteUser, buf, &icsPR); } else { /* Use the rsh program to run telnet program on a gateway host */ if (*appData.remoteUser == NULLCHAR) { snprintf(buf, sizeof(buf), "%s %s %s %s %s", appData.remoteShell, appData.gateway, appData.telnetProgram, appData.icsHost, appData.icsPort); } else { snprintf(buf, sizeof(buf), "%s %s -l %s %s %s %s", appData.remoteShell, appData.gateway, appData.remoteUser, appData.telnetProgram, appData.icsHost, appData.icsPort); } return StartChildProcess(buf, "", &icsPR); } } else if (appData.useTelnet) { return OpenTelnet(appData.icsHost, appData.icsPort, &icsPR); } else { /* TCP socket interface differs somewhat between Unix and NT; handle details in the front end. */ return OpenTCP(appData.icsHost, appData.icsPort, &icsPR); } } void EscapeExpand (char *p, char *q) { // [HGM] initstring: routine to shape up string arguments while(*p++ = *q++) if(p[-1] == '\\') switch(*q++) { case 'n': p[-1] = '\n'; break; case 'r': p[-1] = '\r'; break; case 't': p[-1] = '\t'; break; case '\\': p[-1] = '\\'; break; case 0: *p = 0; return; default: p[-1] = q[-1]; break; } } void show_bytes (FILE *fp, char *buf, int count) { while (count--) { if (*buf < 040 || *(unsigned char *) buf > 0177) { fprintf(fp, "\\%03o", *buf & 0xff); } else { putc(*buf, fp); } buf++; } fflush(fp); } /* Returns an errno value */ int OutputMaybeTelnet (ProcRef pr, char *message, int count, int *outError) { char buf[8192], *p, *q, *buflim; int left, newcount, outcount; if (*appData.icsCommPort != NULLCHAR || appData.useTelnet || *appData.gateway != NULLCHAR) { if (appData.debugMode) { fprintf(debugFP, ">ICS: "); show_bytes(debugFP, message, count); fprintf(debugFP, "\n"); } return OutputToProcess(pr, message, count, outError); } buflim = &buf[sizeof(buf)-1]; /* allow 1 byte for expanding last char */ p = message; q = buf; left = count; newcount = 0; while (left) { if (q >= buflim) { if (appData.debugMode) { fprintf(debugFP, ">ICS: "); show_bytes(debugFP, buf, newcount); fprintf(debugFP, "\n"); } outcount = OutputToProcess(pr, buf, newcount, outError); if (outcount < newcount) return -1; /* to be sure */ q = buf; newcount = 0; } if (*p == '\n') { *q++ = '\r'; newcount++; } else if (((unsigned char) *p) == TN_IAC) { *q++ = (char) TN_IAC; newcount ++; } *q++ = *p++; newcount++; left--; } if (appData.debugMode) { fprintf(debugFP, ">ICS: "); show_bytes(debugFP, buf, newcount); fprintf(debugFP, "\n"); } outcount = OutputToProcess(pr, buf, newcount, outError); if (outcount < newcount) return -1; /* to be sure */ return count; } void read_from_player (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error) { int outError, outCount; static int gotEof = 0; static FILE *ini; /* Pass data read from player on to ICS */ if (count > 0) { gotEof = 0; outCount = OutputMaybeTelnet(icsPR, message, count, &outError); if (outCount < count) { DisplayFatalError(_("Error writing to ICS"), outError, 1); } if(have_sent_ICS_logon == 2) { if(ini = fopen(appData.icsLogon, "w")) { // save first two lines (presumably username & password) on init script file fprintf(ini, "%s", message); have_sent_ICS_logon = 3; } else have_sent_ICS_logon = 1; } else if(have_sent_ICS_logon == 3) { fprintf(ini, "%s", message); fclose(ini); have_sent_ICS_logon = 1; } } else if (count < 0) { RemoveInputSource(isr); DisplayFatalError(_("Error reading from keyboard"), error, 1); } else if (gotEof++ > 0) { RemoveInputSource(isr); DisplayFatalError(_("Got end of file from keyboard"), 0, 0); } } void KeepAlive () { // [HGM] alive: periodically send dummy (date) command to ICS to prevent time-out if(!connectionAlive) DisplayFatalError("No response from ICS", 0, 1); connectionAlive = FALSE; // only sticks if no response to 'date' command. SendToICS("date\n"); if(appData.keepAlive) ScheduleDelayedEvent(KeepAlive, appData.keepAlive*60*1000); } /* added routine for printf style output to ics */ void ics_printf (char *format, ...) { char buffer[MSG_SIZ]; va_list args; va_start(args, format); vsnprintf(buffer, sizeof(buffer), format, args); buffer[sizeof(buffer)-1] = '\0'; SendToICS(buffer); va_end(args); } void SendToICS (char *s) { int count, outCount, outError; if (icsPR == NoProc) return; count = strlen(s); outCount = OutputMaybeTelnet(icsPR, s, count, &outError); if (outCount < count) { DisplayFatalError(_("Error writing to ICS"), outError, 1); } } /* This is used for sending logon scripts to the ICS. Sending without a delay causes problems when using timestamp on ICC (at least on my machine). */ void SendToICSDelayed (char *s, long msdelay) { int count, outCount, outError; if (icsPR == NoProc) return; count = strlen(s); if (appData.debugMode) { fprintf(debugFP, ">ICS: "); show_bytes(debugFP, s, count); fprintf(debugFP, "\n"); } outCount = OutputToProcessDelayed(icsPR, s, count, &outError, msdelay); if (outCount < count) { DisplayFatalError(_("Error writing to ICS"), outError, 1); } } /* Remove all highlighting escape sequences in s Also deletes any suffix starting with '(' */ char * StripHighlightAndTitle (char *s) { static char retbuf[MSG_SIZ]; char *p = retbuf; while (*s != NULLCHAR) { while (*s == '\033') { while (*s != NULLCHAR && !isalpha(*s)) s++; if (*s != NULLCHAR) s++; } while (*s != NULLCHAR && *s != '\033') { if (*s == '(' || *s == '[') { *p = NULLCHAR; return retbuf; } *p++ = *s++; } } *p = NULLCHAR; return retbuf; } /* Remove all highlighting escape sequences in s */ char * StripHighlight (char *s) { static char retbuf[MSG_SIZ]; char *p = retbuf; while (*s != NULLCHAR) { while (*s == '\033') { while (*s != NULLCHAR && !isalpha(*s)) s++; if (*s != NULLCHAR) s++; } while (*s != NULLCHAR && *s != '\033') { *p++ = *s++; } } *p = NULLCHAR; return retbuf; } char *variantNames[] = VARIANT_NAMES; char * VariantName (VariantClass v) { return variantNames[v]; } /* Identify a variant from the strings the chess servers use or the PGN Variant tag names we use. */ VariantClass StringToVariant (char *e) { char *p; int wnum = -1; VariantClass v = VariantNormal; int i, found = FALSE; char buf[MSG_SIZ]; int len; if (!e) return v; /* [HGM] skip over optional board-size prefixes */ if( sscanf(e, "%dx%d_", &i, &i) == 2 || sscanf(e, "%dx%d+%d_", &i, &i, &i) == 3 ) { while( *e++ != '_'); } if(StrCaseStr(e, "misc/")) { // [HGM] on FICS, misc/shogi is not shogi v = VariantNormal; found = TRUE; } else for (i=0; i= MSG_SIZ) && appData.debugMode ) fprintf(debugFP, "StringToVariant: buffer truncated.\n"); DisplayError(buf, 0); v = VariantUnknown; break; } } } if (appData.debugMode) { fprintf(debugFP, "recognized '%s' (%d) as variant %s\n", e, wnum, VariantName(v)); } return v; } static int leftover_start = 0, leftover_len = 0; char star_match[STAR_MATCH_N][MSG_SIZ]; /* Test whether pattern is present at &buf[*index]; if so, return TRUE, advance *index beyond it, and set leftover_start to the new value of *index; else return FALSE. If pattern contains the character '*', it matches any sequence of characters not containing '\r', '\n', or the character following the '*' (if any), and the matched sequence(s) are copied into star_match. */ int looking_at ( char *buf, int *index, char *pattern) { char *bufp = &buf[*index], *patternp = pattern; int star_count = 0; char *matchp = star_match[0]; for (;;) { if (*patternp == NULLCHAR) { *index = leftover_start = bufp - buf; *matchp = NULLCHAR; return TRUE; } if (*bufp == NULLCHAR) return FALSE; if (*patternp == '*') { if (*bufp == *(patternp + 1)) { *matchp = NULLCHAR; matchp = star_match[++star_count]; patternp += 2; bufp++; continue; } else if (*bufp == '\n' || *bufp == '\r') { patternp++; if (*patternp == NULLCHAR) continue; else return FALSE; } else { *matchp++ = *bufp++; continue; } } if (*patternp != *bufp) return FALSE; patternp++; bufp++; } } void SendToPlayer (char *data, int length) { int error, outCount; outCount = OutputToProcess(NoProc, data, length, &error); if (outCount < length) { DisplayFatalError(_("Error writing to display"), error, 1); } } void PackHolding (char packed[], char *holding) { char *p = holding; char *q = packed; int runlength = 0; int curr = 9999; do { if (*p == curr) { runlength++; } else { switch (runlength) { case 0: break; case 1: *q++ = curr; break; case 2: *q++ = curr; *q++ = curr; break; default: sprintf(q, "%d", runlength); while (*q) q++; *q++ = curr; break; } runlength = 1; curr = *p; } } while (*p++); *q = NULLCHAR; } /* Telnet protocol requests from the front end */ void TelnetRequest (unsigned char ddww, unsigned char option) { unsigned char msg[3]; int outCount, outError; if (*appData.icsCommPort != NULLCHAR || appData.useTelnet) return; if (appData.debugMode) { char buf1[8], buf2[8], *ddwwStr, *optionStr; switch (ddww) { case TN_DO: ddwwStr = "DO"; break; case TN_DONT: ddwwStr = "DONT"; break; case TN_WILL: ddwwStr = "WILL"; break; case TN_WONT: ddwwStr = "WONT"; break; default: ddwwStr = buf1; snprintf(buf1,sizeof(buf1)/sizeof(buf1[0]), "%d", ddww); break; } switch (option) { case TN_ECHO: optionStr = "ECHO"; break; default: optionStr = buf2; snprintf(buf2,sizeof(buf2)/sizeof(buf2[0]), "%d", option); break; } fprintf(debugFP, ">%s %s ", ddwwStr, optionStr); } msg[0] = TN_IAC; msg[1] = ddww; msg[2] = option; outCount = OutputToProcess(icsPR, (char *)msg, 3, &outError); if (outCount < 3) { DisplayFatalError(_("Error writing to ICS"), outError, 1); } } void DoEcho () { if (!appData.icsActive) return; TelnetRequest(TN_DO, TN_ECHO); } void DontEcho () { if (!appData.icsActive) return; TelnetRequest(TN_DONT, TN_ECHO); } void CopyHoldings (Board board, char *holdings, ChessSquare lowestPiece) { /* put the holdings sent to us by the server on the board holdings area */ int i, j, holdingsColumn, holdingsStartRow, direction, countsColumn; char p; ChessSquare piece; if(gameInfo.holdingsWidth < 2) return; if(gameInfo.variant != VariantBughouse && board[HOLDINGS_SET]) return; // prevent overwriting by pre-board holdings if( (int)lowestPiece >= BlackPawn ) { holdingsColumn = 0; countsColumn = 1; holdingsStartRow = BOARD_HEIGHT-1; direction = -1; } else { holdingsColumn = BOARD_WIDTH-1; countsColumn = BOARD_WIDTH-2; holdingsStartRow = 0; direction = 1; } for(i=0; i= gameInfo.holdingsSize) continue; /* ignore pieces that do not fit */ if(j < 0) continue; /* should not happen */ piece = (ChessSquare) ( (int)piece + (int)lowestPiece ); board[holdingsStartRow+j*direction][holdingsColumn] = piece; board[holdingsStartRow+j*direction][countsColumn]++; } } void VariantSwitch (Board board, VariantClass newVariant) { int newHoldingsWidth, newWidth = 8, newHeight = 8, i, j; static Board oldBoard; startedFromPositionFile = FALSE; if(gameInfo.variant == newVariant) return; /* [HGM] This routine is called each time an assignment is made to * gameInfo.variant during a game, to make sure the board sizes * are set to match the new variant. If that means adding or deleting * holdings, we shift the playing board accordingly * This kludge is needed because in ICS observe mode, we get boards * of an ongoing game without knowing the variant, and learn about the * latter only later. This can be because of the move list we requested, * in which case the game history is refilled from the beginning anyway, * but also when receiving holdings of a crazyhouse game. In the latter * case we want to add those holdings to the already received position. */ if (appData.debugMode) { fprintf(debugFP, "Switch board from %s to %s\n", VariantName(gameInfo.variant), VariantName(newVariant)); setbuf(debugFP, NULL); } shuffleOpenings = 0; /* [HGM] shuffle */ gameInfo.holdingsSize = 5; /* [HGM] prepare holdings */ switch(newVariant) { case VariantShogi: newWidth = 9; newHeight = 9; gameInfo.holdingsSize = 7; case VariantBughouse: case VariantCrazyhouse: newHoldingsWidth = 2; break; case VariantGreat: newWidth = 10; case VariantSuper: newHoldingsWidth = 2; gameInfo.holdingsSize = 8; break; case VariantGothic: case VariantCapablanca: case VariantCapaRandom: newWidth = 10; default: newHoldingsWidth = gameInfo.holdingsSize = 0; }; if(newWidth != gameInfo.boardWidth || newHeight != gameInfo.boardHeight || newHoldingsWidth != gameInfo.holdingsWidth ) { /* shift position to new playing area, if needed */ if(newHoldingsWidth > gameInfo.holdingsWidth) { for(i=0; i=BOARD_LEFT; j--) board[i][j+newHoldingsWidth-gameInfo.holdingsWidth] = board[i][j]; for(i=0; i=0 ) r = minRating+100; if(r > maxRating) r = maxRating; if(tc < 1.f) tc = 1.f; if(tc > 95.f) tc = 95.f; x = (w-hMargin-squareSize/8-7)* log(tc)/log(95.) + hMargin; y = ((double)r - minRating)/(maxRating - minRating) * (h-vMargin-squareSize/8-1) + vMargin; if(ratingList[i] < 0) y = vMargin + squareSize/4; if(strstr(seekAdList[i], " u ")) color = 1; if(!strstr(seekAdList[i], "lightning") && // for now all wilds same color !strstr(seekAdList[i], "bullet") && !strstr(seekAdList[i], "blitz") && !strstr(seekAdList[i], "standard") ) color = 2; if(strstr(seekAdList[i], "(C) ")) color |= SQUARE; // plot computer seeks as squares DrawSeekDot(xList[i]=x+3*(color&~SQUARE), yList[i]=h-1-y, colorList[i]=color); } void PlotSingleSeekAd (int i) { PlotSeekAd(i); } void AddAd (char *handle, char *rating, int base, int inc, char rated, char *type, int nr, Boolean plot) { char buf[MSG_SIZ], *ext = ""; VariantClass v = StringToVariant(type); if(strstr(type, "wild")) { ext = type + 4; // append wild number if(v == VariantFischeRandom) type = "chess960"; else if(v == VariantLoadable) type = "setup"; else type = VariantName(v); } snprintf(buf, MSG_SIZ, "%s (%s) %d %d %c %s%s", handle, rating, base, inc, rated, type, ext); if(nrOfSeekAds < MAX_SEEK_ADS-1) { if(seekAdList[nrOfSeekAds]) free(seekAdList[nrOfSeekAds]); ratingList[nrOfSeekAds] = -1; // for if seeker has no rating sscanf(rating, "%d", &ratingList[nrOfSeekAds]); tcList[nrOfSeekAds] = base + (2./3.)*inc; seekNrList[nrOfSeekAds] = nr; zList[nrOfSeekAds] = 0; seekAdList[nrOfSeekAds++] = StrSave(buf); if(plot) PlotSingleSeekAd(nrOfSeekAds-1); } } void EraseSeekDot (int i) { int x = xList[i], y = yList[i], d=squareSize/4, k; DrawSeekBackground(x-squareSize/8, y-squareSize/8, x+squareSize/8+1, y+squareSize/8+1); if(x < hMargin+d) DrawSeekAxis(hMargin, y-squareSize/8, hMargin, y+squareSize/8+1); // now replot every dot that overlapped for(k=0; k x-d && yy <= y+d && yy > y-d) DrawSeekDot(xx, yy, colorList[k]); } } void RemoveSeekAd (int nr) { int i; for(i=0; i=minRating && i40 ? i%20 : i%10) == 0) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%d", i); DrawSeekText(buf, xx-2-3*(i>9), h-1-vMargin/2); } } for(i=0; i0) zList[i] *= 0.8; // age priority } if(dist < 120) { char buf[MSG_SIZ]; second = (second > 1); if(displayed != closest || second != lastSecond) { DisplayMessage(second ? "!" : "", seekAdList[closest]); lastSecond = second; displayed = closest; } if(click == Press) { if(moving == 2) zList[closest] = 100; // right-click; push to back on press lastDown = closest; return TRUE; } // on press 'hit', only show info if(moving == 2) return TRUE; // ignore right up-clicks on dot snprintf(buf, MSG_SIZ, "play %d\n", seekNrList[closest]); SendToICS(ics_prefix); SendToICS(buf); return TRUE; // let incoming board of started game pop down the graph } else if(click == Release) { // release 'miss' is ignored zList[lastDown] = 100; // make future selection of the rejected ad more difficult if(moving == 2) { // right up-click nrOfSeekAds = 0; // refresh graph soughtPending = TRUE; SendToICS(ics_prefix); SendToICS("sought\n"); // should this be "sought all"? } return TRUE; } else if(moving) { if(displayed >= 0) DisplayMessage("", ""); displayed = -1; return TRUE; } // press miss or release hit 'pop down' seek graph seekGraphUp = FALSE; DrawPosition(TRUE, NULL); } return TRUE; } void read_from_ics (InputSourceRef isr, VOIDSTAR closure, char *data, int count, int error) { #define BUF_SIZE (16*1024) /* overflowed at 8K with "inchannel 1" on FICS? */ #define STARTED_NONE 0 #define STARTED_MOVES 1 #define STARTED_BOARD 2 #define STARTED_OBSERVE 3 #define STARTED_HOLDINGS 4 #define STARTED_CHATTER 5 #define STARTED_COMMENT 6 #define STARTED_MOVES_NOHIDE 7 static int started = STARTED_NONE; static char parse[20000]; static int parse_pos = 0; static char buf[BUF_SIZE + 1]; static int firstTime = TRUE, intfSet = FALSE; static ColorClass prevColor = ColorNormal; static int savingComment = FALSE; static int cmatch = 0; // continuation sequence match char *bp; char str[MSG_SIZ]; int i, oldi; int buf_len; int next_out; int tkind; int backup; /* [DM] For zippy color lines */ char *p; char talker[MSG_SIZ]; // [HGM] chat int channel; connectionAlive = TRUE; // [HGM] alive: I think, therefore I am... if (appData.debugMode) { if (!error) { fprintf(debugFP, " 0) { /* If last read ended with a partial line that we couldn't parse, prepend it to the new read and try again. */ if (leftover_len > 0) { for (i=0; i= 3 && (unsigned char) buf[i] == TN_IAC) { static int remoteEchoOption = FALSE; /* telnet ECHO option */ unsigned char option; oldi = i; switch ((unsigned char) buf[++i]) { case TN_WILL: if (appData.debugMode) fprintf(debugFP, "\n next_out) SendToPlayer(&buf[next_out], oldi - next_out); if (++i > next_out) next_out = i; continue; } /* OK, this at least will *usually* work */ if (!loggedOn && looking_at(buf, &i, "ics%")) { loggedOn = TRUE; } if (loggedOn && !intfSet) { if (ics_type == ICS_ICC) { snprintf(str, MSG_SIZ, "/set-quietly interface %s\n/set-quietly style 12\n", programVersion); if(appData.seekGraph && appData.autoRefresh) // [HGM] seekgraph strcat(str, "/set-2 51 1\n/set seek 1\n"); } else if (ics_type == ICS_CHESSNET) { snprintf(str, MSG_SIZ, "/style 12\n"); } else { safeStrCpy(str, "alias $ @\n$set interface ", sizeof(str)/sizeof(str[0])); strcat(str, programVersion); strcat(str, "\n$iset startpos 1\n$iset ms 1\n"); if(appData.seekGraph && appData.autoRefresh) // [HGM] seekgraph strcat(str, "$iset seekremove 1\n$set seek 1\n"); #ifdef WIN32 strcat(str, "$iset nohighlight 1\n"); #endif strcat(str, "$iset lock 1\n$style 12\n"); } SendToICS(str); NotifyFrontendLogin(); intfSet = TRUE; } if (started == STARTED_COMMENT) { /* Accumulate characters in comment */ parse[parse_pos++] = buf[i]; if (buf[i] == '\n') { parse[parse_pos] = NULLCHAR; if(chattingPartner>=0) { char mess[MSG_SIZ]; snprintf(mess, MSG_SIZ, "%s%s", talker, parse); OutputChatMessage(chattingPartner, mess); chattingPartner = -1; next_out = i+1; // [HGM] suppress printing in ICS window } else if(!suppressKibitz) // [HGM] kibitz AppendComment(forwardMostMove, StripHighlight(parse), TRUE); else { // [HGM kibitz: divert memorized engine kibitz to engine-output window int nrDigit = 0, nrAlph = 0, j; if(parse_pos > MSG_SIZ - 30) // defuse unreasonably long input { parse_pos = MSG_SIZ-30; parse[parse_pos - 1] = '\n'; } parse[parse_pos] = NULLCHAR; // try to be smart: if it does not look like search info, it should go to // ICS interaction window after all, not to engine-output window. for(j=0; j= '0' && parse[j] <= '9'); nrAlph += (parse[j] >= 'a' && parse[j] <= 'z'); nrAlph += (parse[j] >= 'A' && parse[j] <= 'Z'); } if(nrAlph < 9*nrDigit) { // if more than 10% digit we assume search info int depth=0; float score; if(sscanf(parse, "!!! %f/%d", &score, &depth) == 2 && depth>0) { // [HGM] kibitz: save kibitzed opponent info for PGN and eval graph pvInfoList[forwardMostMove-1].depth = depth; pvInfoList[forwardMostMove-1].score = 100*score; } OutputKibitz(suppressKibitz, parse); } else { char tmp[MSG_SIZ]; if(gameMode == IcsObserving) // restore original ICS messages snprintf(tmp, MSG_SIZ, "%s kibitzes: %s", star_match[0], parse); else snprintf(tmp, MSG_SIZ, _("your opponent kibitzes: %s"), parse); SendToPlayer(tmp, strlen(tmp)); } next_out = i+1; // [HGM] suppress printing in ICS window } started = STARTED_NONE; } else { /* Don't match patterns against characters in comment */ i++; continue; } } if (started == STARTED_CHATTER) { if (buf[i] != '\n') { /* Don't match patterns against characters in chatter */ i++; continue; } started = STARTED_NONE; if(suppressKibitz) next_out = i+1; } /* Kludge to deal with rcmd protocol */ if (firstTime && looking_at(buf, &i, "\001*")) { DisplayFatalError(&buf[1], 0, 1); continue; } else { firstTime = FALSE; } if (!loggedOn && looking_at(buf, &i, "chessclub.com")) { ics_type = ICS_ICC; ics_prefix = "/"; if (appData.debugMode) fprintf(debugFP, "ics_type %d\n", ics_type); continue; } if (!loggedOn && looking_at(buf, &i, "freechess.org")) { ics_type = ICS_FICS; ics_prefix = "$"; if (appData.debugMode) fprintf(debugFP, "ics_type %d\n", ics_type); continue; } if (!loggedOn && looking_at(buf, &i, "chess.net")) { ics_type = ICS_CHESSNET; ics_prefix = "/"; if (appData.debugMode) fprintf(debugFP, "ics_type %d\n", ics_type); continue; } if (!loggedOn && (looking_at(buf, &i, "\"*\" is *a registered name") || looking_at(buf, &i, "Logging you in as \"*\"") || looking_at(buf, &i, "will be \"*\""))) { safeStrCpy(ics_handle, star_match[0], sizeof(ics_handle)/sizeof(ics_handle[0])); continue; } if (loggedOn && !have_set_title && ics_handle[0] != NULLCHAR) { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), "%s@%s", ics_handle, appData.icsHost); DisplayIcsInteractionTitle(buf); have_set_title = TRUE; } /* skip finger notes */ if (started == STARTED_NONE && ((buf[i] == ' ' && isdigit(buf[i+1])) || (buf[i] == '1' && buf[i+1] == '0')) && buf[i+2] == ':' && buf[i+3] == ' ') { started = STARTED_CHATTER; i += 3; continue; } oldi = i; // [HGM] seekgraph: recognize sought lines and end-of-sought message if(appData.seekGraph) { if(soughtPending && MatchSoughtLine(buf+i)) { i = strstr(buf+i, "rated") - buf; if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); next_out = leftover_start = i; started = STARTED_CHATTER; suppressKibitz = TRUE; continue; } if((gameMode == IcsIdle || gameMode == BeginningOfGame) && looking_at(buf, &i, "* ads displayed")) { soughtPending = FALSE; seekGraphUp = TRUE; DrawSeekGraph(); continue; } if(appData.autoRefresh) { if(looking_at(buf, &i, "* (*) seeking * * * * *\"play *\" to respond)\n")) { int s = (ics_type == ICS_ICC); // ICC format differs if(seekGraphUp) AddAd(star_match[0], star_match[1], atoi(star_match[2+s]), atoi(star_match[3+s]), star_match[4+s][0], star_match[5-3*s], atoi(star_match[7]), TRUE); looking_at(buf, &i, "*% "); // eat prompt if(oldi > 0 && buf[oldi-1] == '\n') oldi--; // suppress preceding LF, if any if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); next_out = i; // suppress continue; } if(looking_at(buf, &i, "\nAds removed: *\n") || looking_at(buf, &i, "\031(51 * *\031)")) { char *p = star_match[0]; while(*p) { if(seekGraphUp) RemoveSeekAd(atoi(p)); while(*p && *p++ != ' '); // next } looking_at(buf, &i, "*% "); // eat prompt if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); next_out = i; continue; } } } /* skip formula vars */ if (started == STARTED_NONE && buf[i] == 'f' && isdigit(buf[i+1]) && buf[i+2] == ':') { started = STARTED_CHATTER; i += 3; continue; } // [HGM] kibitz: try to recognize opponent engine-score kibitzes, to divert them to engine-output window if (appData.autoKibitz && started == STARTED_NONE && !appData.icsEngineAnalyze && // [HGM] [DM] ICS analyze (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsObserving)) { if((looking_at(buf, &i, "\n* kibitzes: ") || looking_at(buf, &i, "\n* whispers: ") || looking_at(buf, &i, "* kibitzes: ") || looking_at(buf, &i, "* whispers: ")) && (StrStr(star_match[0], gameInfo.white) == star_match[0] || StrStr(star_match[0], gameInfo.black) == star_match[0] )) { // kibitz of self or opponent suppressKibitz = TRUE; if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); next_out = i; if((StrStr(star_match[0], gameInfo.white) == star_match[0] && (gameMode == IcsPlayingWhite)) || (StrStr(star_match[0], gameInfo.black) == star_match[0] && (gameMode == IcsPlayingBlack)) ) // opponent kibitz started = STARTED_CHATTER; // own kibitz we simply discard else { started = STARTED_COMMENT; // make sure it will be collected in parse[] parse_pos = 0; parse[0] = NULLCHAR; savingComment = TRUE; suppressKibitz = gameMode != IcsObserving ? 2 : (StrStr(star_match[0], gameInfo.white) == NULL) + 1; } continue; } else if((looking_at(buf, &i, "\nkibitzed to *\n") || looking_at(buf, &i, "kibitzed to *\n") || looking_at(buf, &i, "\n(kibitzed to *\n") || looking_at(buf, &i, "(kibitzed to *\n")) && atoi(star_match[0])) { // suppress the acknowledgements of our own autoKibitz char *p; if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); if(p = strchr(star_match[0], ' ')) p[1] = NULLCHAR; // clip off "players)" on FICS SendToPlayer(star_match[0], strlen(star_match[0])); if(looking_at(buf, &i, "*% ")) // eat prompt suppressKibitz = FALSE; next_out = i; continue; } } // [HGM] kibitz: end of patch if(looking_at(buf, &i, "* rating adjustment: * --> *\n")) continue; // [HGM] chat: intercept tells by users for which we have an open chat window channel = -1; if(started == STARTED_NONE && (looking_at(buf, &i, "* tells you:") || looking_at(buf, &i, "* says:") || looking_at(buf, &i, "* whispers:") || looking_at(buf, &i, "* kibitzes:") || looking_at(buf, &i, "* shouts:") || looking_at(buf, &i, "* c-shouts:") || looking_at(buf, &i, "--> * ") || looking_at(buf, &i, "*(*):") && (sscanf(star_match[1], "%d", &channel),1) || looking_at(buf, &i, "*(*)(*):") && (sscanf(star_match[2], "%d", &channel),1) || looking_at(buf, &i, "*(*)(*)(*):") && (sscanf(star_match[3], "%d", &channel),1) || looking_at(buf, &i, "*(*)(*)(*)(*):") && sscanf(star_match[4], "%d", &channel) == 1 )) { int p; sscanf(star_match[0], "%[^(]", talker+1); // strip (C) or (U) off ICS handle chattingPartner = -1; if(channel >= 0) // channel broadcast; look if there is a chatbox for this channel for(p=0; p= '0' && chatPartner[p][0] <= '9' && channel == atoi(chatPartner[p])) { talker[0] = '['; strcat(talker, "] "); Colorize(channel == 1 ? ColorChannel1 : ColorChannel, FALSE); chattingPartner = p; break; } } else if(buf[i-3] == 'e') // kibitz; look if there is a KIBITZ chatbox for(p=0; p') {// shout, c-shout or it; look if there is a 'shouts' chatbox if(buf[i-8] == '-' && buf[i-3] == 't') for(p=0; p') { talker[0] = '<'; strcat(talker, "> "); Colorize(ColorShout, FALSE); } else if(buf[i-8] == '-') { talker[0] = '('; strcat(talker, ") "); Colorize(ColorSShout, FALSE); } else { talker[0] = '['; strcat(talker, "] "); Colorize(ColorShout, FALSE); } chattingPartner = p; break; } } } if(chattingPartner<0) // if not, look if there is a chatbox for this indivdual for(p=0; p 0 && buf[oldi-1] == '\n') oldi--; if (oldi > next_out) SendToPlayer(&buf[next_out], oldi - next_out); started = STARTED_COMMENT; parse_pos = 0; parse[0] = NULLCHAR; savingComment = 3 + chattingPartner; // counts as TRUE suppressKibitz = TRUE; continue; } } // [HGM] chat: end of patch backup = i; if (appData.zippyTalk || appData.zippyPlay) { /* [DM] Backup address for color zippy lines */ #if ZIPPY if (loggedOn == TRUE) if (ZippyControl(buf, &backup) || ZippyConverse(buf, &backup) || (appData.zippyPlay && ZippyMatch(buf, &backup))); #endif } // [DM] 'else { ' deleted if ( /* Regular tells and says */ (tkind = 1, looking_at(buf, &i, "* tells you: ")) || looking_at(buf, &i, "* (your partner) tells you: ") || looking_at(buf, &i, "* says: ") || /* Don't color "message" or "messages" output */ (tkind = 5, looking_at(buf, &i, "*. * (*:*): ")) || looking_at(buf, &i, "*. * at *:*: ") || looking_at(buf, &i, "--* (*:*): ") || /* Message notifications (same color as tells) */ looking_at(buf, &i, "* has left a message ") || looking_at(buf, &i, "* just sent you a message:\n") || /* Whispers and kibitzes */ (tkind = 2, looking_at(buf, &i, "* whispers: ")) || looking_at(buf, &i, "* kibitzes: ") || /* Channel tells */ (tkind = 3, looking_at(buf, &i, "*(*: "))) { if (tkind == 1 && strchr(star_match[0], ':')) { /* Avoid "tells you:" spoofs in channels */ tkind = 3; } if (star_match[0][0] == NULLCHAR || strchr(star_match[0], ' ') || (tkind == 3 && strchr(star_match[1], ' '))) { /* Reject bogus matches */ i = oldi; } else { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } switch (tkind) { case 1: Colorize(ColorTell, FALSE); curColor = ColorTell; break; case 2: Colorize(ColorKibitz, FALSE); curColor = ColorKibitz; break; case 3: p = strrchr(star_match[1], '('); if (p == NULL) { p = star_match[1]; } else { p++; } if (atoi(p) == 1) { Colorize(ColorChannel1, FALSE); curColor = ColorChannel1; } else { Colorize(ColorChannel, FALSE); curColor = ColorChannel; } break; case 5: curColor = ColorNormal; break; } } if (started == STARTED_NONE && appData.autoComment && (gameMode == IcsObserving || gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack)) { parse_pos = i - oldi; memcpy(parse, &buf[oldi], parse_pos); parse[parse_pos] = NULLCHAR; started = STARTED_COMMENT; savingComment = TRUE; } else { started = STARTED_CHATTER; savingComment = FALSE; } loggedOn = TRUE; continue; } } if (looking_at(buf, &i, "* s-shouts: ") || looking_at(buf, &i, "* c-shouts: ")) { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorSShout, FALSE); curColor = ColorSShout; } loggedOn = TRUE; started = STARTED_CHATTER; continue; } if (looking_at(buf, &i, "--->")) { loggedOn = TRUE; continue; } if (looking_at(buf, &i, "* shouts: ") || looking_at(buf, &i, "--> ")) { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorShout, FALSE); curColor = ColorShout; } loggedOn = TRUE; started = STARTED_CHATTER; continue; } if (looking_at( buf, &i, "Challenge:")) { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorChallenge, FALSE); curColor = ColorChallenge; } loggedOn = TRUE; continue; } if (looking_at(buf, &i, "* offers you") || looking_at(buf, &i, "* offers to be") || looking_at(buf, &i, "* would like to") || looking_at(buf, &i, "* requests to") || looking_at(buf, &i, "Your opponent offers") || looking_at(buf, &i, "Your opponent requests")) { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorRequest, FALSE); curColor = ColorRequest; } continue; } if (looking_at(buf, &i, "* (*) seeking")) { if (appData.colorize) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorSeek, FALSE); curColor = ColorSeek; } continue; } if(i < backup) { i = backup; continue; } // [HGM] for if ZippyControl matches, but the colorie code doesn't if (looking_at(buf, &i, "\\ ")) { if (prevColor != ColorNormal) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(prevColor, TRUE); curColor = prevColor; } if (savingComment) { parse_pos = i - oldi; memcpy(parse, &buf[oldi], parse_pos); parse[parse_pos] = NULLCHAR; started = STARTED_COMMENT; if(savingComment >= 3) // [HGM] chat: continuation of line for chat box chattingPartner = savingComment - 3; // kludge to remember the box } else { started = STARTED_CHATTER; } continue; } if (looking_at(buf, &i, "Black Strength :") || looking_at(buf, &i, "<<< style 10 board >>>") || looking_at(buf, &i, "<10>") || looking_at(buf, &i, "#@#")) { /* Wrong board style */ loggedOn = TRUE; SendToICS(ics_prefix); SendToICS("set style 12\n"); SendToICS(ics_prefix); SendToICS("refresh\n"); continue; } if (looking_at(buf, &i, "login:")) { if (!have_sent_ICS_logon) { if(ICSInitScript()) have_sent_ICS_logon = 1; else // no init script was found have_sent_ICS_logon = (appData.autoCreateLogon ? 2 : 1); // flag that we should capture username + password } else { // we have sent (or created) the InitScript, but apparently the ICS rejected it have_sent_ICS_logon = (appData.autoCreateLogon ? 2 : 1); // request creation of a new script } continue; } if (ics_getting_history != H_GETTING_MOVES /*smpos kludge*/ && (looking_at(buf, &i, "\n<12> ") || looking_at(buf, &i, "<12> "))) { loggedOn = TRUE; if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); } next_out = i; started = STARTED_BOARD; parse_pos = 0; continue; } if ((started == STARTED_NONE && looking_at(buf, &i, "\n ")) || looking_at(buf, &i, " ")) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); } next_out = i; started = STARTED_HOLDINGS; parse_pos = 0; continue; } if (looking_at(buf, &i, "* *vs. * *--- *")) { loggedOn = TRUE; /* Header for a move list -- first line */ switch (ics_getting_history) { case H_FALSE: switch (gameMode) { case IcsIdle: case BeginningOfGame: /* User typed "moves" or "oldmoves" while we were idle. Pretend we asked for these moves and soak them up so user can step through them and/or save them. */ Reset(FALSE, TRUE); gameMode = IcsObserving; ModeHighlight(); ics_gamenum = -1; ics_getting_history = H_GOT_UNREQ_HEADER; break; case EditGame: /*?*/ case EditPosition: /*?*/ /* Should above feature work in these modes too? */ /* For now it doesn't */ ics_getting_history = H_GOT_UNWANTED_HEADER; break; default: ics_getting_history = H_GOT_UNWANTED_HEADER; break; } break; case H_REQUESTED: /* Is this the right one? */ if (gameInfo.white && gameInfo.black && strcmp(gameInfo.white, star_match[0]) == 0 && strcmp(gameInfo.black, star_match[2]) == 0) { /* All is well */ ics_getting_history = H_GOT_REQ_HEADER; } break; case H_GOT_REQ_HEADER: case H_GOT_UNREQ_HEADER: case H_GOT_UNWANTED_HEADER: case H_GETTING_MOVES: /* Should not happen */ DisplayError(_("Error gathering move list: two headers"), 0); ics_getting_history = H_FALSE; break; } /* Save player ratings into gameInfo if needed */ if ((ics_getting_history == H_GOT_REQ_HEADER || ics_getting_history == H_GOT_UNREQ_HEADER) && (gameInfo.whiteRating == -1 || gameInfo.blackRating == -1)) { gameInfo.whiteRating = string_to_rating(star_match[1]); gameInfo.blackRating = string_to_rating(star_match[3]); if (appData.debugMode) fprintf(debugFP, "Ratings from header: W %d, B %d\n", gameInfo.whiteRating, gameInfo.blackRating); } continue; } if (looking_at(buf, &i, "* * match, initial time: * minute*, increment: * second")) { /* Header for a move list -- second line */ /* Initial board will follow if this is a wild game */ if (gameInfo.event != NULL) free(gameInfo.event); snprintf(str, MSG_SIZ, "ICS %s %s match", star_match[0], star_match[1]); gameInfo.event = StrSave(str); /* [HGM] we switched variant. Translate boards if needed. */ VariantSwitch(boards[currentMove], StringToVariant(gameInfo.event)); continue; } if (looking_at(buf, &i, "Move ")) { /* Beginning of a move list */ switch (ics_getting_history) { case H_FALSE: /* Normally should not happen */ /* Maybe user hit reset while we were parsing */ break; case H_REQUESTED: /* Happens if we are ignoring a move list that is not * the one we just requested. Common if the user * tries to observe two games without turning off * getMoveList */ break; case H_GETTING_MOVES: /* Should not happen */ DisplayError(_("Error gathering move list: nested"), 0); ics_getting_history = H_FALSE; break; case H_GOT_REQ_HEADER: ics_getting_history = H_GETTING_MOVES; started = STARTED_MOVES; parse_pos = 0; if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); } break; case H_GOT_UNREQ_HEADER: ics_getting_history = H_GETTING_MOVES; started = STARTED_MOVES_NOHIDE; parse_pos = 0; break; case H_GOT_UNWANTED_HEADER: ics_getting_history = H_FALSE; break; } continue; } if (looking_at(buf, &i, "% ") || ((started == STARTED_MOVES || started == STARTED_MOVES_NOHIDE) && looking_at(buf, &i, "}*"))) { char *bookHit = NULL; // [HGM] book if(soughtPending && nrOfSeekAds) { // [HGM] seekgraph: on ICC sought-list has no termination line soughtPending = FALSE; seekGraphUp = TRUE; DrawSeekGraph(); } if(suppressKibitz) next_out = i; savingComment = FALSE; suppressKibitz = 0; switch (started) { case STARTED_MOVES: case STARTED_MOVES_NOHIDE: memcpy(&parse[parse_pos], &buf[oldi], i - oldi); parse[parse_pos + i - oldi] = NULLCHAR; ParseGameHistory(parse); #if ZIPPY if (appData.zippyPlay && first.initDone) { FeedMovesToProgram(&first, forwardMostMove); if (gameMode == IcsPlayingWhite) { if (WhiteOnMove(forwardMostMove)) { if (first.sendTime) { if (first.useColors) { SendToProgram("black\n", &first); } SendTimeRemaining(&first, TRUE); } if (first.useColors) { SendToProgram("white\n", &first); // [HGM] book: made sending of "go\n" book dependent } bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: probe book for initial pos first.maybeThinking = TRUE; } else { if (first.usePlayother) { if (first.sendTime) { SendTimeRemaining(&first, TRUE); } SendToProgram("playother\n", &first); firstMove = FALSE; } else { firstMove = TRUE; } } } else if (gameMode == IcsPlayingBlack) { if (!WhiteOnMove(forwardMostMove)) { if (first.sendTime) { if (first.useColors) { SendToProgram("white\n", &first); } SendTimeRemaining(&first, FALSE); } if (first.useColors) { SendToProgram("black\n", &first); } bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); first.maybeThinking = TRUE; } else { if (first.usePlayother) { if (first.sendTime) { SendTimeRemaining(&first, FALSE); } SendToProgram("playother\n", &first); firstMove = FALSE; } else { firstMove = TRUE; } } } } #endif if (gameMode == IcsObserving && ics_gamenum == -1) { /* Moves came from oldmoves or moves command while we weren't doing anything else. */ currentMove = forwardMostMove; ClearHighlights();/*!!could figure this out*/ flipView = appData.flipView; DrawPosition(TRUE, boards[currentMove]); DisplayBothClocks(); snprintf(str, MSG_SIZ, "%s %s %s", gameInfo.white, _("vs."), gameInfo.black); DisplayTitle(str); gameMode = IcsIdle; } else { /* Moves were history of an active game */ if (gameInfo.resultDetails != NULL) { free(gameInfo.resultDetails); gameInfo.resultDetails = NULL; } } HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); DisplayMove(currentMove - 1); if (started == STARTED_MOVES) next_out = i; started = STARTED_NONE; ics_getting_history = H_FALSE; break; case STARTED_OBSERVE: started = STARTED_NONE; SendToICS(ics_prefix); SendToICS("refresh\n"); break; default: break; } if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } continue; } if ((started == STARTED_MOVES || started == STARTED_BOARD || started == STARTED_HOLDINGS || started == STARTED_MOVES_NOHIDE) && i >= leftover_len) { /* Accumulate characters in move list or board */ parse[parse_pos++] = buf[i]; } /* Start of game messages. Mostly we detect start of game when the first board image arrives. On some versions of the ICS, though, we need to do a "refresh" after starting to observe in order to get the current board right away. */ if (looking_at(buf, &i, "Adding game * to observation list")) { started = STARTED_OBSERVE; continue; } /* Handle auto-observe */ if (appData.autoObserve && (gameMode == IcsIdle || gameMode == BeginningOfGame) && looking_at(buf, &i, "Game notification: * (*) vs. * (*)")) { char *player; /* Choose the player that was highlighted, if any. */ if (star_match[0][0] == '\033' || star_match[1][0] != '\033') { player = star_match[0]; } else { player = star_match[2]; } snprintf(str, MSG_SIZ, "%sobserve %s\n", ics_prefix, StripHighlightAndTitle(player)); SendToICS(str); /* Save ratings from notify string */ safeStrCpy(player1Name, star_match[0], sizeof(player1Name)/sizeof(player1Name[0])); player1Rating = string_to_rating(star_match[1]); safeStrCpy(player2Name, star_match[2], sizeof(player2Name)/sizeof(player2Name[0])); player2Rating = string_to_rating(star_match[3]); if (appData.debugMode) fprintf(debugFP, "Ratings from 'Game notification:' %s %d, %s %d\n", player1Name, player1Rating, player2Name, player2Rating); continue; } /* Deal with automatic examine mode after a game, and with IcsObserving -> IcsExamining transition */ if (looking_at(buf, &i, "Entering examine mode for game *") || looking_at(buf, &i, "has made you an examiner of game *")) { int gamenum = atoi(star_match[0]); if ((gameMode == IcsIdle || gameMode == IcsObserving) && gamenum == ics_gamenum) { /* We were already playing or observing this game; no need to refetch history */ gameMode = IcsExamining; if (pausing) { pauseExamForwardMostMove = forwardMostMove; } else if (currentMove < forwardMostMove) { ForwardInner(forwardMostMove); } } else { /* I don't think this case really can happen */ SendToICS(ics_prefix); SendToICS("refresh\n"); } continue; } /* Error messages */ // if (ics_user_moved) { if (1) { // [HGM] old way ignored error after move type in; ics_user_moved is not set then! if (looking_at(buf, &i, "Illegal move") || looking_at(buf, &i, "Not a legal move") || looking_at(buf, &i, "Your king is in check") || looking_at(buf, &i, "It isn't your turn") || looking_at(buf, &i, "It is not your move")) { /* Illegal move */ if (ics_user_moved && forwardMostMove > backwardMostMove) { // only backup if we already moved currentMove = forwardMostMove-1; DisplayMove(currentMove - 1); /* before DMError */ DrawPosition(FALSE, boards[currentMove]); SwitchClocks(forwardMostMove-1); // [HGM] race DisplayBothClocks(); } DisplayMoveError(_("Illegal move (rejected by ICS)")); // [HGM] but always relay error msg ics_user_moved = 0; continue; } } if (looking_at(buf, &i, "still have time") || looking_at(buf, &i, "not out of time") || looking_at(buf, &i, "either player is out of time") || looking_at(buf, &i, "has timeseal; checking")) { /* We must have called his flag a little too soon */ whiteFlag = blackFlag = FALSE; continue; } if (looking_at(buf, &i, "added * seconds to") || looking_at(buf, &i, "seconds were added to")) { /* Update the clocks */ SendToICS(ics_prefix); SendToICS("refresh\n"); continue; } if (!ics_clock_paused && looking_at(buf, &i, "clock paused")) { ics_clock_paused = TRUE; StopClocks(); continue; } if (ics_clock_paused && looking_at(buf, &i, "clock resumed")) { ics_clock_paused = FALSE; StartClocks(); continue; } /* Grab player ratings from the Creating: message. Note we have to check for the special case when the ICS inserts things like [white] or [black]. */ if (looking_at(buf, &i, "Creating: * (*)* * (*)") || looking_at(buf, &i, "Creating: * (*) [*] * (*)")) { /* star_matches: 0 player 1 name (not necessarily white) 1 player 1 rating 2 empty, white, or black (IGNORED) 3 player 2 name (not necessarily black) 4 player 2 rating The names/ratings are sorted out when the game actually starts (below). */ safeStrCpy(player1Name, StripHighlightAndTitle(star_match[0]), sizeof(player1Name)/sizeof(player1Name[0])); player1Rating = string_to_rating(star_match[1]); safeStrCpy(player2Name, StripHighlightAndTitle(star_match[3]), sizeof(player2Name)/sizeof(player2Name[0])); player2Rating = string_to_rating(star_match[4]); if (appData.debugMode) fprintf(debugFP, "Ratings from 'Creating:' %s %d, %s %d\n", player1Name, player1Rating, player2Name, player2Rating); continue; } /* Improved generic start/end-of-game messages */ if ((tkind=0, looking_at(buf, &i, "{Game * (* vs. *) *}*")) || (tkind=1, looking_at(buf, &i, "{Game * (*(*) vs. *(*)) *}*"))){ /* If tkind == 0: */ /* star_match[0] is the game number */ /* [1] is the white player's name */ /* [2] is the black player's name */ /* For end-of-game: */ /* [3] is the reason for the game end */ /* [4] is a PGN end game-token, preceded by " " */ /* For start-of-game: */ /* [3] begins with "Creating" or "Continuing" */ /* [4] is " *" or empty (don't care). */ int gamenum = atoi(star_match[0]); char *whitename, *blackname, *why, *endtoken; ChessMove endtype = EndOfFile; if (tkind == 0) { whitename = star_match[1]; blackname = star_match[2]; why = star_match[3]; endtoken = star_match[4]; } else { whitename = star_match[1]; blackname = star_match[3]; why = star_match[5]; endtoken = star_match[6]; } /* Game start messages */ if (strncmp(why, "Creating ", 9) == 0 || strncmp(why, "Continuing ", 11) == 0) { gs_gamenum = gamenum; safeStrCpy(gs_kind, strchr(why, ' ') + 1,sizeof(gs_kind)/sizeof(gs_kind[0])); if(ics_gamenum == -1) // [HGM] only if we are not already involved in a game (because gin=1 sends us such messages) VariantSwitch(boards[currentMove], StringToVariant(gs_kind)); // [HGM] variantswitch: even before we get first board #if ZIPPY if (appData.zippyPlay) { ZippyGameStart(whitename, blackname); } #endif /*ZIPPY*/ partnerBoardValid = FALSE; // [HGM] bughouse continue; } /* Game end messages */ if (gameMode == IcsIdle || gameMode == BeginningOfGame || ics_gamenum != gamenum) { continue; } while (endtoken[0] == ' ') endtoken++; switch (endtoken[0]) { case '*': default: endtype = GameUnfinished; break; case '0': endtype = BlackWins; break; case '1': if (endtoken[1] == '/') endtype = GameIsDrawn; else endtype = WhiteWins; break; } GameEnds(endtype, why, GE_ICS); #if ZIPPY if (appData.zippyPlay && first.initDone) { ZippyGameEnd(endtype, why); if (first.pr == NoProc) { /* Start the next process early so that we'll be ready for the next challenge */ StartChessProgram(&first); } /* Send "new" early, in case this command takes a long time to finish, so that we'll be ready for the next challenge. */ gameInfo.variant = VariantNormal; // [HGM] variantswitch: suppress sending of 'variant' Reset(TRUE, TRUE); } #endif /*ZIPPY*/ if(appData.bgObserve && partnerBoardValid) DrawPosition(TRUE, partnerBoard); continue; } if (looking_at(buf, &i, "Removing game * from observation") || looking_at(buf, &i, "no longer observing game *") || looking_at(buf, &i, "Game * (*) has no examiners")) { if (gameMode == IcsObserving && atoi(star_match[0]) == ics_gamenum) { /* icsEngineAnalyze */ if (appData.icsEngineAnalyze) { ExitAnalyzeMode(); ModeHighlight(); } StopClocks(); gameMode = IcsIdle; ics_gamenum = -1; ics_user_moved = FALSE; } continue; } if (looking_at(buf, &i, "no longer examining game *")) { if (gameMode == IcsExamining && atoi(star_match[0]) == ics_gamenum) { gameMode = IcsIdle; ics_gamenum = -1; ics_user_moved = FALSE; } continue; } /* Advance leftover_start past any newlines we find, so only partial lines can get reparsed */ if (looking_at(buf, &i, "\n")) { prevColor = curColor; if (curColor != ColorNormal) { if (oldi > next_out) { SendToPlayer(&buf[next_out], oldi - next_out); next_out = oldi; } Colorize(ColorNormal, FALSE); curColor = ColorNormal; } if (started == STARTED_BOARD) { started = STARTED_NONE; parse[parse_pos] = NULLCHAR; ParseBoard12(parse); ics_user_moved = 0; /* Send premove here */ if (appData.premove) { char str[MSG_SIZ]; if (currentMove == 0 && gameMode == IcsPlayingWhite && appData.premoveWhite) { snprintf(str, MSG_SIZ, "%s\n", appData.premoveWhiteText); if (appData.debugMode) fprintf(debugFP, "Sending premove:\n"); SendToICS(str); } else if (currentMove == 1 && gameMode == IcsPlayingBlack && appData.premoveBlack) { snprintf(str, MSG_SIZ, "%s\n", appData.premoveBlackText); if (appData.debugMode) fprintf(debugFP, "Sending premove:\n"); SendToICS(str); } else if (gotPremove) { gotPremove = 0; ClearPremoveHighlights(); if (appData.debugMode) fprintf(debugFP, "Sending premove:\n"); UserMoveEvent(premoveFromX, premoveFromY, premoveToX, premoveToY, premovePromoChar); } } /* Usually suppress following prompt */ if (!(forwardMostMove == 0 && gameMode == IcsExamining)) { while(looking_at(buf, &i, "\n")); // [HGM] skip empty lines if (looking_at(buf, &i, "*% ")) { savingComment = FALSE; suppressKibitz = 0; } } next_out = i; } else if (started == STARTED_HOLDINGS) { int gamenum; char new_piece[MSG_SIZ]; started = STARTED_NONE; parse[parse_pos] = NULLCHAR; if (appData.debugMode) fprintf(debugFP, "Parsing holdings: %s, currentMove = %d\n", parse, currentMove); if (sscanf(parse, " game %d", &gamenum) == 1) { if(gamenum == ics_gamenum) { // [HGM] bughouse: old code if part of foreground game if (gameInfo.variant == VariantNormal) { /* [HGM] We seem to switch variant during a game! * Presumably no holdings were displayed, so we have * to move the position two files to the right to * create room for them! */ VariantClass newVariant; switch(gameInfo.boardWidth) { // base guess on board width case 9: newVariant = VariantShogi; break; case 10: newVariant = VariantGreat; break; default: newVariant = VariantCrazyhouse; break; } VariantSwitch(boards[currentMove], newVariant); /* temp guess */ /* Get a move list just to see the header, which will tell us whether this is really bug or zh */ if (ics_getting_history == H_FALSE) { ics_getting_history = H_REQUESTED; snprintf(str, MSG_SIZ, "%smoves %d\n", ics_prefix, gamenum); SendToICS(str); } } new_piece[0] = NULLCHAR; sscanf(parse, "game %d white [%s black [%s <- %s", &gamenum, white_holding, black_holding, new_piece); white_holding[strlen(white_holding)-1] = NULLCHAR; black_holding[strlen(black_holding)-1] = NULLCHAR; /* [HGM] copy holdings to board holdings area */ CopyHoldings(boards[forwardMostMove], white_holding, WhitePawn); CopyHoldings(boards[forwardMostMove], black_holding, BlackPawn); boards[forwardMostMove][HOLDINGS_SET] = 1; // flag holdings as set #if ZIPPY if (appData.zippyPlay && first.initDone) { ZippyHoldings(white_holding, black_holding, new_piece); } #endif /*ZIPPY*/ if (tinyLayout || smallLayout) { char wh[16], bh[16]; PackHolding(wh, white_holding); PackHolding(bh, black_holding); snprintf(str, MSG_SIZ, "[%s-%s] %s-%s", wh, bh, gameInfo.white, gameInfo.black); } else { snprintf(str, MSG_SIZ, "%s [%s] %s %s [%s]", gameInfo.white, white_holding, _("vs."), gameInfo.black, black_holding); } if(!partnerUp) // [HGM] bughouse: when peeking at partner game we already know what he captured... DrawPosition(FALSE, boards[currentMove]); DisplayTitle(str); } else if(appData.bgObserve) { // [HGM] bughouse: holdings of other game => background sscanf(parse, "game %d white [%s black [%s <- %s", &gamenum, white_holding, black_holding, new_piece); white_holding[strlen(white_holding)-1] = NULLCHAR; black_holding[strlen(black_holding)-1] = NULLCHAR; /* [HGM] copy holdings to partner-board holdings area */ CopyHoldings(partnerBoard, white_holding, WhitePawn); CopyHoldings(partnerBoard, black_holding, BlackPawn); if(twoBoards) { partnerUp = 1; flipView = !flipView; } // [HGM] dual: always draw if(partnerUp) DrawPosition(FALSE, partnerBoard); if(twoBoards) { partnerUp = 0; flipView = !flipView; } } } /* Suppress following prompt */ if (looking_at(buf, &i, "*% ")) { if(strchr(star_match[0], 7)) SendToPlayer("\007", 1); // Bell(); // FICS fuses bell for next board with prompt in zh captures savingComment = FALSE; suppressKibitz = 0; } next_out = i; } continue; } i++; /* skip unparsed character and loop back */ } if (started != STARTED_MOVES && started != STARTED_BOARD && !suppressKibitz && // [HGM] kibitz // started != STARTED_HOLDINGS && i > next_out) { // [HGM] should we compare to leftover_start in stead of i? // SendToPlayer(&buf[next_out], i - next_out); started != STARTED_HOLDINGS && leftover_start > next_out) { SendToPlayer(&buf[next_out], leftover_start - next_out); next_out = i; } leftover_len = buf_len - leftover_start; /* if buffer ends with something we couldn't parse, reparse it after appending the next read */ } else if (count == 0) { RemoveInputSource(isr); DisplayFatalError(_("Connection closed by ICS"), 0, 0); } else { DisplayFatalError(_("Error reading from ICS"), error, 1); } } /* Board style 12 looks like this: <12> r-b---k- pp----pp ---bP--- ---p---- q------- ------P- P--Q--BP -----R-K W -1 0 0 0 0 0 0 paf MaxII 0 2 12 21 25 234 174 24 Q/d7-a4 (0:06) Qxa4 0 0 * The "<12> " is stripped before it gets to this routine. The two * trailing 0's (flip state and clock ticking) are later addition, and * some chess servers may not have them, or may have only the first. * Additional trailing fields may be added in the future. */ #define PATTERN "%c%d%d%d%d%d%d%d%s%s%d%d%d%d%d%d%d%d%s%s%s%d%d" #define RELATION_OBSERVING_PLAYED 0 #define RELATION_OBSERVING_STATIC -2 /* examined, oldmoves, or smoves */ #define RELATION_PLAYING_MYMOVE 1 #define RELATION_PLAYING_NOTMYMOVE -1 #define RELATION_EXAMINING 2 #define RELATION_ISOLATED_BOARD -3 #define RELATION_STARTING_POSITION -4 /* FICS only */ void ParseBoard12 (char *string) { #if ZIPPY int i, takeback; char *bookHit = NULL; // [HGM] book #endif GameMode newGameMode; int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0; int j, k, n, moveNum, white_stren, black_stren, white_time, black_time; int double_push, castle_ws, castle_wl, castle_bs, castle_bl, irrev_count; char to_play, board_chars[200]; char move_str[MSG_SIZ], str[MSG_SIZ], elapsed_time[MSG_SIZ]; char black[32], white[32]; Board board; int prevMove = currentMove; int ticking = 2; ChessMove moveType; int fromX, fromY, toX, toY; char promoChar; int ranks=1, files=0; /* [HGM] ICS80: allow variable board size */ Boolean weird = FALSE, reqFlag = FALSE; fromX = fromY = toX = toY = -1; newGame = FALSE; if (appData.debugMode) fprintf(debugFP, "Parsing board: %s\n", string); move_str[0] = NULLCHAR; elapsed_time[0] = NULLCHAR; { /* [HGM] figure out how many ranks and files the board has, for ICS extension used by Capablanca server */ int i = 0, j; while(i < 199 && (string[i] != ' ' || string[i+2] != ' ')) { if(string[i] == ' ') { ranks++; files = 0; } else files++; if(!strchr(" -pnbrqkPNBRQK" , string[i])) weird = TRUE; // test for fairies i++; } for(j = 0; j framePtr) { // [HGM] vari: do not run into saved variations DisplayFatalError(_("Game too long; increase MAX_MOVES and recompile"), 0, 1); return; } switch (relation) { case RELATION_OBSERVING_PLAYED: case RELATION_OBSERVING_STATIC: if (gamenum == -1) { /* Old ICC buglet */ relation = RELATION_OBSERVING_STATIC; } newGameMode = IcsObserving; break; case RELATION_PLAYING_MYMOVE: case RELATION_PLAYING_NOTMYMOVE: newGameMode = ((relation == RELATION_PLAYING_MYMOVE) == (to_play == 'W')) ? IcsPlayingWhite : IcsPlayingBlack; soughtPending =FALSE; // [HGM] seekgraph: solve race condition break; case RELATION_EXAMINING: newGameMode = IcsExamining; break; case RELATION_ISOLATED_BOARD: default: /* Just display this board. If user was doing something else, we will forget about it until the next board comes. */ newGameMode = IcsIdle; break; case RELATION_STARTING_POSITION: newGameMode = gameMode; break; } if((gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsObserving && appData.dualBoard) // also allow use of second board for observing two games && newGameMode == IcsObserving && gamenum != ics_gamenum && appData.bgObserve) { // [HGM] bughouse: don't act on alien boards while we play. Just parse the board and save it */ int fac = strchr(elapsed_time, '.') ? 1 : 1000; static int lastBgGame = -1; char *toSqr; for (k = 0; k < ranks; k++) { for (j = 0; j < files; j++) board[k][j+gameInfo.holdingsWidth] = CharToPiece(board_chars[(ranks-1-k)*(files+1) + j]); if(gameInfo.holdingsWidth > 1) { board[k][0] = board[k][BOARD_WIDTH-1] = EmptySquare; board[k][1] = board[k][BOARD_WIDTH-2] = (ChessSquare) 0;; } } CopyBoard(partnerBoard, board); if(toSqr = strchr(str, '/')) { // extract highlights from long move partnerBoard[EP_STATUS-3] = toSqr[1] - AAA; // kludge: hide highlighting info in board partnerBoard[EP_STATUS-4] = toSqr[2] - ONE; } else partnerBoard[EP_STATUS-4] = partnerBoard[EP_STATUS-3] = -1; if(toSqr = strchr(str, '-')) { partnerBoard[EP_STATUS-1] = toSqr[1] - AAA; partnerBoard[EP_STATUS-2] = toSqr[2] - ONE; } else partnerBoard[EP_STATUS-1] = partnerBoard[EP_STATUS-2] = -1; if(appData.dualBoard && !twoBoards) { twoBoards = 1; InitDrawingSizes(-2,0); } if(twoBoards) { partnerUp = 1; flipView = !flipView; } // [HGM] dual if(partnerUp) DrawPosition(FALSE, partnerBoard); if(twoBoards) { DisplayWhiteClock(white_time*fac, to_play == 'W'); DisplayBlackClock(black_time*fac, to_play != 'W'); activePartner = to_play; if(gamenum != lastBgGame) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s %s %s", white, _("vs."), black); DisplayTitle(buf); } lastBgGame = gamenum; activePartnerTime = to_play == 'W' ? white_time*fac : black_time*fac; partnerUp = 0; flipView = !flipView; } // [HGM] dual snprintf(partnerStatus, MSG_SIZ,"W: %d:%02d B: %d:%02d (%d-%d) %c", white_time*fac/60000, (white_time*fac%60000)/1000, (black_time*fac/60000), (black_time*fac%60000)/1000, white_stren, black_stren, to_play); if(!twoBoards) DisplayMessage(partnerStatus, ""); partnerBoardValid = TRUE; return; } if(appData.dualBoard && appData.bgObserve) { if((newGameMode == IcsPlayingWhite || newGameMode == IcsPlayingBlack) && moveNum == 1) SendToICS(ics_prefix), SendToICS("pobserve\n"); else if(newGameMode == IcsObserving && (gameMode == BeginningOfGame || gameMode == IcsIdle)) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%spobserve %s\n", ics_prefix, white); SendToICS(buf); } } /* Modify behavior for initial board display on move listing of wild games. */ switch (ics_getting_history) { case H_FALSE: case H_REQUESTED: break; case H_GOT_REQ_HEADER: case H_GOT_UNREQ_HEADER: /* This is the initial position of the current game */ gamenum = ics_gamenum; moveNum = 0; /* old ICS bug workaround */ if (to_play == 'B') { startedFromSetupPosition = TRUE; blackPlaysFirst = TRUE; moveNum = 1; if (forwardMostMove == 0) forwardMostMove = 1; if (backwardMostMove == 0) backwardMostMove = 1; if (currentMove == 0) currentMove = 1; } newGameMode = gameMode; relation = RELATION_STARTING_POSITION; /* ICC needs this */ break; case H_GOT_UNWANTED_HEADER: /* This is an initial board that we don't want */ return; case H_GETTING_MOVES: /* Should not happen */ DisplayError(_("Error gathering move list: extra board"), 0); ics_getting_history = H_FALSE; return; } if (gameInfo.boardHeight != ranks || gameInfo.boardWidth != files || move_str[1] == '@' && !gameInfo.holdingsWidth || weird && (int)gameInfo.variant < (int)VariantShogi) { /* [HGM] We seem to have switched variant unexpectedly * Try to guess new variant from board size */ VariantClass newVariant = VariantFairy; // if 8x8, but fairies present if(ranks == 8 && files == 10) newVariant = VariantCapablanca; else if(ranks == 10 && files == 9) newVariant = VariantXiangqi; else if(ranks == 8 && files == 12) newVariant = VariantCourier; else if(ranks == 9 && files == 9) newVariant = VariantShogi; else if(ranks == 10 && files == 10) newVariant = VariantGrand; else if(!weird) newVariant = move_str[1] == '@' ? VariantCrazyhouse : VariantNormal; VariantSwitch(boards[currentMove], newVariant); /* temp guess */ /* Get a move list just to see the header, which will tell us whether this is really bug or zh */ if (ics_getting_history == H_FALSE) { ics_getting_history = H_REQUESTED; reqFlag = TRUE; snprintf(str, MSG_SIZ, "%smoves %d\n", ics_prefix, gamenum); SendToICS(str); } } /* Take action if this is the first board of a new game, or of a different game than is currently being displayed. */ if (gamenum != ics_gamenum || newGameMode != gameMode || relation == RELATION_ISOLATED_BOARD) { /* Forget the old game and get the history (if any) of the new one */ if (gameMode != BeginningOfGame) { Reset(TRUE, TRUE); } newGame = TRUE; if (appData.autoRaiseBoard) BoardToTop(); prevMove = -3; if (gamenum == -1) { newGameMode = IcsIdle; } else if ((moveNum > 0 || newGameMode == IcsObserving) && newGameMode != IcsIdle && appData.getMoveList && !reqFlag) { /* Need to get game history */ ics_getting_history = H_REQUESTED; snprintf(str, MSG_SIZ, "%smoves %d\n", ics_prefix, gamenum); SendToICS(str); } /* Initially flip the board to have black on the bottom if playing black or if the ICS flip flag is set, but let the user change it with the Flip View button. */ flipView = appData.autoFlipView ? (newGameMode == IcsPlayingBlack) || ics_flip : appData.flipView; /* Done with values from previous mode; copy in new ones */ gameMode = newGameMode; ModeHighlight(); ics_gamenum = gamenum; if (gamenum == gs_gamenum) { int klen = strlen(gs_kind); if (gs_kind[klen - 1] == '.') gs_kind[klen - 1] = NULLCHAR; snprintf(str, MSG_SIZ, "ICS %s", gs_kind); gameInfo.event = StrSave(str); } else { gameInfo.event = StrSave("ICS game"); } gameInfo.site = StrSave(appData.icsHost); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave(white); gameInfo.black = StrSave(black); timeControl = basetime * 60 * 1000; timeControl_2 = 0; timeIncrement = increment * 1000; movesPerSession = 0; gameInfo.timeControl = TimeControlTagValue(); VariantSwitch(boards[currentMove], StringToVariant(gameInfo.event) ); if (appData.debugMode) { fprintf(debugFP, "ParseBoard says variant = '%s'\n", gameInfo.event); fprintf(debugFP, "recognized as %s\n", VariantName(gameInfo.variant)); setbuf(debugFP, NULL); } gameInfo.outOfBook = NULL; /* Do we have the ratings? */ if (strcmp(player1Name, white) == 0 && strcmp(player2Name, black) == 0) { if (appData.debugMode) fprintf(debugFP, "Remembered ratings: W %d, B %d\n", player1Rating, player2Rating); gameInfo.whiteRating = player1Rating; gameInfo.blackRating = player2Rating; } else if (strcmp(player2Name, white) == 0 && strcmp(player1Name, black) == 0) { if (appData.debugMode) fprintf(debugFP, "Remembered ratings: W %d, B %d\n", player2Rating, player1Rating); gameInfo.whiteRating = player2Rating; gameInfo.blackRating = player1Rating; } player1Name[0] = player2Name[0] = NULLCHAR; /* Silence shouts if requested */ if (appData.quietPlay && (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack)) { SendToICS(ics_prefix); SendToICS("set shout 0\n"); } } /* Deal with midgame name changes */ if (!newGame) { if (!gameInfo.white || strcmp(gameInfo.white, white) != 0) { if (gameInfo.white) free(gameInfo.white); gameInfo.white = StrSave(white); } if (!gameInfo.black || strcmp(gameInfo.black, black) != 0) { if (gameInfo.black) free(gameInfo.black); gameInfo.black = StrSave(black); } } /* Throw away game result if anything actually changes in examine mode */ if (gameMode == IcsExamining && !newGame) { gameInfo.result = GameUnfinished; if (gameInfo.resultDetails != NULL) { free(gameInfo.resultDetails); gameInfo.resultDetails = NULL; } } /* In pausing && IcsExamining mode, we ignore boards coming in if they are in a different variation than we are. */ if (pauseExamInvalid) return; if (pausing && gameMode == IcsExamining) { if (moveNum <= pauseExamForwardMostMove) { pauseExamInvalid = TRUE; forwardMostMove = pauseExamForwardMostMove; return; } } if (appData.debugMode) { fprintf(debugFP, "load %dx%d board\n", files, ranks); } /* Parse the board */ for (k = 0; k < ranks; k++) { for (j = 0; j < files; j++) board[k][j+gameInfo.holdingsWidth] = CharToPiece(board_chars[(ranks-1-k)*(files+1) + j]); if(gameInfo.holdingsWidth > 1) { board[k][0] = board[k][BOARD_WIDTH-1] = EmptySquare; board[k][1] = board[k][BOARD_WIDTH-2] = (ChessSquare) 0;; } } if(moveNum==0 && gameInfo.variant == VariantSChess) { board[5][BOARD_RGHT+1] = WhiteAngel; board[6][BOARD_RGHT+1] = WhiteMarshall; board[1][0] = BlackMarshall; board[2][0] = BlackAngel; board[1][1] = board[2][1] = board[5][BOARD_RGHT] = board[6][BOARD_RGHT] = 1; } CopyBoard(boards[moveNum], board); boards[moveNum][HOLDINGS_SET] = 0; // [HGM] indicate holdings not set if (moveNum == 0) { startedFromSetupPosition = !CompareBoards(board, initialPosition); if(startedFromSetupPosition) initialRulePlies = irrev_count; /* [HGM] 50-move counter offset */ } /* [HGM] Set castling rights. Take the outermost Rooks, to make it also work for FRC opening positions. Note that board12 is really defective for later FRC positions, as it has no way to indicate which Rook can castle if they are on the same side of King. For the initial position we grant rights to the outermost Rooks, and remember thos rights, and we then copy them on positions later in an FRC game. This means WB might not recognize castlings with Rooks that have moved back to their original position as illegal, but in ICS mode that is not its job anyway. */ if(moveNum == 0 || gameInfo.variant != VariantFischeRandom) { int i, j; ChessSquare wKing = WhiteKing, bKing = BlackKing; for(i=BOARD_LEFT, j=NoRights; i=BOARD_LEFT; i--) if(board[0][i] == WhiteRook) j = i; initialRights[1] = boards[moveNum][CASTLING][1] = (castle_wl == 0 && gameInfo.variant != VariantFischeRandom ? NoRights : j); for(i=BOARD_LEFT, j=NoRights; i=BOARD_LEFT; i--) if(board[BOARD_HEIGHT-1][i] == BlackRook) j = i; initialRights[4] = boards[moveNum][CASTLING][4] = (castle_bl == 0 && gameInfo.variant != VariantFischeRandom ? NoRights : j); boards[moveNum][CASTLING][2] = boards[moveNum][CASTLING][5] = NoRights; if(gameInfo.variant == VariantKnightmate) { wKing = WhiteUnicorn; bKing = BlackUnicorn; } for(k=BOARD_LEFT; k forwardMostMove; if (newGame) { forwardMostMove = backwardMostMove = currentMove = moveNum; if (gameMode == IcsExamining && moveNum == 0) { /* Workaround for ICS limitation: we are not told the wild type when starting to examine a game. But if we ask for the move list, the move list header will tell us */ ics_getting_history = H_REQUESTED; snprintf(str, MSG_SIZ, "%smoves %d\n", ics_prefix, gamenum); SendToICS(str); } } else if (moveNum == forwardMostMove + 1 || moveNum == forwardMostMove || (moveNum < forwardMostMove && moveNum >= backwardMostMove)) { #if ZIPPY /* [DM] If we found takebacks during icsEngineAnalyze try send to engine */ /* [HGM] applied this also to an engine that is silently watching */ if (appData.zippyPlay && moveNum < forwardMostMove && first.initDone && (gameMode == IcsObserving || gameMode == IcsExamining) && gameInfo.variant == currentlyInitializedVariant) { takeback = forwardMostMove - moveNum; for (i = 0; i < takeback; i++) { if (appData.debugMode) fprintf(debugFP, "take back move\n"); SendToProgram("undo\n", &first); } } #endif forwardMostMove = moveNum; if (!pausing || currentMove > forwardMostMove) currentMove = forwardMostMove; } else { /* New part of history that is not contiguous with old part */ if (pausing && gameMode == IcsExamining) { pauseExamInvalid = TRUE; forwardMostMove = pauseExamForwardMostMove; return; } if (gameMode == IcsExamining && moveNum > 0 && appData.getMoveList) { #if ZIPPY if(appData.zippyPlay && forwardMostMove > 0 && first.initDone) { // [HGM] when we will receive the move list we now request, it will be // fed to the engine from the first move on. So if the engine is not // in the initial position now, bring it there. InitChessProgram(&first, 0); } #endif ics_getting_history = H_REQUESTED; snprintf(str, MSG_SIZ, "%smoves %d\n", ics_prefix, gamenum); SendToICS(str); } forwardMostMove = backwardMostMove = currentMove = moveNum; } /* Update the clocks */ if (strchr(elapsed_time, '.')) { /* Time is in ms */ timeRemaining[0][moveNum] = whiteTimeRemaining = white_time; timeRemaining[1][moveNum] = blackTimeRemaining = black_time; } else { /* Time is in seconds */ timeRemaining[0][moveNum] = whiteTimeRemaining = white_time * 1000; timeRemaining[1][moveNum] = blackTimeRemaining = black_time * 1000; } #if ZIPPY if (appData.zippyPlay && newGame && gameMode != IcsObserving && gameMode != IcsIdle && gameMode != IcsExamining) ZippyFirstBoard(moveNum, basetime, increment); #endif /* Put the move on the move list, first converting to canonical algebraic form. */ if (moveNum > 0) { if (appData.debugMode) { int f = forwardMostMove; fprintf(debugFP, "parseboard %d, castling = %d %d %d %d %d %d\n", f, boards[f][CASTLING][0],boards[f][CASTLING][1],boards[f][CASTLING][2], boards[f][CASTLING][3],boards[f][CASTLING][4],boards[f][CASTLING][5]); fprintf(debugFP, "accepted move %s from ICS, parse it.\n", move_str); fprintf(debugFP, "moveNum = %d\n", moveNum); fprintf(debugFP, "board = %d-%d x %d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT); setbuf(debugFP, NULL); } if (moveNum <= backwardMostMove) { /* We don't know what the board looked like before this move. Punt. */ safeStrCpy(parseList[moveNum - 1], move_str, sizeof(parseList[moveNum - 1])/sizeof(parseList[moveNum - 1][0])); strcat(parseList[moveNum - 1], " "); strcat(parseList[moveNum - 1], elapsed_time); moveList[moveNum - 1][0] = NULLCHAR; } else if (strcmp(move_str, "none") == 0) { // [HGM] long SAN: swapped order; test for 'none' before parsing move /* Again, we don't know what the board looked like; this is really the start of the game. */ parseList[moveNum - 1][0] = NULLCHAR; moveList[moveNum - 1][0] = NULLCHAR; backwardMostMove = moveNum; startedFromSetupPosition = TRUE; fromX = fromY = toX = toY = -1; } else { // [HGM] long SAN: if legality-testing is off, disambiguation might not work or give wrong move. // So we parse the long-algebraic move string in stead of the SAN move int valid; char buf[MSG_SIZ], *prom; if(gameInfo.variant == VariantShogi && !strchr(move_str, '=') && !strchr(move_str, '@')) strcat(move_str, "="); // if ICS does not say 'promote' on non-drop, we defer. // str looks something like "Q/a1-a2"; kill the slash if(str[1] == '/') snprintf(buf, MSG_SIZ,"%c%s", str[0], str+2); else safeStrCpy(buf, str, sizeof(buf)/sizeof(buf[0])); // might be castling if((prom = strstr(move_str, "=")) && !strstr(buf, "=")) strcat(buf, prom); // long move lacks promo specification! if(!appData.testLegality && move_str[1] != '@') { // drops never ambiguous (parser chokes on long form!) if(appData.debugMode) fprintf(debugFP, "replaced ICS move '%s' by '%s'\n", move_str, buf); safeStrCpy(move_str, buf, MSG_SIZ); } valid = ParseOneMove(move_str, moveNum - 1, &moveType, &fromX, &fromY, &toX, &toY, &promoChar) || ParseOneMove(buf, moveNum - 1, &moveType, &fromX, &fromY, &toX, &toY, &promoChar); // end of long SAN patch if (valid) { (void) CoordsToAlgebraic(boards[moveNum - 1], PosFlags(moveNum - 1), fromY, fromX, toY, toX, promoChar, parseList[moveNum-1]); switch (MateTest(boards[moveNum], PosFlags(moveNum)) ) { case MT_NONE: case MT_STALEMATE: default: break; case MT_CHECK: if(gameInfo.variant != VariantShogi) strcat(parseList[moveNum - 1], "+"); break; case MT_CHECKMATE: case MT_STAINMATE: // [HGM] xq: for notation stalemate that wins counts as checkmate strcat(parseList[moveNum - 1], "#"); break; } strcat(parseList[moveNum - 1], " "); strcat(parseList[moveNum - 1], elapsed_time); /* currentMoveString is set as a side-effect of ParseOneMove */ if(gameInfo.variant == VariantShogi && currentMoveString[4]) currentMoveString[4] = '^'; safeStrCpy(moveList[moveNum - 1], currentMoveString, sizeof(moveList[moveNum - 1])/sizeof(moveList[moveNum - 1][0])); strcat(moveList[moveNum - 1], "\n"); if(gameInfo.holdingsWidth && !appData.disguise && gameInfo.variant != VariantSuper && gameInfo.variant != VariantGreat && gameInfo.variant != VariantGrand&& gameInfo.variant != VariantSChess) // inherit info that ICS does not give from previous board for(k=0; k= BlackPawn && old < BlackCannon) boards[moveNum][k][j] = PROMOTED old; // choose correct type of Gold in promotion else boards[moveNum][k][j] = old; // preserve type of Gold } else if((old == WhitePawn || old == BlackPawn) && new != EmptySquare) // Pawn promotions (but not e.p.capture!) boards[moveNum][k][j] = PROMOTED new; // use non-primordial representation of chosen piece } } else { /* Move from ICS was illegal!? Punt. */ if (appData.debugMode) { fprintf(debugFP, "Illegal move from ICS '%s'\n", move_str); fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth); } safeStrCpy(parseList[moveNum - 1], move_str, sizeof(parseList[moveNum - 1])/sizeof(parseList[moveNum - 1][0])); strcat(parseList[moveNum - 1], " "); strcat(parseList[moveNum - 1], elapsed_time); moveList[moveNum - 1][0] = NULLCHAR; fromX = fromY = toX = toY = -1; } } if (appData.debugMode) { fprintf(debugFP, "Move parsed to '%s'\n", parseList[moveNum - 1]); setbuf(debugFP, NULL); } #if ZIPPY /* Send move to chess program (BEFORE animating it). */ if (appData.zippyPlay && !newGame && newMove && (!appData.getMoveList || backwardMostMove == 0) && first.initDone) { if ((gameMode == IcsPlayingWhite && WhiteOnMove(moveNum)) || (gameMode == IcsPlayingBlack && !WhiteOnMove(moveNum))) { if (moveList[moveNum - 1][0] == NULLCHAR) { snprintf(str, MSG_SIZ, _("Couldn't parse move \"%s\" from ICS"), move_str); DisplayError(str, 0); } else { if (first.sendTime) { SendTimeRemaining(&first, gameMode == IcsPlayingWhite); } bookHit = SendMoveToBookUser(moveNum - 1, &first, FALSE); // [HGM] book if (firstMove && !bookHit) { firstMove = FALSE; if (first.useColors) { SendToProgram(gameMode == IcsPlayingWhite ? "white\ngo\n" : "black\ngo\n", &first); } else { SendToProgram("go\n", &first); } first.maybeThinking = TRUE; } } } else if (gameMode == IcsObserving || gameMode == IcsExamining) { if (moveList[moveNum - 1][0] == NULLCHAR) { snprintf(str, MSG_SIZ, _("Couldn't parse move \"%s\" from ICS"), move_str); DisplayError(str, 0); } else { if(gameInfo.variant == currentlyInitializedVariant) // [HGM] refrain sending moves engine can't understand! SendMoveToProgram(moveNum - 1, &first); } } } #endif } if (moveNum > 0 && !gotPremove && !appData.noGUI) { /* If move comes from a remote source, animate it. If it isn't remote, it will have already been animated. */ if (!pausing && !ics_user_moved && prevMove == moveNum - 1) { AnimateMove(boards[moveNum - 1], fromX, fromY, toX, toY); } if (!pausing && appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } } /* Start the clocks */ whiteFlag = blackFlag = FALSE; appData.clockMode = !(basetime == 0 && increment == 0); if (ticking == 0) { ics_clock_paused = TRUE; StopClocks(); } else if (ticking == 1) { ics_clock_paused = FALSE; } if (gameMode == IcsIdle || relation == RELATION_OBSERVING_STATIC || relation == RELATION_EXAMINING || ics_clock_paused) DisplayBothClocks(); else StartClocks(); /* Display opponents and material strengths */ if (gameInfo.variant != VariantBughouse && gameInfo.variant != VariantCrazyhouse && !appData.noGUI) { if (tinyLayout || smallLayout) { if(gameInfo.variant == VariantNormal) snprintf(str, MSG_SIZ, "%s(%d) %s(%d) {%d %d}", gameInfo.white, white_stren, gameInfo.black, black_stren, basetime, increment); else snprintf(str, MSG_SIZ, "%s(%d) %s(%d) {%d %d w%d}", gameInfo.white, white_stren, gameInfo.black, black_stren, basetime, increment, (int) gameInfo.variant); } else { if(gameInfo.variant == VariantNormal) snprintf(str, MSG_SIZ, "%s (%d) %s %s (%d) {%d %d}", gameInfo.white, white_stren, _("vs."), gameInfo.black, black_stren, basetime, increment); else snprintf(str, MSG_SIZ, "%s (%d) %s %s (%d) {%d %d %s}", gameInfo.white, white_stren, _("vs."), gameInfo.black, black_stren, basetime, increment, VariantName(gameInfo.variant)); } DisplayTitle(str); if (appData.debugMode) { fprintf(debugFP, "Display title '%s, gameInfo.variant = %d'\n", str, gameInfo.variant); } } /* Display the board */ if (!pausing && !appData.noGUI) { if (appData.premove) if (!gotPremove || ((gameMode == IcsPlayingWhite) && (WhiteOnMove(currentMove))) || ((gameMode == IcsPlayingBlack) && (!WhiteOnMove(currentMove)))) ClearPremoveHighlights(); j = seekGraphUp; seekGraphUp = FALSE; // [HGM] seekgraph: when we draw a board, it overwrites the seek graph if(partnerUp) { flipView = originalFlip; partnerUp = FALSE; j = TRUE; } // [HGM] bughouse: restore view DrawPosition(j, boards[currentMove]); DisplayMove(moveNum - 1); if (appData.ringBellAfterMoves && /*!ics_user_moved*/ // [HGM] use absolute method to recognize own move !((gameMode == IcsPlayingWhite) && (!WhiteOnMove(moveNum)) || (gameMode == IcsPlayingBlack) && (WhiteOnMove(moveNum)) ) ) { if(newMove) RingBell(); else PlayIcsUnfinishedSound(); } } HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); #if ZIPPY if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } #endif } void GetMoveListEvent () { char buf[MSG_SIZ]; if (appData.icsActive && gameMode != IcsIdle && ics_gamenum > 0) { ics_getting_history = H_REQUESTED; snprintf(buf, MSG_SIZ, "%smoves %d\n", ics_prefix, ics_gamenum); SendToICS(buf); } } void SendToBoth (char *msg) { // to make it easy to keep two engines in step in dual analysis SendToProgram(msg, &first); if(second.analyzing) SendToProgram(msg, &second); } void AnalysisPeriodicEvent (int force) { if (((programStats.ok_to_send == 0 || programStats.line_is_book) && !force) || !appData.periodicUpdates) return; /* Send . command to Crafty to collect stats */ SendToBoth(".\n"); /* Don't send another until we get a response (this makes us stop sending to old Crafty's which don't understand the "." command (sending illegal cmds resets node count & time, which looks bad)) */ programStats.ok_to_send = 0; } void ics_update_width (int new_width) { ics_printf("set width %d\n", new_width); } void SendMoveToProgram (int moveNum, ChessProgramState *cps) { char buf[MSG_SIZ]; if(moveList[moveNum][1] == '@' && moveList[moveNum][0] == '@') { // null move in variant where engine does not understand it (for analysis purposes) SendBoard(cps, moveNum + 1); // send position after move in stead. return; } if (cps->useUsermove) { SendToProgram("usermove ", cps); } if (cps->useSAN) { char *space; if ((space = strchr(parseList[moveNum], ' ')) != NULL) { int len = space - parseList[moveNum]; memcpy(buf, parseList[moveNum], len); buf[len++] = '\n'; buf[len] = NULLCHAR; } else { snprintf(buf, MSG_SIZ,"%s\n", parseList[moveNum]); } SendToProgram(buf, cps); } else { if(cps->alphaRank) { /* [HGM] shogi: temporarily convert to shogi coordinates before sending */ AlphaRank(moveList[moveNum], 4); SendToProgram(moveList[moveNum], cps); AlphaRank(moveList[moveNum], 4); // and back } else /* Added by Tord: Send castle moves in "O-O" in FRC games if required by * the engine. It would be nice to have a better way to identify castle * moves here. */ if((gameInfo.variant == VariantFischeRandom || gameInfo.variant == VariantCapaRandom) && cps->useOOCastle) { int fromX = moveList[moveNum][0] - AAA; int fromY = moveList[moveNum][1] - ONE; int toX = moveList[moveNum][2] - AAA; int toY = moveList[moveNum][3] - ONE; if((boards[moveNum][fromY][fromX] == WhiteKing && boards[moveNum][toY][toX] == WhiteRook) || (boards[moveNum][fromY][fromX] == BlackKing && boards[moveNum][toY][toX] == BlackRook)) { if(toX > fromX) SendToProgram("O-O\n", cps); else SendToProgram("O-O-O\n", cps); } else SendToProgram(moveList[moveNum], cps); } else if(BOARD_HEIGHT > 10) { // [HGM] big: convert ranks to double-digit where needed if(moveList[moveNum][1] == '@' && (BOARD_HEIGHT < 16 || moveList[moveNum][0] <= 'Z')) { // drop move if(moveList[moveNum][0]== '@') snprintf(buf, MSG_SIZ, "@@@@\n"); else snprintf(buf, MSG_SIZ, "%c@%c%d%s", moveList[moveNum][0], moveList[moveNum][2], moveList[moveNum][3] - '0', moveList[moveNum]+4); } else snprintf(buf, MSG_SIZ, "%c%d%c%d%s", moveList[moveNum][0], moveList[moveNum][1] - '0', moveList[moveNum][2], moveList[moveNum][3] - '0', moveList[moveNum]+4); SendToProgram(buf, cps); } else SendToProgram(moveList[moveNum], cps); /* End of additions by Tord */ } /* [HGM] setting up the opening has brought engine in force mode! */ /* Send 'go' if we are in a mode where machine should play. */ if( (moveNum == 0 && setboardSpoiledMachineBlack && cps == &first) && (gameMode == TwoMachinesPlay || #if ZIPPY gameMode == IcsPlayingBlack || gameMode == IcsPlayingWhite || #endif gameMode == MachinePlaysBlack || gameMode == MachinePlaysWhite) ) { SendToProgram("go\n", cps); if (appData.debugMode) { fprintf(debugFP, "(extra)\n"); } } setboardSpoiledMachineBlack = 0; } void SendMoveToICS (ChessMove moveType, int fromX, int fromY, int toX, int toY, char promoChar) { char user_move[MSG_SIZ]; char suffix[4]; if(gameInfo.variant == VariantSChess && promoChar) { snprintf(suffix, 4, "=%c", toX == BOARD_WIDTH<<1 ? ToUpper(promoChar) : ToLower(promoChar)); if(moveType == NormalMove) moveType = WhitePromotion; // kludge to do gating } else suffix[0] = NULLCHAR; switch (moveType) { default: snprintf(user_move, MSG_SIZ, _("say Internal error; bad moveType %d (%d,%d-%d,%d)"), (int)moveType, fromX, fromY, toX, toY); DisplayError(user_move + strlen("say "), 0); break; case WhiteKingSideCastle: case BlackKingSideCastle: case WhiteQueenSideCastleWild: case BlackQueenSideCastleWild: /* PUSH Fabien */ case WhiteHSideCastleFR: case BlackHSideCastleFR: /* POP Fabien */ snprintf(user_move, MSG_SIZ, "o-o%s\n", suffix); break; case WhiteQueenSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case BlackKingSideCastleWild: /* PUSH Fabien */ case WhiteASideCastleFR: case BlackASideCastleFR: /* POP Fabien */ snprintf(user_move, MSG_SIZ, "o-o-o%s\n",suffix); break; case WhiteNonPromotion: case BlackNonPromotion: sprintf(user_move, "%c%c%c%c==\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY); break; case WhitePromotion: case BlackPromotion: if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) snprintf(user_move, MSG_SIZ, "%c%c%c%c=%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY, PieceToChar(WhiteFerz)); else if(gameInfo.variant == VariantGreat) snprintf(user_move, MSG_SIZ,"%c%c%c%c=%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY, PieceToChar(WhiteMan)); else snprintf(user_move, MSG_SIZ, "%c%c%c%c=%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY, promoChar); break; case WhiteDrop: case BlackDrop: drop: snprintf(user_move, MSG_SIZ, "%c@%c%c\n", ToUpper(PieceToChar((ChessSquare) fromX)), AAA + toX, ONE + toY); break; case IllegalMove: /* could be a variant we don't quite understand */ if(fromY == DROP_RANK) goto drop; // We need 'IllegalDrop' move type? case NormalMove: case WhiteCapturesEnPassant: case BlackCapturesEnPassant: snprintf(user_move, MSG_SIZ,"%c%c%c%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY); break; } SendToICS(user_move); if(appData.keepAlive) // [HGM] alive: schedule sending of dummy 'date' command ScheduleDelayedEvent(KeepAlive, appData.keepAlive*60*1000); } void UploadGameEvent () { // [HGM] upload: send entire stored game to ICS as long-algebraic moves. int i, last = forwardMostMove; // make sure ICS reply cannot pre-empt us by clearing fmm static char *castlingStrings[4] = { "none", "kside", "qside", "both" }; if(gameMode == IcsObserving || gameMode == IcsPlayingBlack || gameMode == IcsPlayingWhite) { DisplayError(_("You cannot do this while you are playing or observing"), 0); return; } if(gameMode != IcsExamining) { // is this ever not the case? char buf[MSG_SIZ], *p, *fen, command[MSG_SIZ], bsetup = 0; if(ics_type == ICS_ICC) { // on ICC match ourselves in applicable variant snprintf(command,MSG_SIZ, "match %s", ics_handle); } else { // on FICS we must first go to general examine mode safeStrCpy(command, "examine\nbsetup", sizeof(command)/sizeof(command[0])); // and specify variant within it with bsetups } if(gameInfo.variant != VariantNormal) { // try figure out wild number, as xboard names are not always valid on ICS for(i=1; i<=36; i++) { snprintf(buf, MSG_SIZ, "wild/%d", i); if(StringToVariant(buf) == gameInfo.variant) break; } if(i<=36 && ics_type == ICS_ICC) snprintf(buf, MSG_SIZ,"%s w%d\n", command, i); else if(i == 22) snprintf(buf,MSG_SIZ, "%s fr\n", command); else snprintf(buf, MSG_SIZ,"%s %s\n", command, VariantName(gameInfo.variant)); } else snprintf(buf, MSG_SIZ,"%s\n", ics_type == ICS_ICC ? command : "examine\n"); // match yourself or examine SendToICS(ics_prefix); SendToICS(buf); if(startedFromSetupPosition || backwardMostMove != 0) { fen = PositionToFEN(backwardMostMove, NULL); if(ics_type == ICS_ICC) { // on ICC we can simply send a complete FEN to set everything snprintf(buf, MSG_SIZ,"loadfen %s\n", fen); SendToICS(buf); } else { // FICS: everything has to set by separate bsetup commands p = strchr(fen, ' '); p[0] = NULLCHAR; // cut after board snprintf(buf, MSG_SIZ,"bsetup fen %s\n", fen); SendToICS(buf); if(!WhiteOnMove(backwardMostMove)) { SendToICS("bsetup tomove black\n"); } i = (strchr(p+3, 'K') != NULL) + 2*(strchr(p+3, 'Q') != NULL); snprintf(buf, MSG_SIZ,"bsetup wcastle %s\n", castlingStrings[i]); SendToICS(buf); i = (strchr(p+3, 'k') != NULL) + 2*(strchr(p+3, 'q') != NULL); snprintf(buf, MSG_SIZ, "bsetup bcastle %s\n", castlingStrings[i]); SendToICS(buf); i = boards[backwardMostMove][EP_STATUS]; if(i >= 0) { // set e.p. snprintf(buf, MSG_SIZ,"bsetup eppos %c\n", i+AAA); SendToICS(buf); } bsetup++; } } if(bsetup || ics_type != ICS_ICC && gameInfo.variant != VariantNormal) SendToICS("bsetup done\n"); // switch to normal examining. } for(i = backwardMostMove; i= BlackPawn) king = WHITE_TO_BLACK king, pawn = WHITE_TO_BLACK pawn; if(gameInfo.variant == VariantSpartan && pawn == BlackPawn) pawn = BlackLance, king = EmptySquare; if(fromY != BOARD_HEIGHT-2 && fromY != 1) pawn = EmptySquare; do { promoSweep -= step; if(promoSweep == EmptySquare) promoSweep = BlackPawn; // wrap else if((int)promoSweep == -1) promoSweep = WhiteKing; else if(promoSweep == BlackPawn && step < 0) promoSweep = WhitePawn; else if(promoSweep == WhiteKing && step > 0) promoSweep = BlackKing; if(!step) step = -1; } while(PieceToChar(promoSweep) == '.' || PieceToChar(promoSweep) == '~' || promoSweep == pawn || appData.testLegality && (promoSweep == king || gameInfo.variant == VariantShogi && promoSweep != PROMOTED last && last != PROMOTED promoSweep && last != promoSweep)); if(toX >= 0) { int victim = boards[currentMove][toY][toX]; boards[currentMove][toY][toX] = promoSweep; DrawPosition(FALSE, boards[currentMove]); boards[currentMove][toY][toX] = victim; } else ChangeDragPiece(promoSweep); } int PromoScroll (int x, int y) { int step = 0; if(promoSweep == EmptySquare || !appData.sweepSelect) return FALSE; if(abs(x - lastX) < 25 && abs(y - lastY) < 25) return FALSE; if( y > lastY + 2 ) step = -1; else if(y < lastY - 2) step = 1; if(!step) return FALSE; lastX = x; lastY = y; if((promoSweep < BlackPawn) == flipView) step = -step; if(step > 0) selectFlag = 1; if(!selectFlag) Sweep(step); return FALSE; } void NextPiece (int step) { ChessSquare piece = boards[currentMove][toY][toX]; do { pieceSweep -= step; if(pieceSweep == EmptySquare) pieceSweep = WhitePawn; // wrap if((int)pieceSweep == -1) pieceSweep = BlackKing; if(!step) step = -1; } while(PieceToChar(pieceSweep) == '.'); boards[currentMove][toY][toX] = pieceSweep; DrawPosition(FALSE, boards[currentMove]); boards[currentMove][toY][toX] = piece; } /* [HGM] Shogi move preprocessor: swap digits for letters, vice versa */ void AlphaRank (char *move, int n) { // char *p = move, c; int x, y; if (appData.debugMode) { fprintf(debugFP, "alphaRank(%s,%d)\n", move, n); } if(move[1]=='*' && move[2]>='0' && move[2]<='9' && move[3]>='a' && move[3]<='x' ) { move[1] = '@'; move[2] = BOARD_RGHT -1 - (move[2]-'1') + AAA; move[3] = BOARD_HEIGHT-1 - (move[3]-'a') + ONE; } else if(move[0]>='0' && move[0]<='9' && move[1]>='a' && move[1]<='x' && move[2]>='0' && move[2]<='9' && move[3]>='a' && move[3]<='x' ) { /* input move, Shogi -> normal */ move[0] = BOARD_RGHT -1 - (move[0]-'1') + AAA; move[1] = BOARD_HEIGHT-1 - (move[1]-'a') + ONE; move[2] = BOARD_RGHT -1 - (move[2]-'1') + AAA; move[3] = BOARD_HEIGHT-1 - (move[3]-'a') + ONE; } else if(move[1]=='@' && move[3]>='0' && move[3]<='9' && move[2]>='a' && move[2]<='x' ) { move[1] = '*'; move[2] = BOARD_RGHT - 1 - (move[2]-AAA) + '1'; move[3] = BOARD_HEIGHT-1 - (move[3]-ONE) + 'a'; } else if( move[0]>='a' && move[0]<='x' && move[3]>='0' && move[3]<='9' && move[2]>='a' && move[2]<='x' ) { /* output move, normal -> Shogi */ move[0] = BOARD_RGHT - 1 - (move[0]-AAA) + '1'; move[1] = BOARD_HEIGHT-1 - (move[1]-ONE) + 'a'; move[2] = BOARD_RGHT - 1 - (move[2]-AAA) + '1'; move[3] = BOARD_HEIGHT-1 - (move[3]-ONE) + 'a'; if(move[4] == PieceToChar(BlackQueen)) move[4] = '+'; } if (appData.debugMode) { fprintf(debugFP, " out = '%s'\n", move); } } char yy_textstr[8000]; /* Parser for moves from gnuchess, ICS, or user typein box */ Boolean ParseOneMove (char *move, int moveNum, ChessMove *moveType, int *fromX, int *fromY, int *toX, int *toY, char *promoChar) { *moveType = yylexstr(moveNum, move, yy_textstr, sizeof yy_textstr); switch (*moveType) { case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case NormalMove: case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: /* Code added by Tord: */ case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: /* End of code added by Tord */ case IllegalMove: /* bug or odd chess variant */ *fromX = currentMoveString[0] - AAA; *fromY = currentMoveString[1] - ONE; *toX = currentMoveString[2] - AAA; *toY = currentMoveString[3] - ONE; *promoChar = currentMoveString[4]; if (*fromX < BOARD_LEFT || *fromX >= BOARD_RGHT || *fromY < 0 || *fromY >= BOARD_HEIGHT || *toX < BOARD_LEFT || *toX >= BOARD_RGHT || *toY < 0 || *toY >= BOARD_HEIGHT) { if (appData.debugMode) { fprintf(debugFP, "Off-board move (%d,%d)-(%d,%d)%c, type = %d\n", *fromX, *fromY, *toX, *toY, *promoChar, *moveType); } *fromX = *fromY = *toX = *toY = 0; return FALSE; } if (appData.testLegality) { return (*moveType != IllegalMove); } else { return !(*fromX == *toX && *fromY == *toY) && boards[moveNum][*fromY][*fromX] != EmptySquare && WhiteOnMove(moveNum) == (boards[moveNum][*fromY][*fromX] < BlackPawn); } case WhiteDrop: case BlackDrop: *fromX = *moveType == WhiteDrop ? (int) CharToPiece(ToUpper(currentMoveString[0])) : (int) CharToPiece(ToLower(currentMoveString[0])); *fromY = DROP_RANK; *toX = currentMoveString[2] - AAA; *toY = currentMoveString[3] - ONE; *promoChar = NULLCHAR; return TRUE; case AmbiguousMove: case ImpossibleMove: case EndOfFile: case ElapsedTime: case Comment: case PGNTag: case NAG: case WhiteWins: case BlackWins: case GameIsDrawn: default: if (appData.debugMode) { fprintf(debugFP, "Impossible move %s, type = %d\n", currentMoveString, *moveType); } /* bug? */ *fromX = *fromY = *toX = *toY = 0; *promoChar = NULLCHAR; return FALSE; } } Boolean pushed = FALSE; char *lastParseAttempt; void ParsePV (char *pv, Boolean storeComments, Boolean atEnd) { // Parse a string of PV moves, and append to current game, behind forwardMostMove int fromX, fromY, toX, toY; char promoChar; ChessMove moveType; Boolean valid; int nr = 0; lastParseAttempt = pv; if(!*pv) return; // turns out we crash when we parse an empty PV if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile) && currentMove < forwardMostMove) { PushInner(currentMove, forwardMostMove); // [HGM] engine might not be thinking on forwardMost position! pushed = TRUE; } endPV = forwardMostMove; do { while(*pv == ' ' || *pv == '\n' || *pv == '\t') pv++; // must still read away whitespace if(nr == 0 && !storeComments && *pv == '(') pv++; // first (ponder) move can be in parentheses lastParseAttempt = pv; valid = ParseOneMove(pv, endPV, &moveType, &fromX, &fromY, &toX, &toY, &promoChar); if(!valid && nr == 0 && ParseOneMove(pv, endPV-1, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)){ nr++; moveType = Comment; // First move has been played; kludge to make sure we continue // Hande case where played move is different from leading PV move CopyBoard(boards[endPV+1], boards[endPV-1]); // tentatively unplay last game move CopyBoard(boards[endPV+2], boards[endPV-1]); // and play first move of PV ApplyMove(fromX, fromY, toX, toY, promoChar, boards[endPV+2]); if(!CompareBoards(boards[endPV], boards[endPV+2])) { endPV += 2; // if position different, keep this moveList[endPV-1][0] = fromX + AAA; moveList[endPV-1][1] = fromY + ONE; moveList[endPV-1][2] = toX + AAA; moveList[endPV-1][3] = toY + ONE; parseList[endPV-1][0] = NULLCHAR; safeStrCpy(moveList[endPV-2], "_0_0", sizeof(moveList[endPV-2])/sizeof(moveList[endPV-2][0])); // suppress premove highlight on takeback move } } pv = strstr(pv, yy_textstr) + strlen(yy_textstr); // skip what we parsed if(nr == 0 && !storeComments && *pv == ')') pv++; // closing parenthesis of ponder move; if(moveType == Comment && storeComments) AppendComment(endPV, yy_textstr, FALSE); if(moveType == Comment || moveType == NAG || moveType == ElapsedTime) { valid++; // allow comments in PV continue; } nr++; if(endPV+1 > framePtr) break; // no space, truncate if(!valid) break; endPV++; CopyBoard(boards[endPV], boards[endPV-1]); ApplyMove(fromX, fromY, toX, toY, promoChar, boards[endPV]); CoordsToComputerAlgebraic(fromY, fromX, toY, toX, promoChar, moveList[endPV - 1]); strncat(moveList[endPV-1], "\n", MOVE_LEN); CoordsToAlgebraic(boards[endPV - 1], PosFlags(endPV - 1), fromY, fromX, toY, toX, promoChar, parseList[endPV - 1]); } while(valid); if(atEnd == 2) return; // used hidden, for PV conversion currentMove = (atEnd || endPV == forwardMostMove) ? endPV : forwardMostMove + 1; if(currentMove == forwardMostMove) ClearPremoveHighlights(); else SetPremoveHighlights(moveList[currentMove-1][0]-AAA, moveList[currentMove-1][1]-ONE, moveList[currentMove-1][2]-AAA, moveList[currentMove-1][3]-ONE); DrawPosition(TRUE, boards[currentMove]); } int MultiPV (ChessProgramState *cps) { // check if engine supports MultiPV, and if so, return the number of the option that sets it int i; for(i=0; inrOptions; i++) if(!strcmp(cps->option[i].name, "MultiPV") && cps->option[i].type == Spin) return i; return -1; } Boolean extendGame; // signals to UnLoadPV() if walked part of PV has to be appended to game Boolean LoadMultiPV (int x, int y, char *buf, int index, int *start, int *end, int pane) { int startPV, multi, lineStart, origIndex = index; char *p, buf2[MSG_SIZ]; ChessProgramState *cps = (pane ? &second : &first); if(index < 0 || index >= strlen(buf)) return FALSE; // sanity lastX = x; lastY = y; while(index > 0 && buf[index-1] != '\n') index--; // beginning of line lineStart = startPV = index; while(buf[index] != '\n') if(buf[index++] == '\t') startPV = index; if(index == startPV && (p = StrCaseStr(buf+index, "PV="))) startPV = p - buf + 3; index = startPV; do{ while(buf[index] && buf[index] != '\n') index++; } while(buf[index] == '\n' && buf[index+1] == '\\' && buf[index+2] == ' ' && index++); // join kibitzed PV continuation line buf[index] = 0; if(lineStart == 0 && gameMode == AnalyzeMode && (multi = MultiPV(cps)) >= 0) { int n = cps->option[multi].value; if(origIndex > 17 && origIndex < 24) { if(n>1) n--; } else if(origIndex > index - 6) n++; snprintf(buf2, MSG_SIZ, "option MultiPV=%d\n", n); if(cps->option[multi].value != n) SendToProgram(buf2, cps); cps->option[multi].value = n; *start = *end = 0; return FALSE; } else if(strstr(buf+lineStart, "exclude:") == buf+lineStart) { // exclude moves clicked ExcludeClick(origIndex - lineStart); return FALSE; } ParsePV(buf+startPV, FALSE, gameMode != AnalyzeMode); *start = startPV; *end = index-1; extendGame = (gameMode == AnalyzeMode && appData.autoExtend); return TRUE; } char * PvToSAN (char *pv) { static char buf[10*MSG_SIZ]; int i, k=0, savedEnd=endPV, saveFMM = forwardMostMove; *buf = NULLCHAR; if(forwardMostMove < endPV) PushInner(forwardMostMove, endPV); // shelve PV of PV-walk ParsePV(pv, FALSE, 2); // this appends PV to game, suppressing any display of it for(i = forwardMostMove; i forwardMostMove) { Boolean saveAnimate = appData.animate; if(pushed) { if(shiftKey && storedGames < MAX_VARIATIONS-2) { // wants to start variation, and there is space if(storedGames == 1) GreyRevert(FALSE); // we already pushed the tail, so just make it official } else storedGames--; // abandon shelved tail of original game } pushed = FALSE; forwardMostMove = currentMove; currentMove = oldFMM; appData.animate = FALSE; ToNrEvent(forwardMostMove); appData.animate = saveAnimate; } currentMove = forwardMostMove; if(pushed) { PopInner(0); pushed = FALSE; } // restore shelved game continuation ClearPremoveHighlights(); DrawPosition(TRUE, boards[currentMove]); } void MovePV (int x, int y, int h) { // step through PV based on mouse coordinates (called on mouse move) int margin = h>>3, step = 0, threshold = (pieceSweep == EmptySquare ? 10 : 15); // we must somehow check if right button is still down (might be released off board!) if(endPV < 0 && pieceSweep == EmptySquare) return; // needed in XBoard because lastX/Y is shared :-( if(abs(x - lastX) < threshold && abs(y - lastY) < threshold) return; if( y > lastY + 2 ) step = -1; else if(y < lastY - 2) step = 1; if(!step) return; lastX = x; lastY = y; if(pieceSweep != EmptySquare) { NextPiece(step); return; } if(endPV < 0) return; if(y < margin) step = 1; else if(y > h - margin) step = -1; if(currentMove + step > endPV || currentMove + step < forwardMostMove) step = 0; currentMove += step; if(currentMove == forwardMostMove) ClearPremoveHighlights(); else SetPremoveHighlights(moveList[currentMove-1][0]-AAA, moveList[currentMove-1][1]-ONE, moveList[currentMove-1][2]-AAA, moveList[currentMove-1][3]-ONE); DrawPosition(FALSE, boards[currentMove]); } // [HGM] shuffle: a general way to suffle opening setups, applicable to arbitrary variants. // All positions will have equal probability, but the current method will not provide a unique // numbering scheme for arrays that contain 3 or more pieces of the same kind. #define DARK 1 #define LITE 2 #define ANY 3 int squaresLeft[4]; int piecesLeft[(int)BlackPawn]; int seed, nrOfShuffles; void GetPositionNumber () { // sets global variable seed int i; seed = appData.defaultFrcPosition; if(seed < 0) { // randomize based on time for negative FRC position numbers for(i=0; i<50; i++) seed += random(); seed = random() ^ random() >> 8 ^ random() << 8; if(seed<0) seed = -seed; } } int put (Board board, int pieceType, int rank, int n, int shade) // put the piece on the (n-1)-th empty squares of the given shade { int i; for(i=BOARD_LEFT; i= j) i -= j--; j = n - 1 - j; i += j; put(board, pieceType, rank, j, ANY); put(board, pieceType, rank, i, ANY); } void SetUpShuffle (Board board, int number) { int i, p, first=1; GetPositionNumber(); nrOfShuffles = 1; squaresLeft[DARK] = (BOARD_RGHT - BOARD_LEFT + 1)/2; squaresLeft[ANY] = BOARD_RGHT - BOARD_LEFT; squaresLeft[LITE] = squaresLeft[ANY] - squaresLeft[DARK]; for(p = 0; p<=(int)WhiteKing; p++) piecesLeft[p] = 0; for(i=BOARD_LEFT; i (int) WhitePawn; p--) { if(p != (int) WhiteBishop && p != (int) WhiteFerz && p != (int) WhiteAlfil) continue; while(piecesLeft[p] >= 2) { AddOnePiece(board, p, 0, LITE); AddOnePiece(board, p, 0, DARK); } // Odd color-bound pieces are shuffled with the rest (to not run out of paired squares) } for(p = (int) WhiteKing - 2; p > (int) WhitePawn; p--) { // Remaining pieces (non-colorbound, or odd color bound) can be put anywhere // but we leave King and Rooks for last, to possibly obey FRC restriction if(p == (int)WhiteRook) continue; while(piecesLeft[p] >= 2) AddTwoPieces(board, p, 0); // add in pairs, for not counting permutations if(piecesLeft[p]) AddOnePiece(board, p, 0, ANY); // add the odd piece } // now everything is placed, except perhaps King (Unicorn) and Rooks if(PosFlags(0) & F_FRC_TYPE_CASTLING) { // Last King gets castling rights while(piecesLeft[(int)WhiteUnicorn]) { i = put(board, WhiteUnicorn, 0, piecesLeft[(int)WhiteRook]/2, ANY); initialRights[2] = initialRights[5] = board[CASTLING][2] = board[CASTLING][5] = i; } while(piecesLeft[(int)WhiteKing]) { i = put(board, WhiteKing, 0, piecesLeft[(int)WhiteRook]/2, ANY); initialRights[2] = initialRights[5] = board[CASTLING][2] = board[CASTLING][5] = i; } } else { while(piecesLeft[(int)WhiteKing]) AddOnePiece(board, WhiteKing, 0, ANY); while(piecesLeft[(int)WhiteUnicorn]) AddOnePiece(board, WhiteUnicorn, 0, ANY); } // Only Rooks can be left; simply place them all while(piecesLeft[(int)WhiteRook]) { i = put(board, WhiteRook, 0, 0, ANY); if(PosFlags(0) & F_FRC_TYPE_CASTLING) { // first and last Rook get FRC castling rights if(first) { first=0; initialRights[1] = initialRights[4] = board[CASTLING][1] = board[CASTLING][4] = i; } initialRights[0] = initialRights[3] = board[CASTLING][0] = board[CASTLING][3] = i; } } for(i=BOARD_LEFT; i= 0) appData.defaultFrcPosition %= nrOfShuffles; // normalize } int SetCharTable (char *table, const char * map) /* [HGM] moved here from winboard.c because of its general usefulness */ /* Basically a safe strcpy that uses the last character as King */ { int result = FALSE; int NrPieces; if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare && NrPieces >= 12 && !(NrPieces&1)) { int i; /* [HGM] Accept even length from 12 to 34 */ for( i=0; i<(int) EmptySquare; i++ ) table[i] = '.'; for( i=0; i= j); seed /= 3; p = board[0][BOARD_LEFT+j]; board[0][BOARD_LEFT+j] = EmptySquare; k = PieceToNumber(p); board[k][BOARD_WIDTH-1] = p; board[k][BOARD_WIDTH-2]++; board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p; board[BOARD_HEIGHT-1-k][1]++; j = seed%3; seed /= 3; p = board[0][BOARD_LEFT+j+5]; board[0][BOARD_LEFT+j+5] = EmptySquare; k = PieceToNumber(p); board[k][BOARD_WIDTH-1] = p; board[k][BOARD_WIDTH-2]++; board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p; board[BOARD_HEIGHT-1-k][1]++; j = seed%2 + (seed%2 >= j); seed /= 2; p = board[0][BOARD_LEFT+j+5]; board[0][BOARD_LEFT+j+5] = EmptySquare; k = PieceToNumber(p); board[k][BOARD_WIDTH-1] = p; board[k][BOARD_WIDTH-2]++; board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p; board[BOARD_HEIGHT-1-k][1]++; j = seed%4; seed /= 4; put(board, exoPieces[3], 0, j, ANY); j = seed%3; seed /= 3; put(board, exoPieces[2], 0, j, ANY); j = seed%2; seed /= 2; put(board, exoPieces[1], 0, j, ANY); put(board, exoPieces[0], 0, 0, ANY); for(i=BOARD_LEFT; i>1; initialPosition[CASTLING][3] = initialRights[3] = BOARD_RGHT-1; initialPosition[CASTLING][4] = initialRights[4] = BOARD_LEFT; initialPosition[CASTLING][5] = initialRights[5] =(BOARD_WIDTH-1)>>1; break; case VariantFalcon: pieces = FalconArray; gameInfo.boardWidth = 10; SetCharTable(pieceToChar, "PNBRQ.............FKpnbrq.............fk"); break; case VariantXiangqi: pieces = XiangqiArray; gameInfo.boardWidth = 9; gameInfo.boardHeight = 10; nrCastlingRights = 0; SetCharTable(pieceToChar, "PH.R.AE..K.C.ph.r.ae..k.c."); break; case VariantShogi: pieces = ShogiArray; gameInfo.boardWidth = 9; gameInfo.boardHeight = 9; gameInfo.holdingsSize = 7; nrCastlingRights = 0; SetCharTable(pieceToChar, "PNBRLS...G.++++++Kpnbrls...g.++++++k"); break; case VariantCourier: pieces = CourierArray; gameInfo.boardWidth = 12; nrCastlingRights = 0; SetCharTable(pieceToChar, "PNBR.FE..WMKpnbr.fe..wmk"); break; case VariantKnightmate: pieces = KnightmateArray; SetCharTable(pieceToChar, "P.BRQ.....M.........K.p.brq.....m.........k."); break; case VariantSpartan: pieces = SpartanArray; SetCharTable(pieceToChar, "PNBRQ................K......lwg.....c...h..k"); break; case VariantFairy: pieces = fairyArray; SetCharTable(pieceToChar, "PNBRQFEACWMOHIJGDVLSUKpnbrqfeacwmohijgdvlsuk"); break; case VariantGreat: pieces = GreatArray; gameInfo.boardWidth = 10; SetCharTable(pieceToChar, "PN....E...S..HWGMKpn....e...s..hwgmk"); gameInfo.holdingsSize = 8; break; case VariantSuper: pieces = FIDEArray; SetCharTable(pieceToChar, "PNBRQ..SE.......V.AKpnbrq..se.......v.ak"); gameInfo.holdingsSize = 8; startedFromSetupPosition = TRUE; break; case VariantCrazyhouse: case VariantBughouse: pieces = FIDEArray; SetCharTable(pieceToChar, "PNBRQ.......~~~~Kpnbrq.......~~~~k"); gameInfo.holdingsSize = 5; break; case VariantWildCastle: pieces = FIDEArray; /* !!?shuffle with kings guaranteed to be on d or e file */ shuffleOpenings = 1; break; case VariantNoCastle: pieces = FIDEArray; nrCastlingRights = 0; /* !!?unconstrained back-rank shuffle */ shuffleOpenings = 1; break; } overrule = 0; if(appData.NrFiles >= 0) { if(gameInfo.boardWidth != appData.NrFiles) overrule++; gameInfo.boardWidth = appData.NrFiles; } if(appData.NrRanks >= 0) { gameInfo.boardHeight = appData.NrRanks; } if(appData.holdingsSize >= 0) { i = appData.holdingsSize; if(i > gameInfo.boardHeight) i = gameInfo.boardHeight; gameInfo.holdingsSize = i; } if(gameInfo.holdingsSize) gameInfo.holdingsWidth = 2; if(BOARD_HEIGHT > BOARD_RANKS || BOARD_WIDTH > BOARD_FILES) DisplayFatalError(_("Recompile to support this BOARD_RANKS or BOARD_FILES!"), 0, 2); pawnRow = gameInfo.boardHeight - 7; /* seems to work in all common variants */ if(pawnRow < 1) pawnRow = 1; if(gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand) pawnRow = 2; /* User pieceToChar list overrules defaults */ if(appData.pieceToCharTable != NULL) SetCharTable(pieceToChar, appData.pieceToCharTable); for( j=0; j= BOARD_RGHT || overrule) continue; initialPosition[gameInfo.variant == VariantGrand][j] = pieces[0][j-gameInfo.holdingsWidth]; initialPosition[pawnRow][j] = WhitePawn; initialPosition[BOARD_HEIGHT-pawnRow-1][j] = gameInfo.variant == VariantSpartan ? BlackLance : BlackPawn; if(gameInfo.variant == VariantXiangqi) { if(j&1) { initialPosition[pawnRow][j] = initialPosition[BOARD_HEIGHT-pawnRow-1][j] = EmptySquare; if(j==BOARD_LEFT+1 || j>=BOARD_RGHT-2) { initialPosition[2][j] = WhiteCannon; initialPosition[BOARD_HEIGHT-3][j] = BlackCannon; } } } if(gameInfo.variant == VariantGrand) { if(j==BOARD_LEFT || j>=BOARD_RGHT-1) { initialPosition[0][j] = WhiteRook; initialPosition[BOARD_HEIGHT-1][j] = BlackRook; } } initialPosition[BOARD_HEIGHT-1-(gameInfo.variant == VariantGrand)][j] = pieces[1][j-gameInfo.holdingsWidth]; } if( (gameInfo.variant == VariantShogi) && !overrule ) { j=BOARD_LEFT+1; initialPosition[1][j] = WhiteBishop; initialPosition[BOARD_HEIGHT-2][j] = BlackRook; j=BOARD_RGHT-2; initialPosition[1][j] = WhiteRook; initialPosition[BOARD_HEIGHT-2][j] = BlackBishop; } if( nrCastlingRights == -1) { /* [HGM] Build normal castling rights (must be done after board sizing!) */ /* This sets default castling rights from none to normal corners */ /* Variants with other castling rights must set them themselves above */ nrCastlingRights = 6; initialPosition[CASTLING][0] = initialRights[0] = BOARD_RGHT-1; initialPosition[CASTLING][1] = initialRights[1] = BOARD_LEFT; initialPosition[CASTLING][2] = initialRights[2] = BOARD_WIDTH>>1; initialPosition[CASTLING][3] = initialRights[3] = BOARD_RGHT-1; initialPosition[CASTLING][4] = initialRights[4] = BOARD_LEFT; initialPosition[CASTLING][5] = initialRights[5] = BOARD_WIDTH>>1; } if(gameInfo.variant == VariantSuper) Prelude(initialPosition); if(gameInfo.variant == VariantGreat) { // promotion commoners initialPosition[PieceToNumber(WhiteMan)][BOARD_WIDTH-1] = WhiteMan; initialPosition[PieceToNumber(WhiteMan)][BOARD_WIDTH-2] = 9; initialPosition[BOARD_HEIGHT-1-PieceToNumber(WhiteMan)][0] = BlackMan; initialPosition[BOARD_HEIGHT-1-PieceToNumber(WhiteMan)][1] = 9; } if( gameInfo.variant == VariantSChess ) { initialPosition[1][0] = BlackMarshall; initialPosition[2][0] = BlackAngel; initialPosition[6][BOARD_WIDTH-1] = WhiteMarshall; initialPosition[5][BOARD_WIDTH-1] = WhiteAngel; initialPosition[1][1] = initialPosition[2][1] = initialPosition[6][BOARD_WIDTH-2] = initialPosition[5][BOARD_WIDTH-2] = 1; } if (appData.debugMode) { fprintf(debugFP, "shuffleOpenings = %d\n", shuffleOpenings); } if(shuffleOpenings) { SetUpShuffle(initialPosition, appData.defaultFrcPosition); startedFromSetupPosition = TRUE; } if(startedFromPositionFile) { /* [HGM] loadPos: use PositionFile for every new game */ CopyBoard(initialPosition, filePosition); for(i=0; iuseSetboard) { char* fen = PositionToFEN(moveNum, cps->fenOverride); snprintf(message, MSG_SIZ,"setboard %s\n", fen); SendToProgram(message, cps); free(fen); } else { ChessSquare *bp; int i, j, left=0, right=BOARD_WIDTH; /* Kludge to set black to move, avoiding the troublesome and now * deprecated "black" command. */ if (!WhiteOnMove(moveNum)) // [HGM] but better a deprecated command than an illegal move... SendToProgram(boards[0][1][BOARD_LEFT] == WhitePawn ? "a2a3\n" : "black\n", cps); if(!cps->extendedEdit) left = BOARD_LEFT, right = BOARD_RGHT; // only board proper SendToProgram("edit\n", cps); SendToProgram("#\n", cps); for (i = BOARD_HEIGHT - 1; i >= 0; i--) { bp = &boards[moveNum][i][left]; for (j = left; j < right; j++, bp++) { if(j == BOARD_LEFT-1 || j == BOARD_RGHT) continue; if ((int) *bp < (int) BlackPawn) { if(j == BOARD_RGHT+1) snprintf(message, MSG_SIZ, "%c@%d\n", PieceToChar(*bp), bp[-1]); else snprintf(message, MSG_SIZ, "%c%c%c\n", PieceToChar(*bp), AAA + j, ONE + i); if(message[0] == '+' || message[0] == '~') { snprintf(message, MSG_SIZ,"%c%c%c+\n", PieceToChar((ChessSquare)(DEMOTED *bp)), AAA + j, ONE + i); } if(cps->alphaRank) { /* [HGM] shogi: translate coords */ message[1] = BOARD_RGHT - 1 - j + '1'; message[2] = BOARD_HEIGHT - 1 - i + 'a'; } SendToProgram(message, cps); } } } SendToProgram("c\n", cps); for (i = BOARD_HEIGHT - 1; i >= 0; i--) { bp = &boards[moveNum][i][left]; for (j = left; j < right; j++, bp++) { if(j == BOARD_LEFT-1 || j == BOARD_RGHT) continue; if (((int) *bp != (int) EmptySquare) && ((int) *bp >= (int) BlackPawn)) { if(j == BOARD_LEFT-2) snprintf(message, MSG_SIZ, "%c@%d\n", ToUpper(PieceToChar(*bp)), bp[1]); else snprintf(message,MSG_SIZ, "%c%c%c\n", ToUpper(PieceToChar(*bp)), AAA + j, ONE + i); if(message[0] == '+' || message[0] == '~') { snprintf(message, MSG_SIZ,"%c%c%c+\n", PieceToChar((ChessSquare)(DEMOTED *bp)), AAA + j, ONE + i); } if(cps->alphaRank) { /* [HGM] shogi: translate coords */ message[1] = BOARD_RGHT - 1 - j + '1'; message[2] = BOARD_HEIGHT - 1 - i + 'a'; } SendToProgram(message, cps); } } } SendToProgram(".\n", cps); } setboardSpoiledMachineBlack = 0; /* [HGM] assume WB 4.2.7 already solves this after sending setboard */ } char exclusionHeader[MSG_SIZ]; int exCnt, excludePtr; typedef struct { int ff, fr, tf, tr, pc, mark; } Exclusion; static Exclusion excluTab[200]; static char excludeMap[(BOARD_RANKS*BOARD_FILES*BOARD_RANKS*BOARD_FILES+7)/8]; // [HGM] exclude: bitmap for excluced moves static void WriteMap (int s) { int j; for(j=0; j<(BOARD_RANKS*BOARD_FILES*BOARD_RANKS*BOARD_FILES+7)/8; j++) excludeMap[j] = s; exclusionHeader[19] = s ? '-' : '+'; // update tail state } static void ClearMap () { safeStrCpy(exclusionHeader, "exclude: none best +tail \n", MSG_SIZ); excludePtr = 24; exCnt = 0; WriteMap(0); } static void UpdateExcludeHeader (int fromY, int fromX, int toY, int toX, char promoChar, char state) { // search given move in table of header moves, to know where it is listed (and add if not there), and update state char buf[2*MOVE_LEN], *p; Exclusion *e = excluTab; int i; for(i=0; i>= 3; if(state == '*') state = (excludeMap[k] & 1< 18) { // tail if(exclusionHeader[19] == '-') { // tail was excluded SendToBoth("include all\n"); WriteMap(0); // clear map completely // now re-exclude selected moves for(i=0; i index) { char *p=exclusionHeader + excluTab[i].mark; // do trust header more than map (promotions!) ExcludeOneMove(e[i].fr, e[i].ff, e[i].tr, e[i].tf, e[i].pc, *p == '+' ? '-' : '+'); break; } } } ChessSquare DefaultPromoChoice (int white) { ChessSquare result; if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) result = WhiteFerz; // no choice else if(gameInfo.variant == VariantSuicide || gameInfo.variant == VariantGiveaway) result= WhiteKing; // in Suicide Q is the last thing we want else if(gameInfo.variant == VariantSpartan) result = white ? WhiteQueen : WhiteAngel; else result = WhiteQueen; if(!white) result = WHITE_TO_BLACK result; return result; } static int autoQueen; // [HGM] oneclick int HasPromotionChoice (int fromX, int fromY, int toX, int toY, char *promoChoice, int sweepSelect) { /* [HGM] rewritten IsPromotion to only flag promotions that offer a choice */ /* [HGM] add Shogi promotions */ int promotionZoneSize=1, highestPromotingPiece = (int)WhitePawn; ChessSquare piece; ChessMove moveType; Boolean premove; if(fromX < BOARD_LEFT || fromX >= BOARD_RGHT) return FALSE; // drop if(toX < BOARD_LEFT || toX >= BOARD_RGHT) return FALSE; // move into holdings if(gameMode == EditPosition || gameInfo.variant == VariantXiangqi || // no promotions !(fromX >=0 && fromY >= 0 && toX >= 0 && toY >= 0) ) // invalid move return FALSE; piece = boards[currentMove][fromY][fromX]; if(gameInfo.variant == VariantShogi) { promotionZoneSize = BOARD_HEIGHT/3; highestPromotingPiece = (int)WhiteFerz; } else if(gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand) { promotionZoneSize = 3; } // Treat Lance as Pawn when it is not representing Amazon if(gameInfo.variant != VariantSuper) { if(piece == WhiteLance) piece = WhitePawn; else if(piece == BlackLance) piece = BlackPawn; } // next weed out all moves that do not touch the promotion zone at all if((int)piece >= BlackPawn) { if(toY >= promotionZoneSize && fromY >= promotionZoneSize) return FALSE; highestPromotingPiece = WHITE_TO_BLACK highestPromotingPiece; } else { if( toY < BOARD_HEIGHT - promotionZoneSize && fromY < BOARD_HEIGHT - promotionZoneSize) return FALSE; } if( (int)piece > highestPromotingPiece ) return FALSE; // non-promoting piece // weed out mandatory Shogi promotions if(gameInfo.variant == VariantShogi) { if(piece >= BlackPawn) { if(toY == 0 && piece == BlackPawn || toY == 0 && piece == BlackQueen || toY <= 1 && piece == BlackKnight) { *promoChoice = '+'; return FALSE; } } else { if(toY == BOARD_HEIGHT-1 && piece == WhitePawn || toY == BOARD_HEIGHT-1 && piece == WhiteQueen || toY >= BOARD_HEIGHT-2 && piece == WhiteKnight) { *promoChoice = '+'; return FALSE; } } } // weed out obviously illegal Pawn moves if(appData.testLegality && (piece == WhitePawn || piece == BlackPawn) ) { if(toX > fromX+1 || toX < fromX-1) return FALSE; // wide if(piece == WhitePawn && toY != fromY+1) return FALSE; // deep if(piece == BlackPawn && toY != fromY-1) return FALSE; // deep if(fromX != toX && gameInfo.variant == VariantShogi) return FALSE; // note we are not allowed to test for valid (non-)capture, due to premove } // we either have a choice what to promote to, or (in Shogi) whether to promote if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) { *promoChoice = PieceToChar(BlackFerz); // no choice return FALSE; } // no sense asking what we must promote to if it is going to explode... if(gameInfo.variant == VariantAtomic && boards[currentMove][toY][toX] != EmptySquare) { *promoChoice = PieceToChar(BlackQueen); // Queen as good as any return FALSE; } // give caller the default choice even if we will not make it *promoChoice = ToLower(PieceToChar(defaultPromoChoice)); if(gameInfo.variant == VariantShogi) *promoChoice = (defaultPromoChoice == piece ? '=' : '+'); if( sweepSelect && gameInfo.variant != VariantGreat && gameInfo.variant != VariantGrand && gameInfo.variant != VariantSuper) return FALSE; if(autoQueen) return FALSE; // predetermined // suppress promotion popup on illegal moves that are not premoves premove = gameMode == IcsPlayingWhite && !WhiteOnMove(currentMove) || gameMode == IcsPlayingBlack && WhiteOnMove(currentMove); if(appData.testLegality && !premove) { moveType = LegalityTest(boards[currentMove], PosFlags(currentMove), fromY, fromX, toY, toX, gameInfo.variant == VariantShogi ? '+' : NULLCHAR); if(moveType != WhitePromotion && moveType != BlackPromotion) return FALSE; } return TRUE; } int InPalace (int row, int column) { /* [HGM] for Xiangqi */ if( (row < 3 || row > BOARD_HEIGHT-4) && column < (BOARD_WIDTH + 4)/2 && column > (BOARD_WIDTH - 5)/2 ) return TRUE; return FALSE; } int PieceForSquare (int x, int y) { if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) return -1; else return boards[currentMove][y][x]; } int OKToStartUserMove (int x, int y) { ChessSquare from_piece; int white_piece; if (matchMode) return FALSE; if (gameMode == EditPosition) return TRUE; if (x >= 0 && y >= 0) from_piece = boards[currentMove][y][x]; else from_piece = EmptySquare; if (from_piece == EmptySquare) return FALSE; white_piece = (int)from_piece >= (int)WhitePawn && (int)from_piece < (int)BlackPawn; /* [HGM] can be > King! */ switch (gameMode) { case AnalyzeFile: case TwoMachinesPlay: case EndOfGame: return FALSE; case IcsObserving: case IcsIdle: return FALSE; case MachinePlaysWhite: case IcsPlayingBlack: if (appData.zippyPlay) return FALSE; if (white_piece) { DisplayMoveError(_("You are playing Black")); return FALSE; } break; case MachinePlaysBlack: case IcsPlayingWhite: if (appData.zippyPlay) return FALSE; if (!white_piece) { DisplayMoveError(_("You are playing White")); return FALSE; } break; case PlayFromGameFile: if(!shiftKey || !appData.variations) return FALSE; // [HGM] allow starting variation in this mode case EditGame: if (!white_piece && WhiteOnMove(currentMove)) { DisplayMoveError(_("It is White's turn")); return FALSE; } if (white_piece && !WhiteOnMove(currentMove)) { DisplayMoveError(_("It is Black's turn")); return FALSE; } if (cmailMsgLoaded && (currentMove < cmailOldMove)) { /* Editing correspondence game history */ /* Could disallow this or prompt for confirmation */ cmailOldMove = -1; } break; case BeginningOfGame: if (appData.icsActive) return FALSE; if (!appData.noChessProgram) { if (!white_piece) { DisplayMoveError(_("You are playing White")); return FALSE; } } break; case Training: if (!white_piece && WhiteOnMove(currentMove)) { DisplayMoveError(_("It is White's turn")); return FALSE; } if (white_piece && !WhiteOnMove(currentMove)) { DisplayMoveError(_("It is Black's turn")); return FALSE; } break; default: case IcsExamining: break; } if (currentMove != forwardMostMove && gameMode != AnalyzeMode && gameMode != EditGame // [HGM] vari: treat as AnalyzeMode && gameMode != PlayFromGameFile // [HGM] as EditGame, with protected main line && gameMode != AnalyzeFile && gameMode != Training) { DisplayMoveError(_("Displayed position is not current")); return FALSE; } return TRUE; } Boolean OnlyMove (int *x, int *y, Boolean captures) { DisambiguateClosure cl; if (appData.zippyPlay || !appData.testLegality) return FALSE; switch(gameMode) { case MachinePlaysBlack: case IcsPlayingWhite: case BeginningOfGame: if(!WhiteOnMove(currentMove)) return FALSE; break; case MachinePlaysWhite: case IcsPlayingBlack: if(WhiteOnMove(currentMove)) return FALSE; break; case EditGame: break; default: return FALSE; } cl.pieceIn = EmptySquare; cl.rfIn = *y; cl.ffIn = *x; cl.rtIn = -1; cl.ftIn = -1; cl.promoCharIn = NULLCHAR; Disambiguate(boards[currentMove], PosFlags(currentMove), &cl); if( cl.kind == NormalMove || cl.kind == AmbiguousMove && captures && cl.captures == 1 || cl.kind == WhitePromotion || cl.kind == BlackPromotion || cl.kind == WhiteCapturesEnPassant || cl.kind == BlackCapturesEnPassant) { fromX = cl.ff; fromY = cl.rf; *x = cl.ft; *y = cl.rt; return TRUE; } if(cl.kind != ImpossibleMove) return FALSE; cl.pieceIn = EmptySquare; cl.rfIn = -1; cl.ffIn = -1; cl.rtIn = *y; cl.ftIn = *x; cl.promoCharIn = NULLCHAR; Disambiguate(boards[currentMove], PosFlags(currentMove), &cl); if( cl.kind == NormalMove || cl.kind == AmbiguousMove && captures && cl.captures == 1 || cl.kind == WhitePromotion || cl.kind == BlackPromotion || cl.kind == WhiteCapturesEnPassant || cl.kind == BlackCapturesEnPassant) { fromX = cl.ff; fromY = cl.rf; *x = cl.ft; *y = cl.rt; autoQueen = TRUE; // act as if autoQueen on when we click to-square return TRUE; } return FALSE; } FILE *lastLoadGameFP = NULL, *lastLoadPositionFP = NULL; int lastLoadGameNumber = 0, lastLoadPositionNumber = 0; int lastLoadGameUseList = FALSE; char lastLoadGameTitle[MSG_SIZ], lastLoadPositionTitle[MSG_SIZ]; ChessMove lastLoadGameStart = EndOfFile; int doubleClick; void UserMoveEvent(int fromX, int fromY, int toX, int toY, int promoChar) { ChessMove moveType; ChessSquare pup; int ff=fromX, rf=fromY, ft=toX, rt=toY; /* Check if the user is playing in turn. This is complicated because we let the user "pick up" a piece before it is his turn. So the piece he tried to pick up may have been captured by the time he puts it down! Therefore we use the color the user is supposed to be playing in this test, not the color of the piece that is currently on the starting square---except in EditGame mode, where the user is playing both sides; fortunately there the capture race can't happen. (It can now happen in IcsExamining mode, but that's just too bad. The user will get a somewhat confusing message in that case.) */ switch (gameMode) { case AnalyzeFile: case TwoMachinesPlay: case EndOfGame: case IcsObserving: case IcsIdle: /* We switched into a game mode where moves are not accepted, perhaps while the mouse button was down. */ return; case MachinePlaysWhite: /* User is moving for Black */ if (WhiteOnMove(currentMove)) { DisplayMoveError(_("It is White's turn")); return; } break; case MachinePlaysBlack: /* User is moving for White */ if (!WhiteOnMove(currentMove)) { DisplayMoveError(_("It is Black's turn")); return; } break; case PlayFromGameFile: if(!shiftKey ||!appData.variations) return; // [HGM] only variations case EditGame: case IcsExamining: case BeginningOfGame: case AnalyzeMode: case Training: if(fromY == DROP_RANK) break; // [HGM] drop moves (entered through move type-in) are automatically assigned to side-to-move if ((int) boards[currentMove][fromY][fromX] >= (int) BlackPawn && (int) boards[currentMove][fromY][fromX] < (int) EmptySquare) { /* User is moving for Black */ if (WhiteOnMove(currentMove)) { DisplayMoveError(_("It is White's turn")); return; } } else { /* User is moving for White */ if (!WhiteOnMove(currentMove)) { DisplayMoveError(_("It is Black's turn")); return; } } break; case IcsPlayingBlack: /* User is moving for Black */ if (WhiteOnMove(currentMove)) { if (!appData.premove) { DisplayMoveError(_("It is White's turn")); } else if (toX >= 0 && toY >= 0) { premoveToX = toX; premoveToY = toY; premoveFromX = fromX; premoveFromY = fromY; premovePromoChar = promoChar; gotPremove = 1; if (appData.debugMode) fprintf(debugFP, "Got premove: fromX %d," "fromY %d, toX %d, toY %d\n", fromX, fromY, toX, toY); } return; } break; case IcsPlayingWhite: /* User is moving for White */ if (!WhiteOnMove(currentMove)) { if (!appData.premove) { DisplayMoveError(_("It is Black's turn")); } else if (toX >= 0 && toY >= 0) { premoveToX = toX; premoveToY = toY; premoveFromX = fromX; premoveFromY = fromY; premovePromoChar = promoChar; gotPremove = 1; if (appData.debugMode) fprintf(debugFP, "Got premove: fromX %d," "fromY %d, toX %d, toY %d\n", fromX, fromY, toX, toY); } return; } break; default: break; case EditPosition: /* EditPosition, empty square, or different color piece; click-click move is possible */ if (toX == -2 || toY == -2) { boards[0][fromY][fromX] = EmptySquare; DrawPosition(FALSE, boards[currentMove]); return; } else if (toX >= 0 && toY >= 0) { boards[0][toY][toX] = boards[0][fromY][fromX]; if(fromX == BOARD_LEFT-2) { // handle 'moves' out of holdings if(boards[0][fromY][0] != EmptySquare) { if(boards[0][fromY][1]) boards[0][fromY][1]--; if(boards[0][fromY][1] == 0) boards[0][fromY][0] = EmptySquare; } } else if(fromX == BOARD_RGHT+1) { if(boards[0][fromY][BOARD_WIDTH-1] != EmptySquare) { if(boards[0][fromY][BOARD_WIDTH-2]) boards[0][fromY][BOARD_WIDTH-2]--; if(boards[0][fromY][BOARD_WIDTH-2] == 0) boards[0][fromY][BOARD_WIDTH-1] = EmptySquare; } } else boards[0][fromY][fromX] = gatingPiece; DrawPosition(FALSE, boards[currentMove]); return; } return; } if(toX < 0 || toY < 0) return; pup = boards[currentMove][toY][toX]; /* [HGM] If move started in holdings, it means a drop. Convert to standard form */ if( (fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) && fromY != DROP_RANK ) { if( pup != EmptySquare ) return; moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop; if(appData.debugMode) fprintf(debugFP, "Drop move %d, curr=%d, x=%d,y=%d, p=%d\n", moveType, currentMove, fromX, fromY, boards[currentMove][fromY][fromX]); // holdings might not be sent yet in ICS play; we have to figure out which piece belongs here if(fromX == 0) fromY = BOARD_HEIGHT-1 - fromY; // black holdings upside-down fromX = fromX ? WhitePawn : BlackPawn; // first piece type in selected holdings while(PieceToChar(fromX) == '.' || PieceToNumber(fromX) != fromY && fromX != (int) EmptySquare) fromX++; fromY = DROP_RANK; } /* [HGM] always test for legality, to get promotion info */ moveType = LegalityTest(boards[currentMove], PosFlags(currentMove), fromY, fromX, toY, toX, promoChar); if(fromY == DROP_RANK && fromX == EmptySquare && (gameMode == AnalyzeMode || gameMode == EditGame)) moveType = NormalMove; /* [HGM] but possibly ignore an IllegalMove result */ if (appData.testLegality) { if (moveType == IllegalMove || moveType == ImpossibleMove) { DisplayMoveError(_("Illegal move")); return; } } if(doubleClick && gameMode == AnalyzeMode) { // [HGM] exclude: move entered with double-click on from square is for exclusion, not playing if(ExcludeOneMove(fromY, fromX, toY, toX, promoChar, '*')) // toggle ClearPremoveHighlights(); // was included else ClearHighlights(), SetPremoveHighlights(ff, rf, ft, rt); // exclusion indicated by premove highlights return; } FinishMove(moveType, fromX, fromY, toX, toY, promoChar); } /* Common tail of UserMoveEvent and DropMenuEvent */ int FinishMove (ChessMove moveType, int fromX, int fromY, int toX, int toY, int promoChar) { char *bookHit = 0; if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) && promoChar != NULLCHAR) { // [HGM] superchess: suppress promotions to non-available piece (but P always allowed) int k = PieceToNumber(CharToPiece(ToUpper(promoChar))); if(WhiteOnMove(currentMove)) { if(!boards[currentMove][k][BOARD_WIDTH-2]) return 0; } else { if(!boards[currentMove][BOARD_HEIGHT-1-k][1]) return 0; } } /* [HGM] kludge to avoid having to know the exact promotion move type in caller when we know the move is a legal promotion */ if(moveType == NormalMove && promoChar) moveType = WhiteOnMove(currentMove) ? WhitePromotion : BlackPromotion; /* [HGM] The following if has been moved here from UserMoveEvent(). Because it seemed to belong here (why not allow piece drops in training games?), and because it can only be performed after it is known to what we promote. */ if (gameMode == Training) { /* compare the move played on the board to the next move in the * game. If they match, display the move and the opponent's response. * If they don't match, display an error message. */ int saveAnimate; Board testBoard; CopyBoard(testBoard, boards[currentMove]); ApplyMove(fromX, fromY, toX, toY, promoChar, testBoard); if (CompareBoards(testBoard, boards[currentMove+1])) { ForwardInner(currentMove+1); /* Autoplay the opponent's response. * if appData.animate was TRUE when Training mode was entered, * the response will be animated. */ saveAnimate = appData.animate; appData.animate = animateTraining; ForwardInner(currentMove+1); appData.animate = saveAnimate; /* check for the end of the game */ if (currentMove >= forwardMostMove) { gameMode = PlayFromGameFile; ModeHighlight(); SetTrainingModeOff(); DisplayInformation(_("End of game")); } } else { DisplayError(_("Incorrect move"), 0); } return 1; } /* Ok, now we know that the move is good, so we can kill the previous line in Analysis Mode */ if ((gameMode == AnalyzeMode || gameMode == EditGame || gameMode == PlayFromGameFile && appData.variations && shiftKey) && currentMove < forwardMostMove) { if(appData.variations && shiftKey) PushTail(currentMove, forwardMostMove); // [HGM] vari: save tail of game else forwardMostMove = currentMove; } ClearMap(); /* If we need the chess program but it's dead, restart it */ ResurrectChessProgram(); /* A user move restarts a paused game*/ if (pausing) PauseEvent(); thinkOutput[0] = NULLCHAR; MakeMove(fromX, fromY, toX, toY, promoChar); /*updates forwardMostMove*/ if(Adjudicate(NULL)) { // [HGM] adjudicate: take care of automatic game end ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ return 1; } if (gameMode == BeginningOfGame) { if (appData.noChessProgram) { gameMode = EditGame; SetGameInfo(); } else { char buf[MSG_SIZ]; gameMode = MachinePlaysBlack; StartClocks(); SetGameInfo(); snprintf(buf, MSG_SIZ, "%s %s %s", gameInfo.white, _("vs."), gameInfo.black); DisplayTitle(buf); if (first.sendName) { snprintf(buf, MSG_SIZ,"name %s\n", gameInfo.white); SendToProgram(buf, &first); } StartClocks(); } ModeHighlight(); } /* Relay move to ICS or chess engine */ if (appData.icsActive) { if (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsExamining) { if(userOfferedDraw && (signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) { SendToICS(ics_prefix); // [HGM] drawclaim: send caim and move on one line for FICS SendToICS("draw "); SendMoveToICS(moveType, fromX, fromY, toX, toY, promoChar); } // also send plain move, in case ICS does not understand atomic claims SendMoveToICS(moveType, fromX, fromY, toX, toY, promoChar); ics_user_moved = 1; } } else { if (first.sendTime && (gameMode == BeginningOfGame || gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack)) { SendTimeRemaining(&first, gameMode != MachinePlaysBlack); } if (gameMode != EditGame && gameMode != PlayFromGameFile && gameMode != AnalyzeMode) { // [HGM] book: if program might be playing, let it use book bookHit = SendMoveToBookUser(forwardMostMove-1, &first, FALSE); first.maybeThinking = TRUE; } else if(fromY == DROP_RANK && fromX == EmptySquare) { if(!first.useSetboard) SendToProgram("undo\n", &first); // kludge to change stm in engines that do not support setboard SendBoard(&first, currentMove+1); if(second.analyzing) { if(!second.useSetboard) SendToProgram("undo\n", &second); SendBoard(&second, currentMove+1); } } else { SendMoveToProgram(forwardMostMove-1, &first); if(second.analyzing) SendMoveToProgram(forwardMostMove-1, &second); } if (currentMove == cmailOldMove + 1) { cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE; } } ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ switch (gameMode) { case EditGame: if(appData.testLegality) switch (MateTest(boards[currentMove], PosFlags(currentMove)) ) { case MT_NONE: case MT_CHECK: break; case MT_CHECKMATE: case MT_STAINMATE: if (WhiteOnMove(currentMove)) { GameEnds(BlackWins, "Black mates", GE_PLAYER); } else { GameEnds(WhiteWins, "White mates", GE_PLAYER); } break; case MT_STALEMATE: GameEnds(GameIsDrawn, "Stalemate", GE_PLAYER); break; } break; case MachinePlaysBlack: case MachinePlaysWhite: /* disable certain menu options while machine is thinking */ SetMachineThinkingEnables(); break; default: break; } userOfferedDraw = FALSE; // [HGM] drawclaim: after move made, and tested for claimable draw promoDefaultAltered = FALSE; // [HGM] fall back on default choice if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } return 1; } void Mark (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { typedef char Markers[BOARD_RANKS][BOARD_FILES]; Markers *m = (Markers *) closure; if(rf == fromY && ff == fromX) (*m)[rt][ft] = 1 + (board[rt][ft] != EmptySquare || kind == WhiteCapturesEnPassant || kind == BlackCapturesEnPassant); else if(flags & F_MANDATORY_CAPTURE && board[rt][ft] != EmptySquare) (*m)[rt][ft] = 3; } void MarkTargetSquares (int clear) { int x, y; if(clear) // no reason to ever suppress clearing for(x=0; x1) capt++; if(capt) for(x=0; x= 0) { y = BOARD_HEIGHT - 1 - y; } if (flipView && x >= 0) { x = BOARD_WIDTH - 1 - x; } if(promoSweep != EmptySquare) { // up-click during sweep-select of promo-piece defaultPromoChoice = promoSweep; promoSweep = EmptySquare; // terminate sweep promoDefaultAltered = TRUE; if(!selectFlag && !sweepSelecting && (x != toX || y != toY)) x = fromX, y = fromY; // and fake up-click on same square if we were still selecting } if(promotionChoice) { // we are waiting for a click to indicate promotion piece if(clickType == Release) return; // ignore upclick of click-click destination promotionChoice = FALSE; // only one chance: if click not OK it is interpreted as cancel if(appData.debugMode) fprintf(debugFP, "promotion click, x=%d, y=%d\n", x, y); if(gameInfo.holdingsWidth && (WhiteOnMove(currentMove) ? x == BOARD_WIDTH-1 && y < gameInfo.holdingsSize && y >= 0 : x == 0 && y >= BOARD_HEIGHT - gameInfo.holdingsSize && y < BOARD_HEIGHT) ) { // click in right holdings, for determining promotion piece ChessSquare p = boards[currentMove][y][x]; if(appData.debugMode) fprintf(debugFP, "square contains %d\n", (int)p); if(p == WhitePawn || p == BlackPawn) p = EmptySquare; // [HGM] Pawns could be valid as deferral if(p != EmptySquare || gameInfo.variant == VariantGrand && toY != 0 && toY != BOARD_HEIGHT-1) { // [HGM] grand: empty square means defer FinishMove(NormalMove, fromX, fromY, toX, toY, p==EmptySquare ? NULLCHAR : ToLower(PieceToChar(p))); fromX = fromY = -1; return; } } DrawPosition(FALSE, boards[currentMove]); return; } /* [HGM] holdings: next 5 lines: ignore all clicks between board and holdings */ if(clickType == Press && ( x == BOARD_LEFT-1 || x == BOARD_RGHT || x == BOARD_LEFT-2 && y < BOARD_HEIGHT-gameInfo.holdingsSize || x == BOARD_RGHT+1 && y >= gameInfo.holdingsSize) ) return; if(gotPremove && x == premoveFromX && y == premoveFromY && clickType == Release) { // could be static click on premove from-square: abort premove gotPremove = 0; ClearPremoveHighlights(); } if(clickType == Press && fromX == x && fromY == y && promoDefaultAltered && SubtractTimeMarks(&lastClickTime, &prevClickTime) >= 200) fromX = fromY = -1; // second click on piece after altering default promo piece treated as first click if(!promoDefaultAltered) { // determine default promotion piece, based on the side the user is moving for int side = (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack || gameMode != MachinePlaysWhite && gameMode != IcsPlayingBlack && WhiteOnMove(currentMove)); defaultPromoChoice = DefaultPromoChoice(side); } autoQueen = appData.alwaysPromoteToQueen; if (fromX == -1) { int originalY = y; gatingPiece = EmptySquare; if (clickType != Press) { if(dragging) { // [HGM] from-square must have been reset due to game end since last press DragPieceEnd(xPix, yPix); dragging = 0; DrawPosition(FALSE, NULL); } return; } doubleClick = FALSE; if(gameMode == AnalyzeMode && (pausing || controlKey) && first.excludeMoves) { // use pause state to exclude moves doubleClick = TRUE; gatingPiece = boards[currentMove][y][x]; } fromX = x; fromY = y; toX = toY = -1; if(!appData.oneClick || !OnlyMove(&x, &y, FALSE) || // even if only move, we treat as normal when this would trigger a promotion popup, to allow sweep selection appData.sweepSelect && CanPromote(boards[currentMove][fromY][fromX], fromY) && originalY != y) { /* First square */ if (OKToStartUserMove(fromX, fromY)) { second = 0; MarkTargetSquares(0); if(gameMode == EditPosition && controlKey) gatingPiece = boards[currentMove][fromY][fromX]; DragPieceBegin(xPix, yPix, FALSE); dragging = 1; if(appData.sweepSelect && CanPromote(piece = boards[currentMove][fromY][fromX], fromY)) { promoSweep = defaultPromoChoice; selectFlag = 0; lastX = xPix; lastY = yPix; Sweep(0); // Pawn that is going to promote: preview promotion piece DisplayMessage("", _("Pull pawn backwards to under-promote")); } if (appData.highlightDragging) { SetHighlights(fromX, fromY, -1, -1); } else { ClearHighlights(); } } else fromX = fromY = -1; return; } } /* fromX != -1 */ if (clickType == Press && gameMode != EditPosition) { ChessSquare fromP; ChessSquare toP; int frc; // ignore off-board to clicks if(y < 0 || x < 0) return; /* Check if clicking again on the same color piece */ fromP = boards[currentMove][fromY][fromX]; toP = boards[currentMove][y][x]; frc = gameInfo.variant == VariantFischeRandom || gameInfo.variant == VariantCapaRandom || gameInfo.variant == VariantSChess; if ((WhitePawn <= fromP && fromP <= WhiteKing && WhitePawn <= toP && toP <= WhiteKing && !(fromP == WhiteKing && toP == WhiteRook && frc) && !(fromP == WhiteRook && toP == WhiteKing && frc)) || (BlackPawn <= fromP && fromP <= BlackKing && BlackPawn <= toP && toP <= BlackKing && !(fromP == BlackRook && toP == BlackKing && frc) && // allow also RxK as FRC castling !(fromP == BlackKing && toP == BlackRook && frc))) { /* Clicked again on same color piece -- changed his mind */ second = (x == fromX && y == fromY); if(second && gameMode == AnalyzeMode && SubtractTimeMarks(&lastClickTime, &prevClickTime) < 200) { second = FALSE; // first double-click rather than scond click doubleClick = first.excludeMoves; // used by UserMoveEvent to recognize exclude moves } promoDefaultAltered = FALSE; MarkTargetSquares(1); if(!(second && appData.oneClick && OnlyMove(&x, &y, TRUE))) { if (appData.highlightDragging) { SetHighlights(x, y, -1, -1); } else { ClearHighlights(); } if (OKToStartUserMove(x, y)) { if(gameInfo.variant == VariantSChess && // S-Chess: back-rank piece selected after holdings means gating (fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) && y == (toP < BlackPawn ? 0 : BOARD_HEIGHT-1)) gatingPiece = boards[currentMove][fromY][fromX]; else gatingPiece = doubleClick ? fromP : EmptySquare; fromX = x; fromY = y; dragging = 1; MarkTargetSquares(0); DragPieceBegin(xPix, yPix, FALSE); if(appData.sweepSelect && CanPromote(piece = boards[currentMove][y][x], y)) { promoSweep = defaultPromoChoice; selectFlag = 0; lastX = xPix; lastY = yPix; Sweep(0); // Pawn that is going to promote: preview promotion piece } } } if(x == fromX && y == fromY) return; // if OnlyMove altered (x,y) we go on second = FALSE; } // ignore clicks on holdings if(x < BOARD_LEFT || x >= BOARD_RGHT) return; } if (clickType == Release && x == fromX && y == fromY) { DragPieceEnd(xPix, yPix); dragging = 0; if(clearFlag) { // a deferred attempt to click-click move an empty square on top of a piece boards[currentMove][y][x] = EmptySquare; ClearHighlights(); DrawPosition(FALSE, boards[currentMove]); fromX = fromY = -1; clearFlag = 0; return; } if (appData.animateDragging) { /* Undo animation damage if any */ DrawPosition(FALSE, NULL); } if (second || sweepSelecting) { /* Second up/down in same square; just abort move */ if(sweepSelecting) DrawPosition(FALSE, boards[currentMove]); second = sweepSelecting = 0; fromX = fromY = -1; gatingPiece = EmptySquare; MarkTargetSquares(1); ClearHighlights(); gotPremove = 0; ClearPremoveHighlights(); } else { /* First upclick in same square; start click-click mode */ SetHighlights(x, y, -1, -1); } return; } clearFlag = 0; /* we now have a different from- and (possibly off-board) to-square */ /* Completed move */ if(!sweepSelecting) { toX = x; toY = y; } else sweepSelecting = 0; // this must be the up-click corresponding to the down-click that started the sweep saveAnimate = appData.animate; if (clickType == Press) { if(gameMode == EditPosition && boards[currentMove][fromY][fromX] == EmptySquare) { // must be Edit Position mode with empty-square selected fromX = x; fromY = y; DragPieceBegin(xPix, yPix, FALSE); dragging = 1; // consider this a new attempt to drag if(x >= BOARD_LEFT && x < BOARD_RGHT) clearFlag = 1; // and defer click-click move of empty-square to up-click return; } if(HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice, FALSE)) { if(appData.sweepSelect) { ChessSquare piece = boards[currentMove][fromY][fromX]; promoSweep = defaultPromoChoice; if(PieceToChar(PROMOTED piece) == '+') promoSweep = PROMOTED piece; selectFlag = 0; lastX = xPix; lastY = yPix; Sweep(0); // Pawn that is going to promote: preview promotion piece sweepSelecting = 1; DisplayMessage("", _("Pull pawn backwards to under-promote")); MarkTargetSquares(1); } return; // promo popup appears on up-click } /* Finish clickclick move */ if (appData.animate || appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } else { ClearHighlights(); } } else { #if 0 // [HGM] this must be done after the move is made, as with arrow it could lead to a board redraw with piece still on from square /* Finish drag move */ if (appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } else { ClearHighlights(); } #endif DragPieceEnd(xPix, yPix); dragging = 0; /* Don't animate move and drag both */ appData.animate = FALSE; } // moves into holding are invalid for now (except in EditPosition, adapting to-square) if(x >= 0 && x < BOARD_LEFT || x >= BOARD_RGHT) { ChessSquare piece = boards[currentMove][fromY][fromX]; if(gameMode == EditPosition && piece != EmptySquare && fromX >= BOARD_LEFT && fromX < BOARD_RGHT) { int n; if(x == BOARD_LEFT-2 && piece >= BlackPawn) { n = PieceToNumber(piece - (int)BlackPawn); if(n >= gameInfo.holdingsSize) { n = 0; piece = BlackPawn; } boards[currentMove][BOARD_HEIGHT-1 - n][0] = piece; boards[currentMove][BOARD_HEIGHT-1 - n][1]++; } else if(x == BOARD_RGHT+1 && piece < BlackPawn) { n = PieceToNumber(piece); if(n >= gameInfo.holdingsSize) { n = 0; piece = WhitePawn; } boards[currentMove][n][BOARD_WIDTH-1] = piece; boards[currentMove][n][BOARD_WIDTH-2]++; } boards[currentMove][fromY][fromX] = EmptySquare; } ClearHighlights(); fromX = fromY = -1; MarkTargetSquares(1); DrawPosition(TRUE, boards[currentMove]); return; } // off-board moves should not be highlighted if(x < 0 || y < 0) ClearHighlights(); if(gatingPiece != EmptySquare && gameInfo.variant == VariantSChess) promoChoice = ToLower(PieceToChar(gatingPiece)); if (HasPromotionChoice(fromX, fromY, toX, toY, &promoChoice, appData.sweepSelect)) { SetHighlights(fromX, fromY, toX, toY); MarkTargetSquares(1); if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) { // [HGM] super: promotion to captured piece selected from holdings ChessSquare p = boards[currentMove][fromY][fromX], q = boards[currentMove][toY][toX]; promotionChoice = TRUE; // kludge follows to temporarily execute move on display, without promoting yet boards[currentMove][fromY][fromX] = EmptySquare; // move Pawn to 8th rank boards[currentMove][toY][toX] = p; DrawPosition(FALSE, boards[currentMove]); boards[currentMove][fromY][fromX] = p; // take back, but display stays boards[currentMove][toY][toX] = q; DisplayMessage("Click in holdings to choose piece", ""); return; } PromotionPopUp(); } else { int oldMove = currentMove; UserMoveEvent(fromX, fromY, toX, toY, promoChoice); if (!appData.highlightLastMove || gotPremove) ClearHighlights(); if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY); if(saveAnimate && !appData.animate && currentMove != oldMove && // drag-move was performed Explode(boards[currentMove-1], fromX, fromY, toX, toY)) DrawPosition(TRUE, boards[currentMove]); MarkTargetSquares(1); fromX = fromY = -1; } appData.animate = saveAnimate; if (appData.animate || appData.animateDragging) { /* Undo animation damage if needed */ DrawPosition(FALSE, NULL); } } int RightClick (ClickType action, int x, int y, int *fromX, int *fromY) { // front-end-free part taken out of PieceMenuPopup int whichMenu; int xSqr, ySqr; if(seekGraphUp) { // [HGM] seekgraph if(action == Press) SeekGraphClick(Press, x, y, 2); // 2 indicates right-click: no pop-down on miss if(action == Release) SeekGraphClick(Release, x, y, 2); // and no challenge on hit return -2; } if((gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack) && !appData.zippyPlay && appData.bgObserve) { // [HGM] bughouse: show background game if(!partnerBoardValid) return -2; // suppress display of uninitialized boards if( appData.dualBoard) return -2; // [HGM] dual: is already displayed if(action == Press) { originalFlip = flipView; flipView = !flipView; // temporarily flip board to see game from partners perspective DrawPosition(TRUE, partnerBoard); DisplayMessage(partnerStatus, ""); partnerUp = TRUE; } else if(action == Release) { flipView = originalFlip; DrawPosition(TRUE, boards[currentMove]); partnerUp = FALSE; } return -2; } xSqr = EventToSquare(x, BOARD_WIDTH); ySqr = EventToSquare(y, BOARD_HEIGHT); if (action == Release) { if(pieceSweep != EmptySquare) { EditPositionMenuEvent(pieceSweep, toX, toY); pieceSweep = EmptySquare; } else UnLoadPV(); // [HGM] pv } if (action != Press) return -2; // return code to be ignored switch (gameMode) { case IcsExamining: if(xSqr < BOARD_LEFT || xSqr >= BOARD_RGHT) return -1; case EditPosition: if (xSqr == BOARD_LEFT-1 || xSqr == BOARD_RGHT) return -1; if (xSqr < 0 || ySqr < 0) return -1; if(appData.pieceMenu) { whichMenu = 0; break; } // edit-position menu pieceSweep = shiftKey ? BlackPawn : WhitePawn; // [HGM] sweep: prepare selecting piece by mouse sweep toX = xSqr; toY = ySqr; lastX = x, lastY = y; if(flipView) toX = BOARD_WIDTH - 1 - toX; else toY = BOARD_HEIGHT - 1 - toY; NextPiece(0); return 2; // grab case IcsObserving: if(!appData.icsEngineAnalyze) return -1; case IcsPlayingWhite: case IcsPlayingBlack: if(!appData.zippyPlay) goto noZip; case AnalyzeMode: case AnalyzeFile: case MachinePlaysWhite: case MachinePlaysBlack: case TwoMachinesPlay: // [HGM] pv: use for showing PV if (!appData.dropMenu) { LoadPV(x, y); return 2; // flag front-end to grab mouse events } if(gameMode == TwoMachinesPlay || gameMode == AnalyzeMode || gameMode == AnalyzeFile || gameMode == IcsObserving) return -1; case EditGame: noZip: if (xSqr < 0 || ySqr < 0) return -1; if (!appData.dropMenu || appData.testLegality && gameInfo.variant != VariantBughouse && gameInfo.variant != VariantCrazyhouse) return -1; whichMenu = 1; // drop menu break; default: return -1; } if (((*fromX = xSqr) < 0) || ((*fromY = ySqr) < 0)) { *fromX = *fromY = -1; return -1; } if (flipView) *fromX = BOARD_WIDTH - 1 - *fromX; else *fromY = BOARD_HEIGHT - 1 - *fromY; return whichMenu; } void SendProgramStatsToFrontend (ChessProgramState * cps, ChessProgramStats * cpstats) { // char * hint = lastHint; FrontEndProgramStats stats; stats.which = cps == &first ? 0 : 1; stats.depth = cpstats->depth; stats.nodes = cpstats->nodes; stats.score = cpstats->score; stats.time = cpstats->time; stats.pv = cpstats->movelist; stats.hint = lastHint; stats.an_move_index = 0; stats.an_move_count = 0; if( gameMode == AnalyzeMode || gameMode == AnalyzeFile ) { stats.hint = cpstats->move_name; stats.an_move_index = cpstats->nr_moves - cpstats->moves_left; stats.an_move_count = cpstats->nr_moves; } if(stats.pv && stats.pv[0]) safeStrCpy(lastPV[stats.which], stats.pv, sizeof(lastPV[stats.which])/sizeof(lastPV[stats.which][0])); // [HGM] pv: remember last PV of each SetProgramStats( &stats ); } void ClearEngineOutputPane (int which) { static FrontEndProgramStats dummyStats; dummyStats.which = which; dummyStats.pv = "#"; SetProgramStats( &dummyStats ); } #define MAXPLAYERS 500 char * TourneyStandings (int display) { int i, w, b, color, wScore, bScore, dummy, nr=0, nPlayers=0; int score[MAXPLAYERS], ranking[MAXPLAYERS], points[MAXPLAYERS], games[MAXPLAYERS]; char result, *p, *names[MAXPLAYERS]; if(appData.tourneyType < 0 && !strchr(appData.results, '*')) return strdup(_("Swiss tourney finished")); // standings of Swiss yet TODO names[0] = p = strdup(appData.participants); while(p = strchr(p, '\n')) *p++ = NULLCHAR, names[++nPlayers] = p; // count participants for(i=0; i 0) nPlayers = appData.tourneyType; // in gauntlet, list only gauntlet engine(s) for(w=0; w bScore) bScore = score[i], b = i; ranking[w] = b; points[w] = bScore; score[b] = -2; } p = malloc(nPlayers*34+1); for(w=0; w 2) return FALSE; // no trivial draws with more than 1 major if(myPawns == 2 && nMine == 3) // KPP return majorDefense || pCnt[BlackFerz-side] + pCnt[BlackAlfil-side] >= 3; if(myPawns == 1 && nMine == 2) // KP return majorDefense || pCnt[BlackFerz-side] + pCnt[BlackAlfil-side] + pCnt[BlackPawn-side] >= 1; if(myPawns == 1 && nMine == 3 && pCnt[WhiteKnight+side]) // KHP return majorDefense || pCnt[BlackFerz-side] + pCnt[BlackAlfil-side]*2 >= 5; if(myPawns) return FALSE; if(pCnt[WhiteRook+side]) return pCnt[BlackRook-side] || pCnt[BlackCannon-side] && (pCnt[BlackFerz-side] >= 2 || pCnt[BlackAlfil-side] >= 2) || pCnt[BlackKnight-side] && pCnt[BlackFerz-side] + pCnt[BlackAlfil-side] > 2 || pCnt[BlackFerz-side] + pCnt[BlackAlfil-side] >= 4; if(pCnt[WhiteCannon+side]) { if(pCnt[WhiteFerz+side] + myPawns == 0) return TRUE; // Cannon needs platform return majorDefense || pCnt[BlackAlfil-side] >= 2; } if(pCnt[WhiteKnight+side]) return majorDefense || pCnt[BlackFerz-side] >= 2 || pCnt[BlackAlfil-side] + pCnt[BlackPawn-side] >= 1; return FALSE; } int MatingPotential (int pCnt[], int side, int nMine, int nHis, int stale, int bisColor) { VariantClass v = gameInfo.variant; if(v == VariantShogi || v == VariantCrazyhouse || v == VariantBughouse) return TRUE; // drop games always winnable if(v == VariantShatranj) return TRUE; // always winnable through baring if(v == VariantLosers || v == VariantSuicide || v == VariantGiveaway) return TRUE; if(v == Variant3Check || v == VariantAtomic) return nMine > 1; // can win through checking / exploding King if(v == VariantXiangqi) { int majors = 5*pCnt[BlackKnight-side] + 7*pCnt[BlackCannon-side] + 7*pCnt[BlackRook-side]; nMine -= pCnt[WhiteFerz+side] + pCnt[WhiteAlfil+side] + stale; // discount defensive pieces and back-rank Pawns if(nMine + stale == 1) return (pCnt[BlackFerz-side] > 1 && pCnt[BlackKnight-side] > 0); // bare K can stalemate KHAA (!) if(nMine > 2) return TRUE; // if we don't have P, H or R, we must have CC if(nMine == 2 && pCnt[WhiteCannon+side] == 0) return TRUE; // We have at least one P, H or R // if we get here, we must have KC... or KP..., possibly with additional A, E or last-rank P if(stale) // we have at least one last-rank P plus perhaps C return majors // KPKX || pCnt[BlackFerz-side] && pCnt[BlackFerz-side] + pCnt[WhiteCannon+side] + stale > 2; // KPKAA, KPPKA and KCPKA else // KCA*E* return pCnt[WhiteFerz+side] // KCAK || pCnt[WhiteAlfil+side] && pCnt[BlackRook-side] + pCnt[BlackCannon-side] + pCnt[BlackFerz-side] // KCEKA, KCEKX (X!=H) || majors + (12*pCnt[BlackFerz-side] | 6*pCnt[BlackAlfil-side]) > 16; // KCKAA, KCKAX, KCKEEX, KCKEXX (XX!=HH), KCKXXX // TO DO: cases wih an unpromoted f-Pawn acting as platform for an opponent Cannon } else if(v == VariantKnightmate) { if(nMine == 1) return FALSE; if(nMine == 2 && nHis == 1 && pCnt[WhiteBishop+side] + pCnt[WhiteFerz+side] + pCnt[WhiteKnight+side]) return FALSE; // KBK is only draw } else if(pCnt[WhiteKing] == 1 && pCnt[BlackKing] == 1) { // other variants with orthodox Kings int nBishops = pCnt[WhiteBishop+side] + pCnt[WhiteFerz+side]; if(nMine == 1) return FALSE; // bare King if(nBishops && bisColor == 3) return TRUE; // There must be a second B/A/F, which can either block (his) or attack (mine) the escape square nMine += (nBishops > 0) - nBishops; // By now all Bishops (and Ferz) on like-colored squares, so count as one if(nMine > 2 && nMine != pCnt[WhiteAlfil+side] + 1) return TRUE; // At least two pieces, not all Alfils // by now we have King + 1 piece (or multiple Bishops on the same color) if(pCnt[WhiteKnight+side]) return (pCnt[BlackKnight-side] + pCnt[BlackBishop-side] + pCnt[BlackMan-side] + pCnt[BlackWazir-side] + pCnt[BlackSilver-side] + bisColor // KNKN, KNKB, KNKF, KNKE, KNKW, KNKM, KNKS || nHis > 3); // be sure to cover suffocation mates in corner (e.g. KNKQCA) if(nBishops) return (pCnt[BlackKnight-side]); // KBKN, KFKN if(pCnt[WhiteAlfil+side]) return (nHis > 2); // Alfils can in general not reach a corner square, but there might be edge (suffocation) mates if(pCnt[WhiteWazir+side]) return (pCnt[BlackKnight-side] + pCnt[BlackWazir-side] + pCnt[BlackAlfil-side]); // KWKN, KWKW, KWKE } return TRUE; } int CompareWithRights (Board b1, Board b2) { int rights = 0; if(!CompareBoards(b1, b2)) return FALSE; if(b1[EP_STATUS] != b2[EP_STATUS]) return FALSE; /* compare castling rights */ if( b1[CASTLING][2] != b2[CASTLING][2] && (b2[CASTLING][0] != NoRights || b2[CASTLING][1] != NoRights) ) rights++; /* King lost rights, while rook still had them */ if( b1[CASTLING][2] != NoRights ) { /* king has rights */ if( b1[CASTLING][0] != b2[CASTLING][0] || b1[CASTLING][1] != b2[CASTLING][1] ) rights++; /* but at least one rook lost them */ } if( b1[CASTLING][5] != b1[CASTLING][5] && (b2[CASTLING][3] != NoRights || b2[CASTLING][4] != NoRights) ) rights++; if( b1[CASTLING][5] != NoRights ) { if( b1[CASTLING][3] != b2[CASTLING][3] || b1[CASTLING][4] != b2[CASTLING][4] ) rights++; } return rights == 0; } int Adjudicate (ChessProgramState *cps) { // [HGM] some adjudications useful with buggy engines // [HGM] adjudicate: made into separate routine, which now can be called after every move // In any case it determnes if the game is a claimable draw (filling in EP_STATUS). // Actually ending the game is now based on the additional internal condition canAdjudicate. // Only when the game is ended, and the opponent is a computer, this opponent gets the move relayed. int k, drop, count = 0; static int bare = 1; ChessProgramState *engineOpponent = (gameMode == TwoMachinesPlay ? cps->other : (cps ? NULL : &first)); Boolean canAdjudicate = !appData.icsActive; // most tests only when we understand the game, i.e. legality-checking on if( appData.testLegality ) { /* [HGM] Some more adjudications for obstinate engines */ int nrW, nrB, bishopColor, staleW, staleB, nr[EmptySquare+1], i; static int moveCount = 6; ChessMove result; char *reason = NULL; /* Count what is on board. */ Count(boards[forwardMostMove], nr, &nrW, &nrB, &staleW, &staleB, &bishopColor); /* Some material-based adjudications that have to be made before stalemate test */ if(gameInfo.variant == VariantAtomic && nr[WhiteKing] + nr[BlackKing] < 2) { // [HGM] atomic: stm must have lost his King on previous move, as destroying own K is illegal boards[forwardMostMove][EP_STATUS] = EP_CHECKMATE; // make claimable as if stm is checkmated if(canAdjudicate && appData.checkMates) { if(engineOpponent) SendMoveToProgram(forwardMostMove-1, engineOpponent); // make sure opponent gets move GameEnds( WhiteOnMove(forwardMostMove) ? BlackWins : WhiteWins, "Xboard adjudication: King destroyed", GE_XBOARD ); return 1; } } /* Bare King in Shatranj (loses) or Losers (wins) */ if( nrW == 1 || nrB == 1) { if( gameInfo.variant == VariantLosers) { // [HGM] losers: bare King wins (stm must have it first) boards[forwardMostMove][EP_STATUS] = EP_WINS; // mark as win, so it becomes claimable if(canAdjudicate && appData.checkMates) { if(engineOpponent) SendMoveToProgram(forwardMostMove-1, engineOpponent); // make sure opponent gets to see move GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, "Xboard adjudication: Bare king", GE_XBOARD ); return 1; } } else if( gameInfo.variant == VariantShatranj && --bare < 0) { /* bare King */ boards[forwardMostMove][EP_STATUS] = EP_WINS; // make claimable as win for stm if(canAdjudicate && appData.checkMates) { /* but only adjudicate if adjudication enabled */ if(engineOpponent) SendMoveToProgram(forwardMostMove-1, engineOpponent); // make sure opponent gets move GameEnds( nrW > 1 ? WhiteWins : nrB > 1 ? BlackWins : GameIsDrawn, "Xboard adjudication: Bare king", GE_XBOARD ); return 1; } } } else bare = 1; // don't wait for engine to announce game end if we can judge ourselves switch (MateTest(boards[forwardMostMove], PosFlags(forwardMostMove)) ) { case MT_CHECK: if(gameInfo.variant == Variant3Check) { // [HGM] 3check: when in check, test if 3rd time int i, checkCnt = 0; // (should really be done by making nr of checks part of game state) for(i=forwardMostMove-2; i>=backwardMostMove; i-=2) { if(MateTest(boards[i], PosFlags(i)) == MT_CHECK) checkCnt++; if(checkCnt >= 2) { reason = "Xboard adjudication: 3rd check"; boards[forwardMostMove][EP_STATUS] = EP_CHECKMATE; break; } } } case MT_NONE: default: break; case MT_STEALMATE: case MT_STALEMATE: case MT_STAINMATE: reason = "Xboard adjudication: Stalemate"; if((signed char)boards[forwardMostMove][EP_STATUS] != EP_CHECKMATE) { // [HGM] don't touch win through baring or K-capt boards[forwardMostMove][EP_STATUS] = EP_STALEMATE; // default result for stalemate is draw if(gameInfo.variant == VariantLosers || gameInfo.variant == VariantGiveaway) // [HGM] losers: boards[forwardMostMove][EP_STATUS] = EP_WINS; // in these variants stalemated is always a win else if(gameInfo.variant == VariantSuicide) // in suicide it depends boards[forwardMostMove][EP_STATUS] = nrW == nrB ? EP_STALEMATE : ((nrW < nrB) != WhiteOnMove(forwardMostMove) ? EP_CHECKMATE : EP_WINS); else if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShogi) boards[forwardMostMove][EP_STATUS] = EP_CHECKMATE; // and in these variants being stalemated loses } break; case MT_CHECKMATE: reason = "Xboard adjudication: Checkmate"; boards[forwardMostMove][EP_STATUS] = (gameInfo.variant == VariantLosers ? EP_WINS : EP_CHECKMATE); if(gameInfo.variant == VariantShogi) { if(forwardMostMove > backwardMostMove && moveList[forwardMostMove-1][1] == '@' && CharToPiece(ToUpper(moveList[forwardMostMove-1][0])) == WhitePawn) { reason = "XBoard adjudication: pawn-drop mate"; boards[forwardMostMove][EP_STATUS] = EP_WINS; } } break; } switch(i = (signed char)boards[forwardMostMove][EP_STATUS]) { case EP_STALEMATE: result = GameIsDrawn; break; case EP_CHECKMATE: result = WhiteOnMove(forwardMostMove) ? BlackWins : WhiteWins; break; case EP_WINS: result = WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins; break; default: result = EndOfFile; } if(canAdjudicate && appData.checkMates && result) { // [HGM] mates: adjudicate finished games if requested if(engineOpponent) SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ GameEnds( result, reason, GE_XBOARD ); return 1; } /* Next absolutely insufficient mating material. */ if(!MatingPotential(nr, WhitePawn, nrW, nrB, staleW, bishopColor) && !MatingPotential(nr, BlackPawn, nrB, nrW, staleB, bishopColor)) { /* includes KBK, KNK, KK of KBKB with like Bishops */ /* always flag draws, for judging claims */ boards[forwardMostMove][EP_STATUS] = EP_INSUF_DRAW; if(canAdjudicate && appData.materialDraws) { /* but only adjudicate them if adjudication enabled */ if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see last move */ } GameEnds( GameIsDrawn, "Xboard adjudication: Insufficient mating material", GE_XBOARD ); return 1; } } /* Then some trivial draws (only adjudicate, cannot be claimed) */ if(gameInfo.variant == VariantXiangqi ? SufficientDefence(nr, WhitePawn, nrW, nrB) && SufficientDefence(nr, BlackPawn, nrB, nrW) : nrW + nrB == 4 && ( nr[WhiteRook] == 1 && nr[BlackRook] == 1 /* KRKR */ || nr[WhiteQueen] && nr[BlackQueen]==1 /* KQKQ */ || nr[WhiteKnight]==2 || nr[BlackKnight]==2 /* KNNK */ || nr[WhiteKnight]+nr[WhiteBishop] == 1 && nr[BlackKnight]+nr[BlackBishop] == 1 /* KBKN, KBKB, KNKN */ ) ) { if(--moveCount < 0 && appData.trivialDraws && canAdjudicate) { /* if the first 3 moves do not show a tactical win, declare draw */ if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ } GameEnds( GameIsDrawn, "Xboard adjudication: Trivial draw", GE_XBOARD ); return 1; } } else moveCount = 6; } // Repetition draws and 50-move rule can be applied independently of legality testing /* Check for rep-draws */ count = 0; drop = gameInfo.holdingsSize && (gameInfo.variant != VariantSuper && gameInfo.variant != VariantSChess && gameInfo.variant != VariantGreat && gameInfo.variant != VariantGrand); for(k = forwardMostMove-2; k>=backwardMostMove && k>=forwardMostMove-100 && (drop || (signed char)boards[k][EP_STATUS] < EP_UNKNOWN && (signed char)boards[k+2][EP_STATUS] <= EP_NONE && (signed char)boards[k+1][EP_STATUS] <= EP_NONE); k-=2) { int rights=0; if(CompareBoards(boards[k], boards[forwardMostMove])) { /* compare castling rights */ if( boards[forwardMostMove][CASTLING][2] != boards[k][CASTLING][2] && (boards[k][CASTLING][0] != NoRights || boards[k][CASTLING][1] != NoRights) ) rights++; /* King lost rights, while rook still had them */ if( boards[forwardMostMove][CASTLING][2] != NoRights ) { /* king has rights */ if( boards[forwardMostMove][CASTLING][0] != boards[k][CASTLING][0] || boards[forwardMostMove][CASTLING][1] != boards[k][CASTLING][1] ) rights++; /* but at least one rook lost them */ } if( boards[forwardMostMove][CASTLING][5] != boards[k][CASTLING][5] && (boards[k][CASTLING][3] != NoRights || boards[k][CASTLING][4] != NoRights) ) rights++; if( boards[forwardMostMove][CASTLING][5] != NoRights ) { if( boards[forwardMostMove][CASTLING][3] != boards[k][CASTLING][3] || boards[forwardMostMove][CASTLING][4] != boards[k][CASTLING][4] ) rights++; } if( rights == 0 && ++count > appData.drawRepeats-2 && canAdjudicate && appData.drawRepeats > 1) { /* adjudicate after user-specified nr of repeats */ int result = GameIsDrawn; char *details = "XBoard adjudication: repetition draw"; if((gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShogi) && appData.testLegality) { // [HGM] xiangqi: check for forbidden perpetuals int m, ourPerpetual = 1, hisPerpetual = 1; for(m=forwardMostMove; m>k; m-=2) { if(MateTest(boards[m], PosFlags(m)) != MT_CHECK) ourPerpetual = 0; // the current mover did not always check if(MateTest(boards[m-1], PosFlags(m-1)) != MT_CHECK) hisPerpetual = 0; // the opponent did not always check } if(appData.debugMode) fprintf(debugFP, "XQ perpetual test, our=%d, his=%d\n", ourPerpetual, hisPerpetual); if(ourPerpetual && !hisPerpetual) { // we are actively checking him: forfeit result = WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins; details = "Xboard adjudication: perpetual checking"; } else if(hisPerpetual && !ourPerpetual) { // he is checking us, but did not repeat yet break; // (or we would have caught him before). Abort repetition-checking loop. } else if(gameInfo.variant == VariantShogi) { // in Shogi other repetitions are draws if(BOARD_HEIGHT == 5 && BOARD_RGHT - BOARD_LEFT == 5) { // but in mini-Shogi gote wins! result = BlackWins; details = "Xboard adjudication: repetition"; } } else // it must be XQ // Now check for perpetual chases if(!ourPerpetual && !hisPerpetual) { // no perpetual check, test for chase hisPerpetual = PerpetualChase(k, forwardMostMove); ourPerpetual = PerpetualChase(k+1, forwardMostMove); if(ourPerpetual && !hisPerpetual) { // we are actively chasing him: forfeit static char resdet[MSG_SIZ]; result = WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins; details = resdet; snprintf(resdet, MSG_SIZ, "Xboard adjudication: perpetual chasing of %c%c", ourPerpetual>>8, ourPerpetual&255); } else if(hisPerpetual && !ourPerpetual) // he is chasing us, but did not repeat yet break; // Abort repetition-checking loop. } // if neither of us is checking or chasing all the time, or both are, it is draw } if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ } GameEnds( result, details, GE_XBOARD ); return 1; } if( rights == 0 && count > 1 ) /* occurred 2 or more times before */ boards[forwardMostMove][EP_STATUS] = EP_REP_DRAW; } } /* Now we test for 50-move draws. Determine ply count */ count = forwardMostMove; /* look for last irreversble move */ while( (signed char)boards[count][EP_STATUS] <= EP_NONE && count > backwardMostMove ) count--; /* if we hit starting position, add initial plies */ if( count == backwardMostMove ) count -= initialRulePlies; count = forwardMostMove - count; if(gameInfo.variant == VariantXiangqi && ( count >= 100 || count >= 2*appData.ruleMoves ) ) { // adjust reversible move counter for checks in Xiangqi int i = forwardMostMove - count, inCheck = 0, lastCheck; if(i < backwardMostMove) i = backwardMostMove; while(i <= forwardMostMove) { lastCheck = inCheck; // check evasion does not count inCheck = (MateTest(boards[i], PosFlags(i)) == MT_CHECK); if(inCheck || lastCheck) count--; // check does not count i++; } } if( count >= 100) boards[forwardMostMove][EP_STATUS] = EP_RULE_DRAW; /* this is used to judge if draw claims are legal */ if(canAdjudicate && appData.ruleMoves > 0 && count >= 2*appData.ruleMoves) { if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ } GameEnds( GameIsDrawn, "Xboard adjudication: 50-move rule", GE_XBOARD ); return 1; } /* if draw offer is pending, treat it as a draw claim * when draw condition present, to allow engines a way to * claim draws before making their move to avoid a race * condition occurring after their move */ if((gameMode == TwoMachinesPlay ? second.offeredDraw : userOfferedDraw) || first.offeredDraw ) { char *p = NULL; if((signed char)boards[forwardMostMove][EP_STATUS] == EP_RULE_DRAW) p = "Draw claim: 50-move rule"; if((signed char)boards[forwardMostMove][EP_STATUS] == EP_REP_DRAW) p = "Draw claim: 3-fold repetition"; if((signed char)boards[forwardMostMove][EP_STATUS] == EP_INSUF_DRAW) p = "Draw claim: insufficient mating material"; if( p != NULL && canAdjudicate) { if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ } GameEnds( GameIsDrawn, p, GE_XBOARD ); return 1; } } if( canAdjudicate && appData.adjudicateDrawMoves > 0 && forwardMostMove > (2*appData.adjudicateDrawMoves) ) { if(engineOpponent) { SendToProgram("force\n", engineOpponent); // suppress reply SendMoveToProgram(forwardMostMove-1, engineOpponent); /* make sure opponent gets to see move */ } GameEnds( GameIsDrawn, "Xboard adjudication: long game", GE_XBOARD ); return 1; } return 0; } char * SendMoveToBookUser (int moveNr, ChessProgramState *cps, int initial) { // [HGM] book: this routine intercepts moves to simulate book replies char *bookHit = NULL; //first determine if the incoming move brings opponent into his book if(appData.usePolyglotBook && (cps == &first ? !appData.firstHasOwnBookUCI : !appData.secondHasOwnBookUCI)) bookHit = ProbeBook(moveNr+1, appData.polyglotBook); // returns move if(appData.debugMode) fprintf(debugFP, "book hit = %s\n", bookHit ? bookHit : "(NULL)"); if(bookHit != NULL && !cps->bookSuspend) { // make sure opponent is not going to reply after receiving move to book position SendToProgram("force\n", cps); cps->bookSuspend = TRUE; // flag indicating it has to be restarted } if(bookHit) setboardSpoiledMachineBlack = FALSE; // suppress 'go' in SendMoveToProgram if(!initial) SendMoveToProgram(moveNr, cps); // with hit on initial position there is no move // now arrange restart after book miss if(bookHit) { // after a book hit we never send 'go', and the code after the call to this routine // has '&& !bookHit' added to suppress potential sending there (based on 'firstMove'). char buf[MSG_SIZ], *move = bookHit; if(cps->useSAN) { int fromX, fromY, toX, toY; char promoChar; ChessMove moveType; move = buf + 30; if (ParseOneMove(bookHit, forwardMostMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { (void) CoordsToAlgebraic(boards[forwardMostMove], PosFlags(forwardMostMove), fromY, fromX, toY, toX, promoChar, move); } else { if(appData.debugMode) fprintf(debugFP, "Book move could not be parsed\n"); bookHit = NULL; } } snprintf(buf, MSG_SIZ, "%s%s\n", (cps->useUsermove ? "usermove " : ""), move); // force book move into program supposed to play it SendToProgram(buf, cps); if(!initial) firstMove = FALSE; // normally we would clear the firstMove condition after return & sending 'go' } else if(initial) { // 'go' was needed irrespective of firstMove, and it has to be done in this routine SendToProgram("go\n", cps); cps->bookSuspend = FALSE; // after a 'go' we are never suspended } else { // 'go' might be sent based on 'firstMove' after this routine returns if(cps->bookSuspend && !firstMove) // 'go' needed, and it will not be done after we return SendToProgram("go\n", cps); cps->bookSuspend = FALSE; // anyhow, we will not be suspended after a miss } return bookHit; // notify caller of hit, so it can take action to send move to opponent } int LoadError (char *errmess, ChessProgramState *cps) { // unloads engine and switches back to -ncp mode if it was first if(cps->initDone) return FALSE; cps->isr = NULL; // this should suppress further error popups from breaking pipes DestroyChildProcess(cps->pr, 9 ); // just to be sure cps->pr = NoProc; if(cps == &first) { appData.noChessProgram = TRUE; gameMode = MachinePlaysBlack; ModeHighlight(); // kludge to unmark Machine Black menu gameMode = BeginningOfGame; ModeHighlight(); SetNCPMode(); } if(GetDelayedEvent()) CancelDelayedEvent(), ThawUI(); // [HGM] cancel remaining loading effort scheduled after feature timeout DisplayMessage("", ""); // erase waiting message if(errmess) DisplayError(errmess, 0); // announce reason, if given return TRUE; } char *savedMessage; ChessProgramState *savedState; void DeferredBookMove (void) { if(savedState->lastPing != savedState->lastPong) ScheduleDelayedEvent(DeferredBookMove, 10); else HandleMachineMove(savedMessage, savedState); } static int savedWhitePlayer, savedBlackPlayer, pairingReceived; static ChessProgramState *stalledEngine; static char stashedInputMove[MSG_SIZ]; void HandleMachineMove (char *message, ChessProgramState *cps) { char machineMove[MSG_SIZ], buf1[MSG_SIZ*10], buf2[MSG_SIZ]; char realname[MSG_SIZ]; int fromX, fromY, toX, toY; ChessMove moveType; char promoChar; char *p, *pv=buf1; int machineWhite, oldError; char *bookHit; if(cps == &pairing && sscanf(message, "%d-%d", &savedWhitePlayer, &savedBlackPlayer) == 2) { // [HGM] pairing: Mega-hack! Pairing engine also uses this routine (so it could give other WB commands). if(savedWhitePlayer == 0 || savedBlackPlayer == 0) { DisplayError(_("Invalid pairing from pairing engine"), 0); return; } pairingReceived = 1; NextMatchGame(); return; // Skim the pairing messages here. } oldError = cps->userError; cps->userError = 0; FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book hit /* * Kludge to ignore BEL characters */ while (*message == '\007') message++; /* * [HGM] engine debug message: ignore lines starting with '#' character */ if(cps->debug && *message == '#') return; /* * Look for book output */ if (cps == &first && bookRequested) { if (message[0] == '\t' || message[0] == ' ') { /* Part of the book output is here; append it */ strcat(bookOutput, message); strcat(bookOutput, " \n"); return; } else if (bookOutput[0] != NULLCHAR) { /* All of book output has arrived; display it */ char *p = bookOutput; while (*p != NULLCHAR) { if (*p == '\t') *p = ' '; p++; } DisplayInformation(bookOutput); bookRequested = FALSE; /* Fall through to parse the current output */ } } /* * Look for machine move. */ if ((sscanf(message, "%s %s %s", buf1, buf2, machineMove) == 3 && strcmp(buf2, "...") == 0) || (sscanf(message, "%s %s", buf1, machineMove) == 2 && strcmp(buf1, "move") == 0)) { if(pausing && !cps->pause) { // for pausing engine that does not support 'pause', we stash its move for processing when we resume. if(appData.debugMode) fprintf(debugFP, "pause %s engine after move\n", cps->which); safeStrCpy(stashedInputMove, message, MSG_SIZ); stalledEngine = cps; if(appData.ponderNextMove) { // bring opponent out of ponder if(gameMode == TwoMachinesPlay) { if(cps->other->pause) PauseEngine(cps->other); else SendToProgram("easy\n", cps->other); } } StopClocks(); return; } /* This method is only useful on engines that support ping */ if (cps->lastPing != cps->lastPong) { if (gameMode == BeginningOfGame) { /* Extra move from before last new; ignore */ if (appData.debugMode) { fprintf(debugFP, "Ignoring extra move from %s\n", cps->which); } } else { if (appData.debugMode) { fprintf(debugFP, "Undoing extra move from %s, gameMode %d\n", cps->which, gameMode); } SendToProgram("undo\n", cps); } return; } switch (gameMode) { case BeginningOfGame: /* Extra move from before last reset; ignore */ if (appData.debugMode) { fprintf(debugFP, "Ignoring extra move from %s\n", cps->which); } return; case EndOfGame: case IcsIdle: default: /* Extra move after we tried to stop. The mode test is not a reliable way of detecting this problem, but it's the best we can do on engines that don't support ping. */ if (appData.debugMode) { fprintf(debugFP, "Undoing extra move from %s, gameMode %d\n", cps->which, gameMode); } SendToProgram("undo\n", cps); return; case MachinePlaysWhite: case IcsPlayingWhite: machineWhite = TRUE; break; case MachinePlaysBlack: case IcsPlayingBlack: machineWhite = FALSE; break; case TwoMachinesPlay: machineWhite = (cps->twoMachinesColor[0] == 'w'); break; } if (WhiteOnMove(forwardMostMove) != machineWhite) { if (appData.debugMode) { fprintf(debugFP, "Ignoring move out of turn by %s, gameMode %d" ", forwardMost %d\n", cps->which, gameMode, forwardMostMove); } return; } if(cps->alphaRank) AlphaRank(machineMove, 4); if (!ParseOneMove(machineMove, forwardMostMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { /* Machine move could not be parsed; ignore it. */ snprintf(buf1, MSG_SIZ*10, _("Illegal move \"%s\" from %s machine"), machineMove, _(cps->which)); DisplayMoveError(buf1); snprintf(buf1, MSG_SIZ*10, "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d", machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, moveType); if (gameMode == TwoMachinesPlay) { GameEnds(machineWhite ? BlackWins : WhiteWins, buf1, GE_XBOARD); } return; } /* [HGM] Apparently legal, but so far only tested with EP_UNKOWN */ /* So we have to redo legality test with true e.p. status here, */ /* to make sure an illegal e.p. capture does not slip through, */ /* to cause a forfeit on a justified illegal-move complaint */ /* of the opponent. */ if( gameMode==TwoMachinesPlay && appData.testLegality ) { ChessMove moveType; moveType = LegalityTest(boards[forwardMostMove], PosFlags(forwardMostMove), fromY, fromX, toY, toX, promoChar); if(moveType == IllegalMove) { snprintf(buf1, MSG_SIZ*10, "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c", machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0); GameEnds(machineWhite ? BlackWins : WhiteWins, buf1, GE_XBOARD); return; } else if(gameInfo.variant != VariantFischeRandom && gameInfo.variant != VariantCapaRandom) /* [HGM] Kludge to handle engines that send FRC-style castling when they shouldn't (like TSCP-Gothic) */ switch(moveType) { case WhiteASideCastleFR: case BlackASideCastleFR: toX+=2; currentMoveString[2]++; break; case WhiteHSideCastleFR: case BlackHSideCastleFR: toX--; currentMoveString[2]--; break; default: ; // nothing to do, but suppresses warning of pedantic compilers } } hintRequested = FALSE; lastHint[0] = NULLCHAR; bookRequested = FALSE; /* Program may be pondering now */ cps->maybeThinking = TRUE; if (cps->sendTime == 2) cps->sendTime = 1; if (cps->offeredDraw) cps->offeredDraw--; /* [AS] Save move info*/ pvInfoList[ forwardMostMove ].score = programStats.score; pvInfoList[ forwardMostMove ].depth = programStats.depth; pvInfoList[ forwardMostMove ].time = programStats.time; // [HGM] PGNtime: take time from engine stats MakeMove(fromX, fromY, toX, toY, promoChar);/*updates forwardMostMove*/ /* [AS] Adjudicate game if needed (note: remember that forwardMostMove now points past the last move) */ if( gameMode == TwoMachinesPlay && adjudicateLossThreshold != 0 && forwardMostMove >= adjudicateLossPlies ) { int count = 0; while( count < adjudicateLossPlies ) { int score = pvInfoList[ forwardMostMove - count - 1 ].score; if( count & 1 ) { score = -score; /* Flip score for winning side */ } if( score > adjudicateLossThreshold ) { break; } count++; } if( count >= adjudicateLossPlies ) { ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, "Xboard adjudication", GE_XBOARD ); return; } } if(Adjudicate(cps)) { ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ return; // [HGM] adjudicate: for all automatic game ends } #if ZIPPY if ((gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack) && first.initDone) { if(cps->offeredDraw && (signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) { SendToICS(ics_prefix); // [HGM] drawclaim: send caim and move on one line for FICS SendToICS("draw "); SendMoveToICS(moveType, fromX, fromY, toX, toY, promoChar); } SendMoveToICS(moveType, fromX, fromY, toX, toY, promoChar); ics_user_moved = 1; if(appData.autoKibitz && !appData.icsEngineAnalyze ) { /* [HGM] kibitz: send most-recent PV info to ICS */ char buf[3*MSG_SIZ]; snprintf(buf, 3*MSG_SIZ, "kibitz !!! %+.2f/%d (%.2f sec, %u nodes, %.0f knps) PV=%s\n", programStats.score / 100., programStats.depth, programStats.time / 100., (unsigned int)programStats.nodes, (unsigned int)programStats.nodes / (10*abs(programStats.time) + 1.), programStats.movelist); SendToICS(buf); if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.nodes, programStats.nodes); } } #endif /* [AS] Clear stats for next move */ ClearProgramStats(); thinkOutput[0] = NULLCHAR; hiddenThinkOutputState = 0; bookHit = NULL; if (gameMode == TwoMachinesPlay) { /* [HGM] relaying draw offers moved to after reception of move */ /* and interpreting offer as claim if it brings draw condition */ if (cps->offeredDraw == 1 && cps->other->sendDrawOffers) { SendToProgram("draw\n", cps->other); } if (cps->other->sendTime) { SendTimeRemaining(cps->other, cps->other->twoMachinesColor[0] == 'w'); } bookHit = SendMoveToBookUser(forwardMostMove-1, cps->other, FALSE); if (firstMove && !bookHit) { firstMove = FALSE; if (cps->other->useColors) { SendToProgram(cps->other->twoMachinesColor, cps->other); } SendToProgram("go\n", cps->other); } cps->other->maybeThinking = TRUE; } ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/ if (!pausing && appData.ringBellAfterMoves) { RingBell(); } /* * Reenable menu items that were disabled while * machine was thinking */ if (gameMode != TwoMachinesPlay) SetUserThinkingEnables(); // [HGM] book: after book hit opponent has received move and is now in force mode // force the book reply into it, and then fake that it outputted this move by jumping // back to the beginning of HandleMachineMove, with cps toggled and message set to this move if(bookHit) { static char bookMove[MSG_SIZ]; // a bit generous? safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); message = bookMove; cps = cps->other; programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); if(cps->lastPing != cps->lastPong) { savedMessage = message; // args for deferred call savedState = cps; ScheduleDelayedEvent(DeferredBookMove, 10); return; } goto FakeBookMove; } return; } /* Set special modes for chess engines. Later something general * could be added here; for now there is just one kludge feature, * needed because Crafty 15.10 and earlier don't ignore SIGINT * when "xboard" is given as an interactive command. */ if (strncmp(message, "kibitz Hello from Crafty", 24) == 0) { cps->useSigint = FALSE; cps->useSigterm = FALSE; } if (strncmp(message, "feature ", 8) == 0) { // [HGM] moved forward to pre-empt non-compliant commands ParseFeatures(message+8, cps); return; // [HGM] This return was missing, causing option features to be recognized as non-compliant commands! } if (!strncmp(message, "setup ", 6) && (!appData.testLegality || gameInfo.variant == VariantFairy || NonStandardBoardSize()) ) { // [HGM] allow first engine to define opening position int dummy, s=6; char buf[MSG_SIZ]; if(appData.icsActive || forwardMostMove != 0 || cps != &first) return; if(sscanf(message, "setup (%s", buf) == 1) s = 8 + strlen(buf), buf[s-9] = NULLCHAR, SetCharTable(pieceToChar, buf); if(startedFromSetupPosition) return; if(sscanf(message+s, "%dx%d+%d", &dummy, &dummy, &dummy) == 3) while(message[s] && message[s++] != ' '); // for compatibility with Alien Edition ParseFEN(boards[0], &dummy, message+s); DrawPosition(TRUE, boards[0]); startedFromSetupPosition = TRUE; return; } /* [HGM] Allow engine to set up a position. Don't ask me why one would * want this, I was asked to put it in, and obliged. */ if (!strncmp(message, "setboard ", 9)) { Board initial_position; GameEnds(GameUnfinished, "Engine aborts game", GE_XBOARD); if (!ParseFEN(initial_position, &blackPlaysFirst, message + 9)) { DisplayError(_("Bad FEN received from engine"), 0); return ; } else { Reset(TRUE, FALSE); CopyBoard(boards[0], initial_position); initialRulePlies = FENrulePlies; if(blackPlaysFirst) gameMode = MachinePlaysWhite; else gameMode = MachinePlaysBlack; DrawPosition(FALSE, boards[currentMove]); } return; } /* * Look for communication commands */ if (!strncmp(message, "telluser ", 9)) { if(message[9] == '\\' && message[10] == '\\') EscapeExpand(message+9, message+11); // [HGM] esc: allow escape sequences in popup box PlayTellSound(); DisplayNote(message + 9); return; } if (!strncmp(message, "tellusererror ", 14)) { cps->userError = 1; if(message[14] == '\\' && message[15] == '\\') EscapeExpand(message+14, message+16); // [HGM] esc: allow escape sequences in popup box PlayTellSound(); DisplayError(message + 14, 0); return; } if (!strncmp(message, "tellopponent ", 13)) { if (appData.icsActive) { if (loggedOn) { snprintf(buf1, sizeof(buf1), "%ssay %s\n", ics_prefix, message + 13); SendToICS(buf1); } } else { DisplayNote(message + 13); } return; } if (!strncmp(message, "tellothers ", 11)) { if (appData.icsActive) { if (loggedOn) { snprintf(buf1, sizeof(buf1), "%swhisper %s\n", ics_prefix, message + 11); SendToICS(buf1); } } else if(appData.autoComment) AppendComment (forwardMostMove, message + 11, 1); // in local mode, add as move comment return; } if (!strncmp(message, "tellall ", 8)) { if (appData.icsActive) { if (loggedOn) { snprintf(buf1, sizeof(buf1), "%skibitz %s\n", ics_prefix, message + 8); SendToICS(buf1); } } else { DisplayNote(message + 8); } return; } if (strncmp(message, "warning", 7) == 0) { /* Undocumented feature, use tellusererror in new code */ DisplayError(message, 0); return; } if (sscanf(message, "askuser %s %[^\n]", buf1, buf2) == 2) { safeStrCpy(realname, cps->tidy, sizeof(realname)/sizeof(realname[0])); strcat(realname, " query"); AskQuestion(realname, buf2, buf1, cps->pr); return; } /* Commands from the engine directly to ICS. We don't allow these to be * sent until we are logged on. Crafty kibitzes have been known to * interfere with the login process. */ if (loggedOn) { if (!strncmp(message, "tellics ", 8)) { SendToICS(message + 8); SendToICS("\n"); return; } if (!strncmp(message, "tellicsnoalias ", 15)) { SendToICS(ics_prefix); SendToICS(message + 15); SendToICS("\n"); return; } /* The following are for backward compatibility only */ if (!strncmp(message,"whisper",7) || !strncmp(message,"kibitz",6) || !strncmp(message,"draw",4) || !strncmp(message,"tell",3)) { SendToICS(ics_prefix); SendToICS(message); SendToICS("\n"); return; } } if (sscanf(message, "pong %d", &cps->lastPong) == 1) { return; } /* * If the move is illegal, cancel it and redraw the board. * Also deal with other error cases. Matching is rather loose * here to accommodate engines written before the spec. */ if (strncmp(message + 1, "llegal move", 11) == 0 || strncmp(message, "Error", 5) == 0) { if (StrStr(message, "name") || StrStr(message, "rating") || StrStr(message, "?") || StrStr(message, "result") || StrStr(message, "board") || StrStr(message, "bk") || StrStr(message, "computer") || StrStr(message, "variant") || StrStr(message, "hint") || StrStr(message, "random") || StrStr(message, "depth") || StrStr(message, "accepted")) { return; } if (StrStr(message, "protover")) { /* Program is responding to input, so it's apparently done initializing, and this error message indicates it is protocol version 1. So we don't need to wait any longer for it to initialize and send feature commands. */ FeatureDone(cps, 1); cps->protocolVersion = 1; return; } cps->maybeThinking = FALSE; if (StrStr(message, "draw")) { /* Program doesn't have "draw" command */ cps->sendDrawOffers = 0; return; } if (cps->sendTime != 1 && (StrStr(message, "time") || StrStr(message, "otim"))) { /* Program apparently doesn't have "time" or "otim" command */ cps->sendTime = 0; return; } if (StrStr(message, "analyze")) { cps->analysisSupport = FALSE; cps->analyzing = FALSE; // Reset(FALSE, TRUE); // [HGM] this caused discrepancy between display and internal state! EditGameEvent(); // [HGM] try to preserve loaded game snprintf(buf2,MSG_SIZ, _("%s does not support analysis"), cps->tidy); DisplayError(buf2, 0); return; } if (StrStr(message, "(no matching move)st")) { /* Special kludge for GNU Chess 4 only */ cps->stKludge = TRUE; SendTimeControl(cps, movesPerSession, timeControl, timeIncrement, appData.searchDepth, searchTime); return; } if (StrStr(message, "(no matching move)sd")) { /* Special kludge for GNU Chess 4 only */ cps->sdKludge = TRUE; SendTimeControl(cps, movesPerSession, timeControl, timeIncrement, appData.searchDepth, searchTime); return; } if (!StrStr(message, "llegal")) { return; } if (gameMode == BeginningOfGame || gameMode == EndOfGame || gameMode == IcsIdle) return; if (forwardMostMove <= backwardMostMove) return; if (pausing) PauseEvent(); if(appData.forceIllegal) { // [HGM] illegal: machine refused move; force position after move into it SendToProgram("force\n", cps); if(!cps->useSetboard) { // hideous kludge on kludge, because SendBoard sucks. // we have a real problem now, as SendBoard will use the a2a3 kludge // when black is to move, while there might be nothing on a2 or black // might already have the move. So send the board as if white has the move. // But first we must change the stm of the engine, as it refused the last move SendBoard(cps, 0); // always kludgeless, as white is to move on boards[0] if(WhiteOnMove(forwardMostMove)) { SendToProgram("a7a6\n", cps); // for the engine black still had the move SendBoard(cps, forwardMostMove); // kludgeless board } else { SendToProgram("a2a3\n", cps); // for the engine white still had the move CopyBoard(boards[forwardMostMove+1], boards[forwardMostMove]); SendBoard(cps, forwardMostMove+1); // kludgeless board } } else SendBoard(cps, forwardMostMove); // FEN case, also sets stm properly if(gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay) SendToProgram("go\n", cps); return; } else if (gameMode == PlayFromGameFile) { /* Stop reading this game file */ gameMode = EditGame; ModeHighlight(); } /* [HGM] illegal-move claim should forfeit game when Xboard */ /* only passes fully legal moves */ if( appData.testLegality && gameMode == TwoMachinesPlay ) { GameEnds( cps->twoMachinesColor[0] == 'w' ? BlackWins : WhiteWins, "False illegal-move claim", GE_XBOARD ); return; // do not take back move we tested as valid } currentMove = forwardMostMove-1; DisplayMove(currentMove-1); /* before DisplayMoveError */ SwitchClocks(forwardMostMove-1); // [HGM] race DisplayBothClocks(); snprintf(buf1, 10*MSG_SIZ, _("Illegal move \"%s\" (rejected by %s chess program)"), parseList[currentMove], _(cps->which)); DisplayMoveError(buf1); DrawPosition(FALSE, boards[currentMove]); SetUserThinkingEnables(); return; } if (strncmp(message, "time", 4) == 0 && StrStr(message, "Illegal")) { /* Program has a broken "time" command that outputs a string not ending in newline. Don't use it. */ cps->sendTime = 0; } /* * If chess program startup fails, exit with an error message. * Attempts to recover here are futile. [HGM] Well, we try anyway */ if ((StrStr(message, "unknown host") != NULL) || (StrStr(message, "No remote directory") != NULL) || (StrStr(message, "not found") != NULL) || (StrStr(message, "No such file") != NULL) || (StrStr(message, "can't alloc") != NULL) || (StrStr(message, "Permission denied") != NULL)) { cps->maybeThinking = FALSE; snprintf(buf1, sizeof(buf1), _("Failed to start %s chess program %s on %s: %s\n"), _(cps->which), cps->program, cps->host, message); RemoveInputSource(cps->isr); if(appData.icsActive) DisplayFatalError(buf1, 0, 1); else { if(LoadError(oldError ? NULL : buf1, cps)) return; // error has then been handled by LoadError if(!oldError) DisplayError(buf1, 0); // if reason neatly announced, suppress general error popup } return; } /* * Look for hint output */ if (sscanf(message, "Hint: %s", buf1) == 1) { if (cps == &first && hintRequested) { hintRequested = FALSE; if (ParseOneMove(buf1, forwardMostMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { (void) CoordsToAlgebraic(boards[forwardMostMove], PosFlags(forwardMostMove), fromY, fromX, toY, toX, promoChar, buf1); snprintf(buf2, sizeof(buf2), _("Hint: %s"), buf1); DisplayInformation(buf2); } else { /* Hint move could not be parsed!? */ snprintf(buf2, sizeof(buf2), _("Illegal hint move \"%s\"\nfrom %s chess program"), buf1, _(cps->which)); DisplayError(buf2, 0); } } else { safeStrCpy(lastHint, buf1, sizeof(lastHint)/sizeof(lastHint[0])); } return; } /* * Ignore other messages if game is not in progress */ if (gameMode == BeginningOfGame || gameMode == EndOfGame || gameMode == IcsIdle || cps->lastPing != cps->lastPong) return; /* * look for win, lose, draw, or draw offer */ if (strncmp(message, "1-0", 3) == 0) { char *p, *q, *r = ""; p = strchr(message, '{'); if (p) { q = strchr(p, '}'); if (q) { *q = NULLCHAR; r = p + 1; } } GameEnds(WhiteWins, r, GE_ENGINE1 + (cps != &first)); /* [HGM] pass claimer indication for claim test */ return; } else if (strncmp(message, "0-1", 3) == 0) { char *p, *q, *r = ""; p = strchr(message, '{'); if (p) { q = strchr(p, '}'); if (q) { *q = NULLCHAR; r = p + 1; } } /* Kludge for Arasan 4.1 bug */ if (strcmp(r, "Black resigns") == 0) { GameEnds(WhiteWins, r, GE_ENGINE1 + (cps != &first)); return; } GameEnds(BlackWins, r, GE_ENGINE1 + (cps != &first)); return; } else if (strncmp(message, "1/2", 3) == 0) { char *p, *q, *r = ""; p = strchr(message, '{'); if (p) { q = strchr(p, '}'); if (q) { *q = NULLCHAR; r = p + 1; } } GameEnds(GameIsDrawn, r, GE_ENGINE1 + (cps != &first)); return; } else if (strncmp(message, "White resign", 12) == 0) { GameEnds(BlackWins, "White resigns", GE_ENGINE1 + (cps != &first)); return; } else if (strncmp(message, "Black resign", 12) == 0) { GameEnds(WhiteWins, "Black resigns", GE_ENGINE1 + (cps != &first)); return; } else if (strncmp(message, "White matches", 13) == 0 || strncmp(message, "Black matches", 13) == 0 ) { /* [HGM] ignore GNUShogi noises */ return; } else if (strncmp(message, "White", 5) == 0 && message[5] != '(' && StrStr(message, "Black") == NULL) { GameEnds(WhiteWins, "White mates", GE_ENGINE1 + (cps != &first)); return; } else if (strncmp(message, "Black", 5) == 0 && message[5] != '(') { GameEnds(BlackWins, "Black mates", GE_ENGINE1 + (cps != &first)); return; } else if (strcmp(message, "resign") == 0 || strcmp(message, "computer resigns") == 0) { switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: GameEnds(WhiteWins, "Black resigns", GE_ENGINE); break; case MachinePlaysWhite: case IcsPlayingWhite: GameEnds(BlackWins, "White resigns", GE_ENGINE); break; case TwoMachinesPlay: if (cps->twoMachinesColor[0] == 'w') GameEnds(BlackWins, "White resigns", GE_ENGINE1 + (cps != &first)); else GameEnds(WhiteWins, "Black resigns", GE_ENGINE1 + (cps != &first)); break; default: /* can't happen */ break; } return; } else if (strncmp(message, "opponent mates", 14) == 0) { switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: GameEnds(WhiteWins, "White mates", GE_ENGINE); break; case MachinePlaysWhite: case IcsPlayingWhite: GameEnds(BlackWins, "Black mates", GE_ENGINE); break; case TwoMachinesPlay: if (cps->twoMachinesColor[0] == 'w') GameEnds(BlackWins, "Black mates", GE_ENGINE1 + (cps != &first)); else GameEnds(WhiteWins, "White mates", GE_ENGINE1 + (cps != &first)); break; default: /* can't happen */ break; } return; } else if (strncmp(message, "computer mates", 14) == 0) { switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: GameEnds(BlackWins, "Black mates", GE_ENGINE1); break; case MachinePlaysWhite: case IcsPlayingWhite: GameEnds(WhiteWins, "White mates", GE_ENGINE); break; case TwoMachinesPlay: if (cps->twoMachinesColor[0] == 'w') GameEnds(WhiteWins, "White mates", GE_ENGINE1 + (cps != &first)); else GameEnds(BlackWins, "Black mates", GE_ENGINE1 + (cps != &first)); break; default: /* can't happen */ break; } return; } else if (strncmp(message, "checkmate", 9) == 0) { if (WhiteOnMove(forwardMostMove)) { GameEnds(BlackWins, "Black mates", GE_ENGINE1 + (cps != &first)); } else { GameEnds(WhiteWins, "White mates", GE_ENGINE1 + (cps != &first)); } return; } else if (strstr(message, "Draw") != NULL || strstr(message, "game is a draw") != NULL) { GameEnds(GameIsDrawn, "Draw", GE_ENGINE1 + (cps != &first)); return; } else if (strstr(message, "offer") != NULL && strstr(message, "draw") != NULL) { #if ZIPPY if (appData.zippyPlay && first.initDone) { /* Relay offer to ICS */ SendToICS(ics_prefix); SendToICS("draw\n"); } #endif cps->offeredDraw = 2; /* valid until this engine moves twice */ if (gameMode == TwoMachinesPlay) { if (cps->other->offeredDraw) { GameEnds(GameIsDrawn, "Draw agreed", GE_XBOARD); /* [HGM] in two-machine mode we delay relaying draw offer */ /* until after we also have move, to see if it is really claim */ } } else if (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack) { if (userOfferedDraw) { DisplayInformation(_("Machine accepts your draw offer")); GameEnds(GameIsDrawn, "Draw agreed", GE_XBOARD); } else { DisplayInformation(_("Machine offers a draw\nSelect Action / Draw to agree")); } } } /* * Look for thinking output */ if ( appData.showThinking // [HGM] thinking: test all options that cause this output || !appData.hideThinkingFromHuman || appData.adjudicateLossThreshold != 0 || EngineOutputIsUp() ) { int plylev, mvleft, mvtot, curscore, time; char mvname[MOVE_LEN]; u64 nodes; // [DM] char plyext; int ignore = FALSE; int prefixHint = FALSE; mvname[0] = NULLCHAR; switch (gameMode) { case MachinePlaysBlack: case IcsPlayingBlack: if (WhiteOnMove(forwardMostMove)) prefixHint = TRUE; break; case MachinePlaysWhite: case IcsPlayingWhite: if (!WhiteOnMove(forwardMostMove)) prefixHint = TRUE; break; case AnalyzeMode: case AnalyzeFile: break; case IcsObserving: /* [DM] icsEngineAnalyze */ if (!appData.icsEngineAnalyze) ignore = TRUE; break; case TwoMachinesPlay: if ((cps->twoMachinesColor[0] == 'w') != WhiteOnMove(forwardMostMove)) { ignore = TRUE; } break; default: ignore = TRUE; break; } if (!ignore) { ChessProgramStats tempStats = programStats; // [HGM] info: filter out info lines buf1[0] = NULLCHAR; if (sscanf(message, "%d%c %d %d " u64Display " %[^\n]\n", &plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5) { if (plyext != ' ' && plyext != '\t') { time *= 100; } /* [AS] Negate score if machine is playing black and reporting absolute scores */ if( cps->scoreIsAbsolute && ( gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b' || gameMode == IcsPlayingBlack || // [HGM] also add other situations where engine should report black POV (gameMode == AnalyzeMode || gameMode == AnalyzeFile || gameMode == IcsObserving && appData.icsEngineAnalyze) && !WhiteOnMove(currentMove) ) ) { curscore = -curscore; } if(appData.pvSAN[cps==&second]) pv = PvToSAN(buf1); if(serverMoves && (time > 100 || time == 0 && plylev > 7)) { char buf[MSG_SIZ]; FILE *f; snprintf(buf, MSG_SIZ, "%s", appData.serverMovesName); buf[strlen(buf)-1] = gameMode == MachinePlaysWhite ? 'w' : gameMode == MachinePlaysBlack ? 'b' : cps->twoMachinesColor[0]; if(appData.debugMode) fprintf(debugFP, "write PV on file '%s'\n", buf); if(f = fopen(buf, "w")) { // export PV to applicable PV file fprintf(f, "%5.2f/%-2d %s", curscore/100., plylev, pv); fclose(f); } else DisplayError(_("failed writing PV"), 0); } tempStats.depth = plylev; tempStats.nodes = nodes; tempStats.time = time; tempStats.score = curscore; tempStats.got_only_move = 0; if(cps->nps >= 0) { /* [HGM] nps: use engine nodes or time to decrement clock */ int ticklen; if(cps->nps == 0) ticklen = 10*time; // use engine reported time else ticklen = (1000. * u64ToDouble(nodes)) / cps->nps; // convert node count to time if(WhiteOnMove(forwardMostMove) && (gameMode == MachinePlaysWhite || gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'w')) whiteTimeRemaining = timeRemaining[0][forwardMostMove] - ticklen; if(!WhiteOnMove(forwardMostMove) && (gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b')) blackTimeRemaining = timeRemaining[1][forwardMostMove] - ticklen; } /* Buffer overflow protection */ if (pv[0] != NULLCHAR) { if (strlen(pv) >= sizeof(tempStats.movelist) && appData.debugMode) { fprintf(debugFP, "PV is too long; using the first %u bytes.\n", (unsigned) sizeof(tempStats.movelist) - 1); } safeStrCpy( tempStats.movelist, pv, sizeof(tempStats.movelist)/sizeof(tempStats.movelist[0]) ); } else { sprintf(tempStats.movelist, " no PV\n"); } if (tempStats.seen_stat) { tempStats.ok_to_send = 1; } if (strchr(tempStats.movelist, '(') != NULL) { tempStats.line_is_book = 1; tempStats.nr_moves = 0; tempStats.moves_left = 0; } else { tempStats.line_is_book = 0; } if(tempStats.score != 0 || tempStats.nodes != 0 || tempStats.time != 0) programStats = tempStats; // [HGM] info: only set stats if genuine PV and not an info line SendProgramStatsToFrontend( cps, &tempStats ); /* [AS] Protect the thinkOutput buffer from overflow... this is only useful if buf1 hasn't overflowed first! */ snprintf(thinkOutput, sizeof(thinkOutput)/sizeof(thinkOutput[0]), "[%d]%c%+.2f %s%s", plylev, (gameMode == TwoMachinesPlay ? ToUpper(cps->twoMachinesColor[0]) : ' '), ((double) curscore) / 100.0, prefixHint ? lastHint : "", prefixHint ? " " : "" ); if( buf1[0] != NULLCHAR ) { unsigned max_len = sizeof(thinkOutput) - strlen(thinkOutput) - 1; if( strlen(pv) > max_len ) { if( appData.debugMode) { fprintf(debugFP,"PV is too long for thinkOutput, truncating.\n"); } pv[max_len+1] = '\0'; } strcat( thinkOutput, pv); } if (currentMove == forwardMostMove || gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { DisplayMove(currentMove - 1); } return; } else if ((p=StrStr(message, "(only move)")) != NULL) { /* crafty (9.25+) says "(only move) " * if there is only 1 legal move */ sscanf(p, "(only move) %s", buf1); snprintf(thinkOutput, sizeof(thinkOutput)/sizeof(thinkOutput[0]), "%s (only move)", buf1); sprintf(programStats.movelist, "%s (only move)", buf1); programStats.depth = 1; programStats.nr_moves = 1; programStats.moves_left = 1; programStats.nodes = 1; programStats.time = 1; programStats.got_only_move = 1; /* Not really, but we also use this member to mean "line isn't going to change" (Crafty isn't searching, so stats won't change) */ programStats.line_is_book = 1; SendProgramStatsToFrontend( cps, &programStats ); if (currentMove == forwardMostMove || gameMode==AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { DisplayMove(currentMove - 1); } return; } else if (sscanf(message,"stat01: %d " u64Display " %d %d %d %s", &time, &nodes, &plylev, &mvleft, &mvtot, mvname) >= 5) { /* The stat01: line is from Crafty (9.29+) in response to the "." command */ programStats.seen_stat = 1; cps->maybeThinking = TRUE; if (programStats.got_only_move || !appData.periodicUpdates) return; programStats.depth = plylev; programStats.time = time; programStats.nodes = nodes; programStats.moves_left = mvleft; programStats.nr_moves = mvtot; safeStrCpy(programStats.move_name, mvname, sizeof(programStats.move_name)/sizeof(programStats.move_name[0])); programStats.ok_to_send = 1; programStats.movelist[0] = '\0'; SendProgramStatsToFrontend( cps, &programStats ); return; } else if (strncmp(message,"++",2) == 0) { /* Crafty 9.29+ outputs this */ programStats.got_fail = 2; return; } else if (strncmp(message,"--",2) == 0) { /* Crafty 9.29+ outputs this */ programStats.got_fail = 1; return; } else if (thinkOutput[0] != NULLCHAR && strncmp(message, " ", 4) == 0) { unsigned message_len; p = message; while (*p && *p == ' ') p++; message_len = strlen( p ); /* [AS] Avoid buffer overflow */ if( sizeof(thinkOutput) - strlen(thinkOutput) - 1 > message_len ) { strcat(thinkOutput, " "); strcat(thinkOutput, p); } if( sizeof(programStats.movelist) - strlen(programStats.movelist) - 1 > message_len ) { strcat(programStats.movelist, " "); strcat(programStats.movelist, p); } if (currentMove == forwardMostMove || gameMode==AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { DisplayMove(currentMove - 1); } return; } } else { buf1[0] = NULLCHAR; if (sscanf(message, "%d%c %d %d " u64Display " %[^\n]\n", &plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5) { ChessProgramStats cpstats; if (plyext != ' ' && plyext != '\t') { time *= 100; } /* [AS] Negate score if machine is playing black and reporting absolute scores */ if( cps->scoreIsAbsolute && ((gameMode == MachinePlaysBlack) || (gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b')) ) { curscore = -curscore; } cpstats.depth = plylev; cpstats.nodes = nodes; cpstats.time = time; cpstats.score = curscore; cpstats.got_only_move = 0; cpstats.movelist[0] = '\0'; if (buf1[0] != NULLCHAR) { safeStrCpy( cpstats.movelist, buf1, sizeof(cpstats.movelist)/sizeof(cpstats.movelist[0]) ); } cpstats.ok_to_send = 0; cpstats.line_is_book = 0; cpstats.nr_moves = 0; cpstats.moves_left = 0; SendProgramStatsToFrontend( cps, &cpstats ); } } } } /* Parse a game score from the character string "game", and record it as the history of the current game. The game score is NOT assumed to start from the standard position. The display is not updated in any way. */ void ParseGameHistory (char *game) { ChessMove moveType; int fromX, fromY, toX, toY, boardIndex; char promoChar; char *p, *q; char buf[MSG_SIZ]; if (appData.debugMode) fprintf(debugFP, "Parsing game history: %s\n", game); if (gameInfo.event == NULL) gameInfo.event = StrSave("ICS game"); gameInfo.site = StrSave(appData.icsHost); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); /* Parse out names of players */ while (*game == ' ') game++; p = buf; while (*game != ' ') *p++ = *game++; *p = NULLCHAR; gameInfo.white = StrSave(buf); while (*game == ' ') game++; p = buf; while (*game != ' ' && *game != '\n') *p++ = *game++; *p = NULLCHAR; gameInfo.black = StrSave(buf); /* Parse moves */ boardIndex = blackPlaysFirst ? 1 : 0; yynewstr(game); for (;;) { yyboardindex = boardIndex; moveType = (ChessMove) Myylex(); switch (moveType) { case IllegalMove: /* maybe suicide chess, etc. */ if (appData.debugMode) { fprintf(debugFP, "Illegal move from ICS: '%s'\n", yy_text); fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth); setbuf(debugFP, NULL); } case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case NormalMove: case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: /* PUSH Fabien */ case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: /* POP Fabien */ fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = currentMoveString[4]; break; case WhiteDrop: case BlackDrop: if(currentMoveString[0] == '@') continue; // no null moves in ICS mode! fromX = moveType == WhiteDrop ? (int) CharToPiece(ToUpper(currentMoveString[0])) : (int) CharToPiece(ToLower(currentMoveString[0])); fromY = DROP_RANK; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = NULLCHAR; break; case AmbiguousMove: /* bug? */ snprintf(buf, MSG_SIZ, _("Ambiguous move in ICS output: \"%s\""), yy_text); if (appData.debugMode) { fprintf(debugFP, "Ambiguous move from ICS: '%s'\n", yy_text); fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth); setbuf(debugFP, NULL); } DisplayError(buf, 0); return; case ImpossibleMove: /* bug? */ snprintf(buf, MSG_SIZ, _("Illegal move in ICS output: \"%s\""), yy_text); if (appData.debugMode) { fprintf(debugFP, "Impossible move from ICS: '%s'\n", yy_text); fprintf(debugFP, "board L=%d, R=%d, H=%d, holdings=%d\n", BOARD_LEFT, BOARD_RGHT, BOARD_HEIGHT, gameInfo.holdingsWidth); setbuf(debugFP, NULL); } DisplayError(buf, 0); return; case EndOfFile: if (boardIndex < backwardMostMove) { /* Oops, gap. How did that happen? */ DisplayError(_("Gap in move list"), 0); return; } backwardMostMove = blackPlaysFirst ? 1 : 0; if (boardIndex > forwardMostMove) { forwardMostMove = boardIndex; } return; case ElapsedTime: if (boardIndex > (blackPlaysFirst ? 1 : 0)) { strcat(parseList[boardIndex-1], " "); strcat(parseList[boardIndex-1], yy_text); } continue; case Comment: case PGNTag: case NAG: default: /* ignore */ continue; case WhiteWins: case BlackWins: case GameIsDrawn: case GameUnfinished: if (gameMode == IcsExamining) { if (boardIndex < backwardMostMove) { /* Oops, gap. How did that happen? */ return; } backwardMostMove = blackPlaysFirst ? 1 : 0; return; } gameInfo.result = moveType; p = strchr(yy_text, '{'); if (p == NULL) p = strchr(yy_text, '('); if (p == NULL) { p = yy_text; if (p[0] == '0' || p[0] == '1' || p[0] == '*') p = ""; } else { q = strchr(p, *p == '{' ? '}' : ')'); if (q != NULL) *q = NULLCHAR; p++; } while(q = strchr(p, '\n')) *q = ' '; // [HGM] crush linefeeds in result message gameInfo.resultDetails = StrSave(p); continue; } if (boardIndex >= forwardMostMove && !(gameMode == IcsObserving && ics_gamenum == -1)) { backwardMostMove = blackPlaysFirst ? 1 : 0; return; } (void) CoordsToAlgebraic(boards[boardIndex], PosFlags(boardIndex), fromY, fromX, toY, toX, promoChar, parseList[boardIndex]); CopyBoard(boards[boardIndex + 1], boards[boardIndex]); /* currentMoveString is set as a side-effect of yylex */ safeStrCpy(moveList[boardIndex], currentMoveString, sizeof(moveList[boardIndex])/sizeof(moveList[boardIndex][0])); strcat(moveList[boardIndex], "\n"); boardIndex++; ApplyMove(fromX, fromY, toX, toY, promoChar, boards[boardIndex]); switch (MateTest(boards[boardIndex], PosFlags(boardIndex)) ) { case MT_NONE: case MT_STALEMATE: default: break; case MT_CHECK: if(gameInfo.variant != VariantShogi) strcat(parseList[boardIndex - 1], "+"); break; case MT_CHECKMATE: case MT_STAINMATE: strcat(parseList[boardIndex - 1], "#"); break; } } } /* Apply a move to the given board */ void ApplyMove (int fromX, int fromY, int toX, int toY, int promoChar, Board board) { ChessSquare captured = board[toY][toX], piece, king; int p, oldEP = EP_NONE, berolina = 0; int promoRank = gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand ? 3 : 1; /* [HGM] compute & store e.p. status and castling rights for new position */ /* we can always do that 'in place', now pointers to these rights are passed to ApplyMove */ if(gameInfo.variant == VariantBerolina) berolina = EP_BEROLIN_A; oldEP = (signed char)board[EP_STATUS]; board[EP_STATUS] = EP_NONE; if (fromY == DROP_RANK) { /* must be first */ if(fromX == EmptySquare) { // [HGM] pass: empty drop encodes null move; nothing to change. board[EP_STATUS] = EP_CAPTURE; // null move considered irreversible return; } piece = board[toY][toX] = (ChessSquare) fromX; } else { int i; if( board[toY][toX] != EmptySquare ) board[EP_STATUS] = EP_CAPTURE; if( board[fromY][fromX] == WhiteLance || board[fromY][fromX] == BlackLance ) { if( gameInfo.variant != VariantSuper && gameInfo.variant != VariantShogi ) board[EP_STATUS] = EP_PAWN_MOVE; // Lance is Pawn-like in most variants } else if( board[fromY][fromX] == WhitePawn ) { if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers board[EP_STATUS] = EP_PAWN_MOVE; if( toY-fromY==2) { if(toX>BOARD_LEFT && board[toY][toX-1] == BlackPawn && gameInfo.variant != VariantBerolina || toX < fromX) board[EP_STATUS] = toX | berolina; if(toX fromX) board[EP_STATUS] = toX; } } else if( board[fromY][fromX] == BlackPawn ) { if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers board[EP_STATUS] = EP_PAWN_MOVE; if( toY-fromY== -2) { if(toX>BOARD_LEFT && board[toY][toX-1] == WhitePawn && gameInfo.variant != VariantBerolina || toX < fromX) board[EP_STATUS] = toX | berolina; if(toX fromX) board[EP_STATUS] = toX; } } for(i=0; i fromX) != (piece == WhiteRook)) { board[0][BOARD_RGHT-2] = WhiteKing; board[0][BOARD_RGHT-3] = WhiteRook; } else { board[0][BOARD_LEFT+2] = WhiteKing; board[0][BOARD_LEFT+3] = WhiteRook; } } else if (board[fromY][fromX] == BlackKing && board[toY][toX] == BlackRook || board[fromY][fromX] == BlackRook && board[toY][toX] == BlackKing) { board[fromY][fromX] = EmptySquare; board[toY][toX] = EmptySquare; if((toX > fromX) != (piece == BlackRook)) { board[BOARD_HEIGHT-1][BOARD_RGHT-2] = BlackKing; board[BOARD_HEIGHT-1][BOARD_RGHT-3] = BlackRook; } else { board[BOARD_HEIGHT-1][BOARD_LEFT+2] = BlackKing; board[BOARD_HEIGHT-1][BOARD_LEFT+3] = BlackRook; } /* End of code added by Tord */ } else if (board[fromY][fromX] == king && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX > fromX+1) { board[fromY][fromX] = EmptySquare; board[toY][toX] = king; board[toY][toX-1] = board[fromY][BOARD_RGHT-1]; board[fromY][BOARD_RGHT-1] = EmptySquare; } else if (board[fromY][fromX] == king && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX < fromX-1) { board[fromY][fromX] = EmptySquare; board[toY][toX] = king; board[toY][toX+1] = board[fromY][BOARD_LEFT]; board[fromY][BOARD_LEFT] = EmptySquare; } else if ((board[fromY][fromX] == WhitePawn && gameInfo.variant != VariantXiangqi || board[fromY][fromX] == WhiteLance && gameInfo.variant != VariantSuper && gameInfo.variant != VariantShogi) && toY >= BOARD_HEIGHT-promoRank && promoChar // defaulting to Q is done elsewhere ) { /* white pawn promotion */ board[toY][toX] = CharToPiece(ToUpper(promoChar)); if(board[toY][toX] < WhiteCannon && PieceToChar(PROMOTED board[toY][toX]) == '~') /* [HGM] use shadow piece (if available) */ board[toY][toX] = (ChessSquare) (PROMOTED board[toY][toX]); board[fromY][fromX] = EmptySquare; } else if ((fromY >= BOARD_HEIGHT>>1) && (oldEP == toX || oldEP == EP_UNKNOWN || appData.testLegality) && (toX != fromX) && gameInfo.variant != VariantXiangqi && gameInfo.variant != VariantBerolina && (board[fromY][fromX] == WhitePawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; board[toY][toX] = WhitePawn; captured = board[toY - 1][toX]; board[toY - 1][toX] = EmptySquare; } else if ((fromY == BOARD_HEIGHT-4) && (toX == fromX) && gameInfo.variant == VariantBerolina && (board[fromY][fromX] == WhitePawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; board[toY][toX] = WhitePawn; if(oldEP & EP_BEROLIN_A) { captured = board[fromY][fromX-1]; board[fromY][fromX-1] = EmptySquare; }else{ captured = board[fromY][fromX+1]; board[fromY][fromX+1] = EmptySquare; } } else if (board[fromY][fromX] == king && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX > fromX+1) { board[fromY][fromX] = EmptySquare; board[toY][toX] = king; board[toY][toX-1] = board[fromY][BOARD_RGHT-1]; board[fromY][BOARD_RGHT-1] = EmptySquare; } else if (board[fromY][fromX] == king && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1 // [HGM] cylinder */ && toY == fromY && toX < fromX-1) { board[fromY][fromX] = EmptySquare; board[toY][toX] = king; board[toY][toX+1] = board[fromY][BOARD_LEFT]; board[fromY][BOARD_LEFT] = EmptySquare; } else if (fromY == 7 && fromX == 3 && board[fromY][fromX] == BlackKing && toY == 7 && toX == 5) { board[fromY][fromX] = EmptySquare; board[toY][toX] = BlackKing; board[fromY][7] = EmptySquare; board[toY][4] = BlackRook; } else if (fromY == 7 && fromX == 3 && board[fromY][fromX] == BlackKing && toY == 7 && toX == 1) { board[fromY][fromX] = EmptySquare; board[toY][toX] = BlackKing; board[fromY][0] = EmptySquare; board[toY][2] = BlackRook; } else if ((board[fromY][fromX] == BlackPawn && gameInfo.variant != VariantXiangqi || board[fromY][fromX] == BlackLance && gameInfo.variant != VariantSuper && gameInfo.variant != VariantShogi) && toY < promoRank && promoChar ) { /* black pawn promotion */ board[toY][toX] = CharToPiece(ToLower(promoChar)); if(board[toY][toX] < BlackCannon && PieceToChar(PROMOTED board[toY][toX]) == '~') /* [HGM] use shadow piece (if available) */ board[toY][toX] = (ChessSquare) (PROMOTED board[toY][toX]); board[fromY][fromX] = EmptySquare; } else if ((fromY < BOARD_HEIGHT>>1) && (oldEP == toX || oldEP == EP_UNKNOWN || appData.testLegality) && (toX != fromX) && gameInfo.variant != VariantXiangqi && gameInfo.variant != VariantBerolina && (board[fromY][fromX] == BlackPawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; board[toY][toX] = BlackPawn; captured = board[toY + 1][toX]; board[toY + 1][toX] = EmptySquare; } else if ((fromY == 3) && (toX == fromX) && gameInfo.variant == VariantBerolina && (board[fromY][fromX] == BlackPawn) && (board[toY][toX] == EmptySquare)) { board[fromY][fromX] = EmptySquare; board[toY][toX] = BlackPawn; if(oldEP & EP_BEROLIN_A) { captured = board[fromY][fromX-1]; board[fromY][fromX-1] = EmptySquare; }else{ captured = board[fromY][fromX+1]; board[fromY][fromX+1] = EmptySquare; } } else { board[toY][toX] = board[fromY][fromX]; board[fromY][fromX] = EmptySquare; } } if (gameInfo.holdingsWidth != 0) { /* !!A lot more code needs to be written to support holdings */ /* [HGM] OK, so I have written it. Holdings are stored in the */ /* penultimate board files, so they are automaticlly stored */ /* in the game history. */ if (fromY == DROP_RANK || gameInfo.variant == VariantSChess && promoChar && piece != WhitePawn && piece != BlackPawn) { /* Delete from holdings, by decreasing count */ /* and erasing image if necessary */ p = fromY == DROP_RANK ? (int) fromX : CharToPiece(piece > BlackPawn ? ToLower(promoChar) : ToUpper(promoChar)); if(p < (int) BlackPawn) { /* white drop */ p -= (int)WhitePawn; p = PieceToNumber((ChessSquare)p); if(p >= gameInfo.holdingsSize) p = 0; if(--board[p][BOARD_WIDTH-2] <= 0) board[p][BOARD_WIDTH-1] = EmptySquare; if((int)board[p][BOARD_WIDTH-2] < 0) board[p][BOARD_WIDTH-2] = 0; } else { /* black drop */ p -= (int)BlackPawn; p = PieceToNumber((ChessSquare)p); if(p >= gameInfo.holdingsSize) p = 0; if(--board[BOARD_HEIGHT-1-p][1] <= 0) board[BOARD_HEIGHT-1-p][0] = EmptySquare; if((int)board[BOARD_HEIGHT-1-p][1] < 0) board[BOARD_HEIGHT-1-p][1] = 0; } } if (captured != EmptySquare && gameInfo.holdingsSize > 0 && gameInfo.variant != VariantBughouse && gameInfo.variant != VariantSChess ) { /* [HGM] holdings: Add to holdings, if holdings exist */ if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) { // [HGM] superchess: suppress flipping color of captured pieces by reverse pre-flip captured = (int) captured >= (int) BlackPawn ? BLACK_TO_WHITE captured : WHITE_TO_BLACK captured; } p = (int) captured; if (p >= (int) BlackPawn) { p -= (int)BlackPawn; if(gameInfo.variant == VariantShogi && DEMOTED p >= 0) { /* in Shogi restore piece to its original first */ captured = (ChessSquare) (DEMOTED captured); p = DEMOTED p; } p = PieceToNumber((ChessSquare)p); if(p >= gameInfo.holdingsSize) { p = 0; captured = BlackPawn; } board[p][BOARD_WIDTH-2]++; board[p][BOARD_WIDTH-1] = BLACK_TO_WHITE captured; } else { p -= (int)WhitePawn; if(gameInfo.variant == VariantShogi && DEMOTED p >= 0) { captured = (ChessSquare) (DEMOTED captured); p = DEMOTED p; } p = PieceToNumber((ChessSquare)p); if(p >= gameInfo.holdingsSize) { p = 0; captured = WhitePawn; } board[BOARD_HEIGHT-1-p][1]++; board[BOARD_HEIGHT-1-p][0] = WHITE_TO_BLACK captured; } } } else if (gameInfo.variant == VariantAtomic) { if (captured != EmptySquare) { int y, x; for (y = toY-1; y <= toY+1; y++) { for (x = toX-1; x <= toX+1; x++) { if (y >= 0 && y < BOARD_HEIGHT && x >= BOARD_LEFT && x < BOARD_RGHT && board[y][x] != WhitePawn && board[y][x] != BlackPawn) { board[y][x] = EmptySquare; } } } board[toY][toX] = EmptySquare; } } if(gameInfo.variant == VariantSChess && promoChar != NULLCHAR && promoChar != '=' && piece != WhitePawn && piece != BlackPawn) { board[fromY][fromX] = CharToPiece(piece < BlackPawn ? ToUpper(promoChar) : ToLower(promoChar)); // S-Chess gating } else if(promoChar == '+') { /* [HGM] Shogi-style promotions, to piece implied by original (Might overwrite ordinary Pawn promotion) */ board[toY][toX] = (ChessSquare) (PROMOTED piece); } else if(!appData.testLegality && promoChar != NULLCHAR && promoChar != '=') { // without legality testing, unconditionally believe promoChar ChessSquare newPiece = CharToPiece(piece < BlackPawn ? ToUpper(promoChar) : ToLower(promoChar)); if((newPiece <= WhiteMan || newPiece >= BlackPawn && newPiece <= BlackMan) // unpromoted piece specified && pieceToChar[PROMOTED newPiece] == '~') newPiece = PROMOTED newPiece; // but promoted version available board[toY][toX] = newPiece; } if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) && promoChar != NULLCHAR && gameInfo.holdingsSize) { // [HGM] superchess: take promotion piece out of holdings int k = PieceToNumber(CharToPiece(ToUpper(promoChar))); if((int)piece < (int)BlackPawn) { // determine stm from piece color if(!--board[k][BOARD_WIDTH-2]) board[k][BOARD_WIDTH-1] = EmptySquare; } else { if(!--board[BOARD_HEIGHT-1-k][1]) board[BOARD_HEIGHT-1-k][0] = EmptySquare; } } } /* Updates forwardMostMove */ void MakeMove (int fromX, int fromY, int toX, int toY, int promoChar) { // forwardMostMove++; // [HGM] bare: moved downstream (void) CoordsToAlgebraic(boards[forwardMostMove], PosFlags(forwardMostMove), fromY, fromX, toY, toX, promoChar, parseList[forwardMostMove]); if(serverMoves != NULL) { /* [HGM] write moves on file for broadcasting (should be separate routine, really) */ int timeLeft; static int lastLoadFlag=0; int king, piece; piece = boards[forwardMostMove][fromY][fromX]; king = piece < (int) BlackPawn ? WhiteKing : BlackKing; if(gameInfo.variant == VariantKnightmate) king += (int) WhiteUnicorn - (int) WhiteKing; if(forwardMostMove == 0) { if(gameMode == MachinePlaysBlack || gameMode == BeginningOfGame) fprintf(serverMoves, "%s;", UserName()); else if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b') fprintf(serverMoves, "%s;", second.tidy); fprintf(serverMoves, "%s;", first.tidy); if(gameMode == MachinePlaysWhite) fprintf(serverMoves, "%s;", UserName()); else if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'w') fprintf(serverMoves, "%s;", second.tidy); } else fprintf(serverMoves, loadFlag|lastLoadFlag ? ":" : ";"); lastLoadFlag = loadFlag; // print base move fprintf(serverMoves, "%c%c:%c%c", AAA+fromX, ONE+fromY, AAA+toX, ONE+toY); // print castling suffix if( toY == fromY && piece == king ) { if(toX-fromX > 1) fprintf(serverMoves, ":%c%c:%c%c", AAA+BOARD_RGHT-1, ONE+fromY, AAA+toX-1,ONE+toY); if(fromX-toX >1) fprintf(serverMoves, ":%c%c:%c%c", AAA+BOARD_LEFT, ONE+fromY, AAA+toX+1,ONE+toY); } // e.p. suffix if( (boards[forwardMostMove][fromY][fromX] == WhitePawn || boards[forwardMostMove][fromY][fromX] == BlackPawn ) && boards[forwardMostMove][toY][toX] == EmptySquare && fromX != toX && fromY != toY) fprintf(serverMoves, ":%c%c:%c%c", AAA+fromX, ONE+fromY, AAA+toX, ONE+fromY); // promotion suffix if(promoChar != NULLCHAR) { if(fromY == 0 || fromY == BOARD_HEIGHT-1) fprintf(serverMoves, ":%c%c:%c%c", WhiteOnMove(forwardMostMove) ? 'w' : 'b', ToLower(promoChar), AAA+fromX, ONE+fromY); // Seirawan gating else fprintf(serverMoves, ":%c:%c%c", ToLower(promoChar), AAA+toX, ONE+toY); } if(!loadFlag) { char buf[MOVE_LEN*2], *p; int len; fprintf(serverMoves, "/%d/%d", pvInfoList[forwardMostMove].depth, pvInfoList[forwardMostMove].score); if(forwardMostMove+1 & 1) timeLeft = whiteTimeRemaining/1000; else timeLeft = blackTimeRemaining/1000; fprintf(serverMoves, "/%d", timeLeft); strncpy(buf, parseList[forwardMostMove], MOVE_LEN*2); if(p = strchr(buf, '/')) *p = NULLCHAR; else if(p = strchr(buf, '=')) *p = NULLCHAR; len = strlen(buf); if(len > 1 && buf[len-2] != '-') buf[len-2] = NULLCHAR; // strip to-square fprintf(serverMoves, "/%s", buf); } fflush(serverMoves); } if (forwardMostMove+1 > framePtr) { // [HGM] vari: do not run into saved variations.. GameEnds(GameUnfinished, _("Game too long; increase MAX_MOVES and recompile"), GE_XBOARD); return; } UnLoadPV(); // [HGM] pv: if we are looking at a PV, abort this if (commentList[forwardMostMove+1] != NULL) { free(commentList[forwardMostMove+1]); commentList[forwardMostMove+1] = NULL; } CopyBoard(boards[forwardMostMove+1], boards[forwardMostMove]); ApplyMove(fromX, fromY, toX, toY, promoChar, boards[forwardMostMove+1]); // forwardMostMove++; // [HGM] bare: moved to after ApplyMove, to make sure clock interrupt finds complete board SwitchClocks(forwardMostMove+1); // [HGM] race: incrementing move nr inside timeRemaining[0][forwardMostMove] = whiteTimeRemaining; timeRemaining[1][forwardMostMove] = blackTimeRemaining; adjustedClock = FALSE; gameInfo.result = GameUnfinished; if (gameInfo.resultDetails != NULL) { free(gameInfo.resultDetails); gameInfo.resultDetails = NULL; } CoordsToComputerAlgebraic(fromY, fromX, toY, toX, promoChar, moveList[forwardMostMove - 1]); switch (MateTest(boards[forwardMostMove], PosFlags(forwardMostMove)) ) { case MT_NONE: case MT_STALEMATE: default: break; case MT_CHECK: if(gameInfo.variant != VariantShogi) strcat(parseList[forwardMostMove - 1], "+"); break; case MT_CHECKMATE: case MT_STAINMATE: strcat(parseList[forwardMostMove - 1], "#"); break; } } /* Updates currentMove if not pausing */ void ShowMove (int fromX, int fromY, int toX, int toY) { int instant = (gameMode == PlayFromGameFile) ? (matchMode || (appData.timeDelay == 0 && !pausing)) : pausing; if(appData.noGUI) return; if (!pausing || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) { if (!instant) { if (forwardMostMove == currentMove + 1) { AnimateMove(boards[forwardMostMove - 1], fromX, fromY, toX, toY); } } currentMove = forwardMostMove; } if (instant) return; DisplayMove(currentMove - 1); if (!pausing || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) { if (appData.highlightLastMove) { // [HGM] moved to after DrawPosition, as with arrow it could redraw old board SetHighlights(fromX, fromY, toX, toY); } } DrawPosition(FALSE, boards[currentMove]); DisplayBothClocks(); HistorySet(parseList,backwardMostMove,forwardMostMove,currentMove-1); } void SendEgtPath (ChessProgramState *cps) { /* [HGM] EGT: match formats given in feature with those given by user, and send info for each match */ char buf[MSG_SIZ], name[MSG_SIZ], *p; if((p = cps->egtFormats) == NULL || appData.egtFormats == NULL) return; while(*p) { char c, *q = name+1, *r, *s; name[0] = ','; // extract next format name from feature and copy with prefixed ',' while(*p && *p != ',') *q++ = *p++; *q++ = ':'; *q = 0; if( appData.defaultPathEGTB && appData.defaultPathEGTB[0] && strcmp(name, ",nalimov:") == 0 ) { // take nalimov path from the menu-changeable option first, if it is defined snprintf(buf, MSG_SIZ, "egtpath nalimov %s\n", appData.defaultPathEGTB); SendToProgram(buf,cps); // send egtbpath command for nalimov } else if( (s = StrStr(appData.egtFormats, name+1)) == appData.egtFormats || (s = StrStr(appData.egtFormats, name)) != NULL) { // format name occurs amongst user-supplied formats, at beginning or immediately after comma s = r = StrStr(s, ":") + 1; // beginning of path info while(*r && *r != ',') r++; // path info is everything upto next ';' or end of string c = *r; *r = 0; // temporarily null-terminate path info *--q = 0; // strip of trailig ':' from name snprintf(buf, MSG_SIZ, "egtpath %s %s\n", name+1, s); *r = c; SendToProgram(buf,cps); // send egtbpath command for this format } if(*p == ',') p++; // read away comma to position for next format name } } static int NonStandardBoardSize () { /* [HGM] Awkward testing. Should really be a table */ int overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0; if( gameInfo.variant == VariantXiangqi ) overruled = gameInfo.boardWidth != 9 || gameInfo.boardHeight != 10 || gameInfo.holdingsSize != 0; if( gameInfo.variant == VariantShogi ) overruled = gameInfo.boardWidth != 9 || gameInfo.boardHeight != 9 || gameInfo.holdingsSize != 7; if( gameInfo.variant == VariantBughouse || gameInfo.variant == VariantCrazyhouse ) overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 5; if( gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantCapaRandom || gameInfo.variant == VariantGothic || gameInfo.variant == VariantFalcon || gameInfo.variant == VariantJanus ) overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0; if( gameInfo.variant == VariantCourier ) overruled = gameInfo.boardWidth != 12 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0; if( gameInfo.variant == VariantSuper ) overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 8; if( gameInfo.variant == VariantGreat ) overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 8; if( gameInfo.variant == VariantSChess ) overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 7; if( gameInfo.variant == VariantGrand ) overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 10 || gameInfo.holdingsSize != 7; return overruled; } void InitChessProgram (ChessProgramState *cps, int setup) /* setup needed to setup FRC opening position */ { char buf[MSG_SIZ], b[MSG_SIZ]; if (appData.noChessProgram) return; hintRequested = FALSE; bookRequested = FALSE; ParseFeatures(appData.features[cps == &second], cps); // [HGM] allow user to overrule features /* [HGM] some new WB protocol commands to configure engine are sent now, if engine supports them */ /* moved to before sending initstring in 4.3.15, so Polyglot can delay UCI 'isready' to recepton of 'new' */ if(cps->memSize) { /* [HGM] memory */ snprintf(buf, MSG_SIZ, "memory %d\n", appData.defaultHashSize + appData.defaultCacheSizeEGTB); SendToProgram(buf, cps); } SendEgtPath(cps); /* [HGM] EGT */ if(cps->maxCores) { /* [HGM] SMP: (protocol specified must be last settings command before new!) */ snprintf(buf, MSG_SIZ, "cores %d\n", appData.smpCores); SendToProgram(buf, cps); } SendToProgram(cps->initString, cps); if (gameInfo.variant != VariantNormal && gameInfo.variant != VariantLoadable /* [HGM] also send variant if board size non-standard */ || gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0 ) { char *v = VariantName(gameInfo.variant); if (cps->protocolVersion != 1 && StrStr(cps->variants, v) == NULL) { /* [HGM] in protocol 1 we have to assume all variants valid */ snprintf(buf, MSG_SIZ, _("Variant %s not supported by %s"), v, cps->tidy); DisplayFatalError(buf, 0, 1); return; } if(NonStandardBoardSize()) { /* [HGM] make prefix for non-standard board size. */ snprintf(b, MSG_SIZ, "%dx%d+%d_%s", gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, VariantName(gameInfo.variant)); // cook up sized variant name /* [HGM] varsize: try first if this defiant size variant is specifically known */ if(StrStr(cps->variants, b) == NULL) { // specific sized variant not known, check if general sizing allowed if (cps->protocolVersion != 1) { // for protocol 1 we cannot check and hope for the best if(StrStr(cps->variants, "boardsize") == NULL) { snprintf(buf, MSG_SIZ, "Board size %dx%d+%d not supported by %s", gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, cps->tidy); DisplayFatalError(buf, 0, 1); return; } /* [HGM] here we really should compare with the maximum supported board size */ } } } else snprintf(b, MSG_SIZ,"%s", VariantName(gameInfo.variant)); snprintf(buf, MSG_SIZ, "variant %s\n", b); SendToProgram(buf, cps); } currentlyInitializedVariant = gameInfo.variant; /* [HGM] send opening position in FRC to first engine */ if(setup) { SendToProgram("force\n", cps); SendBoard(cps, 0); /* engine is now in force mode! Set flag to wake it up after first move. */ setboardSpoiledMachineBlack = 1; } if (cps->sendICS) { snprintf(buf, sizeof(buf), "ics %s\n", appData.icsActive ? appData.icsHost : "-"); SendToProgram(buf, cps); } cps->maybeThinking = FALSE; cps->offeredDraw = 0; if (!appData.icsActive) { SendTimeControl(cps, movesPerSession, timeControl, timeIncrement, appData.searchDepth, searchTime); } if (appData.showThinking // [HGM] thinking: four options require thinking output to be sent || !appData.hideThinkingFromHuman || appData.adjudicateLossThreshold != 0 || EngineOutputIsUp() ) { SendToProgram("post\n", cps); } SendToProgram("hard\n", cps); if (!appData.ponderNextMove) { /* Warning: "easy" is a toggle in GNU Chess, so don't send it without being sure what state we are in first. "hard" is not a toggle, so that one is OK. */ SendToProgram("easy\n", cps); } if (cps->usePing) { snprintf(buf, MSG_SIZ, "ping %d\n", ++cps->lastPing); SendToProgram(buf, cps); } cps->initDone = TRUE; ClearEngineOutputPane(cps == &second); } void ResendOptions (ChessProgramState *cps) { // send the stored value of the options int i; char buf[MSG_SIZ]; Option *opt = cps->option; for(i=0; inrOptions; i++, opt++) { switch(opt->type) { case Spin: case Slider: case CheckBox: snprintf(buf, MSG_SIZ, "option %s=%d\n", opt->name, opt->value); break; case ComboBox: snprintf(buf, MSG_SIZ, "option %s=%s\n", opt->name, opt->choice[opt->value]); break; default: snprintf(buf, MSG_SIZ, "option %s=%s\n", opt->name, opt->textValue); break; case Button: case SaveButton: continue; } SendToProgram(buf, cps); } } void StartChessProgram (ChessProgramState *cps) { char buf[MSG_SIZ]; int err; if (appData.noChessProgram) return; cps->initDone = FALSE; if (strcmp(cps->host, "localhost") == 0) { err = StartChildProcess(cps->program, cps->dir, &cps->pr); } else if (*appData.remoteShell == NULLCHAR) { err = OpenRcmd(cps->host, appData.remoteUser, cps->program, &cps->pr); } else { if (*appData.remoteUser == NULLCHAR) { snprintf(buf, sizeof(buf), "%s %s %s", appData.remoteShell, cps->host, cps->program); } else { snprintf(buf, sizeof(buf), "%s %s -l %s %s", appData.remoteShell, cps->host, appData.remoteUser, cps->program); } err = StartChildProcess(buf, "", &cps->pr); } if (err != 0) { snprintf(buf, MSG_SIZ, _("Startup failure on '%s'"), cps->program); DisplayError(buf, err); // [HGM] bit of a rough kludge: ignore failure, (which XBoard would do anyway), and let I/O discover it if(cps != &first) return; appData.noChessProgram = TRUE; ThawUI(); SetNCPMode(); // DisplayFatalError(buf, err, 1); // cps->pr = NoProc; // cps->isr = NULL; return; } cps->isr = AddInputSource(cps->pr, TRUE, ReceiveFromProgram, cps); if (cps->protocolVersion > 1) { snprintf(buf, MSG_SIZ, "xboard\nprotover %d\n", cps->protocolVersion); if(!cps->reload) { // do not clear options when reloading because of -xreuse cps->nrOptions = 0; // [HGM] options: clear all engine-specific options cps->comboCnt = 0; // and values of combo boxes } SendToProgram(buf, cps); if(cps->reload) ResendOptions(cps); } else { SendToProgram("xboard\n", cps); } } void TwoMachinesEventIfReady P((void)) { static int curMess = 0; if (first.lastPing != first.lastPong) { if(curMess != 1) DisplayMessage("", _("Waiting for first chess program")); curMess = 1; ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); // [HGM] fast: lowered from 1000 return; } if (second.lastPing != second.lastPong) { if(curMess != 2) DisplayMessage("", _("Waiting for second chess program")); curMess = 2; ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); // [HGM] fast: lowered from 1000 return; } DisplayMessage("", ""); curMess = 0; TwoMachinesEvent(); } char * MakeName (char *template) { time_t clock; struct tm *tm; static char buf[MSG_SIZ]; char *p = buf; int i; clock = time((time_t *)NULL); tm = localtime(&clock); while(*p++ = *template++) if(p[-1] == '%') { switch(*template++) { case 0: *p = 0; return buf; case 'Y': i = tm->tm_year+1900; break; case 'y': i = tm->tm_year-100; break; case 'M': i = tm->tm_mon+1; break; case 'd': i = tm->tm_mday; break; case 'h': i = tm->tm_hour; break; case 'm': i = tm->tm_min; break; case 's': i = tm->tm_sec; break; default: i = 0; } snprintf(p-1, MSG_SIZ-10 - (p - buf), "%02d", i); p += strlen(p); } return buf; } int CountPlayers (char *p) { int n = 0; while(p = strchr(p, '\n')) p++, n++; // count participants return n; } FILE * WriteTourneyFile (char *results, FILE *f) { // write tournament parameters on tourneyFile; on success return the stream pointer for closing if(f == NULL) f = fopen(appData.tourneyFile, "w"); if(f == NULL) DisplayError(_("Could not write on tourney file"), 0); else { // create a file with tournament description fprintf(f, "-participants {%s}\n", appData.participants); fprintf(f, "-seedBase %d\n", appData.seedBase); fprintf(f, "-tourneyType %d\n", appData.tourneyType); fprintf(f, "-tourneyCycles %d\n", appData.tourneyCycles); fprintf(f, "-defaultMatchGames %d\n", appData.defaultMatchGames); fprintf(f, "-syncAfterRound %s\n", appData.roundSync ? "true" : "false"); fprintf(f, "-syncAfterCycle %s\n", appData.cycleSync ? "true" : "false"); fprintf(f, "-saveGameFile \"%s\"\n", appData.saveGameFile); fprintf(f, "-loadGameFile \"%s\"\n", appData.loadGameFile); fprintf(f, "-loadGameIndex %d\n", appData.loadGameIndex); fprintf(f, "-loadPositionFile \"%s\"\n", appData.loadPositionFile); fprintf(f, "-loadPositionIndex %d\n", appData.loadPositionIndex); fprintf(f, "-rewindIndex %d\n", appData.rewindIndex); fprintf(f, "-usePolyglotBook %s\n", appData.usePolyglotBook ? "true" : "false"); fprintf(f, "-polyglotBook \"%s\"\n", appData.polyglotBook); fprintf(f, "-bookDepth %d\n", appData.bookDepth); fprintf(f, "-bookVariation %d\n", appData.bookStrength); fprintf(f, "-discourageOwnBooks %s\n", appData.defNoBook ? "true" : "false"); fprintf(f, "-defaultHashSize %d\n", appData.defaultHashSize); fprintf(f, "-defaultCacheSizeEGTB %d\n", appData.defaultCacheSizeEGTB); fprintf(f, "-ponderNextMove %s\n", appData.ponderNextMove ? "true" : "false"); fprintf(f, "-smpCores %d\n", appData.smpCores); if(searchTime > 0) fprintf(f, "-searchTime \"%d:%02d\"\n", searchTime/60, searchTime%60); else { fprintf(f, "-mps %d\n", appData.movesPerSession); fprintf(f, "-tc %s\n", appData.timeControl); fprintf(f, "-inc %.2f\n", appData.timeIncrement); } fprintf(f, "-results \"%s\"\n", results); } return f; } char *command[MAXENGINES], *mnemonic[MAXENGINES]; void Substitute (char *participants, int expunge) { int i, changed, changes=0, nPlayers=0; char *p, *q, *r, buf[MSG_SIZ]; if(participants == NULL) return; if(appData.tourneyFile[0] == NULLCHAR) { free(participants); return; } r = p = participants; q = appData.participants; while(*p && *p == *q) { if(*p == '\n') r = p+1, nPlayers++; p++; q++; } if(*p) { // difference while(*p && *p++ != '\n'); while(*q && *q++ != '\n'); changed = nPlayers; changes = 1 + (strcmp(p, q) != 0); } if(changes == 1) { // a single engine mnemonic was changed q = r; while(*q) nPlayers += (*q++ == '\n'); p = buf; while(*r && (*p = *r++) != '\n') p++; *p = NULLCHAR; NamesToList(firstChessProgramNames, command, mnemonic, "all"); for(i=1; mnemonic[i]; i++) if(!strcmp(buf, mnemonic[i])) break; if(mnemonic[i]) { // The substitute is valid FILE *f; if(appData.tourneyFile[0] && (f = fopen(appData.tourneyFile, "r+")) ) { flock(fileno(f), LOCK_EX); ParseArgsFromFile(f); fseek(f, 0, SEEK_SET); FREE(appData.participants); appData.participants = participants; if(expunge) { // erase results of replaced engine int len = strlen(appData.results), w, b, dummy; for(i=0; i 1) DisplayError(_("You can only change one engine at the time"), 0); free(participants); return; } int CheckPlayers (char *participants) { int i; char buf[MSG_SIZ], *p; NamesToList(firstChessProgramNames, command, mnemonic, "all"); while(p = strchr(participants, '\n')) { *p = NULLCHAR; for(i=1; mnemonic[i]; i++) if(!strcmp(participants, mnemonic[i])) break; if(!mnemonic[i]) { snprintf(buf, MSG_SIZ, _("No engine %s is installed"), participants); *p = '\n'; DisplayError(buf, 0); return 1; } *p = '\n'; participants = p + 1; } return 0; } int CreateTourney (char *name) { FILE *f; if(matchMode && strcmp(name, appData.tourneyFile)) { ASSIGN(name, appData.tourneyFile); //do not allow change of tourneyfile while playing } if(name[0] == NULLCHAR) { if(appData.participants[0]) DisplayError(_("You must supply a tournament file,\nfor storing the tourney progress"), 0); return 0; } f = fopen(name, "r"); if(f) { // file exists ASSIGN(appData.tourneyFile, name); ParseArgsFromFile(f); // parse it } else { if(!appData.participants[0]) return 0; // ignore tourney file if non-existing & no participants if(CountPlayers(appData.participants) < (appData.tourneyType>0 ? appData.tourneyType+1 : 2)) { DisplayError(_("Not enough participants"), 0); return 0; } if(CheckPlayers(appData.participants)) return 0; ASSIGN(appData.tourneyFile, name); if(appData.tourneyType < 0) appData.defaultMatchGames = 1; // Swiss forces games/pairing = 1 if((f = WriteTourneyFile("", NULL)) == NULL) return 0; } fclose(f); appData.noChessProgram = FALSE; appData.clockMode = TRUE; SetGNUMode(); return 1; } int NamesToList (char *names, char **engineList, char **engineMnemonic, char *group) { char buf[MSG_SIZ], *p, *q; int i=1, header, skip, all = !strcmp(group, "all"), depth = 0; insert = names; // afterwards, this global will point just after last retrieved engine line or group end in the 'names' skip = !all && group[0]; // if group requested, we start in skip mode for(;*names && depth >= 0 && i < MAXENGINES-1; names = p) { p = names; q = buf; header = 0; while(*p && *p != '\n') *q++ = *p++; *q = 0; if(*p == '\n') p++; if(buf[0] == '#') { if(strstr(buf, "# end") == buf) { if(!--depth) insert = p; continue; } // leave group, and suppress printing label depth++; // we must be entering a new group if(all) continue; // suppress printing group headers when complete list requested header = 1; if(skip && !strcmp(group, buf)) { depth = 0; skip = FALSE; } // start when we reach requested group } if(depth != header && !all || skip) continue; // skip contents of group (but print first-level header) if(engineList[i]) free(engineList[i]); engineList[i] = strdup(buf); if(buf[0] != '#') insert = p, TidyProgramName(engineList[i], "localhost", buf); // group headers not tidied if(engineMnemonic[i]) free(engineMnemonic[i]); if((q = strstr(engineList[i]+2, "variant")) && q[-2]== ' ' && (q[-1]=='/' || q[-1]=='-') && (q[7]==' ' || q[7]=='=')) { strcat(buf, " ("); sscanf(q + 8, "%s", buf + strlen(buf)); strcat(buf, ")"); } engineMnemonic[i] = strdup(buf); i++; } engineList[i] = engineMnemonic[i] = NULL; return i; } // following implemented as macro to avoid type limitations #define SWAP(item, temp) temp = appData.item[0]; appData.item[0] = appData.item[n]; appData.item[n] = temp; void SwapEngines (int n) { // swap settings for first engine and other engine (so far only some selected options) int h; char *p; if(n == 0) return; SWAP(directory, p) SWAP(chessProgram, p) SWAP(isUCI, h) SWAP(hasOwnBookUCI, h) SWAP(protocolVersion, h) SWAP(reuse, h) SWAP(scoreIsAbsolute, h) SWAP(timeOdds, h) SWAP(logo, p) SWAP(pgnName, p) SWAP(pvSAN, h) SWAP(engOptions, p) SWAP(engInitString, p) SWAP(computerString, p) SWAP(features, p) SWAP(fenOverride, p) SWAP(NPS, h) SWAP(accumulateTC, h) SWAP(host, p) } int GetEngineLine (char *s, int n) { int i; char buf[MSG_SIZ]; extern char *icsNames; if(!s || !*s) return 0; NamesToList(n >= 10 ? icsNames : firstChessProgramNames, command, mnemonic, "all"); for(i=1; mnemonic[i]; i++) if(!strcmp(s, mnemonic[i])) break; if(!mnemonic[i]) return 0; if(n == 11) return 1; // just testing if there was a match snprintf(buf, MSG_SIZ, "-%s %s", n == 10 ? "icshost" : "fcp", command[i]); if(n == 1) SwapEngines(n); ParseArgsFromString(buf); if(n == 1) SwapEngines(n); if(n == 0 && *appData.secondChessProgram == NULLCHAR) { SwapEngines(1); // set second same as first if not yet set (to suppress WB startup dialog) ParseArgsFromString(buf); } return 1; } int SetPlayer (int player, char *p) { // [HGM] find the engine line of the partcipant given by number, and parse its options. int i; char buf[MSG_SIZ], *engineName; for(i=0; i 0) { roundsPerCycle = nPlayers - appData.tourneyType; pairingsPerRound = appData.tourneyType; } gamesPerRound = pairingsPerRound * appData.defaultMatchGames; gamesPerCycle = gamesPerRound * roundsPerCycle; appData.matchGames = gamesPerCycle * appData.tourneyCycles - 1; // fake like all games are one big match curCycle = nr / gamesPerCycle; nr %= gamesPerCycle; curRound = nr / gamesPerRound; nr %= gamesPerRound; curPairing = nr / appData.defaultMatchGames; nr %= appData.defaultMatchGames; matchGame = nr + curCycle * appData.defaultMatchGames + 1; // fake game nr that loads correct game or position from file roundNr = (curCycle * roundsPerCycle + curRound) * appData.defaultMatchGames + nr + 1; if(appData.cycleSync) *syncInterval = gamesPerCycle; if(appData.roundSync) *syncInterval = gamesPerRound; if(appData.debugMode) fprintf(debugFP, "cycle=%d, round=%d, pairing=%d curGame=%d\n", curCycle, curRound, curPairing, matchGame); if(appData.tourneyType == 0) { if(curPairing == (nPlayers-1)/2 ) { *whitePlayer = curRound; *blackPlayer = nPlayers - 1; // this is the 'bye' when nPlayer is odd } else { *whitePlayer = curRound - (nPlayers-1)/2 + curPairing; if(*whitePlayer < 0) *whitePlayer += nPlayers-1+(nPlayers&1); *blackPlayer = curRound + (nPlayers-1)/2 - curPairing; if(*blackPlayer >= nPlayers-1+(nPlayers&1)) *blackPlayer -= nPlayers-1+(nPlayers&1); } } else if(appData.tourneyType > 1) { *blackPlayer = curPairing; // in multi-gauntlet, assign gauntlet engines to second, so first an be kept loaded during round *whitePlayer = curRound + appData.tourneyType; } else if(appData.tourneyType > 0) { *whitePlayer = curPairing; *blackPlayer = curRound + appData.tourneyType; } // take care of white/black alternation per round. // For cycles and games this is already taken care of by default, derived from matchGame! return curRound & 1; } int NextTourneyGame (int nr, int *swapColors) { // !!!major kludge!!! fiddle appData settings to get everything in order for next tourney game char *p, *q; int whitePlayer, blackPlayer, firstBusy=1000000000, syncInterval = 0, nPlayers, OK = 1; FILE *tf; if(appData.tourneyFile[0] == NULLCHAR) return 1; // no tourney, always allow next game tf = fopen(appData.tourneyFile, "r"); if(tf == NULL) { DisplayFatalError(_("Bad tournament file"), 0, 1); return 0; } ParseArgsFromFile(tf); fclose(tf); InitTimeControls(); // TC might be altered from tourney file nPlayers = CountPlayers(appData.participants); // count participants if(appData.tourneyType < 0) syncInterval = nPlayers/2; else *swapColors = Pairing(nr<0 ? 0 : nr, nPlayers, &whitePlayer, &blackPlayer, &syncInterval); if(syncInterval) { p = q = appData.results; while(*q) if(*q++ == '*' || q[-1] == ' ') { firstBusy = q - p - 1; break; } if(firstBusy/syncInterval < (nextGame/syncInterval)) { DisplayMessage(_("Waiting for other game(s)"),""); waitingForGame = TRUE; ScheduleDelayedEvent(NextMatchGame, 1000); // wait for all games of previous round to finish return 0; } waitingForGame = FALSE; } if(appData.tourneyType < 0) { if(nr>=0 && !pairingReceived) { char buf[1<<16]; if(pairing.pr == NoProc) { if(!appData.pairingEngine[0]) { DisplayFatalError(_("No pairing engine specified"), 0, 1); return 0; } StartChessProgram(&pairing); // starts the pairing engine } snprintf(buf, 1<<16, "results %d %s\n", nPlayers, appData.results); SendToProgram(buf, &pairing); snprintf(buf, 1<<16, "pairing %d\n", nr+1); SendToProgram(buf, &pairing); return 0; // wait for pairing engine to answer (which causes NextTourneyGame to be called again... } pairingReceived = 0; // ... so we continue here *swapColors = 0; appData.matchGames = appData.tourneyCycles * syncInterval - 1; whitePlayer = savedWhitePlayer-1; blackPlayer = savedBlackPlayer-1; matchGame = 1; roundNr = nr / syncInterval + 1; } if(first.pr != NoProc && second.pr != NoProc || nr<0) return 1; // engines already loaded // redefine engines, engine dir, etc. NamesToList(firstChessProgramNames, command, mnemonic, "all"); // get mnemonics of installed engines if(first.pr == NoProc) { if(!SetPlayer(whitePlayer, appData.participants)) OK = 0; // find white player amongst it, and parse its engine line InitEngine(&first, 0); // initialize ChessProgramStates based on new settings. } if(second.pr == NoProc) { SwapEngines(1); if(!SetPlayer(blackPlayer, appData.participants)) OK = 0; // find black player amongst it, and parse its engine line SwapEngines(1); // and make that valid for second engine by swapping InitEngine(&second, 1); } CommonEngineInit(); // after this TwoMachinesEvent will create correct engine processes UpdateLogos(FALSE); // leave display to ModeHiglight() return OK; } void NextMatchGame () { // performs game initialization that does not invoke engines, and then tries to start the game int res, firstWhite, swapColors = 0; if(!NextTourneyGame(nextGame, &swapColors)) return; // this sets matchGame, -fcp / -scp and other options for next game, if needed if(matchMode && appData.debugMode) { // [HGM] debug split: game is part of a match; we might have to create a debug file just for this game char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, appData.nameOfDebugFile, nextGame+1); // expand name of debug file with %d in it if(strcmp(buf, currentDebugFile)) { // name has changed FILE *f = fopen(buf, "w"); if(f) { // if opening the new file failed, just keep using the old one ASSIGN(currentDebugFile, buf); fclose(debugFP); debugFP = f; } if(appData.serverFileName) { if(serverFP) fclose(serverFP); serverFP = fopen(appData.serverFileName, "w"); if(serverFP && first.pr != NoProc) fprintf(serverFP, "StartChildProcess (dir=\".\") .\\%s\n", first.tidy); if(serverFP && second.pr != NoProc) fprintf(serverFP, "StartChildProcess (dir=\".\") .\\%s\n", second.tidy); } } } firstWhite = appData.firstPlaysBlack ^ (matchGame & 1 | appData.sameColorGames > 1); // non-incremental default firstWhite ^= swapColors; // reverses if NextTourneyGame says we are in an odd round first.twoMachinesColor = firstWhite ? "white\n" : "black\n"; // perform actual color assignement second.twoMachinesColor = firstWhite ? "black\n" : "white\n"; appData.noChessProgram = (first.pr == NoProc); // kludge to prevent Reset from starting up chess program if(appData.loadGameIndex == -2) srandom(appData.seedBase + 68163*(nextGame & ~1)); // deterministic seed to force same opening Reset(FALSE, first.pr != NoProc); res = LoadGameOrPosition(matchGame); // setup game appData.noChessProgram = FALSE; // LoadGameOrPosition might call Reset too! if(!res) return; // abort when bad game/pos file TwoMachinesEvent(); } void UserAdjudicationEvent (int result) { ChessMove gameResult = GameIsDrawn; if( result > 0 ) { gameResult = WhiteWins; } else if( result < 0 ) { gameResult = BlackWins; } if( gameMode == TwoMachinesPlay ) { GameEnds( gameResult, "User adjudication", GE_XBOARD ); } } // [HGM] save: calculate checksum of game to make games easily identifiable int StringCheckSum (char *s) { int i = 0; if(s==NULL) return 0; while(*s) i = i*259 + *s++; return i; } int GameCheckSum () { int i, sum=0; for(i=backwardMostMove; i1 && sum==0) sum++; // make sure never zero for non-empty game return sum + StringCheckSum(commentList[i]); } // end of save patch void GameEnds (ChessMove result, char *resultDetails, int whosays) { GameMode nextGameMode; int isIcsGame; char buf[MSG_SIZ], popupRequested = 0, *ranking = NULL; if(endingGame) return; /* [HGM] crash: forbid recursion */ endingGame = 1; if(twoBoards) { // [HGM] dual: switch back to one board twoBoards = partnerUp = 0; InitDrawingSizes(-2, 0); DrawPosition(TRUE, partnerBoard); // observed game becomes foreground } if (appData.debugMode) { fprintf(debugFP, "GameEnds(%d, %s, %d)\n", result, resultDetails ? resultDetails : "(null)", whosays); } fromX = fromY = -1; // [HGM] abort any move the user is entering. if(pausing) PauseEvent(); // can happen when we abort a paused game (New Game or Quit) if (appData.icsActive && (whosays == GE_ENGINE || whosays >= GE_ENGINE1)) { /* If we are playing on ICS, the server decides when the game is over, but the engine can offer to draw, claim a draw, or resign. */ #if ZIPPY if (appData.zippyPlay && first.initDone) { if (result == GameIsDrawn) { /* In case draw still needs to be claimed */ SendToICS(ics_prefix); SendToICS("draw\n"); } else if (StrCaseStr(resultDetails, "resign")) { SendToICS(ics_prefix); SendToICS("resign\n"); } } #endif endingGame = 0; /* [HGM] crash */ return; } /* If we're loading the game from a file, stop */ if (whosays == GE_FILE) { (void) StopLoadGameTimer(); gameFileFP = NULL; } /* Cancel draw offers */ first.offeredDraw = second.offeredDraw = 0; /* If this is an ICS game, only ICS can really say it's done; if not, anyone can. */ isIcsGame = (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsObserving || gameMode == IcsExamining); if (!isIcsGame || whosays == GE_ICS) { /* OK -- not an ICS game, or ICS said it was done */ StopClocks(); if (!isIcsGame && !appData.noChessProgram) SetUserThinkingEnables(); /* [HGM] if a machine claims the game end we verify this claim */ if(gameMode == TwoMachinesPlay && appData.testClaims) { if(appData.testLegality && whosays >= GE_ENGINE1 ) { char claimer; ChessMove trueResult = (ChessMove) -1; claimer = whosays == GE_ENGINE1 ? /* color of claimer */ first.twoMachinesColor[0] : second.twoMachinesColor[0] ; // [HGM] losers: because the logic is becoming a bit hairy, determine true result first if((signed char)boards[forwardMostMove][EP_STATUS] == EP_CHECKMATE) { /* [HGM] verify: engine mate claims accepted if they were flagged */ trueResult = WhiteOnMove(forwardMostMove) ? BlackWins : WhiteWins; } else if((signed char)boards[forwardMostMove][EP_STATUS] == EP_WINS) { // added code for games where being mated is a win /* [HGM] verify: engine mate claims accepted if they were flagged */ trueResult = WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins; } else if((signed char)boards[forwardMostMove][EP_STATUS] == EP_STALEMATE) { // only used to indicate draws now trueResult = GameIsDrawn; // default; in variants where stalemate loses, Status is CHECKMATE } // now verify win claims, but not in drop games, as we don't understand those yet if( (gameInfo.holdingsWidth == 0 || gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) && (result == WhiteWins && claimer == 'w' || result == BlackWins && claimer == 'b' ) ) { // case to verify: engine claims own win if (appData.debugMode) { fprintf(debugFP, "result=%d sp=%d move=%d\n", result, (signed char)boards[forwardMostMove][EP_STATUS], forwardMostMove); } if(result != trueResult) { snprintf(buf, MSG_SIZ, "False win claim: '%s'", resultDetails); result = claimer == 'w' ? BlackWins : WhiteWins; resultDetails = buf; } } else if( result == GameIsDrawn && (signed char)boards[forwardMostMove][EP_STATUS] > EP_DRAWS && (forwardMostMove <= backwardMostMove || (signed char)boards[forwardMostMove-1][EP_STATUS] > EP_DRAWS || (claimer=='b')==(forwardMostMove&1)) ) { /* [HGM] verify: draws that were not flagged are false claims */ snprintf(buf, MSG_SIZ, "False draw claim: '%s'", resultDetails); result = claimer == 'w' ? BlackWins : WhiteWins; resultDetails = buf; } /* (Claiming a loss is accepted no questions asked!) */ } else if(matchMode && result == GameIsDrawn && !strcmp(resultDetails, "Engine Abort Request")) { forwardMostMove = backwardMostMove; // [HGM] delete game to surpress saving result = GameUnfinished; if(!*appData.tourneyFile) matchGame--; // replay even in plain match } /* [HGM] bare: don't allow bare King to win */ if((gameInfo.holdingsWidth == 0 || gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat || gameInfo.variant == VariantGrand) && gameInfo.variant != VariantLosers && gameInfo.variant != VariantGiveaway && gameInfo.variant != VariantSuicide // [HGM] losers: except in losers, of course... && result != GameIsDrawn) { int i, j, k=0, color = (result==WhiteWins ? (int)WhitePawn : (int)BlackPawn); for(j=BOARD_LEFT; j= 0 && p <= (int)WhiteKing) k++; } if (appData.debugMode) { fprintf(debugFP, "GE(%d, %s, %d) bare king k=%d color=%d\n", result, resultDetails ? resultDetails : "(null)", whosays, k, color); } if(k <= 1) { result = GameIsDrawn; snprintf(buf, MSG_SIZ, "%s but bare king", resultDetails); resultDetails = buf; } } } if(serverMoves != NULL && !loadFlag) { char c = '='; if(result==WhiteWins) c = '+'; if(result==BlackWins) c = '-'; if(resultDetails != NULL) fprintf(serverMoves, ";%c;%s\n", c, resultDetails), fflush(serverMoves); } if (resultDetails != NULL) { gameInfo.result = result; gameInfo.resultDetails = StrSave(resultDetails); /* display last move only if game was not loaded from file */ if ((whosays != GE_FILE) && (currentMove == forwardMostMove)) DisplayMove(currentMove - 1); if (forwardMostMove != 0) { if (gameMode != PlayFromGameFile && gameMode != EditGame && lastSavedGame != GameCheckSum() // [HGM] save: suppress duplicates ) { if (*appData.saveGameFile != NULLCHAR) { if(result == GameUnfinished && matchMode && *appData.tourneyFile) AutoSaveGame(); // [HGM] protect tourney PGN from aborted games, and prompt for name instead else SaveGameToFile(appData.saveGameFile, TRUE); } else if (appData.autoSaveGames) { if(gameMode != IcsObserving || !appData.onlyOwn) AutoSaveGame(); } if (*appData.savePositionFile != NULLCHAR) { SavePositionToFile(appData.savePositionFile); } AddGameToBook(FALSE); // Only does something during Monte-Carlo book building } } /* Tell program how game ended in case it is learning */ /* [HGM] Moved this to after saving the PGN, just in case */ /* engine died and we got here through time loss. In that */ /* case we will get a fatal error writing the pipe, which */ /* would otherwise lose us the PGN. */ /* [HGM] crash: not needed anymore, but doesn't hurt; */ /* output during GameEnds should never be fatal anymore */ if (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay || gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == BeginningOfGame) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "result %s {%s}\n", PGNResult(result), resultDetails); if (first.pr != NoProc) { SendToProgram(buf, &first); } if (second.pr != NoProc && gameMode == TwoMachinesPlay) { SendToProgram(buf, &second); } } } if (appData.icsActive) { if (appData.quietPlay && (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack)) { SendToICS(ics_prefix); SendToICS("set shout 1\n"); } nextGameMode = IcsIdle; ics_user_moved = FALSE; /* clean up premove. It's ugly when the game has ended and the * premove highlights are still on the board. */ if (gotPremove) { gotPremove = FALSE; ClearPremoveHighlights(); DrawPosition(FALSE, boards[currentMove]); } if (whosays == GE_ICS) { switch (result) { case WhiteWins: if (gameMode == IcsPlayingWhite) PlayIcsWinSound(); else if(gameMode == IcsPlayingBlack) PlayIcsLossSound(); break; case BlackWins: if (gameMode == IcsPlayingBlack) PlayIcsWinSound(); else if(gameMode == IcsPlayingWhite) PlayIcsLossSound(); break; case GameIsDrawn: PlayIcsDrawSound(); break; default: PlayIcsUnfinishedSound(); } } } else if (gameMode == EditGame || gameMode == PlayFromGameFile || gameMode == AnalyzeMode || gameMode == AnalyzeFile) { nextGameMode = gameMode; } else { nextGameMode = EndOfGame; } pausing = FALSE; ModeHighlight(); } else { nextGameMode = gameMode; } if (appData.noChessProgram) { gameMode = nextGameMode; ModeHighlight(); endingGame = 0; /* [HGM] crash */ return; } if (first.reuse) { /* Put first chess program into idle state */ if (first.pr != NoProc && (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay || gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == BeginningOfGame)) { SendToProgram("force\n", &first); if (first.usePing) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "ping %d\n", ++first.lastPing); SendToProgram(buf, &first); } } } else if (result != GameUnfinished || nextGameMode == IcsIdle) { /* Kill off first chess program */ if (first.isr != NULL) RemoveInputSource(first.isr); first.isr = NULL; if (first.pr != NoProc) { ExitAnalyzeMode(); DoSleep( appData.delayBeforeQuit ); SendToProgram("quit\n", &first); DoSleep( appData.delayAfterQuit ); DestroyChildProcess(first.pr, first.useSigterm); first.reload = TRUE; } first.pr = NoProc; } if (second.reuse) { /* Put second chess program into idle state */ if (second.pr != NoProc && gameMode == TwoMachinesPlay) { SendToProgram("force\n", &second); if (second.usePing) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "ping %d\n", ++second.lastPing); SendToProgram(buf, &second); } } } else if (result != GameUnfinished || nextGameMode == IcsIdle) { /* Kill off second chess program */ if (second.isr != NULL) RemoveInputSource(second.isr); second.isr = NULL; if (second.pr != NoProc) { DoSleep( appData.delayBeforeQuit ); SendToProgram("quit\n", &second); DoSleep( appData.delayAfterQuit ); DestroyChildProcess(second.pr, second.useSigterm); second.reload = TRUE; } second.pr = NoProc; } if (matchMode && (gameMode == TwoMachinesPlay || (waitingForGame || startingEngine) && exiting)) { char resChar = '='; switch (result) { case WhiteWins: resChar = '+'; if (first.twoMachinesColor[0] == 'w') { first.matchWins++; } else { second.matchWins++; } break; case BlackWins: resChar = '-'; if (first.twoMachinesColor[0] == 'b') { first.matchWins++; } else { second.matchWins++; } break; case GameUnfinished: resChar = ' '; default: break; } if(exiting) resChar = ' '; // quit while waiting for round sync: unreserve already reserved game if(appData.tourneyFile[0]){ // [HGM] we are in a tourney; update tourney file with game result if(appData.afterGame && appData.afterGame[0]) RunCommand(appData.afterGame); ReserveGame(nextGame, resChar); // sets nextGame if(nextGame > appData.matchGames) appData.tourneyFile[0] = 0, ranking = TourneyStandings(3); // tourney is done else ranking = strdup("busy"); //suppress popup when aborted but not finished } else roundNr = nextGame = matchGame + 1; // normal match, just increment; round equals matchGame if (nextGame <= appData.matchGames && !abortMatch) { gameMode = nextGameMode; matchGame = nextGame; // this will be overruled in tourney mode! GetTimeMark(&pauseStart); // [HGM] matchpause: stipulate a pause ScheduleDelayedEvent(NextMatchGame, 10); // but start game immediately (as it will wait out the pause itself) endingGame = 0; /* [HGM] crash */ return; } else { gameMode = nextGameMode; snprintf(buf, MSG_SIZ, _("Match %s vs. %s: final score %d-%d-%d"), first.tidy, second.tidy, first.matchWins, second.matchWins, appData.matchGames - (first.matchWins + second.matchWins)); if(!appData.tourneyFile[0]) matchGame++, DisplayTwoMachinesTitle(); // [HGM] update result in window title if(ranking && strcmp(ranking, "busy") && appData.afterTourney && appData.afterTourney[0]) RunCommand(appData.afterTourney); popupRequested++; // [HGM] crash: postpone to after resetting endingGame if (appData.firstPlaysBlack) { // [HGM] match: back to original for next match first.twoMachinesColor = "black\n"; second.twoMachinesColor = "white\n"; } else { first.twoMachinesColor = "white\n"; second.twoMachinesColor = "black\n"; } } } if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile) && !(nextGameMode == AnalyzeMode || nextGameMode == AnalyzeFile)) ExitAnalyzeMode(); gameMode = nextGameMode; ModeHighlight(); endingGame = 0; /* [HGM] crash */ if(popupRequested) { // [HGM] crash: this calls GameEnds recursively through ExitEvent! Make it a harmless tail recursion. if(matchMode == TRUE) { // match through command line: exit with or without popup if(ranking) { ToNrEvent(forwardMostMove); if(strcmp(ranking, "busy")) DisplayFatalError(ranking, 0, 0); else ExitEvent(0); } else DisplayFatalError(buf, 0, 0); } else { // match through menu; just stop, with or without popup matchMode = FALSE; appData.matchGames = matchGame = roundNr = 0; ModeHighlight(); if(ranking){ if(strcmp(ranking, "busy")) DisplayNote(ranking); } else DisplayNote(buf); } if(ranking) free(ranking); } } /* Assumes program was just initialized (initString sent). Leaves program in force mode. */ void FeedMovesToProgram (ChessProgramState *cps, int upto) { int i; if (appData.debugMode) fprintf(debugFP, "Feeding %smoves %d through %d to %s chess program\n", startedFromSetupPosition ? "position and " : "", backwardMostMove, upto, cps->which); if(currentlyInitializedVariant != gameInfo.variant) { char buf[MSG_SIZ]; // [HGM] variantswitch: make engine aware of new variant if(cps->protocolVersion > 1 && StrStr(cps->variants, VariantName(gameInfo.variant)) == NULL) return; // [HGM] refrain from feeding moves altogether if variant is unsupported! snprintf(buf, MSG_SIZ, "variant %s\n", VariantName(gameInfo.variant)); SendToProgram(buf, cps); currentlyInitializedVariant = gameInfo.variant; } SendToProgram("force\n", cps); if (startedFromSetupPosition) { SendBoard(cps, backwardMostMove); if (appData.debugMode) { fprintf(debugFP, "feedMoves\n"); } } for (i = backwardMostMove; i < upto; i++) { SendMoveToProgram(i, cps); } } int ResurrectChessProgram () { /* The chess program may have exited. If so, restart it and feed it all the moves made so far. */ static int doInit = 0; if (appData.noChessProgram) return 1; if(matchMode /*&& appData.tourneyFile[0]*/) { // [HGM] tourney: make sure we get features after engine replacement. (Should we always do this?) if(WaitForEngine(&first, TwoMachinesEventIfReady)) { doInit = 1; return 0; } // request to do init on next visit, because we started engine if(!doInit) return 1; // this replaces testing first.pr != NoProc, which is true when we get here, but first time no reason to abort doInit = 0; // we fell through (first time after starting the engine); make sure it doesn't happen again } else { if (first.pr != NoProc) return 1; StartChessProgram(&first); } InitChessProgram(&first, FALSE); FeedMovesToProgram(&first, currentMove); if (!first.sendTime) { /* can't tell gnuchess what its clock should read, so we bow to its notion. */ ResetClocks(); timeRemaining[0][currentMove] = whiteTimeRemaining; timeRemaining[1][currentMove] = blackTimeRemaining; } if ((gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) && first.analysisSupport) { SendToProgram("analyze\n", &first); first.analyzing = TRUE; } return 1; } /* * Button procedures */ void Reset (int redraw, int init) { int i; if (appData.debugMode) { fprintf(debugFP, "Reset(%d, %d) from gameMode %d\n", redraw, init, gameMode); } CleanupTail(); // [HGM] vari: delete any stored variations CommentPopDown(); // [HGM] make sure no comments to the previous game keep hanging on pausing = pauseExamInvalid = FALSE; startedFromSetupPosition = blackPlaysFirst = FALSE; firstMove = TRUE; whiteFlag = blackFlag = FALSE; userOfferedDraw = FALSE; hintRequested = bookRequested = FALSE; first.maybeThinking = FALSE; second.maybeThinking = FALSE; first.bookSuspend = FALSE; // [HGM] book second.bookSuspend = FALSE; thinkOutput[0] = NULLCHAR; lastHint[0] = NULLCHAR; ClearGameInfo(&gameInfo); gameInfo.variant = StringToVariant(appData.variant); ics_user_moved = ics_clock_paused = FALSE; ics_getting_history = H_FALSE; ics_gamenum = -1; white_holding[0] = black_holding[0] = NULLCHAR; ClearProgramStats(); opponentKibitzes = FALSE; // [HGM] kibitz: do not reserve space in engine-output window in zippy mode ResetFrontEnd(); ClearHighlights(); flipView = appData.flipView; ClearPremoveHighlights(); gotPremove = FALSE; alarmSounded = FALSE; GameEnds(EndOfFile, NULL, GE_PLAYER); if(appData.serverMovesName != NULL) { /* [HGM] prepare to make moves file for broadcasting */ clock_t t = clock(); if(serverMoves != NULL) fclose(serverMoves); serverMoves = fopen(appData.serverMovesName, "r"); if(serverMoves != NULL) { fclose(serverMoves); /* delay 15 sec before overwriting, so all clients can see end */ while(clock()-t < appData.serverPause*CLOCKS_PER_SEC); } serverMoves = fopen(appData.serverMovesName, "w"); } ExitAnalyzeMode(); gameMode = BeginningOfGame; ModeHighlight(); if(appData.icsActive) gameInfo.variant = VariantNormal; currentMove = forwardMostMove = backwardMostMove = 0; MarkTargetSquares(1); InitPosition(redraw); for (i = 0; i < MAX_MOVES; i++) { if (commentList[i] != NULL) { free(commentList[i]); commentList[i] = NULL; } } ResetClocks(); timeRemaining[0][0] = whiteTimeRemaining; timeRemaining[1][0] = blackTimeRemaining; if (first.pr == NoProc) { StartChessProgram(&first); } if (init) { InitChessProgram(&first, startedFromSetupPosition); } DisplayTitle(""); DisplayMessage("", ""); HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); lastSavedGame = 0; // [HGM] save: make sure next game counts as unsaved ClearMap(); // [HGM] exclude: invalidate map } void AutoPlayGameLoop () { for (;;) { if (!AutoPlayOneMove()) return; if (matchMode || appData.timeDelay == 0) continue; if (appData.timeDelay < 0) return; StartLoadGameTimer((long)(1000.0f * appData.timeDelay)); break; } } void AnalyzeNextGame() { ReloadGame(1); // next game } int AutoPlayOneMove () { int fromX, fromY, toX, toY; if (appData.debugMode) { fprintf(debugFP, "AutoPlayOneMove(): current %d\n", currentMove); } if (gameMode != PlayFromGameFile && gameMode != AnalyzeFile) return FALSE; if (gameMode == AnalyzeFile && currentMove > backwardMostMove && programStats.depth) { pvInfoList[currentMove].depth = programStats.depth; pvInfoList[currentMove].score = programStats.score; pvInfoList[currentMove].time = 0; if(currentMove < forwardMostMove) AppendComment(currentMove+1, lastPV[0], 2); else { // append analysis of final position as comment char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "{final score %+4.2f/%d}", programStats.score/100., programStats.depth); AppendComment(currentMove, buf, 3); // the 3 prevents stripping of the score/depth! } programStats.depth = 0; } if (currentMove >= forwardMostMove) { if(gameMode == AnalyzeFile) { if(appData.loadGameIndex == -1) { GameEnds(gameInfo.result, gameInfo.resultDetails ? gameInfo.resultDetails : "", GE_FILE); ScheduleDelayedEvent(AnalyzeNextGame, 10); } else { ExitAnalyzeMode(); SendToProgram("force\n", &first); } } // gameMode = EndOfGame; // ModeHighlight(); /* [AS] Clear current move marker at the end of a game */ /* HistorySet(parseList, backwardMostMove, forwardMostMove, -1); */ return FALSE; } toX = moveList[currentMove][2] - AAA; toY = moveList[currentMove][3] - ONE; if (moveList[currentMove][1] == '@') { if (appData.highlightLastMove) { SetHighlights(-1, -1, toX, toY); } } else { fromX = moveList[currentMove][0] - AAA; fromY = moveList[currentMove][1] - ONE; HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove); /* [AS] */ AnimateMove(boards[currentMove], fromX, fromY, toX, toY); if (appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } } DisplayMove(currentMove); SendMoveToProgram(currentMove++, &first); DisplayBothClocks(); DrawPosition(FALSE, boards[currentMove]); // [HGM] PV info: always display, routine tests if empty DisplayComment(currentMove - 1, commentList[currentMove]); return TRUE; } int LoadGameOneMove (ChessMove readAhead) { int fromX = 0, fromY = 0, toX = 0, toY = 0, done; char promoChar = NULLCHAR; ChessMove moveType; char move[MSG_SIZ]; char *p, *q; if (gameMode != PlayFromGameFile && gameMode != AnalyzeFile && gameMode != AnalyzeMode && gameMode != Training) { gameFileFP = NULL; return FALSE; } yyboardindex = forwardMostMove; if (readAhead != EndOfFile) { moveType = readAhead; } else { if (gameFileFP == NULL) return FALSE; moveType = (ChessMove) Myylex(); } done = FALSE; switch (moveType) { case Comment: if (appData.debugMode) fprintf(debugFP, "Parsed Comment: %s\n", yy_text); p = yy_text; /* append the comment but don't display it */ AppendComment(currentMove, p, FALSE); return TRUE; case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case NormalMove: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: /* PUSH Fabien */ case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: /* POP Fabien */ if (appData.debugMode) fprintf(debugFP, "Parsed %s into %s\n", yy_text, currentMoveString); fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = currentMoveString[4]; break; case WhiteDrop: case BlackDrop: if (appData.debugMode) fprintf(debugFP, "Parsed %s into %s\n", yy_text, currentMoveString); fromX = moveType == WhiteDrop ? (int) CharToPiece(ToUpper(currentMoveString[0])) : (int) CharToPiece(ToLower(currentMoveString[0])); fromY = DROP_RANK; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; break; case WhiteWins: case BlackWins: case GameIsDrawn: case GameUnfinished: if (appData.debugMode) fprintf(debugFP, "Parsed game end: %s\n", yy_text); p = strchr(yy_text, '{'); if (p == NULL) p = strchr(yy_text, '('); if (p == NULL) { p = yy_text; if (p[0] == '0' || p[0] == '1' || p[0] == '*') p = ""; } else { q = strchr(p, *p == '{' ? '}' : ')'); if (q != NULL) *q = NULLCHAR; p++; } while(q = strchr(p, '\n')) *q = ' '; // [HGM] crush linefeeds in result message GameEnds(moveType, p, GE_FILE); done = TRUE; if (cmailMsgLoaded) { ClearHighlights(); flipView = WhiteOnMove(currentMove); if (moveType == GameUnfinished) flipView = !flipView; if (appData.debugMode) fprintf(debugFP, "Setting flipView to %d\n", flipView) ; } break; case EndOfFile: if (appData.debugMode) fprintf(debugFP, "Parser hit end of file\n"); switch (MateTest(boards[currentMove], PosFlags(currentMove)) ) { case MT_NONE: case MT_CHECK: break; case MT_CHECKMATE: case MT_STAINMATE: if (WhiteOnMove(currentMove)) { GameEnds(BlackWins, "Black mates", GE_FILE); } else { GameEnds(WhiteWins, "White mates", GE_FILE); } break; case MT_STALEMATE: GameEnds(GameIsDrawn, "Stalemate", GE_FILE); break; } done = TRUE; break; case MoveNumberOne: if (lastLoadGameStart == GNUChessGame) { /* GNUChessGames have numbers, but they aren't move numbers */ if (appData.debugMode) fprintf(debugFP, "Parser ignoring: '%s' (%d)\n", yy_text, (int) moveType); return LoadGameOneMove(EndOfFile); /* tail recursion */ } /* else fall thru */ case XBoardGame: case GNUChessGame: case PGNTag: /* Reached start of next game in file */ if (appData.debugMode) fprintf(debugFP, "Parsed start of next game: %s\n", yy_text); switch (MateTest(boards[currentMove], PosFlags(currentMove)) ) { case MT_NONE: case MT_CHECK: break; case MT_CHECKMATE: case MT_STAINMATE: if (WhiteOnMove(currentMove)) { GameEnds(BlackWins, "Black mates", GE_FILE); } else { GameEnds(WhiteWins, "White mates", GE_FILE); } break; case MT_STALEMATE: GameEnds(GameIsDrawn, "Stalemate", GE_FILE); break; } done = TRUE; break; case PositionDiagram: /* should not happen; ignore */ case ElapsedTime: /* ignore */ case NAG: /* ignore */ if (appData.debugMode) fprintf(debugFP, "Parser ignoring: '%s' (%d)\n", yy_text, (int) moveType); return LoadGameOneMove(EndOfFile); /* tail recursion */ case IllegalMove: if (appData.testLegality) { if (appData.debugMode) fprintf(debugFP, "Parsed IllegalMove: %s\n", yy_text); snprintf(move, MSG_SIZ, _("Illegal move: %d.%s%s"), (forwardMostMove / 2) + 1, WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text); DisplayError(move, 0); done = TRUE; } else { if (appData.debugMode) fprintf(debugFP, "Parsed %s into IllegalMove %s\n", yy_text, currentMoveString); fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = currentMoveString[4]; } break; case AmbiguousMove: if (appData.debugMode) fprintf(debugFP, "Parsed AmbiguousMove: %s\n", yy_text); snprintf(move, MSG_SIZ, _("Ambiguous move: %d.%s%s"), (forwardMostMove / 2) + 1, WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text); DisplayError(move, 0); done = TRUE; break; default: case ImpossibleMove: if (appData.debugMode) fprintf(debugFP, "Parsed ImpossibleMove (type = %d): %s\n", moveType, yy_text); snprintf(move, MSG_SIZ, _("Illegal move: %d.%s%s"), (forwardMostMove / 2) + 1, WhiteOnMove(forwardMostMove) ? " " : ".. ", yy_text); DisplayError(move, 0); done = TRUE; break; } if (done) { if (appData.matchMode || (appData.timeDelay == 0 && !pausing)) { DrawPosition(FALSE, boards[currentMove]); DisplayBothClocks(); if (!appData.matchMode) // [HGM] PV info: routine tests if empty DisplayComment(currentMove - 1, commentList[currentMove]); } (void) StopLoadGameTimer(); gameFileFP = NULL; cmailOldMove = forwardMostMove; return FALSE; } else { /* currentMoveString is set as a side-effect of yylex */ thinkOutput[0] = NULLCHAR; MakeMove(fromX, fromY, toX, toY, promoChar); currentMove = forwardMostMove; return TRUE; } } /* Load the nth game from the given file */ int LoadGameFromFile (char *filename, int n, char *title, int useList) { FILE *f; char buf[MSG_SIZ]; if (strcmp(filename, "-") == 0) { f = stdin; title = "stdin"; } else { f = fopen(filename, "rb"); if (f == NULL) { snprintf(buf, sizeof(buf), _("Can't open \"%s\""), filename); DisplayError(buf, errno); return FALSE; } } if (fseek(f, 0, 0) == -1) { /* f is not seekable; probably a pipe */ useList = FALSE; } if (useList && n == 0) { int error = GameListBuild(f); if (error) { DisplayError(_("Cannot build game list"), error); } else if (!ListEmpty(&gameList) && ((ListGame *) gameList.tailPred)->number > 1) { GameListPopUp(f, title); return TRUE; } GameListDestroy(); n = 1; } if (n == 0) n = 1; return LoadGame(f, n, title, FALSE); } void MakeRegisteredMove () { int fromX, fromY, toX, toY; char promoChar; if (cmailMoveRegistered[lastLoadGameNumber - 1]) { switch (cmailMoveType[lastLoadGameNumber - 1]) { case CMAIL_MOVE: case CMAIL_DRAW: if (appData.debugMode) fprintf(debugFP, "Restoring %s for game %d\n", cmailMove[lastLoadGameNumber - 1], lastLoadGameNumber); thinkOutput[0] = NULLCHAR; safeStrCpy(moveList[currentMove], cmailMove[lastLoadGameNumber - 1], sizeof(moveList[currentMove])/sizeof(moveList[currentMove][0])); fromX = cmailMove[lastLoadGameNumber - 1][0] - AAA; fromY = cmailMove[lastLoadGameNumber - 1][1] - ONE; toX = cmailMove[lastLoadGameNumber - 1][2] - AAA; toY = cmailMove[lastLoadGameNumber - 1][3] - ONE; promoChar = cmailMove[lastLoadGameNumber - 1][4]; MakeMove(fromX, fromY, toX, toY, promoChar); ShowMove(fromX, fromY, toX, toY); switch (MateTest(boards[currentMove], PosFlags(currentMove)) ) { case MT_NONE: case MT_CHECK: break; case MT_CHECKMATE: case MT_STAINMATE: if (WhiteOnMove(currentMove)) { GameEnds(BlackWins, "Black mates", GE_PLAYER); } else { GameEnds(WhiteWins, "White mates", GE_PLAYER); } break; case MT_STALEMATE: GameEnds(GameIsDrawn, "Stalemate", GE_PLAYER); break; } break; case CMAIL_RESIGN: if (WhiteOnMove(currentMove)) { GameEnds(BlackWins, "White resigns", GE_PLAYER); } else { GameEnds(WhiteWins, "Black resigns", GE_PLAYER); } break; case CMAIL_ACCEPT: GameEnds(GameIsDrawn, "Draw agreed", GE_PLAYER); break; default: break; } } return; } /* Wrapper around LoadGame for use when a Cmail message is loaded */ int CmailLoadGame (FILE *f, int gameNumber, char *title, int useList) { int retVal; if (gameNumber > nCmailGames) { DisplayError(_("No more games in this message"), 0); return FALSE; } if (f == lastLoadGameFP) { int offset = gameNumber - lastLoadGameNumber; if (offset == 0) { cmailMsg[0] = NULLCHAR; if (cmailMoveRegistered[lastLoadGameNumber - 1]) { cmailMoveRegistered[lastLoadGameNumber - 1] = FALSE; nCmailMovesRegistered--; } cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE; if (cmailResult[lastLoadGameNumber - 1] == CMAIL_NEW_RESULT) { cmailResult[lastLoadGameNumber - 1] = CMAIL_NOT_RESULT; } } else { if (! RegisterMove()) return FALSE; } } retVal = LoadGame(f, gameNumber, title, useList); /* Make move registered during previous look at this game, if any */ MakeRegisteredMove(); if (cmailCommentList[lastLoadGameNumber - 1] != NULL) { commentList[currentMove] = StrSave(cmailCommentList[lastLoadGameNumber - 1]); DisplayComment(currentMove - 1, commentList[currentMove]); } return retVal; } /* Support for LoadNextGame, LoadPreviousGame, ReloadSameGame */ int ReloadGame (int offset) { int gameNumber = lastLoadGameNumber + offset; if (lastLoadGameFP == NULL) { DisplayError(_("No game has been loaded yet"), 0); return FALSE; } if (gameNumber <= 0) { DisplayError(_("Can't back up any further"), 0); return FALSE; } if (cmailMsgLoaded) { return CmailLoadGame(lastLoadGameFP, gameNumber, lastLoadGameTitle, lastLoadGameUseList); } else { return LoadGame(lastLoadGameFP, gameNumber, lastLoadGameTitle, lastLoadGameUseList); } } int keys[EmptySquare+1]; int PositionMatches (Board b1, Board b2) { int r, f, sum=0; switch(appData.searchMode) { case 1: return CompareWithRights(b1, b2); case 2: for(r=0; r fromX+1 || toX < fromX-1) && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1) { int from = toX>fromX ? BOARD_RGHT-1 : BOARD_LEFT; moveDatabase[movePtr++].piece = Q_WCASTL; quickBoard[sq] = piece; piece = quickBoard[from]; quickBoard[from] = 0; moveDatabase[movePtr].to = pieceList[piece] = sq = toX>fromX ? sq-1 : sq+1; } else if((rook = quickBoard[sq]) && pieceType[rook] == WhiteRook) { // FRC castling quickBoard[sq] = 0; // remove Rook moveDatabase[movePtr].to = sq = (toX>fromX ? BOARD_RGHT-2 : BOARD_LEFT+2); // King to-square moveDatabase[movePtr++].piece = Q_WCASTL; quickBoard[sq] = pieceList[1]; // put King piece = rook; moveDatabase[movePtr].to = pieceList[rook] = sq = toX>fromX ? sq-1 : sq+1; } } else if(piece == pieceList[2] && fromY == toY) { if((toX > fromX+1 || toX < fromX-1) && fromX != BOARD_LEFT && fromX != BOARD_RGHT-1) { int from = (toX>fromX ? BOARD_RGHT-1 : BOARD_LEFT) + (BOARD_HEIGHT-1 <<4); moveDatabase[movePtr++].piece = Q_BCASTL; quickBoard[sq] = piece; piece = quickBoard[from]; quickBoard[from] = 0; moveDatabase[movePtr].to = pieceList[piece] = sq = toX>fromX ? sq-1 : sq+1; } else if((rook = quickBoard[sq]) && pieceType[rook] == BlackRook) { // FRC castling quickBoard[sq] = 0; // remove Rook moveDatabase[movePtr].to = sq = (toX>fromX ? BOARD_RGHT-2 : BOARD_LEFT+2); moveDatabase[movePtr++].piece = Q_BCASTL; quickBoard[sq] = pieceList[2]; // put King piece = rook; moveDatabase[movePtr].to = pieceList[rook] = sq = toX>fromX ? sq-1 : sq+1; } } else if(epOK && (pieceType[piece] == WhitePawn || pieceType[piece] == BlackPawn) && fromX != toX && quickBoard[sq] == 0) { quickBoard[(fromY<<4)+toX] = 0; moveDatabase[movePtr].piece = Q_EP; moveDatabase[movePtr++].to = (fromY<<4)+toX; moveDatabase[movePtr].to = sq; } else if(promoPiece != pieceType[piece]) { moveDatabase[movePtr++].piece = Q_PROMO; moveDatabase[movePtr].to = pieceType[piece] = (int) promoPiece; } moveDatabase[movePtr].piece = piece; quickBoard[sq] = piece; movePtr++; } int PackGame (Board board) { Move *newSpace = NULL; moveDatabase[movePtr].piece = 0; // terminate previous game if(movePtr > dataSize) { if(appData.debugMode) fprintf(debugFP, "move-cache overflow, enlarge to %d MB\n", dataSize/128); dataSize *= 8; // increase size by factor 8 (512KB -> 4MB -> 32MB -> 256MB -> 2GB) if(dataSize) newSpace = (Move*) calloc(dataSize + 1000, sizeof(Move)); if(newSpace) { int i; Move *p = moveDatabase, *q = newSpace; for(i=0; i 8*DSIZE) free(moveDatabase); // and free old space (if it was allocated) moveDatabase = newSpace; } else { // calloc failed, we must be out of memory. Too bad... dataSize = 0; // prevent calloc events for all subsequent games return 0; // and signal this one isn't cached } } movePtr++; MakePieceList(board, counts); return movePtr; } int QuickCompare (Board board, int *minCounts, int *maxCounts) { // compare according to search mode int r, f; switch(appData.searchMode) { case 1: // exact position match if(!(turn & board[EP_STATUS-1])) return FALSE; // wrong side to move for(r=0; r maxCounts[r]) return FALSE; } return TRUE; } int QuickScan (Board board, Move *move) { // reconstruct game,and compare all positions in it int cnt=0, stretch=0, total = MakePieceList(board, counts); do { int piece = move->piece; int to = move->to, from = pieceList[piece]; if(piece <= Q_PROMO) { // special moves encoded by otherwise invalid piece numbers 1-4 if(!piece) return -1; if(piece == Q_PROMO) { // promotion, encoded as (Q_PROMO, to) + (piece, promoType) piece = (++move)->piece; from = pieceList[piece]; counts[pieceType[piece]]--; pieceType[piece] = (ChessSquare) move->to; counts[move->to]++; } else if(piece == Q_EP) { // e.p. capture, encoded as (Q_EP, ep-sqr) + (piece, to) counts[pieceType[quickBoard[to]]]--; quickBoard[to] = 0; total--; move++; continue; } else if(piece <= Q_BCASTL) { // castling, encoded as (Q_XCASTL, king-to) + (rook, rook-to) piece = pieceList[piece]; // first two elements of pieceList contain King numbers from = pieceList[piece]; // so this must be King quickBoard[from] = 0; pieceList[piece] = to; from = pieceList[(++move)->piece]; // for FRC this has to be done here quickBoard[from] = 0; // rook quickBoard[to] = piece; to = move->to; piece = move->piece; goto aftercastle; } } if(appData.searchMode > 2) counts[pieceType[quickBoard[to]]]--; // account capture if((total -= (quickBoard[to] != 0)) < soughtTotal) return -1; // piece count dropped below what we search for quickBoard[from] = 0; aftercastle: quickBoard[to] = piece; pieceList[piece] = to; cnt++; turn ^= 3; if(QuickCompare(soughtBoard, minSought, maxSought) || appData.ignoreColors && QuickCompare(reverseBoard, minReverse, maxReverse) || flipSearch && (QuickCompare(flipBoard, minSought, maxSought) || appData.ignoreColors && QuickCompare(rotateBoard, minReverse, maxReverse)) ) { static int lastCounts[EmptySquare+1]; int i; if(stretch) for(i=0; i= appData.stretch)) return cnt + 1 - stretch; move++; } while(1); } void InitSearch () { int r, f; flipSearch = FALSE; CopyBoard(soughtBoard, boards[currentMove]); soughtTotal = MakePieceList(soughtBoard, maxSought); soughtBoard[EP_STATUS-1] = (currentMove & 1) + 1; if(currentMove == 0 && gameMode == EditPosition) soughtBoard[EP_STATUS-1] = blackPlaysFirst + 1; // (!) CopyBoard(reverseBoard, boards[currentMove]); for(r=0; r= 5) { for(r=BOARD_HEIGHT/2; rgameInfo.variant != gameInfo.variant) return -1; // wrong variant if(appData.eloThreshold1 && (lg->gameInfo.whiteRating < appData.eloThreshold1 && lg->gameInfo.blackRating < appData.eloThreshold1)) return -1; if(appData.eloThreshold2 && (lg->gameInfo.whiteRating < appData.eloThreshold2 || lg->gameInfo.blackRating < appData.eloThreshold2)) return -1; if(appData.dateThreshold && (!lg->gameInfo.date || atoi(lg->gameInfo.date) < appData.dateThreshold)) return -1; if(!initDone) { for(next = WhitePawn; next>8 ^ random()<<6 ^random()<<20; initDone = TRUE; } if(lg->gameInfo.fen) ParseFEN(boards[scratch], &btm, lg->gameInfo.fen); else CopyBoard(boards[scratch], initialPosition); // default start position if(lg->moves) { turn = btm + 1; if((next = QuickScan( boards[scratch], &moveDatabase[lg->moves] )) < 0) return -1; // quick scan rules out it is there if(appData.searchMode >= 4) return next; // for material searches, trust QuickScan. } if(btm) plyNr++; if(PositionMatches(boards[scratch], boards[currentMove])) return plyNr; fseek(f, lg->offset, 0); yynewfile(f); while(1) { yyboardindex = scratch; quickFlag = plyNr+1; next = Myylex(); quickFlag = 0; switch(next) { case PGNTag: if(plyNr) return -1; // after we have seen moves, any tags will be start of next game default: continue; case XBoardGame: case GNUChessGame: if(plyNr) return -1; // after we have seen moves, this is for new game continue; case AmbiguousMove: // we cannot reconstruct the game beyond these two case ImpossibleMove: case WhiteWins: // game ends here with these four case BlackWins: case GameIsDrawn: case GameUnfinished: return -1; case IllegalMove: if(appData.testLegality) return -1; case WhiteCapturesEnPassant: case BlackCapturesEnPassant: case WhitePromotion: case BlackPromotion: case WhiteNonPromotion: case BlackNonPromotion: case NormalMove: case WhiteKingSideCastle: case WhiteQueenSideCastle: case BlackKingSideCastle: case BlackQueenSideCastle: case WhiteKingSideCastleWild: case WhiteQueenSideCastleWild: case BlackKingSideCastleWild: case BlackQueenSideCastleWild: case WhiteHSideCastleFR: case WhiteASideCastleFR: case BlackHSideCastleFR: case BlackASideCastleFR: fromX = currentMoveString[0] - AAA; fromY = currentMoveString[1] - ONE; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = currentMoveString[4]; break; case WhiteDrop: case BlackDrop: fromX = next == WhiteDrop ? (int) CharToPiece(ToUpper(currentMoveString[0])) : (int) CharToPiece(ToLower(currentMoveString[0])); fromY = DROP_RANK; toX = currentMoveString[2] - AAA; toY = currentMoveString[3] - ONE; promoChar = 0; break; } // Move encountered; peform it. We need to shuttle between two boards, as even/odd index determines side to move plyNr++; ApplyMove(fromX, fromY, toX, toY, promoChar, boards[scratch]); if(PositionMatches(boards[scratch], boards[currentMove])) return plyNr; if(appData.ignoreColors && PositionMatches(boards[scratch], reverseBoard)) return plyNr; if(appData.findMirror) { if(PositionMatches(boards[scratch], flipBoard)) return plyNr; if(appData.ignoreColors && PositionMatches(boards[scratch], rotateBoard)) return plyNr; } } } /* Load the nth game from open file f */ int LoadGame (FILE *f, int gameNumber, char *title, int useList) { ChessMove cm; char buf[MSG_SIZ]; int gn = gameNumber; ListGame *lg = NULL; int numPGNTags = 0; int err, pos = -1; GameMode oldGameMode; VariantClass oldVariant = gameInfo.variant; /* [HGM] PGNvariant */ if (appData.debugMode) fprintf(debugFP, "LoadGame(): on entry, gameMode %d\n", gameMode); if (gameMode == Training ) SetTrainingModeOff(); oldGameMode = gameMode; if (gameMode != BeginningOfGame) { Reset(FALSE, TRUE); } gameFileFP = f; if (lastLoadGameFP != NULL && lastLoadGameFP != f) { fclose(lastLoadGameFP); } if (useList) { lg = (ListGame *) ListElem(&gameList, gameNumber-1); if (lg) { fseek(f, lg->offset, 0); GameListHighlight(gameNumber); pos = lg->position; gn = 1; } else { if(oldGameMode == AnalyzeFile && appData.loadGameIndex == -1) appData.loadGameIndex = 0; // [HGM] suppress error message if we reach file end after auto-stepping analysis else DisplayError(_("Game number out of range"), 0); return FALSE; } } else { GameListDestroy(); if (fseek(f, 0, 0) == -1) { if (f == lastLoadGameFP ? gameNumber == lastLoadGameNumber + 1 : gameNumber == 1) { gn = 1; } else { DisplayError(_("Can't seek on game file"), 0); return FALSE; } } } lastLoadGameFP = f; lastLoadGameNumber = gameNumber; safeStrCpy(lastLoadGameTitle, title, sizeof(lastLoadGameTitle)/sizeof(lastLoadGameTitle[0])); lastLoadGameUseList = useList; yynewfile(f); if (lg && lg->gameInfo.white && lg->gameInfo.black) { snprintf(buf, sizeof(buf), "%s %s %s", lg->gameInfo.white, _("vs."), lg->gameInfo.black); DisplayTitle(buf); } else if (*title != NULLCHAR) { if (gameNumber > 1) { snprintf(buf, MSG_SIZ, "%s %d", title, gameNumber); DisplayTitle(buf); } else { DisplayTitle(title); } } if (gameMode != AnalyzeFile && gameMode != AnalyzeMode) { gameMode = PlayFromGameFile; ModeHighlight(); } currentMove = forwardMostMove = backwardMostMove = 0; CopyBoard(boards[0], initialPosition); StopClocks(); /* * Skip the first gn-1 games in the file. * Also skip over anything that precedes an identifiable * start of game marker, to avoid being confused by * garbage at the start of the file. Currently * recognized start of game markers are the move number "1", * the pattern "gnuchess .* game", the pattern * "^[#;%] [^ ]* game file", and a PGN tag block. * A game that starts with one of the latter two patterns * will also have a move number 1, possibly * following a position diagram. * 5-4-02: Let's try being more lenient and allowing a game to * start with an unnumbered move. Does that break anything? */ cm = lastLoadGameStart = EndOfFile; while (gn > 0) { yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); switch (cm) { case EndOfFile: if (cmailMsgLoaded) { nCmailGames = CMAIL_MAX_GAMES - gn; } else { Reset(TRUE, TRUE); DisplayError(_("Game not found in file"), 0); } return FALSE; case GNUChessGame: case XBoardGame: gn--; lastLoadGameStart = cm; break; case MoveNumberOne: switch (lastLoadGameStart) { case GNUChessGame: case XBoardGame: case PGNTag: break; case MoveNumberOne: case EndOfFile: gn--; /* count this game */ lastLoadGameStart = cm; break; default: /* impossible */ break; } break; case PGNTag: switch (lastLoadGameStart) { case GNUChessGame: case PGNTag: case MoveNumberOne: case EndOfFile: gn--; /* count this game */ lastLoadGameStart = cm; break; case XBoardGame: lastLoadGameStart = cm; /* game counted already */ break; default: /* impossible */ break; } if (gn > 0) { do { yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); } while (cm == PGNTag || cm == Comment); } break; case WhiteWins: case BlackWins: case GameIsDrawn: if (cmailMsgLoaded && (CMAIL_MAX_GAMES == lastLoadGameNumber)) { if ( cmailResult[CMAIL_MAX_GAMES - gn - 1] != CMAIL_OLD_RESULT) { nCmailResults ++ ; cmailResult[ CMAIL_MAX_GAMES - gn - 1] = CMAIL_OLD_RESULT; } } break; case NormalMove: /* Only a NormalMove can be at the start of a game * without a position diagram. */ if (lastLoadGameStart == EndOfFile ) { gn--; lastLoadGameStart = MoveNumberOne; } break; default: break; } } if (appData.debugMode) fprintf(debugFP, "Parsed game start '%s' (%d)\n", yy_text, (int) cm); if (cm == XBoardGame) { /* Skip any header junk before position diagram and/or move 1 */ for (;;) { yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); if (cm == EndOfFile || cm == GNUChessGame || cm == XBoardGame) { /* Empty game; pretend end-of-file and handle later */ cm = EndOfFile; break; } if (cm == MoveNumberOne || cm == PositionDiagram || cm == PGNTag || cm == Comment) break; } } else if (cm == GNUChessGame) { if (gameInfo.event != NULL) { free(gameInfo.event); } gameInfo.event = StrSave(yy_text); } startedFromSetupPosition = FALSE; while (cm == PGNTag) { if (appData.debugMode) fprintf(debugFP, "Parsed PGNTag: %s\n", yy_text); err = ParsePGNTag(yy_text, &gameInfo); if (!err) numPGNTags++; /* [HGM] PGNvariant: automatically switch to variant given in PGN tag */ if(gameInfo.variant != oldVariant) { startedFromPositionFile = FALSE; /* [HGM] loadPos: variant switch likely makes position invalid */ ResetFrontEnd(); // [HGM] might need other bitmaps. Cannot use Reset() because it clears gameInfo :-( InitPosition(TRUE); oldVariant = gameInfo.variant; if (appData.debugMode) fprintf(debugFP, "New variant %d\n", (int) oldVariant); } if (gameInfo.fen != NULL) { Board initial_position; startedFromSetupPosition = TRUE; if (!ParseFEN(initial_position, &blackPlaysFirst, gameInfo.fen)) { Reset(TRUE, TRUE); DisplayError(_("Bad FEN position in file"), 0); return FALSE; } CopyBoard(boards[0], initial_position); if (blackPlaysFirst) { currentMove = forwardMostMove = backwardMostMove = 1; CopyBoard(boards[1], initial_position); safeStrCpy(moveList[0], "", sizeof(moveList[0])/sizeof(moveList[0][0])); safeStrCpy(parseList[0], "", sizeof(parseList[0])/sizeof(parseList[0][0])); timeRemaining[0][1] = whiteTimeRemaining; timeRemaining[1][1] = blackTimeRemaining; if (commentList[0] != NULL) { commentList[1] = commentList[0]; commentList[0] = NULL; } } else { currentMove = forwardMostMove = backwardMostMove = 0; } /* [HGM] copy FEN attributes as well. Bugfix 4.3.14m and 4.3.15e: moved to after 'blackPlaysFirst' */ { int i; initialRulePlies = FENrulePlies; for( i=0; i< nrCastlingRights; i++ ) initialRights[i] = initial_position[CASTLING][i]; } yyboardindex = forwardMostMove; free(gameInfo.fen); gameInfo.fen = NULL; } yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); /* Handle comments interspersed among the tags */ while (cm == Comment) { char *p; if (appData.debugMode) fprintf(debugFP, "Parsed Comment: %s\n", yy_text); p = yy_text; AppendComment(currentMove, p, FALSE); yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); } } /* don't rely on existence of Event tag since if game was * pasted from clipboard the Event tag may not exist */ if (numPGNTags > 0){ char *tags; if (gameInfo.variant == VariantNormal) { VariantClass v = StringToVariant(gameInfo.event); // [HGM] do not recognize variants from event tag that were introduced after supporting variant tag if(v < VariantShogi) gameInfo.variant = v; } if (!matchMode) { if( appData.autoDisplayTags ) { tags = PGNTags(&gameInfo); TagsPopUp(tags, CmailMsg()); free(tags); } } } else { /* Make something up, but don't display it now */ SetGameInfo(); TagsPopDown(); } if (cm == PositionDiagram) { int i, j; char *p; Board initial_position; if (appData.debugMode) fprintf(debugFP, "Parsed PositionDiagram: %s\n", yy_text); if (!startedFromSetupPosition) { p = yy_text; for (i = BOARD_HEIGHT - 1; i >= 0; i--) for (j = BOARD_LEFT; j < BOARD_RGHT; p++) switch (*p) { case '{': case '[': case '-': case ' ': case '\t': case '\n': case '\r': break; default: initial_position[i][j++] = CharToPiece(*p); break; } while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') p++; if (strncmp(p, "black", strlen("black"))==0) blackPlaysFirst = TRUE; else blackPlaysFirst = FALSE; startedFromSetupPosition = TRUE; CopyBoard(boards[0], initial_position); if (blackPlaysFirst) { currentMove = forwardMostMove = backwardMostMove = 1; CopyBoard(boards[1], initial_position); safeStrCpy(moveList[0], "", sizeof(moveList[0])/sizeof(moveList[0][0])); safeStrCpy(parseList[0], "", sizeof(parseList[0])/sizeof(parseList[0][0])); timeRemaining[0][1] = whiteTimeRemaining; timeRemaining[1][1] = blackTimeRemaining; if (commentList[0] != NULL) { commentList[1] = commentList[0]; commentList[0] = NULL; } } else { currentMove = forwardMostMove = backwardMostMove = 0; } } yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); } if(!creatingBook) { if (first.pr == NoProc) { StartChessProgram(&first); } InitChessProgram(&first, FALSE); SendToProgram("force\n", &first); if (startedFromSetupPosition) { SendBoard(&first, forwardMostMove); if (appData.debugMode) { fprintf(debugFP, "Load Game\n"); } DisplayBothClocks(); } } /* [HGM] server: flag to write setup moves in broadcast file as one */ loadFlag = appData.suppressLoadMoves; while (cm == Comment) { char *p; if (appData.debugMode) fprintf(debugFP, "Parsed Comment: %s\n", yy_text); p = yy_text; AppendComment(currentMove, p, FALSE); yyboardindex = forwardMostMove; cm = (ChessMove) Myylex(); } if ((cm == EndOfFile && lastLoadGameStart != EndOfFile ) || cm == WhiteWins || cm == BlackWins || cm == GameIsDrawn || cm == GameUnfinished) { DisplayMessage("", _("No moves in game")); if (cmailMsgLoaded) { if (appData.debugMode) fprintf(debugFP, "Setting flipView to %d.\n", FALSE); ClearHighlights(); flipView = FALSE; } DrawPosition(FALSE, boards[currentMove]); DisplayBothClocks(); gameMode = EditGame; ModeHighlight(); gameFileFP = NULL; cmailOldMove = 0; return TRUE; } // [HGM] PV info: routine tests if comment empty if (!matchMode && (pausing || appData.timeDelay != 0)) { DisplayComment(currentMove - 1, commentList[currentMove]); } if (!matchMode && appData.timeDelay != 0) DrawPosition(FALSE, boards[currentMove]); if (gameMode == AnalyzeFile || gameMode == AnalyzeMode) { programStats.ok_to_send = 1; } /* if the first token after the PGN tags is a move * and not move number 1, retrieve it from the parser */ if (cm != MoveNumberOne) LoadGameOneMove(cm); /* load the remaining moves from the file */ while (LoadGameOneMove(EndOfFile)) { timeRemaining[0][forwardMostMove] = whiteTimeRemaining; timeRemaining[1][forwardMostMove] = blackTimeRemaining; } /* rewind to the start of the game */ currentMove = backwardMostMove; HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); if (oldGameMode == AnalyzeFile) { appData.loadGameIndex = -1; // [HGM] order auto-stepping through games AnalyzeFileEvent(); } else if (oldGameMode == AnalyzeMode) { AnalyzeFileEvent(); } if(creatingBook) return TRUE; if (!matchMode && pos > 0) { ToNrEvent(pos); // [HGM] no autoplay if selected on position } else if (matchMode || appData.timeDelay == 0) { ToEndEvent(); } else if (appData.timeDelay > 0) { AutoPlayGameLoop(); } if (appData.debugMode) fprintf(debugFP, "LoadGame(): on exit, gameMode %d\n", gameMode); loadFlag = 0; /* [HGM] true game starts */ return TRUE; } /* Support for LoadNextPosition, LoadPreviousPosition, ReloadSamePosition */ int ReloadPosition (int offset) { int positionNumber = lastLoadPositionNumber + offset; if (lastLoadPositionFP == NULL) { DisplayError(_("No position has been loaded yet"), 0); return FALSE; } if (positionNumber <= 0) { DisplayError(_("Can't back up any further"), 0); return FALSE; } return LoadPosition(lastLoadPositionFP, positionNumber, lastLoadPositionTitle); } /* Load the nth position from the given file */ int LoadPositionFromFile (char *filename, int n, char *title) { FILE *f; char buf[MSG_SIZ]; if (strcmp(filename, "-") == 0) { return LoadPosition(stdin, n, "stdin"); } else { f = fopen(filename, "rb"); if (f == NULL) { snprintf(buf, sizeof(buf), _("Can't open \"%s\""), filename); DisplayError(buf, errno); return FALSE; } else { return LoadPosition(f, n, title); } } } /* Load the nth position from the given open file, and close it */ int LoadPosition (FILE *f, int positionNumber, char *title) { char *p, line[MSG_SIZ]; Board initial_position; int i, j, fenMode, pn; if (gameMode == Training ) SetTrainingModeOff(); if (gameMode != BeginningOfGame) { Reset(FALSE, TRUE); } if (lastLoadPositionFP != NULL && lastLoadPositionFP != f) { fclose(lastLoadPositionFP); } if (positionNumber == 0) positionNumber = 1; lastLoadPositionFP = f; lastLoadPositionNumber = positionNumber; safeStrCpy(lastLoadPositionTitle, title, sizeof(lastLoadPositionTitle)/sizeof(lastLoadPositionTitle[0])); if (first.pr == NoProc && !appData.noChessProgram) { StartChessProgram(&first); InitChessProgram(&first, FALSE); } pn = positionNumber; if (positionNumber < 0) { /* Negative position number means to seek to that byte offset */ if (fseek(f, -positionNumber, 0) == -1) { DisplayError(_("Can't seek on position file"), 0); return FALSE; }; pn = 1; } else { if (fseek(f, 0, 0) == -1) { if (f == lastLoadPositionFP ? positionNumber == lastLoadPositionNumber + 1 : positionNumber == 1) { pn = 1; } else { DisplayError(_("Can't seek on position file"), 0); return FALSE; } } } /* See if this file is FEN or old-style xboard */ if (fgets(line, MSG_SIZ, f) == NULL) { DisplayError(_("Position not found in file"), 0); return FALSE; } // [HGM] FEN can begin with digit, any piece letter valid in this variant, or a + for Shogi promoted pieces fenMode = line[0] >= '0' && line[0] <= '9' || line[0] == '+' || CharToPiece(line[0]) != EmptySquare; if (pn >= 2) { if (fenMode || line[0] == '#') pn--; while (pn > 0) { /* skip positions before number pn */ if (fgets(line, MSG_SIZ, f) == NULL) { Reset(TRUE, TRUE); DisplayError(_("Position not found in file"), 0); return FALSE; } if (fenMode || line[0] == '#') pn--; } } if (fenMode) { if (!ParseFEN(initial_position, &blackPlaysFirst, line)) { DisplayError(_("Bad FEN position in file"), 0); return FALSE; } } else { (void) fgets(line, MSG_SIZ, f); (void) fgets(line, MSG_SIZ, f); for (i = BOARD_HEIGHT - 1; i >= 0; i--) { (void) fgets(line, MSG_SIZ, f); for (p = line, j = BOARD_LEFT; j < BOARD_RGHT; p++) { if (*p == ' ') continue; initial_position[i][j++] = CharToPiece(*p); } } blackPlaysFirst = FALSE; if (!feof(f)) { (void) fgets(line, MSG_SIZ, f); if (strncmp(line, "black", strlen("black"))==0) blackPlaysFirst = TRUE; } } startedFromSetupPosition = TRUE; CopyBoard(boards[0], initial_position); if (blackPlaysFirst) { currentMove = forwardMostMove = backwardMostMove = 1; safeStrCpy(moveList[0], "", sizeof(moveList[0])/sizeof(moveList[0][0])); safeStrCpy(parseList[0], "", sizeof(parseList[0])/sizeof(parseList[0][0])); CopyBoard(boards[1], initial_position); DisplayMessage("", _("Black to play")); } else { currentMove = forwardMostMove = backwardMostMove = 0; DisplayMessage("", _("White to play")); } initialRulePlies = FENrulePlies; /* [HGM] copy FEN attributes as well */ if(first.pr != NoProc) { // [HGM] in tourney-mode a position can be loaded before the chess engine is installed SendToProgram("force\n", &first); SendBoard(&first, forwardMostMove); } if (appData.debugMode) { int i, j; for(i=0;i<2;i++){for(j=0;j<6;j++)fprintf(debugFP, " %d", boards[i][CASTLING][j]);fprintf(debugFP,"\n");} for(j=0;j<6;j++)fprintf(debugFP, " %d", initialRights[j]);fprintf(debugFP,"\n"); fprintf(debugFP, "Load Position\n"); } if (positionNumber > 1) { snprintf(line, MSG_SIZ, "%s %d", title, positionNumber); DisplayTitle(line); } else { DisplayTitle(title); } gameMode = EditGame; ModeHighlight(); ResetClocks(); timeRemaining[0][1] = whiteTimeRemaining; timeRemaining[1][1] = blackTimeRemaining; DrawPosition(FALSE, boards[currentMove]); return TRUE; } void CopyPlayerNameIntoFileName (char **dest, char *src) { while (*src != NULLCHAR && *src != ',') { if (*src == ' ') { *(*dest)++ = '_'; src++; } else { *(*dest)++ = *src++; } } } char * DefaultFileName (char *ext) { static char def[MSG_SIZ]; char *p; if (gameInfo.white != NULL && gameInfo.white[0] != '-') { p = def; CopyPlayerNameIntoFileName(&p, gameInfo.white); *p++ = '-'; CopyPlayerNameIntoFileName(&p, gameInfo.black); *p++ = '.'; safeStrCpy(p, ext, MSG_SIZ-2-strlen(gameInfo.white)-strlen(gameInfo.black)); } else { def[0] = NULLCHAR; } return def; } /* Save the current game to the given file */ int SaveGameToFile (char *filename, int append) { FILE *f; char buf[MSG_SIZ]; int result, i, t,tot=0; if (strcmp(filename, "-") == 0) { return SaveGame(stdout, 0, NULL); } else { for(i=0; i<10; i++) { // upto 10 tries f = fopen(filename, append ? "a" : "w"); if(f && i) fprintf(f, "[Delay \"%d retries, %d msec\"]\n",i,tot); if(f || errno != 13) break; DoSleep(t = 5 + random()%11); // wait 5-15 msec tot += t; } if (f == NULL) { snprintf(buf, sizeof(buf), _("Can't open \"%s\""), filename); DisplayError(buf, errno); return FALSE; } else { safeStrCpy(buf, lastMsg, MSG_SIZ); DisplayMessage(_("Waiting for access to save file"), ""); flock(fileno(f), LOCK_EX); // [HGM] lock: lock file while we are writing DisplayMessage(_("Saving game"), ""); if(lseek(fileno(f), 0, SEEK_END) == -1) DisplayError(_("Bad Seek"), errno); // better safe than sorry... result = SaveGame(f, 0, NULL); DisplayMessage(buf, ""); return result; } } } char * SavePart (char *str) { static char buf[MSG_SIZ]; char *p; p = strchr(str, ' '); if (p == NULL) return str; strncpy(buf, str, p - str); buf[p - str] = NULLCHAR; return buf; } #define PGN_MAX_LINE 75 #define PGN_SIDE_WHITE 0 #define PGN_SIDE_BLACK 1 static int FindFirstMoveOutOfBook (int side) { int result = -1; if( backwardMostMove == 0 && ! startedFromSetupPosition) { int index = backwardMostMove; int has_book_hit = 0; if( (index % 2) != side ) { index++; } while( index < forwardMostMove ) { /* Check to see if engine is in book */ int depth = pvInfoList[index].depth; int score = pvInfoList[index].score; int in_book = 0; if( depth <= 2 ) { in_book = 1; } else if( score == 0 && depth == 63 ) { in_book = 1; /* Zappa */ } else if( score == 2 && depth == 99 ) { in_book = 1; /* Abrok */ } has_book_hit += in_book; if( ! in_book ) { result = index; break; } index += 2; } } return result; } void GetOutOfBookInfo (char * buf) { int oob[2]; int i; int offset = backwardMostMove & (~1L); /* output move numbers start at 1 */ oob[0] = FindFirstMoveOutOfBook( PGN_SIDE_WHITE ); oob[1] = FindFirstMoveOutOfBook( PGN_SIDE_BLACK ); *buf = '\0'; if( oob[0] >= 0 || oob[1] >= 0 ) { for( i=0; i<2; i++ ) { int idx = oob[i]; if( idx >= 0 ) { if( i > 0 && oob[0] >= 0 ) { strcat( buf, " " ); } sprintf( buf+strlen(buf), "%d%s. ", (idx - offset)/2 + 1, idx & 1 ? ".." : "" ); sprintf( buf+strlen(buf), "%s%.2f", pvInfoList[idx].score >= 0 ? "+" : "", pvInfoList[idx].score / 100.0 ); } } } } /* Save game in PGN style and close the file */ int SaveGamePGN (FILE *f) { int i, offset, linelen, newblock; // char *movetext; char numtext[32]; int movelen, numlen, blank; char move_buffer[100]; /* [AS] Buffer for move+PV info */ offset = backwardMostMove & (~1L); /* output move numbers start at 1 */ PrintPGNTags(f, &gameInfo); if(appData.numberTag && matchMode) fprintf(f, "[Number \"%d\"]\n", nextGame+1); // [HGM] number tag if (backwardMostMove > 0 || startedFromSetupPosition) { char *fen = PositionToFEN(backwardMostMove, NULL); fprintf(f, "[FEN \"%s\"]\n[SetUp \"1\"]\n", fen); fprintf(f, "\n{--------------\n"); PrintPosition(f, backwardMostMove); fprintf(f, "--------------}\n"); free(fen); } else { /* [AS] Out of book annotation */ if( appData.saveOutOfBookInfo ) { char buf[64]; GetOutOfBookInfo( buf ); if( buf[0] != '\0' ) { fprintf( f, "[%s \"%s\"]\n", PGN_OUT_OF_BOOK, buf ); } } fprintf(f, "\n"); } i = backwardMostMove; linelen = 0; newblock = TRUE; while (i < forwardMostMove) { /* Print comments preceding this move */ if (commentList[i] != NULL) { if (linelen > 0) fprintf(f, "\n"); fprintf(f, "%s", commentList[i]); linelen = 0; newblock = TRUE; } /* Format move number */ if ((i % 2) == 0) snprintf(numtext, sizeof(numtext)/sizeof(numtext[0]),"%d.", (i - offset)/2 + 1); else if (newblock) snprintf(numtext, sizeof(numtext)/sizeof(numtext[0]), "%d...", (i - offset)/2 + 1); else numtext[0] = NULLCHAR; numlen = strlen(numtext); newblock = FALSE; /* Print move number */ blank = linelen > 0 && numlen > 0; if (linelen + (blank ? 1 : 0) + numlen > PGN_MAX_LINE) { fprintf(f, "\n"); linelen = 0; blank = 0; } if (blank) { fprintf(f, " "); linelen++; } fprintf(f, "%s", numtext); linelen += numlen; /* Get move */ safeStrCpy(move_buffer, SavePart(parseList[i]), sizeof(move_buffer)/sizeof(move_buffer[0])); // [HGM] pgn: print move via buffer, so it can be edited movelen = strlen(move_buffer); /* [HGM] pgn: line-break point before move */ /* Print move */ blank = linelen > 0 && movelen > 0; if (linelen + (blank ? 1 : 0) + movelen > PGN_MAX_LINE) { fprintf(f, "\n"); linelen = 0; blank = 0; } if (blank) { fprintf(f, " "); linelen++; } fprintf(f, "%s", move_buffer); linelen += movelen; /* [AS] Add PV info if present */ if( i >= 0 && appData.saveExtendedInfoInPGN && pvInfoList[i].depth > 0 ) { /* [HGM] add time */ char buf[MSG_SIZ]; int seconds; seconds = (pvInfoList[i].time+5)/10; // deci-seconds, rounded to nearest if( seconds <= 0) buf[0] = 0; else if( seconds < 30 ) snprintf(buf, MSG_SIZ, " %3.1f%c", seconds/10., 0); else { seconds = (seconds + 4)/10; // round to full seconds if( seconds < 60 ) snprintf(buf, MSG_SIZ, " %d%c", seconds, 0); else snprintf(buf, MSG_SIZ, " %d:%02d%c", seconds/60, seconds%60, 0); } snprintf( move_buffer, sizeof(move_buffer)/sizeof(move_buffer[0]),"{%s%.2f/%d%s}", pvInfoList[i].score >= 0 ? "+" : "", pvInfoList[i].score / 100.0, pvInfoList[i].depth, buf ); movelen = strlen(move_buffer); /* [HGM] pgn: line-break point after move */ /* Print score/depth */ blank = linelen > 0 && movelen > 0; if (linelen + (blank ? 1 : 0) + movelen > PGN_MAX_LINE) { fprintf(f, "\n"); linelen = 0; blank = 0; } if (blank) { fprintf(f, " "); linelen++; } fprintf(f, "%s", move_buffer); linelen += movelen; } i++; } /* Start a new line */ if (linelen > 0) fprintf(f, "\n"); /* Print comments after last move */ if (commentList[i] != NULL) { fprintf(f, "%s\n", commentList[i]); } /* Print result */ if (gameInfo.resultDetails != NULL && gameInfo.resultDetails[0] != NULLCHAR) { fprintf(f, "{%s} %s\n\n", gameInfo.resultDetails, PGNResult(gameInfo.result)); } else { fprintf(f, "%s\n\n", PGNResult(gameInfo.result)); } fclose(f); lastSavedGame = GameCheckSum(); // [HGM] save: remember ID of last saved game to prevent double saving return TRUE; } /* Save game in old style and close the file */ int SaveGameOldStyle (FILE *f) { int i, offset; time_t tm; tm = time((time_t *) NULL); fprintf(f, "# %s game file -- %s", programName, ctime(&tm)); PrintOpponents(f); if (backwardMostMove > 0 || startedFromSetupPosition) { fprintf(f, "\n[--------------\n"); PrintPosition(f, backwardMostMove); fprintf(f, "--------------]\n"); } else { fprintf(f, "\n"); } i = backwardMostMove; offset = backwardMostMove & (~1L); /* output move numbers start at 1 */ while (i < forwardMostMove) { if (commentList[i] != NULL) { fprintf(f, "[%s]\n", commentList[i]); } if ((i % 2) == 1) { fprintf(f, "%d. ... %s\n", (i - offset)/2 + 1, parseList[i]); i++; } else { fprintf(f, "%d. %s ", (i - offset)/2 + 1, parseList[i]); i++; if (commentList[i] != NULL) { fprintf(f, "\n"); continue; } if (i >= forwardMostMove) { fprintf(f, "\n"); break; } fprintf(f, "%s\n", parseList[i]); i++; } } if (commentList[i] != NULL) { fprintf(f, "[%s]\n", commentList[i]); } /* This isn't really the old style, but it's close enough */ if (gameInfo.resultDetails != NULL && gameInfo.resultDetails[0] != NULLCHAR) { fprintf(f, "%s (%s)\n\n", PGNResult(gameInfo.result), gameInfo.resultDetails); } else { fprintf(f, "%s\n\n", PGNResult(gameInfo.result)); } fclose(f); return TRUE; } /* Save the current game to open file f and close the file */ int SaveGame (FILE *f, int dummy, char *dummy2) { if (gameMode == EditPosition) EditPositionDone(TRUE); lastSavedGame = GameCheckSum(); // [HGM] save: remember ID of last saved game to prevent double saving if (appData.oldSaveStyle) return SaveGameOldStyle(f); else return SaveGamePGN(f); } /* Save the current position to the given file */ int SavePositionToFile (char *filename) { FILE *f; char buf[MSG_SIZ]; if (strcmp(filename, "-") == 0) { return SavePosition(stdout, 0, NULL); } else { f = fopen(filename, "a"); if (f == NULL) { snprintf(buf, sizeof(buf), _("Can't open \"%s\""), filename); DisplayError(buf, errno); return FALSE; } else { safeStrCpy(buf, lastMsg, MSG_SIZ); DisplayMessage(_("Waiting for access to save file"), ""); flock(fileno(f), LOCK_EX); // [HGM] lock DisplayMessage(_("Saving position"), ""); lseek(fileno(f), 0, SEEK_END); // better safe than sorry... SavePosition(f, 0, NULL); DisplayMessage(buf, ""); return TRUE; } } } /* Save the current position to the given open file and close the file */ int SavePosition (FILE *f, int dummy, char *dummy2) { time_t tm; char *fen; if (gameMode == EditPosition) EditPositionDone(TRUE); if (appData.oldSaveStyle) { tm = time((time_t *) NULL); fprintf(f, "# %s position file -- %s", programName, ctime(&tm)); PrintOpponents(f); fprintf(f, "[--------------\n"); PrintPosition(f, currentMove); fprintf(f, "--------------]\n"); } else { fen = PositionToFEN(currentMove, NULL); fprintf(f, "%s\n", fen); free(fen); } fclose(f); return TRUE; } void ReloadCmailMsgEvent (int unregister) { #if !WIN32 static char *inFilename = NULL; static char *outFilename; int i; struct stat inbuf, outbuf; int status; /* Any registered moves are unregistered if unregister is set, */ /* i.e. invoked by the signal handler */ if (unregister) { for (i = 0; i < CMAIL_MAX_GAMES; i ++) { cmailMoveRegistered[i] = FALSE; if (cmailCommentList[i] != NULL) { free(cmailCommentList[i]); cmailCommentList[i] = NULL; } } nCmailMovesRegistered = 0; } for (i = 0; i < CMAIL_MAX_GAMES; i ++) { cmailResult[i] = CMAIL_NOT_RESULT; } nCmailResults = 0; if (inFilename == NULL) { /* Because the filenames are static they only get malloced once */ /* and they never get freed */ inFilename = (char *) malloc(strlen(appData.cmailGameName) + 9); sprintf(inFilename, "%s.game.in", appData.cmailGameName); outFilename = (char *) malloc(strlen(appData.cmailGameName) + 5); sprintf(outFilename, "%s.out", appData.cmailGameName); } status = stat(outFilename, &outbuf); if (status < 0) { cmailMailedMove = FALSE; } else { status = stat(inFilename, &inbuf); cmailMailedMove = (inbuf.st_mtime < outbuf.st_mtime); } /* LoadGameFromFile(CMAIL_MAX_GAMES) with cmailMsgLoaded == TRUE counts the games, notes how each one terminated, etc. It would be nice to remove this kludge and instead gather all the information while building the game list. (And to keep it in the game list nodes instead of having a bunch of fixed-size parallel arrays.) Note this will require getting each game's termination from the PGN tags, as the game list builder does not process the game moves. --mann */ cmailMsgLoaded = TRUE; LoadGameFromFile(inFilename, CMAIL_MAX_GAMES, "", FALSE); /* Load first game in the file or popup game menu */ LoadGameFromFile(inFilename, 0, appData.cmailGameName, TRUE); #endif /* !WIN32 */ return; } int RegisterMove () { FILE *f; char string[MSG_SIZ]; if ( cmailMailedMove || (cmailResult[lastLoadGameNumber - 1] == CMAIL_OLD_RESULT)) { return TRUE; /* Allow free viewing */ } /* Unregister move to ensure that we don't leave RegisterMove */ /* with the move registered when the conditions for registering no */ /* longer hold */ if (cmailMoveRegistered[lastLoadGameNumber - 1]) { cmailMoveRegistered[lastLoadGameNumber - 1] = FALSE; nCmailMovesRegistered --; if (cmailCommentList[lastLoadGameNumber - 1] != NULL) { free(cmailCommentList[lastLoadGameNumber - 1]); cmailCommentList[lastLoadGameNumber - 1] = NULL; } } if (cmailOldMove == -1) { DisplayError(_("You have edited the game history.\nUse Reload Same Game and make your move again."), 0); return FALSE; } if (currentMove > cmailOldMove + 1) { DisplayError(_("You have entered too many moves.\nBack up to the correct position and try again."), 0); return FALSE; } if (currentMove < cmailOldMove) { DisplayError(_("Displayed position is not current.\nStep forward to the correct position and try again."), 0); return FALSE; } if (forwardMostMove > currentMove) { /* Silently truncate extra moves */ TruncateGame(); } if ( (currentMove == cmailOldMove + 1) || ( (currentMove == cmailOldMove) && ( (cmailMoveType[lastLoadGameNumber - 1] == CMAIL_ACCEPT) || (cmailMoveType[lastLoadGameNumber - 1] == CMAIL_RESIGN)))) { if (gameInfo.result != GameUnfinished) { cmailResult[lastLoadGameNumber - 1] = CMAIL_NEW_RESULT; } if (commentList[currentMove] != NULL) { cmailCommentList[lastLoadGameNumber - 1] = StrSave(commentList[currentMove]); } safeStrCpy(cmailMove[lastLoadGameNumber - 1], moveList[currentMove - 1], sizeof(cmailMove[lastLoadGameNumber - 1])/sizeof(cmailMove[lastLoadGameNumber - 1][0])); if (appData.debugMode) fprintf(debugFP, "Saving %s for game %d\n", cmailMove[lastLoadGameNumber - 1], lastLoadGameNumber); snprintf(string, MSG_SIZ, "%s.game.out.%d", appData.cmailGameName, lastLoadGameNumber); f = fopen(string, "w"); if (appData.oldSaveStyle) { SaveGameOldStyle(f); /* also closes the file */ snprintf(string, MSG_SIZ, "%s.pos.out", appData.cmailGameName); f = fopen(string, "w"); SavePosition(f, 0, NULL); /* also closes the file */ } else { fprintf(f, "{--------------\n"); PrintPosition(f, currentMove); fprintf(f, "--------------}\n\n"); SaveGame(f, 0, NULL); /* also closes the file*/ } cmailMoveRegistered[lastLoadGameNumber - 1] = TRUE; nCmailMovesRegistered ++; } else if (nCmailGames == 1) { DisplayError(_("You have not made a move yet"), 0); return FALSE; } return TRUE; } void MailMoveEvent () { #if !WIN32 static char *partCommandString = "cmail -xv%s -remail -game %s 2>&1"; FILE *commandOutput; char buffer[MSG_SIZ], msg[MSG_SIZ], string[MSG_SIZ]; int nBytes = 0; /* Suppress warnings on uninitialized variables */ int nBuffers; int i; int archived; char *arcDir; if (! cmailMsgLoaded) { DisplayError(_("The cmail message is not loaded.\nUse Reload CMail Message and make your move again."), 0); return; } if (nCmailGames == nCmailResults) { DisplayError(_("No unfinished games"), 0); return; } #if CMAIL_PROHIBIT_REMAIL if (cmailMailedMove) { snprintf(msg, MSG_SIZ, _("You have already mailed a move.\nWait until a move arrives from your opponent.\nTo resend the same move, type\n\"cmail -remail -game %s\"\non the command line."), appData.cmailGameName); DisplayError(msg, 0); return; } #endif if (! (cmailMailedMove || RegisterMove())) return; if ( cmailMailedMove || (nCmailMovesRegistered + nCmailResults == nCmailGames)) { snprintf(string, MSG_SIZ, partCommandString, appData.debugMode ? " -v" : "", appData.cmailGameName); commandOutput = popen(string, "r"); if (commandOutput == NULL) { DisplayError(_("Failed to invoke cmail"), 0); } else { for (nBuffers = 0; (! feof(commandOutput)); nBuffers ++) { nBytes = fread(buffer, 1, MSG_SIZ - 1, commandOutput); } if (nBuffers > 1) { (void) memcpy(msg, buffer + nBytes, MSG_SIZ - nBytes - 1); (void) memcpy(msg + MSG_SIZ - nBytes - 1, buffer, nBytes); nBytes = MSG_SIZ - 1; } else { (void) memcpy(msg, buffer, nBytes); } *(msg + nBytes) = '\0'; /* \0 for end-of-string*/ if(StrStr(msg, "Mailed cmail message to ") != NULL) { cmailMailedMove = TRUE; /* Prevent >1 moves */ archived = TRUE; for (i = 0; i < nCmailGames; i ++) { if (cmailResult[i] == CMAIL_NOT_RESULT) { archived = FALSE; } } if ( archived && ( (arcDir = (char *) getenv("CMAIL_ARCDIR")) != NULL)) { snprintf(buffer, MSG_SIZ, "%s/%s.%s.archive", arcDir, appData.cmailGameName, gameInfo.date); LoadGameFromFile(buffer, 1, buffer, FALSE); cmailMsgLoaded = FALSE; } } DisplayInformation(msg); pclose(commandOutput); } } else { if ((*cmailMsg) != '\0') { DisplayInformation(cmailMsg); } } return; #endif /* !WIN32 */ } char * CmailMsg () { #if WIN32 return NULL; #else int prependComma = 0; char number[5]; char string[MSG_SIZ]; /* Space for game-list */ int i; if (!cmailMsgLoaded) return ""; if (cmailMailedMove) { snprintf(cmailMsg, MSG_SIZ, _("Waiting for reply from opponent\n")); } else { /* Create a list of games left */ snprintf(string, MSG_SIZ, "["); for (i = 0; i < nCmailGames; i ++) { if (! ( cmailMoveRegistered[i] || (cmailResult[i] == CMAIL_OLD_RESULT))) { if (prependComma) { snprintf(number, sizeof(number)/sizeof(number[0]), ",%d", i + 1); } else { snprintf(number, sizeof(number)/sizeof(number[0]), "%d", i + 1); prependComma = 1; } strcat(string, number); } } strcat(string, "]"); if (nCmailMovesRegistered + nCmailResults == 0) { switch (nCmailGames) { case 1: snprintf(cmailMsg, MSG_SIZ, _("Still need to make move for game\n")); break; case 2: snprintf(cmailMsg, MSG_SIZ, _("Still need to make moves for both games\n")); break; default: snprintf(cmailMsg, MSG_SIZ, _("Still need to make moves for all %d games\n"), nCmailGames); break; } } else { switch (nCmailGames - nCmailMovesRegistered - nCmailResults) { case 1: snprintf(cmailMsg, MSG_SIZ, _("Still need to make a move for game %s\n"), string); break; case 0: if (nCmailResults == nCmailGames) { snprintf(cmailMsg, MSG_SIZ, _("No unfinished games\n")); } else { snprintf(cmailMsg, MSG_SIZ, _("Ready to send mail\n")); } break; default: snprintf(cmailMsg, MSG_SIZ, _("Still need to make moves for games %s\n"), string); } } } return cmailMsg; #endif /* WIN32 */ } void ResetGameEvent () { if (gameMode == Training) SetTrainingModeOff(); Reset(TRUE, TRUE); cmailMsgLoaded = FALSE; if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("refresh\n"); } } void ExitEvent (int status) { exiting++; if (exiting > 2) { /* Give up on clean exit */ exit(status); } if (exiting > 1) { /* Keep trying for clean exit */ return; } if (appData.icsActive && appData.colorize) Colorize(ColorNone, FALSE); if (telnetISR != NULL) { RemoveInputSource(telnetISR); } if (icsPR != NoProc) { DestroyChildProcess(icsPR, TRUE); } /* [HGM] crash: leave writing PGN and position entirely to GameEnds() */ GameEnds(gameInfo.result, gameInfo.resultDetails==NULL ? "xboard exit" : gameInfo.resultDetails, GE_PLAYER); /* [HGM] crash: the above GameEnds() is a dud if another one was running */ /* make sure this other one finishes before killing it! */ if(endingGame) { int count = 0; if(appData.debugMode) fprintf(debugFP, "ExitEvent() during GameEnds(), wait\n"); while(endingGame && count++ < 10) DoSleep(1); if(appData.debugMode && endingGame) fprintf(debugFP, "GameEnds() seems stuck, proceed exiting\n"); } /* Kill off chess programs */ if (first.pr != NoProc) { ExitAnalyzeMode(); DoSleep( appData.delayBeforeQuit ); SendToProgram("quit\n", &first); DoSleep( appData.delayAfterQuit ); DestroyChildProcess(first.pr, 10 /* [AS] first.useSigterm */ ); } if (second.pr != NoProc) { DoSleep( appData.delayBeforeQuit ); SendToProgram("quit\n", &second); DoSleep( appData.delayAfterQuit ); DestroyChildProcess(second.pr, 10 /* [AS] second.useSigterm */ ); } if (first.isr != NULL) { RemoveInputSource(first.isr); } if (second.isr != NULL) { RemoveInputSource(second.isr); } if (pairing.pr != NoProc) SendToProgram("quit\n", &pairing); if (pairing.isr != NULL) RemoveInputSource(pairing.isr); ShutDownFrontEnd(); exit(status); } void PauseEngine (ChessProgramState *cps) { SendToProgram("pause\n", cps); cps->pause = 2; } void UnPauseEngine (ChessProgramState *cps) { SendToProgram("resume\n", cps); cps->pause = 1; } void PauseEvent () { if (appData.debugMode) fprintf(debugFP, "PauseEvent(): pausing %d\n", pausing); if (pausing) { pausing = FALSE; ModeHighlight(); if(stalledEngine) { // [HGM] pause: resume game by releasing withheld move StartClocks(); if(gameMode == TwoMachinesPlay) { // we might have to make the opponent resume pondering if(stalledEngine->other->pause == 2) UnPauseEngine(stalledEngine->other); else if(appData.ponderNextMove) SendToProgram("hard\n", stalledEngine->other); } if(appData.ponderNextMove) SendToProgram("hard\n", stalledEngine); HandleMachineMove(stashedInputMove, stalledEngine); stalledEngine = NULL; return; } if (gameMode == MachinePlaysWhite || gameMode == TwoMachinesPlay || gameMode == MachinePlaysBlack) { // the thinking engine must have used pause mode, or it would have been stalledEngine if(first.pause) UnPauseEngine(&first); else if(appData.ponderNextMove) SendToProgram("hard\n", &first); if(second.pause) UnPauseEngine(&second); else if(gameMode == TwoMachinesPlay && appData.ponderNextMove) SendToProgram("hard\n", &second); StartClocks(); } else { DisplayBothClocks(); } if (gameMode == PlayFromGameFile) { if (appData.timeDelay >= 0) AutoPlayGameLoop(); } else if (gameMode == IcsExamining && pauseExamInvalid) { Reset(FALSE, TRUE); SendToICS(ics_prefix); SendToICS("refresh\n"); } else if (currentMove < forwardMostMove && gameMode != AnalyzeMode) { ForwardInner(forwardMostMove); } pauseExamInvalid = FALSE; } else { switch (gameMode) { default: return; case IcsExamining: pauseExamForwardMostMove = forwardMostMove; pauseExamInvalid = FALSE; /* fall through */ case IcsObserving: case IcsPlayingWhite: case IcsPlayingBlack: pausing = TRUE; ModeHighlight(); return; case PlayFromGameFile: (void) StopLoadGameTimer(); pausing = TRUE; ModeHighlight(); break; case BeginningOfGame: if (appData.icsActive) return; /* else fall through */ case MachinePlaysWhite: case MachinePlaysBlack: case TwoMachinesPlay: if (forwardMostMove == 0) return; /* don't pause if no one has moved */ if(gameMode == TwoMachinesPlay) { // [HGM] pause: stop clocks if engine can be paused immediately ChessProgramState *onMove = (WhiteOnMove(forwardMostMove) == (first.twoMachinesColor[0] == 'w') ? &first : &second); if(onMove->pause) { // thinking engine can be paused PauseEngine(onMove); // do it if(onMove->other->pause) // pondering opponent can always be paused immediately PauseEngine(onMove->other); else SendToProgram("easy\n", onMove->other); StopClocks(); } else if(appData.ponderNextMove) SendToProgram("easy\n", onMove); // pre-emptively bring out of ponder } else if(gameMode == (WhiteOnMove(forwardMostMove) ? MachinePlaysWhite : MachinePlaysBlack)) { // engine on move if(first.pause) { PauseEngine(&first); StopClocks(); } else if(appData.ponderNextMove) SendToProgram("easy\n", &first); // pre-emptively bring out of ponder } else { // human on move, pause pondering by either method if(first.pause) PauseEngine(&first); else if(appData.ponderNextMove) SendToProgram("easy\n", &first); StopClocks(); } // if no immediate pausing is possible, wait for engine to move, and stop clocks then case AnalyzeMode: pausing = TRUE; ModeHighlight(); break; } } } void EditCommentEvent () { char title[MSG_SIZ]; if (currentMove < 1 || parseList[currentMove - 1][0] == NULLCHAR) { safeStrCpy(title, _("Edit comment"), sizeof(title)/sizeof(title[0])); } else { snprintf(title, MSG_SIZ, _("Edit comment on %d.%s%s"), (currentMove - 1) / 2 + 1, WhiteOnMove(currentMove - 1) ? " " : ".. ", parseList[currentMove - 1]); } EditCommentPopUp(currentMove, title, commentList[currentMove]); } void EditTagsEvent () { char *tags = PGNTags(&gameInfo); bookUp = FALSE; EditTagsPopUp(tags, NULL); free(tags); } void ToggleSecond () { if(second.analyzing) { SendToProgram("exit\n", &second); second.analyzing = FALSE; } else { if (second.pr == NoProc) StartChessProgram(&second); InitChessProgram(&second, FALSE); FeedMovesToProgram(&second, currentMove); SendToProgram("analyze\n", &second); second.analyzing = TRUE; } } /* Toggle ShowThinking */ void ToggleShowThinking() { appData.showThinking = !appData.showThinking; ShowThinkingEvent(); } int AnalyzeModeEvent () { char buf[MSG_SIZ]; if (!first.analysisSupport) { snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy); DisplayError(buf, 0); return 0; } /* [DM] icsEngineAnalyze [HGM] This is horrible code; reverse the gameMode and isEngineAnalyze tests! */ if (appData.icsActive) { if (gameMode != IcsObserving) { snprintf(buf, MSG_SIZ, _("You are not observing a game")); DisplayError(buf, 0); /* secure check */ if (appData.icsEngineAnalyze) { if (appData.debugMode) fprintf(debugFP, "Found unexpected active ICS engine analyze \n"); ExitAnalyzeMode(); ModeHighlight(); } return 0; } /* if enable, user wants to disable icsEngineAnalyze */ if (appData.icsEngineAnalyze) { ExitAnalyzeMode(); ModeHighlight(); return 0; } appData.icsEngineAnalyze = TRUE; if (appData.debugMode) fprintf(debugFP, "ICS engine analyze starting... \n"); } if (gameMode == AnalyzeMode) { ToggleSecond(); return 0; } if (appData.noChessProgram || gameMode == AnalyzeMode) return 0; if (gameMode != AnalyzeFile) { if (!appData.icsEngineAnalyze) { EditGameEvent(); if (gameMode != EditGame) return 0; } if (!appData.showThinking) ToggleShowThinking(); ResurrectChessProgram(); SendToProgram("analyze\n", &first); first.analyzing = TRUE; /*first.maybeThinking = TRUE;*/ first.maybeThinking = FALSE; /* avoid killing GNU Chess */ EngineOutputPopUp(); } if (!appData.icsEngineAnalyze) gameMode = AnalyzeMode; pausing = FALSE; ModeHighlight(); SetGameInfo(); StartAnalysisClock(); GetTimeMark(&lastNodeCountTime); lastNodeCount = 0; return 1; } void AnalyzeFileEvent () { if (appData.noChessProgram || gameMode == AnalyzeFile) return; if (!first.analysisSupport) { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy); DisplayError(buf, 0); return; } if (gameMode != AnalyzeMode) { keepInfo = 1; // mere annotating should not alter PGN tags EditGameEvent(); keepInfo = 0; if (gameMode != EditGame) return; if (!appData.showThinking) ToggleShowThinking(); ResurrectChessProgram(); SendToProgram("analyze\n", &first); first.analyzing = TRUE; /*first.maybeThinking = TRUE;*/ first.maybeThinking = FALSE; /* avoid killing GNU Chess */ EngineOutputPopUp(); } gameMode = AnalyzeFile; pausing = FALSE; ModeHighlight(); StartAnalysisClock(); GetTimeMark(&lastNodeCountTime); lastNodeCount = 0; if(appData.timeDelay > 0) StartLoadGameTimer((long)(1000.0f * appData.timeDelay)); AnalysisPeriodicEvent(1); } void MachineWhiteEvent () { char buf[MSG_SIZ]; char *bookHit = NULL; if (appData.noChessProgram || (gameMode == MachinePlaysWhite)) return; if (gameMode == PlayFromGameFile || gameMode == TwoMachinesPlay || gameMode == Training || gameMode == AnalyzeMode || gameMode == EndOfGame) EditGameEvent(); if (gameMode == EditPosition) EditPositionDone(TRUE); if (!WhiteOnMove(currentMove)) { DisplayError(_("It is not White's turn"), 0); return; } if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) ExitAnalyzeMode(); if (gameMode == EditGame || gameMode == AnalyzeMode || gameMode == AnalyzeFile) TruncateGame(); ResurrectChessProgram(); /* in case it isn't running */ if(gameMode == BeginningOfGame) { /* [HGM] time odds: to get right odds in human mode */ gameMode = MachinePlaysWhite; ResetClocks(); } else gameMode = MachinePlaysWhite; pausing = FALSE; ModeHighlight(); SetGameInfo(); snprintf(buf, MSG_SIZ, "%s %s %s", gameInfo.white, _("vs."), gameInfo.black); DisplayTitle(buf); if (first.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", gameInfo.black); SendToProgram(buf, &first); } if (first.sendTime) { if (first.useColors) { SendToProgram("black\n", &first); /*gnu kludge*/ } SendTimeRemaining(&first, TRUE); } if (first.useColors) { SendToProgram("white\n", &first); // [HGM] book: send 'go' separately } bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: send go or retrieve book move SetMachineThinkingEnables(); first.maybeThinking = TRUE; StartClocks(); firstMove = FALSE; if (appData.autoFlipView && !flipView) { flipView = !flipView; DrawPosition(FALSE, NULL); DisplayBothClocks(); // [HGM] logo: clocks might have to be exchanged; } if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } } void MachineBlackEvent () { char buf[MSG_SIZ]; char *bookHit = NULL; if (appData.noChessProgram || (gameMode == MachinePlaysBlack)) return; if (gameMode == PlayFromGameFile || gameMode == TwoMachinesPlay || gameMode == Training || gameMode == AnalyzeMode || gameMode == EndOfGame) EditGameEvent(); if (gameMode == EditPosition) EditPositionDone(TRUE); if (WhiteOnMove(currentMove)) { DisplayError(_("It is not Black's turn"), 0); return; } if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) ExitAnalyzeMode(); if (gameMode == EditGame || gameMode == AnalyzeMode || gameMode == AnalyzeFile) TruncateGame(); ResurrectChessProgram(); /* in case it isn't running */ gameMode = MachinePlaysBlack; pausing = FALSE; ModeHighlight(); SetGameInfo(); snprintf(buf, MSG_SIZ, "%s %s %s", gameInfo.white, _("vs."), gameInfo.black); DisplayTitle(buf); if (first.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", gameInfo.white); SendToProgram(buf, &first); } if (first.sendTime) { if (first.useColors) { SendToProgram("white\n", &first); /*gnu kludge*/ } SendTimeRemaining(&first, FALSE); } if (first.useColors) { SendToProgram("black\n", &first); // [HGM] book: 'go' sent separately } bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: send go or retrieve book move SetMachineThinkingEnables(); first.maybeThinking = TRUE; StartClocks(); if (appData.autoFlipView && flipView) { flipView = !flipView; DrawPosition(FALSE, NULL); DisplayBothClocks(); // [HGM] logo: clocks might have to be exchanged; } if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } } void DisplayTwoMachinesTitle () { char buf[MSG_SIZ]; if (appData.matchGames > 0) { if(appData.tourneyFile[0]) { snprintf(buf, MSG_SIZ, "%s %s %s (%d/%d%s)", gameInfo.white, _("vs."), gameInfo.black, nextGame+1, appData.matchGames+1, appData.tourneyType>0 ? "gt" : appData.tourneyType<0 ? "sw" : "rr"); } else if (first.twoMachinesColor[0] == 'w') { snprintf(buf, MSG_SIZ, "%s %s %s (%d-%d-%d)", gameInfo.white, _("vs."), gameInfo.black, first.matchWins, second.matchWins, matchGame - 1 - (first.matchWins + second.matchWins)); } else { snprintf(buf, MSG_SIZ, "%s %s %s (%d-%d-%d)", gameInfo.white, _("vs."), gameInfo.black, second.matchWins, first.matchWins, matchGame - 1 - (first.matchWins + second.matchWins)); } } else { snprintf(buf, MSG_SIZ, "%s %s %s", gameInfo.white, _("vs."), gameInfo.black); } DisplayTitle(buf); } void SettingsMenuIfReady () { if (second.lastPing != second.lastPong) { DisplayMessage("", _("Waiting for second chess program")); ScheduleDelayedEvent(SettingsMenuIfReady, 10); // [HGM] fast: lowered from 1000 return; } ThawUI(); DisplayMessage("", ""); SettingsPopUp(&second); } int WaitForEngine (ChessProgramState *cps, DelayedEventCallback retry) { char buf[MSG_SIZ]; if (cps->pr == NoProc) { StartChessProgram(cps); if (cps->protocolVersion == 1) { retry(); ScheduleDelayedEvent(retry, 1); // Do this also through timeout to avoid recursive calling of 'retry' } else { /* kludge: allow timeout for initial "feature" command */ if(retry != TwoMachinesEventIfReady) FreezeUI(); snprintf(buf, MSG_SIZ, _("Starting %s chess program"), _(cps->which)); DisplayMessage("", buf); ScheduleDelayedEvent(retry, FEATURE_TIMEOUT); } return 1; } return 0; } void TwoMachinesEvent P((void)) { int i; char buf[MSG_SIZ]; ChessProgramState *onmove; char *bookHit = NULL; static int stalling = 0; TimeMark now; long wait; if (appData.noChessProgram) return; switch (gameMode) { case TwoMachinesPlay: return; case MachinePlaysWhite: case MachinePlaysBlack: if (WhiteOnMove(forwardMostMove) == (gameMode == MachinePlaysWhite)) { DisplayError(_("Wait until your turn,\nor select Move Now"), 0); return; } /* fall through */ case BeginningOfGame: case PlayFromGameFile: case EndOfGame: EditGameEvent(); if (gameMode != EditGame) return; break; case EditPosition: EditPositionDone(TRUE); break; case AnalyzeMode: case AnalyzeFile: ExitAnalyzeMode(); break; case EditGame: default: break; } // forwardMostMove = currentMove; TruncateGame(); // [HGM] vari: MachineWhite and MachineBlack do this... startingEngine = TRUE; if(!ResurrectChessProgram()) return; /* in case first program isn't running (unbalances its ping due to InitChessProgram!) */ if(!first.initDone && GetDelayedEvent() == TwoMachinesEventIfReady) return; // [HGM] engine #1 still waiting for feature timeout if(first.lastPing != first.lastPong) { // [HGM] wait till we are sure first engine has set up position ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); return; } if(WaitForEngine(&second, TwoMachinesEventIfReady)) return; // (if needed:) started up second engine, so wait for features if(second.protocolVersion >= 2 && !strstr(second.variants, VariantName(gameInfo.variant))) { startingEngine = FALSE; DisplayError("second engine does not play this", 0); return; } if(!stalling) { InitChessProgram(&second, FALSE); // unbalances ping of second engine SendToProgram("force\n", &second); stalling = 1; ScheduleDelayedEvent(TwoMachinesEventIfReady, 10); return; } GetTimeMark(&now); // [HGM] matchpause: implement match pause after engine load if(appData.matchPause>10000 || appData.matchPause<10) appData.matchPause = 10000; /* [HGM] make pause adjustable */ wait = SubtractTimeMarks(&now, &pauseStart); if(wait < appData.matchPause) { ScheduleDelayedEvent(TwoMachinesEventIfReady, appData.matchPause - wait); return; } // we are now committed to starting the game stalling = 0; DisplayMessage("", ""); if (startedFromSetupPosition) { SendBoard(&second, backwardMostMove); if (appData.debugMode) { fprintf(debugFP, "Two Machines\n"); } } for (i = backwardMostMove; i < forwardMostMove; i++) { SendMoveToProgram(i, &second); } gameMode = TwoMachinesPlay; pausing = startingEngine = FALSE; ModeHighlight(); // [HGM] logo: this triggers display update of logos SetGameInfo(); DisplayTwoMachinesTitle(); firstMove = TRUE; if ((first.twoMachinesColor[0] == 'w') == WhiteOnMove(forwardMostMove)) { onmove = &first; } else { onmove = &second; } if(appData.debugMode) fprintf(debugFP, "New game (%d): %s-%s (%c)\n", matchGame, first.tidy, second.tidy, first.twoMachinesColor[0]); SendToProgram(first.computerString, &first); if (first.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", second.tidy); SendToProgram(buf, &first); } SendToProgram(second.computerString, &second); if (second.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", first.tidy); SendToProgram(buf, &second); } ResetClocks(); if (!first.sendTime || !second.sendTime) { timeRemaining[0][forwardMostMove] = whiteTimeRemaining; timeRemaining[1][forwardMostMove] = blackTimeRemaining; } if (onmove->sendTime) { if (onmove->useColors) { SendToProgram(onmove->other->twoMachinesColor, onmove); /*gnu kludge*/ } SendTimeRemaining(onmove, WhiteOnMove(forwardMostMove)); } if (onmove->useColors) { SendToProgram(onmove->twoMachinesColor, onmove); } bookHit = SendMoveToBookUser(forwardMostMove-1, onmove, TRUE); // [HGM] book: send go or retrieve book move // SendToProgram("go\n", onmove); onmove->maybeThinking = TRUE; SetMachineThinkingEnables(); StartClocks(); if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.nodes = programStats.depth = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); savedMessage = bookMove; // args for deferred call savedState = onmove; ScheduleDelayedEvent(DeferredBookMove, 1); } } void TrainingEvent () { if (gameMode == Training) { SetTrainingModeOff(); gameMode = PlayFromGameFile; DisplayMessage("", _("Training mode off")); } else { gameMode = Training; animateTraining = appData.animate; /* make sure we are not already at the end of the game */ if (currentMove < forwardMostMove) { SetTrainingModeOn(); DisplayMessage("", _("Training mode on")); } else { gameMode = PlayFromGameFile; DisplayError(_("Already at end of game"), 0); } } ModeHighlight(); } void IcsClientEvent () { if (!appData.icsActive) return; switch (gameMode) { case IcsPlayingWhite: case IcsPlayingBlack: case IcsObserving: case IcsIdle: case BeginningOfGame: case IcsExamining: return; case EditGame: break; case EditPosition: EditPositionDone(TRUE); break; case AnalyzeMode: case AnalyzeFile: ExitAnalyzeMode(); break; default: EditGameEvent(); break; } gameMode = IcsIdle; ModeHighlight(); return; } void EditGameEvent () { int i; switch (gameMode) { case Training: SetTrainingModeOff(); break; case MachinePlaysWhite: case MachinePlaysBlack: case BeginningOfGame: SendToProgram("force\n", &first); SetUserThinkingEnables(); break; case PlayFromGameFile: (void) StopLoadGameTimer(); if (gameFileFP != NULL) { gameFileFP = NULL; } break; case EditPosition: EditPositionDone(TRUE); break; case AnalyzeMode: case AnalyzeFile: ExitAnalyzeMode(); SendToProgram("force\n", &first); break; case TwoMachinesPlay: GameEnds(EndOfFile, NULL, GE_PLAYER); ResurrectChessProgram(); SetUserThinkingEnables(); break; case EndOfGame: ResurrectChessProgram(); break; case IcsPlayingBlack: case IcsPlayingWhite: DisplayError(_("Warning: You are still playing a game"), 0); break; case IcsObserving: DisplayError(_("Warning: You are still observing a game"), 0); break; case IcsExamining: DisplayError(_("Warning: You are still examining a game"), 0); break; case IcsIdle: break; case EditGame: default: return; } pausing = FALSE; StopClocks(); first.offeredDraw = second.offeredDraw = 0; if (gameMode == PlayFromGameFile) { whiteTimeRemaining = timeRemaining[0][currentMove]; blackTimeRemaining = timeRemaining[1][currentMove]; DisplayTitle(""); } if (gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay || gameMode == EndOfGame) { i = forwardMostMove; while (i > currentMove) { SendToProgram("undo\n", &first); i--; } if(!adjustedClock) { whiteTimeRemaining = timeRemaining[0][currentMove]; blackTimeRemaining = timeRemaining[1][currentMove]; DisplayBothClocks(); } if (whiteFlag || blackFlag) { whiteFlag = blackFlag = 0; } DisplayTitle(""); } gameMode = EditGame; ModeHighlight(); SetGameInfo(); } void EditPositionEvent () { if (gameMode == EditPosition) { EditGameEvent(); return; } EditGameEvent(); if (gameMode != EditGame) return; gameMode = EditPosition; ModeHighlight(); SetGameInfo(); if (currentMove > 0) CopyBoard(boards[0], boards[currentMove]); blackPlaysFirst = !WhiteOnMove(currentMove); ResetClocks(); currentMove = forwardMostMove = backwardMostMove = 0; HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); DisplayMove(-1); if(!appData.pieceMenu) DisplayMessage(_("Click clock to clear board"), ""); } void ExitAnalyzeMode () { /* [DM] icsEngineAnalyze - possible call from other functions */ if (appData.icsEngineAnalyze) { appData.icsEngineAnalyze = FALSE; DisplayMessage("",_("Close ICS engine analyze...")); } if (first.analysisSupport && first.analyzing) { SendToBoth("exit\n"); first.analyzing = second.analyzing = FALSE; } thinkOutput[0] = NULLCHAR; } void EditPositionDone (Boolean fakeRights) { int king = gameInfo.variant == VariantKnightmate ? WhiteUnicorn : WhiteKing; startedFromSetupPosition = TRUE; InitChessProgram(&first, FALSE); if(fakeRights) { // [HGM] suppress this if we just pasted a FEN. boards[0][EP_STATUS] = EP_NONE; boards[0][CASTLING][2] = boards[0][CASTLING][5] = BOARD_WIDTH>>1; if(boards[0][0][BOARD_WIDTH>>1] == king) { boards[0][CASTLING][1] = boards[0][0][BOARD_LEFT] == WhiteRook ? BOARD_LEFT : NoRights; boards[0][CASTLING][0] = boards[0][0][BOARD_RGHT-1] == WhiteRook ? BOARD_RGHT-1 : NoRights; } else boards[0][CASTLING][2] = NoRights; if(boards[0][BOARD_HEIGHT-1][BOARD_WIDTH>>1] == WHITE_TO_BLACK king) { boards[0][CASTLING][4] = boards[0][BOARD_HEIGHT-1][BOARD_LEFT] == BlackRook ? BOARD_LEFT : NoRights; boards[0][CASTLING][3] = boards[0][BOARD_HEIGHT-1][BOARD_RGHT-1] == BlackRook ? BOARD_RGHT-1 : NoRights; } else boards[0][CASTLING][5] = NoRights; if(gameInfo.variant == VariantSChess) { int i; for(i=BOARD_LEFT; i MSG_SIZ) len = MSG_SIZ; strncpy(temp, buf, len); temp[len] = 0; p = temp; while (*p) { if (*p == '\n' || *p == '\r') *p = ' '; ++p; } strcat(temp, "\n"); SendToICS(temp); SendToPlayer(temp, strlen(temp)); } void SetWhiteToPlayEvent () { if (gameMode == EditPosition) { blackPlaysFirst = FALSE; DisplayBothClocks(); /* works because currentMove is 0 */ } else if (gameMode == IcsExamining) { SendToICS(ics_prefix); SendToICS("tomove white\n"); } } void SetBlackToPlayEvent () { if (gameMode == EditPosition) { blackPlaysFirst = TRUE; currentMove = 1; /* kludge */ DisplayBothClocks(); currentMove = 0; } else if (gameMode == IcsExamining) { SendToICS(ics_prefix); SendToICS("tomove black\n"); } } void EditPositionMenuEvent (ChessSquare selection, int x, int y) { char buf[MSG_SIZ]; ChessSquare piece = boards[0][y][x]; if (gameMode != EditPosition && gameMode != IcsExamining) return; switch (selection) { case ClearBoard: if (gameMode == IcsExamining && ics_type == ICS_FICS) { SendToICS(ics_prefix); SendToICS("bsetup clear\n"); } else if (gameMode == IcsExamining && ics_type == ICS_ICC) { SendToICS(ics_prefix); SendToICS("clearboard\n"); } else { for (x = 0; x < BOARD_WIDTH; x++) { ChessSquare p = EmptySquare; if(x == BOARD_LEFT-1 || x == BOARD_RGHT) p = (ChessSquare) 0; /* [HGM] holdings */ for (y = 0; y < BOARD_HEIGHT; y++) { if (gameMode == IcsExamining) { if (boards[currentMove][y][x] != EmptySquare) { snprintf(buf, MSG_SIZ, "%sx@%c%c\n", ics_prefix, AAA + x, ONE + y); SendToICS(buf); } } else { boards[0][y][x] = p; } } } } if (gameMode == EditPosition) { DrawPosition(FALSE, boards[0]); } break; case WhitePlay: SetWhiteToPlayEvent(); break; case BlackPlay: SetBlackToPlayEvent(); break; case EmptySquare: if (gameMode == IcsExamining) { if (x < BOARD_LEFT || x >= BOARD_RGHT) break; // [HGM] holdings snprintf(buf, MSG_SIZ, "%sx@%c%c\n", ics_prefix, AAA + x, ONE + y); SendToICS(buf); } else { if(x < BOARD_LEFT || x >= BOARD_RGHT) { if(x == BOARD_LEFT-2) { if(y < BOARD_HEIGHT-1-gameInfo.holdingsSize) break; boards[0][y][1] = 0; } else if(x == BOARD_RGHT+1) { if(y >= gameInfo.holdingsSize) break; boards[0][y][BOARD_WIDTH-2] = 0; } else break; } boards[0][y][x] = EmptySquare; DrawPosition(FALSE, boards[0]); } break; case PromotePiece: if(piece >= (int)WhitePawn && piece < (int)WhiteMan || piece >= (int)BlackPawn && piece < (int)BlackMan ) { selection = (ChessSquare) (PROMOTED piece); } else if(piece == EmptySquare) selection = WhiteSilver; else selection = (ChessSquare)((int)piece - 1); goto defaultlabel; case DemotePiece: if(piece > (int)WhiteMan && piece <= (int)WhiteKing || piece > (int)BlackMan && piece <= (int)BlackKing ) { selection = (ChessSquare) (DEMOTED piece); } else if(piece == EmptySquare) selection = BlackSilver; else selection = (ChessSquare)((int)piece + 1); goto defaultlabel; case WhiteQueen: case BlackQueen: if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk ) selection = (ChessSquare)((int)selection - (int)WhiteQueen + (int)WhiteFerz); goto defaultlabel; case WhiteKing: case BlackKing: if(gameInfo.variant == VariantXiangqi) selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteWazir); if(gameInfo.variant == VariantKnightmate) selection = (ChessSquare)((int)selection - (int)WhiteKing + (int)WhiteUnicorn); default: defaultlabel: if (gameMode == IcsExamining) { if (x < BOARD_LEFT || x >= BOARD_RGHT) break; // [HGM] holdings snprintf(buf, MSG_SIZ, "%s%c@%c%c\n", ics_prefix, PieceToChar(selection), AAA + x, ONE + y); SendToICS(buf); } else { if(x < BOARD_LEFT || x >= BOARD_RGHT) { int n; if(x == BOARD_LEFT-2 && selection >= BlackPawn) { n = PieceToNumber(selection - BlackPawn); if(n >= gameInfo.holdingsSize) { n = 0; selection = BlackPawn; } boards[0][BOARD_HEIGHT-1-n][0] = selection; boards[0][BOARD_HEIGHT-1-n][1]++; } else if(x == BOARD_RGHT+1 && selection < BlackPawn) { n = PieceToNumber(selection); if(n >= gameInfo.holdingsSize) { n = 0; selection = WhitePawn; } boards[0][n][BOARD_WIDTH-1] = selection; boards[0][n][BOARD_WIDTH-2]++; } } else boards[0][y][x] = selection; DrawPosition(TRUE, boards[0]); ClearHighlights(); fromX = fromY = -1; } break; } } void DropMenuEvent (ChessSquare selection, int x, int y) { ChessMove moveType; switch (gameMode) { case IcsPlayingWhite: case MachinePlaysBlack: if (!WhiteOnMove(currentMove)) { DisplayMoveError(_("It is Black's turn")); return; } moveType = WhiteDrop; break; case IcsPlayingBlack: case MachinePlaysWhite: if (WhiteOnMove(currentMove)) { DisplayMoveError(_("It is White's turn")); return; } moveType = BlackDrop; break; case EditGame: moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop; break; default: return; } if (moveType == BlackDrop && selection < BlackPawn) { selection = (ChessSquare) ((int) selection + (int) BlackPawn - (int) WhitePawn); } if (boards[currentMove][y][x] != EmptySquare) { DisplayMoveError(_("That square is occupied")); return; } FinishMove(moveType, (int) selection, DROP_RANK, x, y, NULLCHAR); } void AcceptEvent () { /* Accept a pending offer of any kind from opponent */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("accept\n"); } else if (cmailMsgLoaded) { if (currentMove == cmailOldMove && commentList[cmailOldMove] != NULL && StrStr(commentList[cmailOldMove], WhiteOnMove(cmailOldMove) ? "Black offers a draw" : "White offers a draw")) { TruncateGame(); GameEnds(GameIsDrawn, "Draw agreed", GE_PLAYER); cmailMoveType[lastLoadGameNumber - 1] = CMAIL_ACCEPT; } else { DisplayError(_("There is no pending offer on this move"), 0); cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE; } } else { /* Not used for offers from chess program */ } } void DeclineEvent () { /* Decline a pending offer of any kind from opponent */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("decline\n"); } else if (cmailMsgLoaded) { if (currentMove == cmailOldMove && commentList[cmailOldMove] != NULL && StrStr(commentList[cmailOldMove], WhiteOnMove(cmailOldMove) ? "Black offers a draw" : "White offers a draw")) { #ifdef NOTDEF AppendComment(cmailOldMove, "Draw declined", TRUE); DisplayComment(cmailOldMove - 1, "Draw declined"); #endif /*NOTDEF*/ } else { DisplayError(_("There is no pending offer on this move"), 0); } } else { /* Not used for offers from chess program */ } } void RematchEvent () { /* Issue ICS rematch command */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("rematch\n"); } } void CallFlagEvent () { /* Call your opponent's flag (claim a win on time) */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("flag\n"); } else { switch (gameMode) { default: return; case MachinePlaysWhite: if (whiteFlag) { if (blackFlag) GameEnds(GameIsDrawn, "Both players ran out of time", GE_PLAYER); else GameEnds(BlackWins, "Black wins on time", GE_PLAYER); } else { DisplayError(_("Your opponent is not out of time"), 0); } break; case MachinePlaysBlack: if (blackFlag) { if (whiteFlag) GameEnds(GameIsDrawn, "Both players ran out of time", GE_PLAYER); else GameEnds(WhiteWins, "White wins on time", GE_PLAYER); } else { DisplayError(_("Your opponent is not out of time"), 0); } break; } } } void ClockClick (int which) { // [HGM] code moved to back-end from winboard.c if(which) { // black clock if (gameMode == EditPosition || gameMode == IcsExamining) { if(!appData.pieceMenu && blackPlaysFirst) EditPositionMenuEvent(ClearBoard, 0, 0); SetBlackToPlayEvent(); } else if ((gameMode == AnalyzeMode || gameMode == EditGame) && !blackFlag && WhiteOnMove(currentMove)) { UserMoveEvent((int)EmptySquare, DROP_RANK, 0, 0, 0); // [HGM] multi-move: if not out of time, enters null move } else if (shiftKey) { AdjustClock(which, -1); } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) { CallFlagEvent(); } } else { // white clock if (gameMode == EditPosition || gameMode == IcsExamining) { if(!appData.pieceMenu && !blackPlaysFirst) EditPositionMenuEvent(ClearBoard, 0, 0); SetWhiteToPlayEvent(); } else if ((gameMode == AnalyzeMode || gameMode == EditGame) && !whiteFlag && !WhiteOnMove(currentMove)) { UserMoveEvent((int)EmptySquare, DROP_RANK, 0, 0, 0); // [HGM] multi-move } else if (shiftKey) { AdjustClock(which, -1); } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) { CallFlagEvent(); } } } void DrawEvent () { /* Offer draw or accept pending draw offer from opponent */ if (appData.icsActive) { /* Note: tournament rules require draw offers to be made after you make your move but before you punch your clock. Currently ICS doesn't let you do that; instead, you immediately punch your clock after making a move, but you can offer a draw at any time. */ SendToICS(ics_prefix); SendToICS("draw\n"); userOfferedDraw = TRUE; // [HGM] drawclaim: also set flag in ICS play } else if (cmailMsgLoaded) { if (currentMove == cmailOldMove && commentList[cmailOldMove] != NULL && StrStr(commentList[cmailOldMove], WhiteOnMove(cmailOldMove) ? "Black offers a draw" : "White offers a draw")) { GameEnds(GameIsDrawn, "Draw agreed", GE_PLAYER); cmailMoveType[lastLoadGameNumber - 1] = CMAIL_ACCEPT; } else if (currentMove == cmailOldMove + 1) { char *offer = WhiteOnMove(cmailOldMove) ? "White offers a draw" : "Black offers a draw"; AppendComment(currentMove, offer, TRUE); DisplayComment(currentMove - 1, offer); cmailMoveType[lastLoadGameNumber - 1] = CMAIL_DRAW; } else { DisplayError(_("You must make your move before offering a draw"), 0); cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE; } } else if (first.offeredDraw) { GameEnds(GameIsDrawn, "Draw agreed", GE_XBOARD); } else { if (first.sendDrawOffers) { SendToProgram("draw\n", &first); userOfferedDraw = TRUE; } } } void AdjournEvent () { /* Offer Adjourn or accept pending Adjourn offer from opponent */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("adjourn\n"); } else { /* Currently GNU Chess doesn't offer or accept Adjourns */ } } void AbortEvent () { /* Offer Abort or accept pending Abort offer from opponent */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("abort\n"); } else { GameEnds(GameUnfinished, "Game aborted", GE_PLAYER); } } void ResignEvent () { /* Resign. You can do this even if it's not your turn. */ if (appData.icsActive) { SendToICS(ics_prefix); SendToICS("resign\n"); } else { switch (gameMode) { case MachinePlaysWhite: GameEnds(WhiteWins, "Black resigns", GE_PLAYER); break; case MachinePlaysBlack: GameEnds(BlackWins, "White resigns", GE_PLAYER); break; case EditGame: if (cmailMsgLoaded) { TruncateGame(); if (WhiteOnMove(cmailOldMove)) { GameEnds(BlackWins, "White resigns", GE_PLAYER); } else { GameEnds(WhiteWins, "Black resigns", GE_PLAYER); } cmailMoveType[lastLoadGameNumber - 1] = CMAIL_RESIGN; } break; default: break; } } } void StopObservingEvent () { /* Stop observing current games */ SendToICS(ics_prefix); SendToICS("unobserve\n"); } void StopExaminingEvent () { /* Stop observing current game */ SendToICS(ics_prefix); SendToICS("unexamine\n"); } void ForwardInner (int target) { int limit; int oldSeekGraphUp = seekGraphUp; if (appData.debugMode) fprintf(debugFP, "ForwardInner(%d), current %d, forward %d\n", target, currentMove, forwardMostMove); if (gameMode == EditPosition) return; seekGraphUp = FALSE; MarkTargetSquares(1); if (gameMode == PlayFromGameFile && !pausing) PauseEvent(); if (gameMode == IcsExamining && pausing) limit = pauseExamForwardMostMove; else limit = forwardMostMove; if (target > limit) target = limit; if (target > 0 && moveList[target - 1][0]) { int fromX, fromY, toX, toY; toX = moveList[target - 1][2] - AAA; toY = moveList[target - 1][3] - ONE; if (moveList[target - 1][1] == '@') { if (appData.highlightLastMove) { SetHighlights(-1, -1, toX, toY); } } else { fromX = moveList[target - 1][0] - AAA; fromY = moveList[target - 1][1] - ONE; if (target == currentMove + 1) { AnimateMove(boards[currentMove], fromX, fromY, toX, toY); } if (appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } } } if (gameMode == EditGame || gameMode == AnalyzeMode || gameMode == Training || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) { while (currentMove < target) { if(second.analyzing) SendMoveToProgram(currentMove, &second); SendMoveToProgram(currentMove++, &first); } } else { currentMove = target; } if (gameMode == EditGame || gameMode == EndOfGame) { whiteTimeRemaining = timeRemaining[0][currentMove]; blackTimeRemaining = timeRemaining[1][currentMove]; } DisplayBothClocks(); DisplayMove(currentMove - 1); DrawPosition(oldSeekGraphUp, boards[currentMove]); HistorySet(parseList,backwardMostMove,forwardMostMove,currentMove-1); if ( !matchMode && gameMode != Training) { // [HGM] PV info: routine tests if empty DisplayComment(currentMove - 1, commentList[currentMove]); } ClearMap(); // [HGM] exclude: invalidate map } void ForwardEvent () { if (gameMode == IcsExamining && !pausing) { SendToICS(ics_prefix); SendToICS("forward\n"); } else { ForwardInner(currentMove + 1); } } void ToEndEvent () { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { /* to optimze, we temporarily turn off analysis mode while we feed * the remaining moves to the engine. Otherwise we get analysis output * after each move. */ if (first.analysisSupport) { SendToProgram("exit\nforce\n", &first); first.analyzing = FALSE; } } if (gameMode == IcsExamining && !pausing) { SendToICS(ics_prefix); SendToICS("forward 999999\n"); } else { ForwardInner(forwardMostMove); } if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { /* we have fed all the moves, so reactivate analysis mode */ SendToProgram("analyze\n", &first); first.analyzing = TRUE; /*first.maybeThinking = TRUE;*/ first.maybeThinking = FALSE; /* avoid killing GNU Chess */ } } void BackwardInner (int target) { int full_redraw = TRUE; /* [AS] Was FALSE, had to change it! */ if (appData.debugMode) fprintf(debugFP, "BackwardInner(%d), current %d, forward %d\n", target, currentMove, forwardMostMove); if (gameMode == EditPosition) return; seekGraphUp = FALSE; MarkTargetSquares(1); if (currentMove <= backwardMostMove) { ClearHighlights(); DrawPosition(full_redraw, boards[currentMove]); return; } if (gameMode == PlayFromGameFile && !pausing) PauseEvent(); if (moveList[target][0]) { int fromX, fromY, toX, toY; toX = moveList[target][2] - AAA; toY = moveList[target][3] - ONE; if (moveList[target][1] == '@') { if (appData.highlightLastMove) { SetHighlights(-1, -1, toX, toY); } } else { fromX = moveList[target][0] - AAA; fromY = moveList[target][1] - ONE; if (target == currentMove - 1) { AnimateMove(boards[currentMove], toX, toY, fromX, fromY); } if (appData.highlightLastMove) { SetHighlights(fromX, fromY, toX, toY); } } } if (gameMode == EditGame || gameMode==AnalyzeMode || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) { while (currentMove > target) { if(moveList[currentMove-1][1] == '@' && moveList[currentMove-1][0] == '@') { // null move cannot be undone. Reload program with move history before it. int i; for(i=target; i>backwardMostMove; i--) { // seek back to start or previous null move if(moveList[i-1][1] == '@' && moveList[i-1][0] == '@') break; } SendBoard(&first, i); if(second.analyzing) SendBoard(&second, i); for(currentMove=i; currentMove= forwardMostMove) to = forwardMostMove; if (to <= backwardMostMove) to = backwardMostMove; if (to < currentMove) { BackwardInner(to); } else { ForwardInner(to); } } void RevertEvent (Boolean annotate) { if(PopTail(annotate)) { // [HGM] vari: restore old game tail return; } if (gameMode != IcsExamining) { DisplayError(_("You are not examining a game"), 0); return; } if (pausing) { DisplayError(_("You can't revert while pausing"), 0); return; } SendToICS(ics_prefix); SendToICS("revert\n"); } void RetractMoveEvent () { switch (gameMode) { case MachinePlaysWhite: case MachinePlaysBlack: if (WhiteOnMove(forwardMostMove) == (gameMode == MachinePlaysWhite)) { DisplayError(_("Wait until your turn,\nor select Move Now"), 0); return; } if (forwardMostMove < 2) return; currentMove = forwardMostMove = forwardMostMove - 2; whiteTimeRemaining = timeRemaining[0][currentMove]; blackTimeRemaining = timeRemaining[1][currentMove]; DisplayBothClocks(); DisplayMove(currentMove - 1); ClearHighlights();/*!! could figure this out*/ DrawPosition(TRUE, boards[currentMove]); /* [AS] Changed to full redraw! */ SendToProgram("remove\n", &first); /*first.maybeThinking = TRUE;*/ /* GNU Chess does not ponder here */ break; case BeginningOfGame: default: break; case IcsPlayingWhite: case IcsPlayingBlack: if (WhiteOnMove(forwardMostMove) == (gameMode == IcsPlayingWhite)) { SendToICS(ics_prefix); SendToICS("takeback 2\n"); } else { SendToICS(ics_prefix); SendToICS("takeback 1\n"); } break; } } void MoveNowEvent () { ChessProgramState *cps; switch (gameMode) { case MachinePlaysWhite: if (!WhiteOnMove(forwardMostMove)) { DisplayError(_("It is your turn"), 0); return; } cps = &first; break; case MachinePlaysBlack: if (WhiteOnMove(forwardMostMove)) { DisplayError(_("It is your turn"), 0); return; } cps = &first; break; case TwoMachinesPlay: if (WhiteOnMove(forwardMostMove) == (first.twoMachinesColor[0] == 'w')) { cps = &first; } else { cps = &second; } break; case BeginningOfGame: default: return; } SendToProgram("?\n", cps); } void TruncateGameEvent () { EditGameEvent(); if (gameMode != EditGame) return; TruncateGame(); } void TruncateGame () { CleanupTail(); // [HGM] vari: only keep current variation if we explicitly truncate if (forwardMostMove > currentMove) { if (gameInfo.resultDetails != NULL) { free(gameInfo.resultDetails); gameInfo.resultDetails = NULL; gameInfo.result = GameUnfinished; } forwardMostMove = currentMove; HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1); } } void HintEvent () { if (appData.noChessProgram) return; switch (gameMode) { case MachinePlaysWhite: if (WhiteOnMove(forwardMostMove)) { DisplayError(_("Wait until your turn"), 0); return; } break; case BeginningOfGame: case MachinePlaysBlack: if (!WhiteOnMove(forwardMostMove)) { DisplayError(_("Wait until your turn"), 0); return; } break; default: DisplayError(_("No hint available"), 0); return; } SendToProgram("hint\n", &first); hintRequested = TRUE; } void CreateBookEvent () { ListGame * lg = (ListGame *) gameList.head; FILE *f, *g; int nItem; static int secondTime = FALSE; if( !(f = GameFile()) || ((ListGame *) gameList.tailPred)->number <= 0 ) { DisplayError(_("Game list not loaded or empty"), 0); return; } if(!secondTime && (g = fopen(appData.polyglotBook, "r"))) { fclose(g); secondTime++; DisplayNote(_("Book file exists! Try again for overwrite.")); return; } creatingBook = TRUE; secondTime = FALSE; /* Get list size */ for (nItem = 1; nItem <= ((ListGame *) gameList.tailPred)->number; nItem++){ LoadGame(f, nItem, "", TRUE); AddGameToBook(TRUE); lg = (ListGame *) lg->node.succ; } creatingBook = FALSE; FlushBook(); } void BookEvent () { if (appData.noChessProgram) return; switch (gameMode) { case MachinePlaysWhite: if (WhiteOnMove(forwardMostMove)) { DisplayError(_("Wait until your turn"), 0); return; } break; case BeginningOfGame: case MachinePlaysBlack: if (!WhiteOnMove(forwardMostMove)) { DisplayError(_("Wait until your turn"), 0); return; } break; case EditPosition: EditPositionDone(TRUE); break; case TwoMachinesPlay: return; default: break; } SendToProgram("bk\n", &first); bookOutput[0] = NULLCHAR; bookRequested = TRUE; } void AboutGameEvent () { char *tags = PGNTags(&gameInfo); TagsPopUp(tags, CmailMsg()); free(tags); } /* end button procedures */ void PrintPosition (FILE *fp, int move) { int i, j; for (i = BOARD_HEIGHT - 1; i >= 0; i--) { for (j = BOARD_LEFT; j < BOARD_RGHT; j++) { char c = PieceToChar(boards[move][i][j]); fputc(c == 'x' ? '.' : c, fp); fputc(j == BOARD_RGHT - 1 ? '\n' : ' ', fp); } } if ((gameMode == EditPosition) ? !blackPlaysFirst : (move % 2 == 0)) fprintf(fp, "white to play\n"); else fprintf(fp, "black to play\n"); } void PrintOpponents (FILE *fp) { if (gameInfo.white != NULL) { fprintf(fp, "\t%s vs. %s\n", gameInfo.white, gameInfo.black); } else { fprintf(fp, "\n"); } } /* Find last component of program's own name, using some heuristics */ void TidyProgramName (char *prog, char *host, char buf[MSG_SIZ]) { char *p, *q, c; int local = (strcmp(host, "localhost") == 0); while (!local && (p = strchr(prog, ';')) != NULL) { p++; while (*p == ' ') p++; prog = p; } if (*prog == '"' || *prog == '\'') { q = strchr(prog + 1, *prog); } else { q = strchr(prog, ' '); } if (q == NULL) q = prog + strlen(prog); p = q; while (p >= prog && *p != '/' && *p != '\\') p--; p++; if(p == prog && *p == '"') p++; c = *q; *q = 0; if (q - p >= 4 && StrCaseCmp(q - 4, ".exe") == 0) *q = c, q -= 4; else *q = c; memcpy(buf, p, q - p); buf[q - p] = NULLCHAR; if (!local) { strcat(buf, "@"); strcat(buf, host); } } char * TimeControlTagValue () { char buf[MSG_SIZ]; if (!appData.clockMode) { safeStrCpy(buf, "-", sizeof(buf)/sizeof(buf[0])); } else if (movesPerSession > 0) { snprintf(buf, MSG_SIZ, "%d/%ld", movesPerSession, timeControl/1000); } else if (timeIncrement == 0) { snprintf(buf, MSG_SIZ, "%ld", timeControl/1000); } else { snprintf(buf, MSG_SIZ, "%ld+%ld", timeControl/1000, timeIncrement/1000); } return StrSave(buf); } void SetGameInfo () { /* This routine is used only for certain modes */ VariantClass v = gameInfo.variant; ChessMove r = GameUnfinished; char *p = NULL; if(keepInfo) return; if(gameMode == EditGame) { // [HGM] vari: do not erase result on EditGame r = gameInfo.result; p = gameInfo.resultDetails; gameInfo.resultDetails = NULL; } ClearGameInfo(&gameInfo); gameInfo.variant = v; switch (gameMode) { case MachinePlaysWhite: gameInfo.event = StrSave( appData.pgnEventHeader ); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave(first.tidy); gameInfo.black = StrSave(UserName()); gameInfo.timeControl = TimeControlTagValue(); break; case MachinePlaysBlack: gameInfo.event = StrSave( appData.pgnEventHeader ); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave(UserName()); gameInfo.black = StrSave(first.tidy); gameInfo.timeControl = TimeControlTagValue(); break; case TwoMachinesPlay: gameInfo.event = StrSave( appData.pgnEventHeader ); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); if (roundNr > 0) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%d", roundNr); gameInfo.round = StrSave(buf); } else { gameInfo.round = StrSave("-"); } if (first.twoMachinesColor[0] == 'w') { gameInfo.white = StrSave(appData.pgnName[0][0] ? appData.pgnName[0] : first.tidy); gameInfo.black = StrSave(appData.pgnName[1][0] ? appData.pgnName[1] : second.tidy); } else { gameInfo.white = StrSave(appData.pgnName[1][0] ? appData.pgnName[1] : second.tidy); gameInfo.black = StrSave(appData.pgnName[0][0] ? appData.pgnName[0] : first.tidy); } gameInfo.timeControl = TimeControlTagValue(); break; case EditGame: gameInfo.event = StrSave("Edited game"); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave("-"); gameInfo.black = StrSave("-"); gameInfo.result = r; gameInfo.resultDetails = p; break; case EditPosition: gameInfo.event = StrSave("Edited position"); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave("-"); gameInfo.black = StrSave("-"); break; case IcsPlayingWhite: case IcsPlayingBlack: case IcsObserving: case IcsExamining: break; case PlayFromGameFile: gameInfo.event = StrSave("Game from non-PGN file"); gameInfo.site = StrSave(HostName()); gameInfo.date = PGNDate(); gameInfo.round = StrSave("-"); gameInfo.white = StrSave("?"); gameInfo.black = StrSave("?"); break; default: break; } } void ReplaceComment (int index, char *text) { int len; char *p; float score; if(index && sscanf(text, "%f/%d", &score, &len) == 2 && pvInfoList[index-1].depth == len && fabs(pvInfoList[index-1].score - score*100.) < 0.5 && (p = strchr(text, '\n'))) text = p; // [HGM] strip off first line with PV info, if any while (*text == '\n') text++; len = strlen(text); while (len > 0 && text[len - 1] == '\n') len--; if (commentList[index] != NULL) free(commentList[index]); if (len == 0) { commentList[index] = NULL; return; } if( *text == '{' && strchr(text, '}') || // [HGM] braces: if certainy malformed, put braces *text == '[' && strchr(text, ']') || // otherwise hope the user knows what he is doing *text == '(' && strchr(text, ')')) { // (perhaps check if this parses as comment-only?) commentList[index] = (char *) malloc(len + 2); strncpy(commentList[index], text, len); commentList[index][len] = '\n'; commentList[index][len + 1] = NULLCHAR; } else { // [HGM] braces: if text does not start with known OK delimiter, put braces around it. char *p; commentList[index] = (char *) malloc(len + 7); safeStrCpy(commentList[index], "{\n", 3); safeStrCpy(commentList[index]+2, text, len+1); commentList[index][len+2] = NULLCHAR; while(p = strchr(commentList[index], '}')) *p = ')'; // kill all } to make it one comment strcat(commentList[index], "\n}\n"); } } void CrushCRs (char *text) { char *p = text; char *q = text; char ch; do { ch = *p++; if (ch == '\r') continue; *q++ = ch; } while (ch != '\0'); } void AppendComment (int index, char *text, Boolean addBraces) /* addBraces tells if we should add {} */ { int oldlen, len; char *old; if(appData.debugMode) fprintf(debugFP, "Append: in='%s' %d\n", text, addBraces); if(addBraces == 3) addBraces = 0; else // force appending literally text = GetInfoFromComment( index, text ); /* [HGM] PV time: strip PV info from comment */ CrushCRs(text); while (*text == '\n') text++; len = strlen(text); while (len > 0 && text[len - 1] == '\n') len--; text[len] = NULLCHAR; if (len == 0) return; if (commentList[index] != NULL) { Boolean addClosingBrace = addBraces; old = commentList[index]; oldlen = strlen(old); while(commentList[index][oldlen-1] == '\n') commentList[index][--oldlen] = NULLCHAR; commentList[index] = (char *) malloc(oldlen + len + 6); // might waste 4 safeStrCpy(commentList[index], old, oldlen + len + 6); free(old); // [HGM] braces: join "{A\n}\n" + "{\nB}" as "{A\nB\n}" if(commentList[index][oldlen-1] == '}' && (text[0] == '{' || addBraces == TRUE)) { if(addBraces == TRUE) addBraces = FALSE; else { text++; len--; } while (*text == '\n') { text++; len--; } commentList[index][--oldlen] = NULLCHAR; } if(addBraces) strcat(commentList[index], addBraces == 2 ? "\n(" : "\n{\n"); else strcat(commentList[index], "\n"); strcat(commentList[index], text); if(addClosingBrace) strcat(commentList[index], addClosingBrace == 2 ? ")\n" : "\n}\n"); else strcat(commentList[index], "\n"); } else { commentList[index] = (char *) malloc(len + 6); // perhaps wastes 4... if(addBraces) safeStrCpy(commentList[index], addBraces == 2 ? "(" : "{\n", 3); else commentList[index][0] = NULLCHAR; strcat(commentList[index], text); strcat(commentList[index], addBraces == 2 ? ")\n" : "\n"); if(addBraces == TRUE) strcat(commentList[index], "}\n"); } } static char * FindStr (char * text, char * sub_text) { char * result = strstr( text, sub_text ); if( result != NULL ) { result += strlen( sub_text ); } return result; } /* [AS] Try to extract PV info from PGN comment */ /* [HGM] PV time: and then remove it, to prevent it appearing twice */ char * GetInfoFromComment (int index, char * text) { char * sep = text, *p; if( text != NULL && index > 0 ) { int score = 0; int depth = 0; int time = -1, sec = 0, deci; char * s_eval = FindStr( text, "[%eval " ); char * s_emt = FindStr( text, "[%emt " ); #if 0 if( s_eval != NULL || s_emt != NULL ) { #else if(0) { // [HGM] this code is not finished, and could actually be detrimental #endif /* New style */ char delim; if( s_eval != NULL ) { if( sscanf( s_eval, "%d,%d%c", &score, &depth, &delim ) != 3 ) { return text; } if( delim != ']' ) { return text; } } if( s_emt != NULL ) { } return text; } else { /* We expect something like: [+|-]nnn.nn/dd */ int score_lo = 0; if(*text != '{') return text; // [HGM] braces: must be normal comment sep = strchr( text, '/' ); if( sep == NULL || sep < (text+4) ) { return text; } p = text; if(!strncmp(p+1, "final score ", 12)) p += 12, index++; else if(p[1] == '(') { // comment starts with PV p = strchr(p, ')'); // locate end of PV if(p == NULL || sep < p+5) return text; // at this point we have something like "{(.*) +0.23/6 ..." p = text; while(*++p != ')') p[-1] = *p; p[-1] = ')'; *p = '\n'; while(*p == ' ' || *p == '\n') p++; *--p = '{'; // we now moved the brace to behind the PV: "(.*) {+0.23/6 ..." } time = -1; sec = -1; deci = -1; if( sscanf( p+1, "%d.%d/%d %d:%d", &score, &score_lo, &depth, &time, &sec ) != 5 && sscanf( p+1, "%d.%d/%d %d.%d", &score, &score_lo, &depth, &time, &deci ) != 5 && sscanf( p+1, "%d.%d/%d %d", &score, &score_lo, &depth, &time ) != 4 && sscanf( p+1, "%d.%d/%d", &score, &score_lo, &depth ) != 3 ) { return text; } if( score_lo < 0 || score_lo >= 100 ) { return text; } if(sec >= 0) time = 600*time + 10*sec; else if(deci >= 0) time = 10*time + deci; else time *= 10; // deci-sec score = score > 0 || !score & p[1] != '-' ? score*100 + score_lo : score*100 - score_lo; /* [HGM] PV time: now locate end of PV info */ while( *++sep >= '0' && *sep <= '9'); // strip depth if(time >= 0) while( *++sep >= '0' && *sep <= '9' || *sep == '\n'); // strip time if(sec >= 0) while( *++sep >= '0' && *sep <= '9'); // strip seconds if(deci >= 0) while( *++sep >= '0' && *sep <= '9'); // strip fractional seconds while(*sep == ' ' || *sep == '\n' || *sep == '\r') sep++; } if( depth <= 0 ) { return text; } if( time < 0 ) { time = -1; } pvInfoList[index-1].depth = depth; pvInfoList[index-1].score = score; pvInfoList[index-1].time = 10*time; // centi-sec if(*sep == '}') *sep = 0; else *--sep = '{'; if(p != text) { while(*p++ = *sep++); sep = text; } // squeeze out space between PV and comment, and return both } return sep; } void SendToProgram (char *message, ChessProgramState *cps) { int count, outCount, error; char buf[MSG_SIZ]; if (cps->pr == NoProc) return; Attention(cps); if (appData.debugMode) { TimeMark now; GetTimeMark(&now); fprintf(debugFP, "%ld >%-6s: %s", SubtractTimeMarks(&now, &programStartTime), cps->which, message); if(serverFP) fprintf(serverFP, "%ld >%-6s: %s", SubtractTimeMarks(&now, &programStartTime), cps->which, message), fflush(serverFP); } count = strlen(message); outCount = OutputToProcess(cps->pr, message, count, &error); if (outCount < count && !exiting && !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */ if(!cps->initDone) return; // [HGM] should not generate fatal error during engine load snprintf(buf, MSG_SIZ, _("Error writing to %s chess program"), _(cps->which)); if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */ if((signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) { snprintf(buf, MSG_SIZ, _("%s program exits in draw position (%s)"), _(cps->which), cps->program); if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; GameEnds(GameIsDrawn, buf, GE_XBOARD); return; } gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */ } else { ChessMove res = cps->twoMachinesColor[0]=='w' ? BlackWins : WhiteWins; if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; GameEnds(res, buf, GE_XBOARD); return; } gameInfo.result = res; } gameInfo.resultDetails = StrSave(buf); } if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; return; } if(!cps->userError || !appData.popupExitMessage) DisplayFatalError(buf, error, 1); else errorExitStatus = 1; } } void ReceiveFromProgram (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error) { char *end_str; char buf[MSG_SIZ]; ChessProgramState *cps = (ChessProgramState *)closure; if (isr != cps->isr) return; /* Killed intentionally */ if (count <= 0) { if (count == 0) { RemoveInputSource(cps->isr); snprintf(buf, MSG_SIZ, _("Error: %s chess program (%s) exited unexpectedly"), _(cps->which), cps->program); if(LoadError(cps->userError ? NULL : buf, cps)) return; // [HGM] should not generate fatal error during engine load if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */ if((signed char)boards[forwardMostMove][EP_STATUS] <= EP_DRAWS) { snprintf(buf, MSG_SIZ, _("%s program exits in draw position (%s)"), _(cps->which), cps->program); if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; GameEnds(GameIsDrawn, buf, GE_XBOARD); return; } gameInfo.result = GameIsDrawn; /* [HGM] accept exit as draw claim */ } else { ChessMove res = cps->twoMachinesColor[0]=='w' ? BlackWins : WhiteWins; if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; GameEnds(res, buf, GE_XBOARD); return; } gameInfo.result = res; } gameInfo.resultDetails = StrSave(buf); } if(matchMode && appData.tourneyFile[0]) { cps->pr = NoProc; return; } if(!cps->userError || !appData.popupExitMessage) DisplayFatalError(buf, 0, 1); else errorExitStatus = 1; } else { snprintf(buf, MSG_SIZ, _("Error reading from %s chess program (%s)"), _(cps->which), cps->program); RemoveInputSource(cps->isr); /* [AS] Program is misbehaving badly... kill it */ if( count == -2 ) { DestroyChildProcess( cps->pr, 9 ); cps->pr = NoProc; } if(!cps->userError || !appData.popupExitMessage) DisplayFatalError(buf, error, 1); else errorExitStatus = 1; } return; } if ((end_str = strchr(message, '\r')) != NULL) *end_str = NULLCHAR; if ((end_str = strchr(message, '\n')) != NULL) *end_str = NULLCHAR; if (appData.debugMode) { TimeMark now; int print = 1; char *quote = ""; char c; int i; if(appData.engineComments != 1) { /* [HGM] debug: decide if protocol-violating output is written */ char start = message[0]; if(start >='A' && start <= 'Z') start += 'a' - 'A'; // be tolerant to capitalizing if(sscanf(message, "%d%c%d%d%d", &i, &c, &i, &i, &i) != 5 && sscanf(message, "move %c", &c)!=1 && sscanf(message, "offer%c", &c)!=1 && sscanf(message, "resign%c", &c)!=1 && sscanf(message, "feature %c", &c)!=1 && sscanf(message, "error %c", &c)!=1 && sscanf(message, "illegal %c", &c)!=1 && sscanf(message, "tell%c", &c)!=1 && sscanf(message, "0-1 %c", &c)!=1 && sscanf(message, "1-0 %c", &c)!=1 && sscanf(message, "1/2-1/2 %c", &c)!=1 && sscanf(message, "setboard %c", &c)!=1 && sscanf(message, "setup %c", &c)!=1 && sscanf(message, "hint: %c", &c)!=1 && sscanf(message, "pong %c", &c)!=1 && start != '#') { quote = appData.engineComments == 2 ? "# " : "### NON-COMPLIANT! ### "; print = (appData.engineComments >= 2); } message[0] = start; // restore original message } if(print) { GetTimeMark(&now); fprintf(debugFP, "%ld <%-6s: %s%s\n", SubtractTimeMarks(&now, &programStartTime), cps->which, quote, message); if(serverFP) fprintf(serverFP, "%ld <%-6s: %s%s\n", SubtractTimeMarks(&now, &programStartTime), cps->which, quote, message), fflush(serverFP); } } /* [DM] if icsEngineAnalyze is active we block all whisper and kibitz output, because nobody want to see this */ if (appData.icsEngineAnalyze) { if (strstr(message, "whisper") != NULL || strstr(message, "kibitz") != NULL || strstr(message, "tellics") != NULL) return; } HandleMachineMove(message, cps); } void SendTimeControl (ChessProgramState *cps, int mps, long tc, int inc, int sd, int st) { char buf[MSG_SIZ]; int seconds; if( timeControl_2 > 0 ) { if( (gameMode == MachinePlaysBlack) || (gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b') ) { tc = timeControl_2; } } tc /= cps->timeOdds; /* [HGM] time odds: apply before telling engine */ inc /= cps->timeOdds; st /= cps->timeOdds; seconds = (tc / 1000) % 60; /* [HGM] displaced to after applying odds */ if (st > 0) { /* Set exact time per move, normally using st command */ if (cps->stKludge) { /* GNU Chess 4 has no st command; uses level in a nonstandard way */ seconds = st % 60; if (seconds == 0) { snprintf(buf, MSG_SIZ, "level 1 %d\n", st/60); } else { snprintf(buf, MSG_SIZ, "level 1 %d:%02d\n", st/60, seconds); } } else { snprintf(buf, MSG_SIZ, "st %d\n", st); } } else { /* Set conventional or incremental time control, using level command */ if (seconds == 0) { /* Note old gnuchess bug -- minutes:seconds used to not work. Fixed in later versions, but still avoid :seconds when seconds is 0. */ snprintf(buf, MSG_SIZ, "level %d %ld %g\n", mps, tc/60000, inc/1000.); } else { snprintf(buf, MSG_SIZ, "level %d %ld:%02d %g\n", mps, tc/60000, seconds, inc/1000.); } } SendToProgram(buf, cps); /* Orthoganally (except for GNU Chess 4), limit time to st seconds */ /* Orthogonally, limit search to given depth */ if (sd > 0) { if (cps->sdKludge) { snprintf(buf, MSG_SIZ, "depth\n%d\n", sd); } else { snprintf(buf, MSG_SIZ, "sd %d\n", sd); } SendToProgram(buf, cps); } if(cps->nps >= 0) { /* [HGM] nps */ if(cps->supportsNPS == FALSE) cps->nps = -1; // don't use if engine explicitly says not supported! else { snprintf(buf, MSG_SIZ, "nps %d\n", cps->nps); SendToProgram(buf, cps); } } } ChessProgramState * WhitePlayer () /* [HGM] return pointer to 'first' or 'second', depending on who plays white */ { if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b' || gameMode == BeginningOfGame || gameMode == MachinePlaysBlack) return &second; return &first; } void SendTimeRemaining (ChessProgramState *cps, int machineWhite) { char message[MSG_SIZ]; long time, otime; /* Note: this routine must be called when the clocks are stopped or when they have *just* been set or switched; otherwise it will be off by the time since the current tick started. */ if (machineWhite) { time = whiteTimeRemaining / 10; otime = blackTimeRemaining / 10; } else { time = blackTimeRemaining / 10; otime = whiteTimeRemaining / 10; } /* [HGM] translate opponent's time by time-odds factor */ otime = (otime * cps->other->timeOdds) / cps->timeOdds; if (time <= 0) time = 1; if (otime <= 0) otime = 1; snprintf(message, MSG_SIZ, "time %ld\n", time); SendToProgram(message, cps); snprintf(message, MSG_SIZ, "otim %ld\n", otime); SendToProgram(message, cps); } int BoolFeature (char **p, char *name, int *loc, ChessProgramState *cps) { char buf[MSG_SIZ]; int len = strlen(name); int val; if (strncmp((*p), name, len) == 0 && (*p)[len] == '=') { (*p) += len + 1; sscanf(*p, "%d", &val); *loc = (val != 0); while (**p && **p != ' ') (*p)++; snprintf(buf, MSG_SIZ, "accepted %s\n", name); SendToProgram(buf, cps); return TRUE; } return FALSE; } int IntFeature (char **p, char *name, int *loc, ChessProgramState *cps) { char buf[MSG_SIZ]; int len = strlen(name); if (strncmp((*p), name, len) == 0 && (*p)[len] == '=') { (*p) += len + 1; sscanf(*p, "%d", loc); while (**p && **p != ' ') (*p)++; snprintf(buf, MSG_SIZ, "accepted %s\n", name); SendToProgram(buf, cps); return TRUE; } return FALSE; } int StringFeature (char **p, char *name, char **loc, ChessProgramState *cps) { char buf[MSG_SIZ]; int len = strlen(name); if (strncmp((*p), name, len) == 0 && (*p)[len] == '=' && (*p)[len+1] == '\"') { (*p) += len + 2; ASSIGN(*loc, *p); // kludge alert: assign rest of line just to be sure allocation is large enough so that sscanf below always fits sscanf(*p, "%[^\"]", *loc); while (**p && **p != '\"') (*p)++; if (**p == '\"') (*p)++; snprintf(buf, MSG_SIZ, "accepted %s\n", name); SendToProgram(buf, cps); return TRUE; } return FALSE; } int ParseOption (Option *opt, ChessProgramState *cps) // [HGM] options: process the string that defines an engine option, and determine // name, type, default value, and allowed value range { char *p, *q, buf[MSG_SIZ]; int n, min = (-1)<<31, max = 1<<31, def; if(p = strstr(opt->name, " -spin ")) { if((n = sscanf(p, " -spin %d %d %d", &def, &min, &max)) < 3 ) return FALSE; if(max < min) max = min; // enforce consistency if(def < min) def = min; if(def > max) def = max; opt->value = def; opt->min = min; opt->max = max; opt->type = Spin; } else if((p = strstr(opt->name, " -slider "))) { // for now -slider is a synonym for -spin, to already provide compatibility with future polyglots if((n = sscanf(p, " -slider %d %d %d", &def, &min, &max)) < 3 ) return FALSE; if(max < min) max = min; // enforce consistency if(def < min) def = min; if(def > max) def = max; opt->value = def; opt->min = min; opt->max = max; opt->type = Spin; // Slider; } else if((p = strstr(opt->name, " -string "))) { opt->textValue = p+9; opt->type = TextBox; } else if((p = strstr(opt->name, " -file "))) { // for now -file is a synonym for -string, to already provide compatibility with future polyglots opt->textValue = p+7; opt->type = FileName; // FileName; } else if((p = strstr(opt->name, " -path "))) { // for now -file is a synonym for -string, to already provide compatibility with future polyglots opt->textValue = p+7; opt->type = PathName; // PathName; } else if(p = strstr(opt->name, " -check ")) { if(sscanf(p, " -check %d", &def) < 1) return FALSE; opt->value = (def != 0); opt->type = CheckBox; } else if(p = strstr(opt->name, " -combo ")) { opt->textValue = (char*) (opt->choice = &cps->comboList[cps->comboCnt]); // cheat with pointer type cps->comboList[cps->comboCnt++] = q = p+8; // holds possible choices if(*q == '*') cps->comboList[cps->comboCnt-1]++; opt->value = n = 0; while(q = StrStr(q, " /// ")) { n++; *q = 0; // count choices, and null-terminate each of them q += 5; if(*q == '*') { // remember default, which is marked with * prefix q++; opt->value = n; } cps->comboList[cps->comboCnt++] = q; } cps->comboList[cps->comboCnt++] = NULL; opt->max = n + 1; opt->type = ComboBox; } else if(p = strstr(opt->name, " -button")) { opt->type = Button; } else if(p = strstr(opt->name, " -save")) { opt->type = SaveButton; } else return FALSE; *p = 0; // terminate option name // now look if the command-line options define a setting for this engine option. if(cps->optionSettings && cps->optionSettings[0]) p = strstr(cps->optionSettings, opt->name); else p = NULL; if(p && (p == cps->optionSettings || p[-1] == ',')) { snprintf(buf, MSG_SIZ, "option %s", p); if(p = strstr(buf, ",")) *p = 0; if(q = strchr(buf, '=')) switch(opt->type) { case ComboBox: for(n=0; nmax; n++) if(!strcmp(((char**)opt->textValue)[n], q+1)) opt->value = n; break; case TextBox: safeStrCpy(opt->textValue, q+1, MSG_SIZ - (opt->textValue - opt->name)); break; case Spin: case CheckBox: opt->value = atoi(q+1); default: break; } strcat(buf, "\n"); SendToProgram(buf, cps); } return TRUE; } void FeatureDone (ChessProgramState *cps, int val) { DelayedEventCallback cb = GetDelayedEvent(); if ((cb == InitBackEnd3 && cps == &first) || (cb == SettingsMenuIfReady && cps == &second) || (cb == LoadEngine) || (cb == TwoMachinesEventIfReady)) { CancelDelayedEvent(); ScheduleDelayedEvent(cb, val ? 1 : 3600000); } cps->initDone = val; if(val) cps->reload = FALSE; } /* Parse feature command from engine */ void ParseFeatures (char *args, ChessProgramState *cps) { char *p = args; char *q = NULL; int val; char buf[MSG_SIZ]; for (;;) { while (*p == ' ') p++; if (*p == NULLCHAR) return; if (BoolFeature(&p, "setboard", &cps->useSetboard, cps)) continue; if (BoolFeature(&p, "xedit", &cps->extendedEdit, cps)) continue; if (BoolFeature(&p, "time", &cps->sendTime, cps)) continue; if (BoolFeature(&p, "draw", &cps->sendDrawOffers, cps)) continue; if (BoolFeature(&p, "sigint", &cps->useSigint, cps)) continue; if (BoolFeature(&p, "sigterm", &cps->useSigterm, cps)) continue; if (BoolFeature(&p, "reuse", &val, cps)) { /* Engine can disable reuse, but can't enable it if user said no */ if (!val) cps->reuse = FALSE; continue; } if (BoolFeature(&p, "analyze", &cps->analysisSupport, cps)) continue; if (StringFeature(&p, "myname", &cps->tidy, cps)) { if (gameMode == TwoMachinesPlay) { DisplayTwoMachinesTitle(); } else { DisplayTitle(""); } continue; } if (StringFeature(&p, "variants", &cps->variants, cps)) continue; if (BoolFeature(&p, "san", &cps->useSAN, cps)) continue; if (BoolFeature(&p, "ping", &cps->usePing, cps)) continue; if (BoolFeature(&p, "playother", &cps->usePlayother, cps)) continue; if (BoolFeature(&p, "colors", &cps->useColors, cps)) continue; if (BoolFeature(&p, "usermove", &cps->useUsermove, cps)) continue; if (BoolFeature(&p, "exclude", &cps->excludeMoves, cps)) continue; if (BoolFeature(&p, "ics", &cps->sendICS, cps)) continue; if (BoolFeature(&p, "name", &cps->sendName, cps)) continue; if (BoolFeature(&p, "pause", &cps->pause, cps)) continue; // [HGM] pause if (IntFeature(&p, "done", &val, cps)) { FeatureDone(cps, val); continue; } /* Added by Tord: */ if (BoolFeature(&p, "fen960", &cps->useFEN960, cps)) continue; if (BoolFeature(&p, "oocastle", &cps->useOOCastle, cps)) continue; /* End of additions by Tord */ /* [HGM] added features: */ if (BoolFeature(&p, "debug", &cps->debug, cps)) continue; if (BoolFeature(&p, "nps", &cps->supportsNPS, cps)) continue; if (IntFeature(&p, "level", &cps->maxNrOfSessions, cps)) continue; if (BoolFeature(&p, "memory", &cps->memSize, cps)) continue; if (BoolFeature(&p, "smp", &cps->maxCores, cps)) continue; if (StringFeature(&p, "egt", &cps->egtFormats, cps)) continue; if (StringFeature(&p, "option", &q, cps)) { // read to freshly allocated temp buffer first if(cps->reload) { FREE(q); q = NULL; continue; } // we are reloading because of xreuse FREE(cps->option[cps->nrOptions].name); cps->option[cps->nrOptions].name = q; q = NULL; if(!ParseOption(&(cps->option[cps->nrOptions++]), cps)) { // [HGM] options: add option feature snprintf(buf, MSG_SIZ, "rejected option %s\n", cps->option[--cps->nrOptions].name); SendToProgram(buf, cps); continue; } if(cps->nrOptions >= MAX_OPTIONS) { cps->nrOptions--; snprintf(buf, MSG_SIZ, _("%s engine has too many options\n"), _(cps->which)); DisplayError(buf, 0); } continue; } /* End of additions by HGM */ /* unknown feature: complain and skip */ q = p; while (*q && *q != '=') q++; snprintf(buf, MSG_SIZ,"rejected %.*s\n", (int)(q-p), p); SendToProgram(buf, cps); p = q; if (*p == '=') { p++; if (*p == '\"') { p++; while (*p && *p != '\"') p++; if (*p == '\"') p++; } else { while (*p && *p != ' ') p++; } } } } void PeriodicUpdatesEvent (int newState) { if (newState == appData.periodicUpdates) return; appData.periodicUpdates=newState; /* Display type changes, so update it now */ // DisplayAnalysis(); /* Get the ball rolling again... */ if (newState) { AnalysisPeriodicEvent(1); StartAnalysisClock(); } } void PonderNextMoveEvent (int newState) { if (newState == appData.ponderNextMove) return; if (gameMode == EditPosition) EditPositionDone(TRUE); if (newState) { SendToProgram("hard\n", &first); if (gameMode == TwoMachinesPlay) { SendToProgram("hard\n", &second); } } else { SendToProgram("easy\n", &first); thinkOutput[0] = NULLCHAR; if (gameMode == TwoMachinesPlay) { SendToProgram("easy\n", &second); } } appData.ponderNextMove = newState; } void NewSettingEvent (int option, int *feature, char *command, int value) { char buf[MSG_SIZ]; if (gameMode == EditPosition) EditPositionDone(TRUE); snprintf(buf, MSG_SIZ,"%s%s %d\n", (option ? "option ": ""), command, value); if(feature == NULL || *feature) SendToProgram(buf, &first); if (gameMode == TwoMachinesPlay) { if(feature == NULL || feature[(int*)&second - (int*)&first]) SendToProgram(buf, &second); } } void ShowThinkingEvent () // [HGM] thinking: this routine is now also called from "Options -> Engine..." popup { static int oldState = 2; // kludge alert! Neither true nor fals, so first time oldState is always updated int newState = appData.showThinking // [HGM] thinking: other features now need thinking output as well || !appData.hideThinkingFromHuman || appData.adjudicateLossThreshold != 0 || EngineOutputIsUp(); if (oldState == newState) return; oldState = newState; if (gameMode == EditPosition) EditPositionDone(TRUE); if (oldState) { SendToProgram("post\n", &first); if (gameMode == TwoMachinesPlay) { SendToProgram("post\n", &second); } } else { SendToProgram("nopost\n", &first); thinkOutput[0] = NULLCHAR; if (gameMode == TwoMachinesPlay) { SendToProgram("nopost\n", &second); } } // appData.showThinking = newState; // [HGM] thinking: responsible option should already have be changed when calling this routine! } void AskQuestionEvent (char *title, char *question, char *replyPrefix, char *which) { ProcRef pr = (which[0] == '1') ? first.pr : second.pr; if (pr == NoProc) return; AskQuestion(title, question, replyPrefix, pr); } void TypeInEvent (char firstChar) { if ((gameMode == BeginningOfGame && !appData.icsActive) || gameMode == MachinePlaysWhite || gameMode == MachinePlaysBlack || gameMode == AnalyzeMode || gameMode == EditGame || gameMode == EditPosition || gameMode == IcsExamining || gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || isdigit(firstChar) && // [HGM] movenum: allow typing in of move nr in 'passive' modes ( gameMode == AnalyzeFile || gameMode == PlayFromGameFile || gameMode == IcsObserving || gameMode == TwoMachinesPlay ) || gameMode == Training) PopUpMoveDialog(firstChar); } void TypeInDoneEvent (char *move) { Board board; int n, fromX, fromY, toX, toY; char promoChar; ChessMove moveType; // [HGM] FENedit if(gameMode == EditPosition && ParseFEN(board, &n, move) ) { EditPositionPasteFEN(move); return; } // [HGM] movenum: allow move number to be typed in any mode if(sscanf(move, "%d", &n) == 1 && n != 0 ) { ToNrEvent(2*n-1); return; } // undocumented kludge: allow command-line option to be typed in! // (potentially fatal, and does not implement the effect of the option.) // should only be used for options that are values on which future decisions will be made, // and definitely not on options that would be used during initialization. if(strstr(move, "!!! -") == move) { ParseArgsFromString(move+4); return; } if (gameMode != EditGame && currentMove != forwardMostMove && gameMode != Training) { DisplayMoveError(_("Displayed move is not current")); } else { int ok = ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar); if(!ok && move[0] >= 'a') { move[0] += 'A' - 'a'; ok = 2; } // [HGM] try also capitalized if (ok==1 || ok && ParseOneMove(move, gameMode == EditPosition ? blackPlaysFirst : currentMove, &moveType, &fromX, &fromY, &toX, &toY, &promoChar)) { UserMoveEvent(fromX, fromY, toX, toY, promoChar); } else { DisplayMoveError(_("Could not parse move")); } } } void DisplayMove (int moveNumber) { char message[MSG_SIZ]; char res[MSG_SIZ]; char cpThinkOutput[MSG_SIZ]; if(appData.noGUI) return; // [HGM] fast: suppress display of moves if (moveNumber == forwardMostMove - 1 || gameMode == AnalyzeMode || gameMode == AnalyzeFile) { safeStrCpy(cpThinkOutput, thinkOutput, sizeof(cpThinkOutput)/sizeof(cpThinkOutput[0])); if (strchr(cpThinkOutput, '\n')) { *strchr(cpThinkOutput, '\n') = NULLCHAR; } } else { *cpThinkOutput = NULLCHAR; } /* [AS] Hide thinking from human user */ if( appData.hideThinkingFromHuman && gameMode != TwoMachinesPlay ) { *cpThinkOutput = NULLCHAR; if( thinkOutput[0] != NULLCHAR ) { int i; for( i=0; i<=hiddenThinkOutputState; i++ ) { cpThinkOutput[i] = '.'; } cpThinkOutput[i] = NULLCHAR; hiddenThinkOutputState = (hiddenThinkOutputState + 1) % 3; } } if (moveNumber == forwardMostMove - 1 && gameInfo.resultDetails != NULL) { if (gameInfo.resultDetails[0] == NULLCHAR) { snprintf(res, MSG_SIZ, " %s", PGNResult(gameInfo.result)); } else { snprintf(res, MSG_SIZ, " {%s} %s", T_(gameInfo.resultDetails), PGNResult(gameInfo.result)); } } else { res[0] = NULLCHAR; } if (moveNumber < 0 || parseList[moveNumber][0] == NULLCHAR) { DisplayMessage(res, cpThinkOutput); } else { snprintf(message, MSG_SIZ, "%d.%s%s%s", moveNumber / 2 + 1, WhiteOnMove(moveNumber) ? " " : ".. ", parseList[moveNumber], res); DisplayMessage(message, cpThinkOutput); } } void DisplayComment (int moveNumber, char *text) { char title[MSG_SIZ]; if (moveNumber < 0 || parseList[moveNumber][0] == NULLCHAR) { safeStrCpy(title, "Comment", sizeof(title)/sizeof(title[0])); } else { snprintf(title,MSG_SIZ, "Comment on %d.%s%s", moveNumber / 2 + 1, WhiteOnMove(moveNumber) ? " " : ".. ", parseList[moveNumber]); } if (text != NULL && (appData.autoDisplayComment || commentUp)) CommentPopUp(title, text); } /* This routine sends a ^C interrupt to gnuchess, to awaken it if it * might be busy thinking or pondering. It can be omitted if your * gnuchess is configured to stop thinking immediately on any user * input. However, that gnuchess feature depends on the FIONREAD * ioctl, which does not work properly on some flavors of Unix. */ void Attention (ChessProgramState *cps) { #if ATTENTION if (!cps->useSigint) return; if (appData.noChessProgram || (cps->pr == NoProc)) return; switch (gameMode) { case MachinePlaysWhite: case MachinePlaysBlack: case TwoMachinesPlay: case IcsPlayingWhite: case IcsPlayingBlack: case AnalyzeMode: case AnalyzeFile: /* Skip if we know it isn't thinking */ if (!cps->maybeThinking) return; if (appData.debugMode) fprintf(debugFP, "Interrupting %s\n", cps->which); InterruptChildProcess(cps->pr); cps->maybeThinking = FALSE; break; default: break; } #endif /*ATTENTION*/ } int CheckFlags () { if (whiteTimeRemaining <= 0) { if (!whiteFlag) { whiteFlag = TRUE; if (appData.icsActive) { if (appData.autoCallFlag && gameMode == IcsPlayingBlack && !blackFlag) { SendToICS(ics_prefix); SendToICS("flag\n"); } } else { if (blackFlag) { if(gameMode != TwoMachinesPlay) DisplayTitle(_("Both flags fell")); } else { if(gameMode != TwoMachinesPlay) DisplayTitle(_("White's flag fell")); if (appData.autoCallFlag) { GameEnds(BlackWins, "Black wins on time", GE_XBOARD); return TRUE; } } } } } if (blackTimeRemaining <= 0) { if (!blackFlag) { blackFlag = TRUE; if (appData.icsActive) { if (appData.autoCallFlag && gameMode == IcsPlayingWhite && !whiteFlag) { SendToICS(ics_prefix); SendToICS("flag\n"); } } else { if (whiteFlag) { if(gameMode != TwoMachinesPlay) DisplayTitle(_("Both flags fell")); } else { if(gameMode != TwoMachinesPlay) DisplayTitle(_("Black's flag fell")); if (appData.autoCallFlag) { GameEnds(WhiteWins, "White wins on time", GE_XBOARD); return TRUE; } } } } } return FALSE; } void CheckTimeControl () { if (!appData.clockMode || appData.icsActive || searchTime || // [HGM] st: no inc in st mode gameMode == PlayFromGameFile || forwardMostMove == 0) return; /* * add time to clocks when time control is achieved ([HGM] now also used for increment) */ if ( !WhiteOnMove(forwardMostMove) ) { /* White made time control */ lastWhite -= whiteTimeRemaining; // [HGM] contains start time, socalculate thinking time whiteTimeRemaining += GetTimeQuota((forwardMostMove-whiteStartMove-1)/2, lastWhite, whiteTC) /* [HGM] time odds: correct new time quota for time odds! */ / WhitePlayer()->timeOdds; lastBlack = blackTimeRemaining; // [HGM] leave absolute time (after quota), so next switch we can us it to calculate thinking time } else { lastBlack -= blackTimeRemaining; /* Black made time control */ blackTimeRemaining += GetTimeQuota((forwardMostMove-blackStartMove-1)/2, lastBlack, blackTC) / WhitePlayer()->other->timeOdds; lastWhite = whiteTimeRemaining; } } void DisplayBothClocks () { int wom = gameMode == EditPosition ? !blackPlaysFirst : WhiteOnMove(currentMove); DisplayWhiteClock(whiteTimeRemaining, wom); DisplayBlackClock(blackTimeRemaining, !wom); } /* Timekeeping seems to be a portability nightmare. I think everyone has ftime(), but I'm really not sure, so I'm including some ifdefs to use other calls if you don't. Clocks will be less accurate if you have neither ftime nor gettimeofday. */ /* VS 2008 requires the #include outside of the function */ #if !HAVE_GETTIMEOFDAY && HAVE_FTIME #include #endif /* Get the current time as a TimeMark */ void GetTimeMark (TimeMark *tm) { #if HAVE_GETTIMEOFDAY struct timeval timeVal; struct timezone timeZone; gettimeofday(&timeVal, &timeZone); tm->sec = (long) timeVal.tv_sec; tm->ms = (int) (timeVal.tv_usec / 1000L); #else /*!HAVE_GETTIMEOFDAY*/ #if HAVE_FTIME // include / moved to just above start of function struct timeb timeB; ftime(&timeB); tm->sec = (long) timeB.time; tm->ms = (int) timeB.millitm; #else /*!HAVE_FTIME && !HAVE_GETTIMEOFDAY*/ tm->sec = (long) time(NULL); tm->ms = 0; #endif #endif } /* Return the difference in milliseconds between two time marks. We assume the difference will fit in a long! */ long SubtractTimeMarks (TimeMark *tm2, TimeMark *tm1) { return 1000L*(tm2->sec - tm1->sec) + (long) (tm2->ms - tm1->ms); } /* * Code to manage the game clocks. * * In tournament play, black starts the clock and then white makes a move. * We give the human user a slight advantage if he is playing white---the * clocks don't run until he makes his first move, so it takes zero time. * Also, we don't account for network lag, so we could get out of sync * with GNU Chess's clock -- but then, referees are always right. */ static TimeMark tickStartTM; static long intendedTickLength; long NextTickLength (long timeRemaining) { long nominalTickLength, nextTickLength; if (timeRemaining > 0L && timeRemaining <= 10000L) nominalTickLength = 100L; else nominalTickLength = 1000L; nextTickLength = timeRemaining % nominalTickLength; if (nextTickLength <= 0) nextTickLength += nominalTickLength; return nextTickLength; } /* Adjust clock one minute up or down */ void AdjustClock (Boolean which, int dir) { if(appData.autoCallFlag) { DisplayError(_("Clock adjustment not allowed in auto-flag mode"), 0); return; } if(which) blackTimeRemaining += 60000*dir; else whiteTimeRemaining += 60000*dir; DisplayBothClocks(); adjustedClock = TRUE; } /* Stop clocks and reset to a fresh time control */ void ResetClocks () { (void) StopClockTimer(); if (appData.icsActive) { whiteTimeRemaining = blackTimeRemaining = 0; } else if (searchTime) { whiteTimeRemaining = 1000*searchTime / WhitePlayer()->timeOdds; blackTimeRemaining = 1000*searchTime / WhitePlayer()->other->timeOdds; } else { /* [HGM] correct new time quote for time odds */ whiteTC = blackTC = fullTimeControlString; whiteTimeRemaining = GetTimeQuota(-1, 0, whiteTC) / WhitePlayer()->timeOdds; blackTimeRemaining = GetTimeQuota(-1, 0, blackTC) / WhitePlayer()->other->timeOdds; } if (whiteFlag || blackFlag) { DisplayTitle(""); whiteFlag = blackFlag = FALSE; } lastWhite = lastBlack = whiteStartMove = blackStartMove = 0; DisplayBothClocks(); adjustedClock = FALSE; } #define FUDGE 25 /* 25ms = 1/40 sec; should be plenty even for 50 Hz clocks */ /* Decrement running clock by amount of time that has passed */ void DecrementClocks () { long timeRemaining; long lastTickLength, fudge; TimeMark now; if (!appData.clockMode) return; if (gameMode==AnalyzeMode || gameMode == AnalyzeFile) return; GetTimeMark(&now); lastTickLength = SubtractTimeMarks(&now, &tickStartTM); /* Fudge if we woke up a little too soon */ fudge = intendedTickLength - lastTickLength; if (fudge < 0 || fudge > FUDGE) fudge = 0; if (WhiteOnMove(forwardMostMove)) { if(whiteNPS >= 0) lastTickLength = 0; timeRemaining = whiteTimeRemaining -= lastTickLength; if(timeRemaining < 0 && !appData.icsActive) { GetTimeQuota((forwardMostMove-whiteStartMove-1)/2, 0, whiteTC); // sets suddenDeath & nextSession; if(suddenDeath) { // [HGM] if we run out of a non-last incremental session, go to the next whiteStartMove = forwardMostMove; whiteTC = nextSession; lastWhite= timeRemaining = whiteTimeRemaining += GetTimeQuota(-1, 0, whiteTC); } } DisplayWhiteClock(whiteTimeRemaining - fudge, WhiteOnMove(currentMove < forwardMostMove ? currentMove : forwardMostMove)); } else { if(blackNPS >= 0) lastTickLength = 0; timeRemaining = blackTimeRemaining -= lastTickLength; if(timeRemaining < 0 && !appData.icsActive) { // [HGM] if we run out of a non-last incremental session, go to the next GetTimeQuota((forwardMostMove-blackStartMove-1)/2, 0, blackTC); if(suddenDeath) { blackStartMove = forwardMostMove; lastBlack = timeRemaining = blackTimeRemaining += GetTimeQuota(-1, 0, blackTC=nextSession); } } DisplayBlackClock(blackTimeRemaining - fudge, !WhiteOnMove(currentMove < forwardMostMove ? currentMove : forwardMostMove)); } if (CheckFlags()) return; if(twoBoards) { // count down secondary board's clocks as well activePartnerTime -= lastTickLength; partnerUp = 1; if(activePartner == 'W') DisplayWhiteClock(activePartnerTime, TRUE); // the counting clock is always the highlighted one! else DisplayBlackClock(activePartnerTime, TRUE); partnerUp = 0; } tickStartTM = now; intendedTickLength = NextTickLength(timeRemaining - fudge) + fudge; StartClockTimer(intendedTickLength); /* if the time remaining has fallen below the alarm threshold, sound the * alarm. if the alarm has sounded and (due to a takeback or time control * with increment) the time remaining has increased to a level above the * threshold, reset the alarm so it can sound again. */ if (appData.icsActive && appData.icsAlarm) { /* make sure we are dealing with the user's clock */ if (!( ((gameMode == IcsPlayingWhite) && WhiteOnMove(currentMove)) || ((gameMode == IcsPlayingBlack) && !WhiteOnMove(currentMove)) )) return; if (alarmSounded && (timeRemaining > appData.icsAlarmTime)) { alarmSounded = FALSE; } else if (!alarmSounded && (timeRemaining <= appData.icsAlarmTime)) { PlayAlarmSound(); alarmSounded = TRUE; } } } /* A player has just moved, so stop the previously running clock and (if in clock mode) start the other one. We redisplay both clocks in case we're in ICS mode, because ICS gives us an update to both clocks after every move. Note that this routine is called *after* forwardMostMove is updated, so the last fractional tick must be subtracted from the color that is *not* on move now. */ void SwitchClocks (int newMoveNr) { long lastTickLength; TimeMark now; int flagged = FALSE; GetTimeMark(&now); if (StopClockTimer() && appData.clockMode) { lastTickLength = SubtractTimeMarks(&now, &tickStartTM); if (!WhiteOnMove(forwardMostMove)) { if(blackNPS >= 0) lastTickLength = 0; blackTimeRemaining -= lastTickLength; /* [HGM] PGNtime: save time for PGN file if engine did not give it */ // if(pvInfoList[forwardMostMove].time == -1) pvInfoList[forwardMostMove].time = // use GUI time (timeRemaining[1][forwardMostMove-1] - blackTimeRemaining)/10; } else { if(whiteNPS >= 0) lastTickLength = 0; whiteTimeRemaining -= lastTickLength; /* [HGM] PGNtime: save time for PGN file if engine did not give it */ // if(pvInfoList[forwardMostMove].time == -1) pvInfoList[forwardMostMove].time = (timeRemaining[0][forwardMostMove-1] - whiteTimeRemaining)/10; } flagged = CheckFlags(); } forwardMostMove = newMoveNr; // [HGM] race: change stm when no timer interrupt scheduled CheckTimeControl(); if (flagged || !appData.clockMode) return; switch (gameMode) { case MachinePlaysBlack: case MachinePlaysWhite: case BeginningOfGame: if (pausing) return; break; case EditGame: case PlayFromGameFile: case IcsExamining: return; default: break; } if (searchTime) { // [HGM] st: set clock of player that has to move to max time if(WhiteOnMove(forwardMostMove)) whiteTimeRemaining = 1000*searchTime / WhitePlayer()->timeOdds; else blackTimeRemaining = 1000*searchTime / WhitePlayer()->other->timeOdds; } tickStartTM = now; intendedTickLength = NextTickLength(WhiteOnMove(forwardMostMove) ? whiteTimeRemaining : blackTimeRemaining); StartClockTimer(intendedTickLength); } /* Stop both clocks */ void StopClocks () { long lastTickLength; TimeMark now; if (!StopClockTimer()) return; if (!appData.clockMode) return; GetTimeMark(&now); lastTickLength = SubtractTimeMarks(&now, &tickStartTM); if (WhiteOnMove(forwardMostMove)) { if(whiteNPS >= 0) lastTickLength = 0; whiteTimeRemaining -= lastTickLength; DisplayWhiteClock(whiteTimeRemaining, WhiteOnMove(currentMove)); } else { if(blackNPS >= 0) lastTickLength = 0; blackTimeRemaining -= lastTickLength; DisplayBlackClock(blackTimeRemaining, !WhiteOnMove(currentMove)); } CheckFlags(); } /* Start clock of player on move. Time may have been reset, so if clock is already running, stop and restart it. */ void StartClocks () { (void) StopClockTimer(); /* in case it was running already */ DisplayBothClocks(); if (CheckFlags()) return; if (!appData.clockMode) return; if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) return; GetTimeMark(&tickStartTM); intendedTickLength = NextTickLength(WhiteOnMove(forwardMostMove) ? whiteTimeRemaining : blackTimeRemaining); /* [HGM] nps: figure out nps factors, by determining which engine plays white and/or black once and for all */ whiteNPS = blackNPS = -1; if(gameMode == MachinePlaysWhite || gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'w' || appData.zippyPlay && gameMode == IcsPlayingBlack) // first (perhaps only) engine has white whiteNPS = first.nps; if(gameMode == MachinePlaysBlack || gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b' || appData.zippyPlay && gameMode == IcsPlayingWhite) // first (perhaps only) engine has black blackNPS = first.nps; if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b') // second only used in Two-Machines mode whiteNPS = second.nps; if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'w') blackNPS = second.nps; if(appData.debugMode) fprintf(debugFP, "nps: w=%d, b=%d\n", whiteNPS, blackNPS); StartClockTimer(intendedTickLength); } char * TimeString (long ms) { long second, minute, hour, day; char *sign = ""; static char buf[32]; if (ms > 0 && ms <= 9900) { /* convert milliseconds to tenths, rounding up */ double tenths = floor( ((double)(ms + 99L)) / 100.00 ); snprintf(buf,sizeof(buf)/sizeof(buf[0]), " %03.1f ", tenths/10.0); return buf; } /* convert milliseconds to seconds, rounding up */ /* use floating point to avoid strangeness of integer division with negative dividends on many machines */ second = (long) floor(((double) (ms + 999L)) / 1000.0); if (second < 0) { sign = "-"; second = -second; } day = second / (60 * 60 * 24); second = second % (60 * 60 * 24); hour = second / (60 * 60); second = second % (60 * 60); minute = second / 60; second = second % 60; if (day > 0) snprintf(buf, sizeof(buf)/sizeof(buf[0]), " %s%ld:%02ld:%02ld:%02ld ", sign, day, hour, minute, second); else if (hour > 0) snprintf(buf, sizeof(buf)/sizeof(buf[0]), " %s%ld:%02ld:%02ld ", sign, hour, minute, second); else snprintf(buf, sizeof(buf)/sizeof(buf[0]), " %s%2ld:%02ld ", sign, minute, second); return buf; } /* * This is necessary because some C libraries aren't ANSI C compliant yet. */ char * StrStr (char *string, char *match) { int i, length; length = strlen(match); for (i = strlen(string) - length; i >= 0; i--, string++) if (!strncmp(match, string, length)) return string; return NULL; } char * StrCaseStr (char *string, char *match) { int i, j, length; length = strlen(match); for (i = strlen(string) - length; i >= 0; i--, string++) { for (j = 0; j < length; j++) { if (ToLower(match[j]) != ToLower(string[j])) break; } if (j == length) return string; } return NULL; } #ifndef _amigados int StrCaseCmp (char *s1, char *s2) { char c1, c2; for (;;) { c1 = ToLower(*s1++); c2 = ToLower(*s2++); if (c1 > c2) return 1; if (c1 < c2) return -1; if (c1 == NULLCHAR) return 0; } } int ToLower (int c) { return isupper(c) ? tolower(c) : c; } int ToUpper (int c) { return islower(c) ? toupper(c) : c; } #endif /* !_amigados */ char * StrSave (char *s) { char *ret; if ((ret = (char *) malloc(strlen(s) + 1))) { safeStrCpy(ret, s, strlen(s)+1); } return ret; } char * StrSavePtr (char *s, char **savePtr) { if (*savePtr) { free(*savePtr); } if ((*savePtr = (char *) malloc(strlen(s) + 1))) { safeStrCpy(*savePtr, s, strlen(s)+1); } return(*savePtr); } char * PGNDate () { time_t clock; struct tm *tm; char buf[MSG_SIZ]; clock = time((time_t *)NULL); tm = localtime(&clock); snprintf(buf, MSG_SIZ, "%04d.%02d.%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); return StrSave(buf); } char * PositionToFEN (int move, char *overrideCastling) { int i, j, fromX, fromY, toX, toY; int whiteToPlay; char buf[MSG_SIZ]; char *p, *q; int emptycount; ChessSquare piece; whiteToPlay = (gameMode == EditPosition) ? !blackPlaysFirst : (move % 2 == 0); p = buf; /* Piece placement data */ for (i = BOARD_HEIGHT - 1; i >= 0; i--) { if(MSG_SIZ - (p - buf) < BOARD_RGHT - BOARD_LEFT + 20) { *p = 0; return StrSave(buf); } emptycount = 0; for (j = BOARD_LEFT; j < BOARD_RGHT; j++) { if (boards[move][i][j] == EmptySquare) { emptycount++; } else { ChessSquare piece = boards[move][i][j]; if (emptycount > 0) { if(emptycount<10) /* [HGM] can be >= 10 */ *p++ = '0' + emptycount; else { *p++ = '0' + emptycount/10; *p++ = '0' + emptycount%10; } emptycount = 0; } if(PieceToChar(piece) == '+') { /* [HGM] write promoted pieces as '+' (Shogi) */ *p++ = '+'; piece = (ChessSquare)(DEMOTED piece); } *p++ = PieceToChar(piece); if(p[-1] == '~') { /* [HGM] flag promoted pieces as '~' (Crazyhouse) */ p[-1] = PieceToChar((ChessSquare)(DEMOTED piece)); *p++ = '~'; } } } if (emptycount > 0) { if(emptycount<10) /* [HGM] can be >= 10 */ *p++ = '0' + emptycount; else { *p++ = '0' + emptycount/10; *p++ = '0' + emptycount%10; } emptycount = 0; } *p++ = '/'; } *(p - 1) = ' '; /* [HGM] print Crazyhouse or Shogi holdings */ if( gameInfo.holdingsWidth ) { *(p-1) = '['; /* if we wanted to support BFEN, this could be '/' */ q = p; for(i=0; i=BOARD_LEFT+q && j; i--) if((boards[move][0][i] != WhiteKing || k+q == 0) && boards[move][VIRGIN][i] & VIRGIN_W) *p++ = i + AAA + 'A' - 'a'; } if(q) *p++ = 'Q'; k = 0; if(boards[move][CASTLING][3] == BOARD_RGHT-1 && boards[move][CASTLING][5] != NoRights ) k = 1, *p++ = 'k'; q = (boards[move][CASTLING][4] == BOARD_LEFT && boards[move][CASTLING][5] != NoRights ); if(gameInfo.variant == VariantSChess) { for(i=j=0; i=BOARD_LEFT+q && j; i--) if((boards[move][BOARD_HEIGHT-1][i] != BlackKing || k+q == 0) && boards[move][VIRGIN][i] & VIRGIN_B) *p++ = i + AAA; } if(q) *p++ = 'q'; } } if (q == p) *p++ = '-'; /* No castling rights */ *p++ = ' '; } if(gameInfo.variant != VariantShogi && gameInfo.variant != VariantXiangqi && gameInfo.variant != VariantShatranj && gameInfo.variant != VariantCourier && gameInfo.variant != VariantMakruk ) { /* En passant target square */ if (move > backwardMostMove) { fromX = moveList[move - 1][0] - AAA; fromY = moveList[move - 1][1] - ONE; toX = moveList[move - 1][2] - AAA; toY = moveList[move - 1][3] - ONE; if (fromY == (whiteToPlay ? BOARD_HEIGHT-2 : 1) && toY == (whiteToPlay ? BOARD_HEIGHT-4 : 3) && boards[move][toY][toX] == (whiteToPlay ? BlackPawn : WhitePawn) && fromX == toX) { /* 2-square pawn move just happened */ *p++ = toX + AAA; *p++ = whiteToPlay ? '6'+BOARD_HEIGHT-8 : '3'; } else { *p++ = '-'; } } else if(move == backwardMostMove) { // [HGM] perhaps we should always do it like this, and forget the above? if((signed char)boards[move][EP_STATUS] >= 0) { *p++ = boards[move][EP_STATUS] + AAA; *p++ = whiteToPlay ? '6'+BOARD_HEIGHT-8 : '3'; } else { *p++ = '-'; } } else { *p++ = '-'; } *p++ = ' '; } } /* [HGM] find reversible plies */ { int i = 0, j=move; if (appData.debugMode) { int k; fprintf(debugFP, "write FEN 50-move: %d %d %d\n", initialRulePlies, forwardMostMove, backwardMostMove); for(k=backwardMostMove; k<=forwardMostMove; k++) fprintf(debugFP, "e%d. p=%d\n", k, (signed char)boards[k][EP_STATUS]); } while(j > backwardMostMove && (signed char)boards[j][EP_STATUS] <= EP_NONE) j--,i++; if( j == backwardMostMove ) i += initialRulePlies; sprintf(p, "%d ", i); p += i>=100 ? 4 : i >= 10 ? 3 : 2; } /* Fullmove number */ sprintf(p, "%d", (move / 2) + 1); return StrSave(buf); } Boolean ParseFEN (Board board, int *blackPlaysFirst, char *fen) { int i, j; char *p, c; int emptycount, virgin[BOARD_FILES]; ChessSquare piece; p = fen; /* [HGM] by default clear Crazyhouse holdings, if present */ if(gameInfo.holdingsWidth) { for(i=0; i= 0; i--) { j = 0; for (;;) { if (*p == '/' || *p == ' ' || (*p == '[' && i == 0) ) { if (*p == '/') p++; emptycount = gameInfo.boardWidth - j; while (emptycount--) board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare; break; #if(BOARD_FILES >= 10) } else if(*p=='x' || *p=='X') { /* [HGM] X means 10 */ p++; emptycount=10; if (j + emptycount > gameInfo.boardWidth) return FALSE; while (emptycount--) board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare; #endif } else if (isdigit(*p)) { emptycount = *p++ - '0'; while(isdigit(*p)) emptycount = 10*emptycount + *p++ - '0'; /* [HGM] allow > 9 */ if (j + emptycount > gameInfo.boardWidth) return FALSE; while (emptycount--) board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare; } else if (*p == '+' || isalpha(*p)) { if (j >= gameInfo.boardWidth) return FALSE; if(*p=='+') { piece = CharToPiece(*++p); if(piece == EmptySquare) return FALSE; /* unknown piece */ piece = (ChessSquare) (PROMOTED piece ); p++; if(PieceToChar(piece) != '+') return FALSE; /* unpromotable piece */ } else piece = CharToPiece(*p++); if(piece==EmptySquare) return FALSE; /* unknown piece */ if(*p == '~') { /* [HGM] make it a promoted piece for Crazyhouse */ piece = (ChessSquare) (PROMOTED piece); if(PieceToChar(piece) != '~') return FALSE; /* cannot be a promoted piece */ p++; } board[i][(j++)+gameInfo.holdingsWidth] = piece; } else { return FALSE; } } } while (*p == '/' || *p == ' ') p++; /* [HGM] look for Crazyhouse holdings here */ while(*p==' ') p++; if( gameInfo.holdingsWidth && p[-1] == '/' || *p == '[') { if(*p == '[') p++; if(*p == '-' ) p++; /* empty holdings */ else { if( !gameInfo.holdingsWidth ) return FALSE; /* no room to put holdings! */ /* if we would allow FEN reading to set board size, we would */ /* have to add holdings and shift the board read so far here */ while( (piece = CharToPiece(*p) ) != EmptySquare ) { p++; if((int) piece >= (int) BlackPawn ) { i = (int)piece - (int)BlackPawn; i = PieceToNumber((ChessSquare)i); if( i >= gameInfo.holdingsSize ) return FALSE; board[BOARD_HEIGHT-1-i][0] = piece; /* black holdings */ board[BOARD_HEIGHT-1-i][1]++; /* black counts */ } else { i = (int)piece - (int)WhitePawn; i = PieceToNumber((ChessSquare)i); if( i >= gameInfo.holdingsSize ) return FALSE; board[i][BOARD_WIDTH-1] = piece; /* white holdings */ board[i][BOARD_WIDTH-2]++; /* black holdings */ } } } if(*p == ']') p++; } while(*p == ' ') p++; /* Active color */ c = *p++; if(appData.colorNickNames) { if( c == appData.colorNickNames[0] ) c = 'w'; else if( c == appData.colorNickNames[1] ) c = 'b'; } switch (c) { case 'w': *blackPlaysFirst = FALSE; break; case 'b': *blackPlaysFirst = TRUE; break; default: return FALSE; } /* [HGM] We NO LONGER ignore the rest of the FEN notation */ /* return the extra info in global variiables */ /* set defaults in case FEN is incomplete */ board[EP_STATUS] = EP_UNKNOWN; for(i=0; i= 'A' && *p <= 'Z' || *p >= 'a' && *p <= 'z' || *p=='-') { /* castling indicator present, so default becomes no castlings */ for(i=0; i= 'a' && *p < 'a' + gameInfo.boardWidth) || ( *p >= 'A' && *p < 'A' + gameInfo.boardWidth) ) { int c = *p++, whiteKingFile=NoRights, blackKingFile=NoRights; for(i=BOARD_LEFT; i> 1; // for these variant scanning fails if(whiteKingFile == NoRights || board[0][whiteKingFile] != WhiteUnicorn && board[0][whiteKingFile] != WhiteKing) whiteKingFile = NoRights; if(blackKingFile == NoRights || board[BOARD_HEIGHT-1][blackKingFile] != BlackUnicorn && board[BOARD_HEIGHT-1][blackKingFile] != BlackKing) blackKingFile = NoRights; switch(c) { case'K': for(i=BOARD_RGHT-1; board[0][i]!=WhiteRook && i>whiteKingFile; i--); board[CASTLING][0] = i != whiteKingFile ? i : NoRights; board[CASTLING][2] = whiteKingFile; if(board[CASTLING][0] != NoRights) virgin[board[CASTLING][0]] |= VIRGIN_W; if(board[CASTLING][2] != NoRights) virgin[board[CASTLING][2]] |= VIRGIN_W; break; case'Q': for(i=BOARD_LEFT; iblackKingFile; i--); board[CASTLING][3] = i != blackKingFile ? i : NoRights; board[CASTLING][5] = blackKingFile; if(board[CASTLING][3] != NoRights) virgin[board[CASTLING][3]] |= VIRGIN_B; if(board[CASTLING][5] != NoRights) virgin[board[CASTLING][5]] |= VIRGIN_B; break; case'q': for(i=BOARD_LEFT; i= 'a') { /* black rights */ if(gameInfo.variant == VariantSChess) { virgin[c-AAA] |= VIRGIN_B; break; } // in S-Chess castlings are always kq, so just virginity for(i=BOARD_LEFT; i= BlackKing ) break; if(c > i) board[CASTLING][3] = c; else board[CASTLING][4] = c; } else { /* white rights */ if(gameInfo.variant == VariantSChess) { virgin[c-AAA-'A'+'a'] |= VIRGIN_W; break; } // in S-Chess castlings are always KQ for(i=BOARD_LEFT; i= WhiteKing) break; if(c > i) board[CASTLING][0] = c; else board[CASTLING][1] = c; } } } for(i=0; i= BOARD_RGHT) return TRUE; if(*p >= '0' && *p <='9') p++; board[EP_STATUS] = c; } } if(sscanf(p, "%d", &i) == 1) { FENrulePlies = i; /* 50-move ply counter */ /* (The move number is still ignored) */ } return TRUE; } void EditPositionPasteFEN (char *fen) { if (fen != NULL) { Board initial_position; if (!ParseFEN(initial_position, &blackPlaysFirst, fen)) { DisplayError(_("Bad FEN position in clipboard"), 0); return ; } else { int savedBlackPlaysFirst = blackPlaysFirst; EditPositionEvent(); blackPlaysFirst = savedBlackPlaysFirst; CopyBoard(boards[0], initial_position); initialRulePlies = FENrulePlies; /* [HGM] copy FEN attributes as well */ EditPositionDone(FALSE); // [HGM] fake: do not fake rights if we had FEN DisplayBothClocks(); DrawPosition(FALSE, boards[currentMove]); } } } static char cseq[12] = "\\ "; Boolean set_cont_sequence (char *new_seq) { int len; Boolean ret; // handle bad attempts to set the sequence if (!new_seq) return 0; // acceptable error - no debug len = strlen(new_seq); ret = (len > 0) && (len < sizeof(cseq)); if (ret) safeStrCpy(cseq, new_seq, sizeof(cseq)/sizeof(cseq[0])); else if (appData.debugMode) fprintf(debugFP, "Invalid continuation sequence \"%s\" (maximum length is: %u)\n", new_seq, (unsigned) sizeof(cseq)-1); return ret; } /* reformat a source message so words don't cross the width boundary. internal newlines are not removed. returns the wrapped size (no null character unless included in source message). If dest is NULL, only calculate the size required for the dest buffer. lp argument indicats line position upon entry, and it's passed back upon exit. */ int wrap (char *dest, char *src, int count, int width, int *lp) { int len, i, ansi, cseq_len, line, old_line, old_i, old_len, clen; cseq_len = strlen(cseq); old_line = line = *lp; ansi = len = clen = 0; for (i=0; i < count; i++) { if (src[i] == '\033') ansi = 1; // if we hit the width, back up if (!ansi && (line >= width) && src[i] != '\n' && src[i] != ' ') { // store i & len in case the word is too long old_i = i, old_len = len; // find the end of the last word while (i && src[i] != ' ' && src[i] != '\n') { i--; len--; } // word too long? restore i & len before splitting it if ((old_i-i+clen) >= width) { i = old_i; len = old_len; } // extra space? if (i && src[i-1] == ' ') len--; if (src[i] != ' ' && src[i] != '\n') { i--; if (len) len--; } // now append the newline and continuation sequence if (dest) dest[len] = '\n'; len++; if (dest) strncpy(dest+len, cseq, cseq_len); len += cseq_len; line = cseq_len; clen = cseq_len; continue; } if (dest) dest[len] = src[i]; len++; if (!ansi) line++; if (src[i] == '\n') line = 0; if (src[i] == 'm') ansi = 0; } if (dest && appData.debugMode) { fprintf(debugFP, "wrap(count:%d,width:%d,line:%d,len:%d,*lp:%d,src: ", count, width, line, len, *lp); show_bytes(debugFP, src, count); fprintf(debugFP, "\ndest: "); show_bytes(debugFP, dest, len); fprintf(debugFP, "\n"); } *lp = dest ? line : old_line; return len; } // [HGM] vari: routines for shelving variations Boolean modeRestore = FALSE; void PushInner (int firstMove, int lastMove) { int i, j, nrMoves = lastMove - firstMove; // push current tail of game on stack savedResult[storedGames] = gameInfo.result; savedDetails[storedGames] = gameInfo.resultDetails; gameInfo.resultDetails = NULL; savedFirst[storedGames] = firstMove; savedLast [storedGames] = lastMove; savedFramePtr[storedGames] = framePtr; framePtr -= nrMoves; // reserve space for the boards for(i=nrMoves; i>=1; i--) { // copy boards to stack, working downwards, in case of overlap CopyBoard(boards[framePtr+i], boards[firstMove+i]); for(j=0; j= MAX_VARIATIONS-2) return; // leave one for PV-walk PushInner(firstMove, lastMove); if(storedGames == 1) GreyRevert(FALSE); if(gameMode == PlayFromGameFile) gameMode = EditGame, modeRestore = TRUE; } void PopInner (Boolean annotate) { int i, j, nrMoves; char buf[8000], moveBuf[20]; ToNrEvent(savedFirst[storedGames-1]); // sets currentMove storedGames--; // do this after ToNrEvent, to make sure HistorySet will refresh entire game after PopInner returns nrMoves = savedLast[storedGames] - currentMove; if(annotate) { int cnt = 10; if(!WhiteOnMove(currentMove)) snprintf(buf, sizeof(buf)/sizeof(buf[0]),"(%d...", (currentMove+2)>>1); else safeStrCpy(buf, "(", sizeof(buf)/sizeof(buf[0])); for(i=currentMove; i>1, SavePart(parseList[i])); else snprintf(moveBuf, sizeof(moveBuf)/sizeof(moveBuf[0])," %s", SavePart(parseList[i])); strcat(buf, moveBuf); if(commentList[i]) { strcat(buf, " "); strcat(buf, commentList[i]); } if(!--cnt) { strcat(buf, "\n"); cnt = 10; } } strcat(buf, ")"); } for(i=1; i<=nrMoves; i++) { // copy last variation back CopyBoard(boards[currentMove+i], boards[framePtr+i]); for(j=0; j 0 && --level == 0 && p-text > index && end == NULL) end = p-1; } if(*p == wait) wait = NULLCHAR; // closing ]} found p++; } if(!start || !end) return; // no variation found, or syntax error in PGN: ignore click if(appData.debugMode) fprintf(debugFP, "at move %d load variation '%s'\n", currentMove, start); end[1] = NULLCHAR; // clip off comment beyond variation ToNrEvent(currentMove-1); PushTail(currentMove, forwardMostMove); // shelve main variation. This truncates game // kludge: use ParsePV() to append variation to game move = currentMove; ParsePV(start, TRUE, TRUE); forwardMostMove = endPV; endPV = -1; currentMove = move; // cleanup what ParsePV did ClearPremoveHighlights(); CommentPopDown(); ToNrEvent(currentMove+1); } void LoadTheme () { char *p, *q, buf[MSG_SIZ]; if(engineLine && engineLine[0]) { // a theme was selected from the listbox snprintf(buf, MSG_SIZ, "-theme %s", engineLine); ParseArgsFromString(buf); ActivateTheme(TRUE); // also redo colors return; } p = nickName; if(*p && !strchr(p, '"')) // theme name specified and well-formed; add settings to theme list { int len; q = appData.themeNames; snprintf(buf, MSG_SIZ, "\"%s\"", nickName); if(appData.useBitmaps) { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -ubt true -lbtf \"%s\" -dbtf \"%s\" -lbtm %d -dbtm %d", appData.liteBackTextureFile, appData.darkBackTextureFile, appData.liteBackTextureMode, appData.darkBackTextureMode ); } else { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -ubt false -lsc %s -dsc %s", Col2Text(2), // lightSquareColor Col2Text(3) ); // darkSquareColor } if(appData.useBorder) { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -ub true -border \"%s\"", appData.border); } else { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -ub false"); } if(appData.useFont) { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -upf true -pf \"%s\" -fptc \"%s\" -fpfcw %s -fpbcb %s", appData.renderPiecesWithFont, appData.fontToPieceTable, Col2Text(9), // appData.fontBackColorWhite Col2Text(10) ); // appData.fontForeColorBlack } else { snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -upf false -pid \"%s\"", appData.pieceDirectory); if(!appData.pieceDirectory[0]) snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -wpc %s -bpc %s", Col2Text(0), // whitePieceColor Col2Text(1) ); // blackPieceColor } snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -hsc %s -phc %s\n", Col2Text(4), // highlightSquareColor Col2Text(5) ); // premoveHighlightColor appData.themeNames = malloc(len = strlen(q) + strlen(buf) + 1); if(insert != q) insert[-1] = NULLCHAR; snprintf(appData.themeNames, len, "%s\n%s%s", q, buf, insert); if(q) free(q); } ActivateTheme(FALSE); } xboard-4.7.3/xboard.man0000644000175000001440000062355112262562277011724 00000000000000.\"Do not edit this file. It was created from ./xboard.texi .\"using texi2man version 1.01.tpm1 on Mon Jan 6 09:15:43 PST 2014 .\"If you want a typeset version, you will get better .\"results with the original file. .\" .TH xboard 6 "$Date: " "GNU" .SH NAME .PP xboard \- X graphical user interface for chess .SH SYNOPSIS .PP .B xboard [options] .br .B xboard -ics -icshost hostname [options] .br .B xboard -ncp [options] .br .B |pxboard .br .B cmail [options] .SH DESCRIPTION XBoard is a graphical chessboard that can serve as a user interface to chess engines (such as GNU Chess), the Internet Chess Servers, electronic mail correspondence chess, or your own collection of saved games. This manual documents version 4.7.3 of XBoard. .SH MAJOR MODES XBoard always runs in one of four major modes. You select the major mode from the command line when you start up XBoard. .TP .B xboard [options] As an interface to GNU Chess or another chess engine running on your machine, XBoard lets you play a game against the machine, set up arbitrary positions, force variations, watch a game between two chess engines, interactively analyze your stored games or set up and analyze arbitrary positions. (Note: Not all chess engines support analysis.) .TP .B xboard -ics -icshost hostname [options] As Internet Chess Server (ICS) interface, XBoard lets you play against other ICS users, observe games they are playing, or review games that have recently finished. Most of the ICS "wild" chess variants are supported, including bughouse. .TP .B xboard -ncp [options] XBoard can also be used simply as an electronic chessboard to play through games. It will read and write game files and allow you to play through variations manually. You can use it to browse games off the net or review games you have saved. These features are also available in the other modes. .TP .B |pxboard If you want to pipe games into XBoard, use the supplied shell script `pxboard'. For example, from the news reader `xrn', find a message with one or more games in it, click the Save button, and type `|pxboard' as the file name. .TP .B cmail [options] As an interface to electronic mail correspondence chess, XBoard works with the cmail program. See \fICMail\fR below for instructions. .PP .SH BASIC OPERATION To move a piece, you can drag it with the left mouse button, or you can click the left mouse button once on the piece, then once more on the destination square. In crazyhouse, bughouse or shogi you can drag and drop pieces to the board from the holdings squares displayed next to the board. Old behavior, where right-clicking a square brings up a menu where you can select what piece to drop on it can still be selected through the `Drop Menu' option. Only in Edit Position mode right and middle clicking a square is still used to put a piece on it, and the piece to drop is selected by sweeping the mouse vertically with the button held down. The default function of the right mouse button in other modes is to display the position the chess program thinks it will end up in. While moving the mouse vertically with this button pressed XBoard will step through the principal variation to show how this position will be reached. Lines of play displayed in the engine-output window, or PGN variations in the comment window can similarly be played out on the board, by right-clicking on them. Only in Analysis mode, when you walk along a PV, releasing the mouse button will forward the game upto that point, like you entered all previous PV moves. As the display of the PV in that case starts after the first move a simple right-click will play the move the engine indicates. In Analysis mode you can also make a move by grabbing the piece with a double-click of the left mouse button (or while keeping the Ctrl key pressed). In this case the move you enter will not be played, but will be excluded from the analysis of the current position. (Or included if it was already excluded; it is a toggle.) This only works for engines that support this feature. When connected to an ICS, it is possible to call up a graphical representation of players seeking a game in stead of the chess board, when the latter is not in use (i.e. when you are not playing or observing). Left-clicking the display area will switch between this 'seek graph' and the chess board. Hovering the mouse pointer over a dot will show the details of the seek ad in the message field above the board. Left-clicking the dot will challenge that player. Right-clicking a dot will 'push it to the back', to reveal any dots that were hidden behind it. Right-clicking off dots will refresh the graph. Most other XBoard commands are available from the menu bar. The most frequently used commands also have shortcut keys or on-screen buttons. These shortcut keystrokes are mostly non-printable characters. Typing a letter or digit while the board window has focus will bring up a type-in box with the typed letter already in it. You can use that to type a move in siuations where it is your turn to enter a move, type a move number to call up the position after that move in the display, or, in Edit Position mode, type a FEN. Some rarely used parameters can only be set through options on the command line used to invoke XBoard. XBoard uses a settings file, in which it can remember any changes to the settings that are made through menus or command-line options, so they will still apply when you restart XBoard for another session. The settings can be saved into this file automatically when XBoard exits, or on explicit request of the user. The default name for the settings file is /etc/xboard/xboard.conf, but in a standard install this file is only used as a master settings file that determines the system-wide default settings, and defers reading and writing of user settings to a user-specific file like ~/.xboardrc in the user's home directory. When XBoard is iconized, its graphical icon is a white knight if it is White's turn to move, a black knight if it is Black's turn. .SH MENUS, BUTTONS, AND KEYS .SS File Menu .TP .B New Game Resets XBoard and the chess engine to the beginning of a new chess game. The `Ctrl-N' key is a keyboard equivalent. In Internet Chess Server mode, clears the current state of XBoard, then resynchronizes with the ICS by sending a refresh command. If you want to stop playing, observing, or examining an ICS game, use an appropriate command from the Action menu, not `New Game'. See \fIAction Menu\fR. .TP .B New Shuffle Game Similar to `New Game', but allows you to specify a particular initial position (according to a standardized numbering system) in chess variants which use randomized opening positions (e.g. Chess960). You can also press the `Pick Fixed' button to let XBoard generate a random number for you. The thus selected opening position will then persistently be chosen on any following New Game command until you use this menu to select another. Selecting position number -1 (or pushing the `Randomize' button) will produce a newly randomized position on any new game. Using this menu item in variants that normally do not shuffle their opening position does cause these variants to become shuffle variants until you use the `New Shuffle Game' menu to explicitly switch the randomization off, or select a new variant. .TP .B New Variant Allows you to select a new chess variant in non-ICS mode. (In ICS play, the ICS is responsible for deciding which variant will be played, and XBoard adapts automatically.) The shifted `Alt+V' key is a keyboard equivalent. If you play with an engine, the engine must be able to play the selected variant, or the command will be ignored. XBoard supports all major variants, such as xiangqi, shogi, chess, chess960, Capablanca Chess, shatranj, crazyhouse, bughouse. But not every board size has built-in bitmaps for un-orthodox pieces! Only sizes bulky (72) and middling (49) have all pieces, while size petite (33) has most. These sizes would have to be set at startup through the `size' command-line option when you start up XBoard for such variants to be playable. You can overrule the default board format of the selected variant, (e.g. to play suicide chess on a 6 x 6 board), in this dialog, but normally you would not do that, and leave them at '-1', which means 'default'. .TP .B Load Game Plays a game from a record file. The `Ctrl-O' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the file contains more than one game, a second pop-up dialog displays a list of games (with information drawn from their PGN tags, if any), and you can select the one you want. Alternatively, you can load the Nth game in the file directly, by typing the number `N' after the file name, separated by a space. The game file parser will accept PGN (portable game notation), or in fact almost any file that contains moves in algebraic notation. Notation of the form `P@f7' is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. If the file includes a PGN position (FEN tag), or an old-style XBoard position diagram bracketed by `[--' and `--]' before the first move, the game starts from that position. Text enclosed in parentheses, square brackets, or curly braces is assumed to be commentary and is displayed in a pop-up window. Any other text in the file is ignored. PGN variations (enclosed in parentheses) also are treated as comments; however, if you rights-click them in the comment window, XBoard will shelve the current line, and load the the selected variation, so you can step through it. You can later revert to the previous line with the `Revert' command. This way you can walk quite complex varation trees with XBoard. The nonstandard PGN tag [Variant "varname"] functions similarly to the -variant command-line option (see below), allowing games in certain chess variants to be loaded. Note that it must appear before any FEN tag for XBoard to recognize variant FENs appropriately. There is also a heuristic to recognize chess variants from the Event tag, by looking for the strings that the Internet Chess Servers put there when saving variant ("wild") games. .TP .B Load Position Sets up a position from a position file. A pop-up dialog prompts you for the file name. The shifted `Ctrl-O' key is a keyboard equivalent. If the file contains more than one saved position, and you want to load the Nth one, type the number N after the file name, separated by a space. Position files must be in FEN (Forsythe-Edwards notation), or in the format that the Save Position command writes when oldSaveStyle is turned on. .TP .B Load Next Position Loads the next position from the last position file you loaded. The shifted `PgDn' key is a keyboard equivalent. .TP .B Load Previous Position Loads the previous position from the last position file you loaded. The shifted `PgUp' key is a keyboard equivalent. Not available if the last position was loaded from a pipe. .TP .B Save Game Appends a record of the current game to a file. The `Ctrl-S' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the game did not begin with the standard starting position, the game file includes the starting position used. Games are saved in the PGN (portable game notation) format, unless the oldSaveStyle option is true, in which case they are saved in an older format that is specific to XBoard. Both formats are human-readable, and both can be read back by the `Load Game' command. Notation of the form `P@f7' is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. .TP .B Save Position Appends a diagram of the current position to a file. The shifted `Ctrl+S' key is a keyboard equivalent. A pop-up dialog prompts you for the file name. Positions are saved in FEN (Forsythe-Edwards notation) format unless the `oldSaveStyle' option is true, in which case they are saved in an older, human-readable format that is specific to XBoard. Both formats can be read back by the `Load Position' command. .TP .B Save Games as Book Creates an opening book from the currently loaded game file. The book will be saved on the file specified in the `Common Engine' options dialog. The value of `Book Depth' specified in that same dialog will be used to determine how many moves of each game will be added to the internal book buffer. This command can take a long time to process, and the size of the buffer is currently limited. At the end the buffer will be saved as a Polyglot book, but the buffer will ot be cleared, so that you can continue adding games from other game files. .TP .B Mail Move .PD 0 .TP .B Reload CMail Message .PD See \fICMail\fR. .TP .B Exit Exits from XBoard. The `Ctrl-Q' key is a keyboard equivalent. .PP .SS Edit Menu .TP .B Copy Game Copies a record of the current game to an internal clipboard in PGN format and sets the X selection to the game text. The `Ctrl-C' key is a keyboard equivalent. The game can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Game command. .TP .B Copy Position Copies the current position to an internal clipboard in FEN format and sets the X selection to the position text. The shifted `Ctrl-C' key is a keyboard equivalent. The position can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Position command. .TP .B Copy Game List Copies the current game list to the clipboard, and sets the X selection to this text. A format of comma-separated double-quoted strings is used, including all tags, so it can be easily imported into spread-sheet programs. .TP .B Paste Game Interprets the current X selection as a game record and loads it, as with Load Game. The `Ctrl-V' key is a keyboard equivalent. .TP .B Paste Position Interprets the current X selection as a FEN position and loads it, as with Load Position. The shifted `Ctrl-V' key is a keyboard equivalent. .TP .B Edit Game Allows you to make moves for both Black and White, and to change moves after backing up with the `Backward' command. The clocks do not run. The `Ctrl-E' key is a keyboard equivalent. In chess engine mode, the chess engine continues to check moves for legality but does not participate in the game. You can bring the chess engine into the game by selecting `Machine White', `Machine Black', or `Two Machines'. In ICS mode, the moves are not sent to the ICS: `Edit Game' takes XBoard out of ICS Client mode and lets you edit games locally. If you want to edit games on ICS in a way that other ICS users can see, use the ICS `examine' command or start an ICS match against yourself. .TP .B Edit Position Lets you set up an arbitrary board position. The shifted `Ctrl-E' key is a keyboard equivalent. Use mouse button 1 to drag pieces to new squares, or to delete a piece by dragging it off the board or dragging an empty square on top of it. To drop a new piece on a square, press mouse button 2 or 3 over the square. This puts a white or black pawn in the square, respectively, but you can change that to any other piece type by dragging the mouse down before you release the button. You will then see the piece on the originally clicked square cycle through the available pieces (including those of opposite color), and can release the button when you see the piece you want. To alter the side to move, you can click the clock (the words White and Black above the board) of the side you want to give the move to. To clear the board you can click the clock of the side that alread has the move (which is highlighted in black). The old behavior with a piece menu can still be configured with the aid of the `pieceMenu' option. Selecting `Edit Position' causes XBoard to discard all remembered moves in the current game. In ICS mode, changes made to the position by `Edit Position' are not sent to the ICS: `Edit Position' takes XBoard out of `ICS Client' mode and lets you edit positions locally. If you want to edit positions on ICS in a way that other ICS users can see, use the ICS `examine' command, or start an ICS match against yourself. (See also the ICS Client topic above.) .TP .B Edit Tags Lets you edit the PGN (portable game notation) tags for the current game. After editing, the tags must still conform to the PGN tag syntax: .nf ::= ::= [ ] ::= ::= .fi See the PGN Standard for full details. Here is an example: .nf [Event "Portoroz Interzonal"] [Site "Portoroz, Yugoslavia"] [Date "1958.08.16"] [Round "8"] [White "Robert J. Fischer"] [Black "Bent Larsen"] [Result "1-0"] .fi Any characters that do not match this syntax are silently ignored. Note that the PGN standard requires all games to have at least the seven tags shown above. Any that you omit will be filled in by XBoard with `?' (unknown value), or `-' (inapplicable value). .TP .B Edit Comment Adds or modifies a comment on the current position. Comments are saved by `Save Game' and are displayed by `Load Game', PGN variations will also be printed in this window, and can be promoted to main line by right-clicking them. `Forward', and `Backward'. .TP .B Edit Book Pops up a window listing the moves available in the GUI book (specified in the `Common Engine Settings' dialog) from the currently displayed position, together with their weights and (optionally in braces) learn info. You can then edit this list, and the new list will be stored back into the book when you press OK. Note that the listed percentages are neither used, nor updated when you change the weights; they are just there as an optical aid. .TP .B Revert .PD 0 .TP .B Annotate .PD If you are examining an ICS game and Pause mode is off, Revert issues the ICS command `revert'. In local mode, when you were editing or analyzing a game, and the `-variations' command-line option is switched on, you can start a new variation by holding the Shift key down while entering a move not at the end of the game. Variations can also become the currently displayed line by clicking a PGN variation displayed in the Comment window. This can be applied recursively, so that you can analyze variations on variations; each time you create a new variation by entering an alternative move with Shift pressed, or select a new one from the Comment window, the current variation will be shelved. `Revert' allows you to return to the most recently shelved variation. The difference between `Revert' and `Annotate' is that with the latter, the variation you are now abandoning will be added as a comment (in PGN variation syntax, i.e. between parentheses) to the original move where you deviated, for later recalling. The `Home' key is a keyboard equivalent to `Revert'. .TP .B Truncate Game Discards all remembered moves of the game beyond the current position. Puts XBoard into `Edit Game' mode if it was not there already. The `End' key is a keyboard equivalent. .TP .B Backward Steps backward through a series of remembered moves. The `[<]' button and the `Alt+LeftArrow' key are equivalents, as is turning the mouse wheel towards you. In addition, pressing the Control key steps back one move, and releasing it steps forward again. In most modes, `Backward' only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on an ICS, or loading a game. If you select `Backward' in any of these situations, you will not be allowed to make a different move. Use `Retract Move' or `Edit Game' if you want to change past moves. If you are examining an ICS game, the behavior of `Backward' depends on whether XBoard is in Pause mode. If Pause mode is off, `Backward' issues the ICS backward command, which backs up everyone's view of the game and allows you to make a different move. If Pause mode is on, `Backward' only backs up your local view. .TP .B Forward Steps forward through a series of remembered moves (undoing the effect of `Backward') or forward through a game file. The `[>]' button and the `Alt+RightArrow' key are equivalents, as is turning the mouse wheel away from you. If you are examining an ICS game, the behavior of Forward depends on whether XBoard is in Pause mode. If Pause mode is off, `Forward' issues the ICS forward command, which moves everyone's view of the game forward along the current line. If Pause mode is on, `Forward' only moves your local view forward, and it will not go past the position that the game was in when you paused. .TP .B Back to Start Jumps backward to the first remembered position in the game. The `[<<]' button and the `Alt+Home' key are equivalents. In most modes, Back to Start only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a local chess engine, playing or observing a game on a chess server, or loading a game. If you select `Back to Start' in any of these situations, you will not be allowed to make different moves. Use `Retract Move' or `Edit Game' if you want to change past moves; or use Reset to start a new game. If you are examining an ICS game, the behavior of @samp{Back to Start} depends on whether XBoard is in Pause mode. If Pause mode is off, `Back to Start' issues the ICS `backward 999999' command, which backs up everyone's view of the game to the start and allows you to make different moves. If Pause mode is on, @samp{Back to Start} only backs up your local view. .TP .B Forward to End Jumps forward to the last remembered position in the game. The `[>>]' button and the `Alt+End' key are equivalents. If you are examining an ICS game, the behavior of @samp{Forward to End} depends on whether XBoard is in Pause mode. If Pause mode is off, `Forward to End' issues the ICS `forward 999999' command, which moves everyone's view of the game forward to the end of the current line. If Pause mode is on, `Forward to End' only moves your local view forward, and it will not go past the position that the game was in when you paused. .PP .SS View Menu .TP .B Flip View Inverts your view of the chess board for the duration of the current game. Starting a new game returns the board to normal. The `F2' key is a keyboard equivalent. .TP .B Show Engine Output Shows or hides a window in which the thinking output of any loaded engines is displayed. The shifted `Alt+O' key is a keyboard equivalent. XBoard will display lines of thinking output of the same depth ordered by score, (highest score on top), rather than in the order the engine produced them. Usually this amounts to the same, as a normal engine search will only find new PV (and emit it as thinking output) when it searches a move with a higher score than the previous variation. But when the engine is in multi-variation mode this needs not always be true, and it is more convenient for someone analyzing games to see the moves sorted by score. The order in which the engine found them is only of interest to the engine author, and can still be deduced from the time or node count printed with the line. Right-clicking a line in this window, and then moving the mouse vertically with the right button kept down, will make XBoard play through the PV listed there. The use of the board window as 'variation board' will normally end when you release the right button, or when the opponent plays a move. But beware: in Analysis mode, moves thus played out will be added to the game. The Engine-Output pane for each engine will contain a header displaying the multi-PV status and a list of excluded moves in Analysis mode, which are also responsive to right-clicking. .TP .B Show Move History Shows or hides a list of moves of the current game. The shifted `Alt+H' key is a keyboard equivalent. This list allows you to move the display to any earlier position in the game by clicking on the corresponding move. .TP .B Show Evaluation Graph Shows or hides a window which displays a graph of how the engine score(s) evolved as a function of the move number. The shifted `Alt+E' key is a keyboard equivalent. Clicking on the graph will bring the corresponding position in the board display. .TP .B Show Game List Shows or hides the list of games generated by the last `Load Game' command. The shifted `Alt+G' key is a keyboard equivalent. .TP .B Tags Pops up a window which shows the PGN (portable game notation) tags for the current game. For now this is a duplicate of the `Edit Tags' item in the `Edit' menu. .TP .B Comments Pops up a window which shows any comments to or variations on the current move. For now this is a duplicate of the `Edit Comment' item in the `Edit' menu. .TP .B ICS Input Box If this option is set in ICS mode, XBoard creates an extra window that you can use for typing in ICS commands. The input box is especially useful if you want to type in something long or do some editing on your input, because output from ICS doesn't get mixed in with your typing as it would in the main terminal window. .TP .B Open Chat Window This menu item opens a window in which you can conduct upto 5 chats with other ICS users (or channels). To use the window, write the name of your chat partner, the channel number, or the words 'shouts', 'whispers', 'cshouts' in the upper field (closing with ). Everything you type in the lowest field will then automatically be sent to the mentioned party, while everything that party sends to you will appear in the central text box, rather than appear in the ICS console. The row of buttons allow you to choose between chat; to start a new chat, just select an empty button, and complete the `Chat partner' field. .TP .B Board Summons a dialog where you can customize the look of the chess board. Here you can specify the directory from which piece images should be taken, when you don't want to use the built-in piece images (see `pieceImageDirectory' option), external images to be used for the board squares (`liteBackTextureFile' and `darkBackTextureFile' options), and square and piece colors for the default pieces. .TP .B Game List Tags a duplicate of the Game List dialog in the Options menu. .PP .SS Mode Menu .TP .B Machine White Tells the chess engine to play White. The `Ctrl-W' key is a keyboard equivalent. .TP .B Machine Black Tells the chess engine to play Black. The `Ctrl-B' key is a keyboard equivalent. .TP .B Two Machines Plays a game between two chess engines. The `Ctrl-T' key is a keyboard equivalent. .TP .B Analysis Mode XBoard tells the chess engine to start analyzing the current game/position and shows you the analysis as you move pieces around. The `Ctrl-A' key is a keyboard equivalent. Note: Some chess engines do not support Analysis mode. To set up a position to analyze, you do the following: 1. Select Edit Position from the Mode Menu 2. Set up the position. Use the middle and right buttons to bring up the white and black piece menus. 3. When you are finished, click on either the Black or White clock to tell XBoard which side moves first. 4. Select Analysis Mode from the Mode Menu to start the analysis. You can now play legal moves to create follow-up positions for the engine to analyze, while the moves will be remembered as a stored game, and then step backward through this game to take the moves back. Note that you can also click on the clocks to set the opposite side to move (adding a so-called `null move' to the game). You can also tell the engine to exclude some moves from analysis. (Engines that do not support the exclude-moves feature will ignore this, however.) The general way to do this is to play the move you want to exclude starting with a double click on the piece. When you use drag-drop moving, the piece you grab with a double click will also remain on its square, to show you that you are not really making the move, but just forbid it from the current position. Playing a thus excluded move a second time will include it again. Excluded moves will be listed as text in a header line in the Engine Output window, and you can also re-include them by right-clicking them there. This header line will also contain the words 'best' and 'tail'; right-clicking those will exclude the currently best move, or all moves not explicitly listed in the header line. Once you leave the current position all memory of excluded moves will be lost when you return there. Selecting this menu item while already in `Analysis Mode' will toggle the participation of the second engine in the analysis. The output of this engine will then be shown in the lower pane of the Engine Output window. The analysis function can also be used when observing games on an ICS with an engine loaded (zippy mode); the engine then will analyse the positions as they occur in the observed game. .TP .B Analyze Game This option subjects the currently loaded game to automatic analysis by the loaded engine. The `Ctrl-G' key is a keyboard equivalent. XBoard will start auto-playing the game from the currently displayed position, while the engine is analyzing the current position. The game will be annotated with the results of these analyses. In particlar, the score and depth will be added as a comment, and the PV will be added as a variation. Normally the analysis would stop after reaching the end of the game. But when a game is loaded from a multi-game file while `Analyze Game' was already switched on, the analysis will continue with the next game in the file until the end of the file is reached (or you switch to another mode). The time the engine spends on analyzing each move can be controlled through the command-line option `-timeDelay', which can also be set from the `Load Game Options' menu dialog. Note: Some chess engines do not support Analysis mode. .TP .B Edit Game Duplicate of the item in the Edit menu. Note that `Edit Game' is the idle mode of XBoard, and can be used to get you out of other modes. E.g. to stop analyzing, stop a game between two engines or stop editing a position. .TP .B Edit Position Duplicate of the item in the Edit menu. .TP .B Training Training mode lets you interactively guess the moves of a game for one of the players. You guess the next move of the game by playing the move on the board. If the move played matches the next move of the game, the move is accepted and the opponent's response is auto-played. If the move played is incorrect, an error message is displayed. You can select this mode only while loading a game (that is, after selecting `Load Game' from the File menu). While XBoard is in `Training' mode, the navigation buttons are disabled. .TP .B ICS Client This is the normal mode when XBoard is connected to a chess server. If you have moved into Edit Game or Edit Position mode, you can select this option to get out. To use xboard in ICS mode, run it in the foreground with the -ics option, and use the terminal you started it from to type commands and receive text responses from the chess server. See \fIChess Servers\fR below for more information. XBoard activates some special position/game editing features when you use the `examine' or `bsetup' commands on ICS and you have `ICS Client' selected on the Mode menu. First, you can issue the ICS position-editing commands with the mouse. Move pieces by dragging with mouse button 1. To drop a new piece on a square, press mouse button 2 or 3 over the square. This brings up a menu of white pieces (button 2) or black pieces (button 3). Additional menu choices let you empty the square or clear the board. Click on the White or Black clock to set the side to play. You cannot set the side to play or drag pieces to arbitrary squares while examining on ICC, but you can do so in `bsetup' mode on FICS. In addition, the menu commands `Forward', `Backward', `Pause', and `Stop Examining' have special functions in this mode; see below. .TP .B Machine Match Starts a match between two chess programs, with a number of games and other parameters set through the `Match Options' menu dialog. When a match is already running, selecting this item will make XBoard drop out of match mode after the current game finishes. .TP .B Pause Pauses updates to the board, and if you are playing against a chess engine, also pauses your clock. To continue, select `Pause' again, and the display will automatically update to the latest position. The `P' button and keyboard `Pause' key are equivalents. If you select Pause when you are playing against a chess engine and it is not your move, the chess engine's clock will continue to run and it will eventually make a move, at which point both clocks will stop. Since board updates are paused, however, you will not see the move until you exit from Pause mode (or select Forward). This behavior is meant to simulate adjournment with a sealed move. If you select Pause while you are observing or examining a game on a chess server, you can step backward and forward in the current history of the examined game without affecting the other observers and examiners, and without having your display jump forward to the latest position each time a move is made. Select Pause again to reconnect yourself to the current state of the game on ICS. If you select `Pause' while you are loading a game, the game stops loading. You can load more moves manually by selecting `Forward', or resume automatic loading by selecting `Pause' again. .PP .SS Action Menu .TP .B Accept Accepts a pending match offer. The `F3' key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. .TP .B Decline Declines a pending offer (match, draw, adjourn, etc.). The `F4' key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. .TP .B Call Flag Calls your opponent's flag, claiming a win on time, or claiming a draw if you are both out of time. The `F5' key is a keyboard equivalent. You can also call your opponent's flag by clicking on his clock. .TP .B Draw Offers a draw to your opponent, accepts a pending draw offer from your opponent, or claims a draw by repetition or the 50-move rule, as appropriate. The `F6' key is a keyboard equivalent. .TP .B Adjourn Asks your opponent to agree to adjourning the current game, or agrees to a pending adjournment offer from your opponent. The `F7' key is a keyboard equivalent. .TP .B Abort Asks your opponent to agree to aborting the current game, or agrees to a pending abort offer from your opponent. The `F8' key is a keyboard equivalent. An aborted game ends immediately without affecting either player's rating. .TP .B Resign Resigns the game to your opponent. The `F9' key is a keyboard equivalent. .TP .B Stop Observing Ends your participation in observing a game, by issuing the ICS observe command with no arguments. ICS mode only. The `F10' key is a keyboard equivalent. .TP .B Stop Examining Ends your participation in examining a game, by issuing the ICS unexamine command. ICS mode only. The `F11' key is a keyboard equivalent. .TP .B Upload to Examine Create an examined game of the proper variant on the ICS, and send the game there that is currenty loaded in XBoard (e.g. through pasting or loading from file). You must be connected to an ICS for this to work. .TP .B Adjudicate to White .PD 0 .TP .B Adjudicate to Black .PD .PD 0 .TP .B Adjudicate Draw .PD Terminate an ongoing game in Two-Machines mode (including match mode), with as result a win for white, for black, or a draw, respectively. The PGN file of the game will accompany the result string by the comment "user adjudication". .PP .SS Engine Menu .TP .B Load Engine Pops up a dialog where you can select or specify an engine to be loaded. You will always have to indicate whether you want to load the engine as first or second engine, through the ‘Load menitioned engine as’ drop-down list at the bottom of the dialog. You can even replace engines during a game, without disturbing that game. (Beware that after loading an engine, XBoard will always be in Edit Game mode, so you will have to tell the new engine what to do before it does anything!) When you select an already installed engine from the ‘Select Engine from List’ drop-down list, all other fields of the dialog will be ignored. In other cases, you have to specify the engine executable, possible arguments on the engine command line (if the engine docs say the engine needs any), and the directory where the engine should look for its files (if this cannot be deduced automatically from the specification of the engine executable). You will also have to specify (with the aid of checkboxes) if the engine is UCI. If ‘Add this engine to the list’ is ticked (which it is by default), the engine will be added to the list of installed engines in your settings file, (provided you save the settings!), so that next time you can select it from the drop-down list. You can also specify a ‘nickname’, under which the engine will then appear in that drop-down list, and even choose to use that nickname for it in PGN files for engine-engine games. The info you supply with the checkboxes whether the engine should use GUI book, or (for variant engines) automatically switch to the current variant when loaded, will also be included in the list. For obsolete XBoard engines, which would normally take a long delay to load because XBoard is waiting for a response they will not give, you can tick ‘WB protocol v1’ to speed up the loading process. .TP .B Engine #N Settings Pop up a menu dialog to alter the settings specific to the applicable engine. (The second engine is only accessible once it has been used in Two-Machines mode.) For each parameter the engine allows to be set, a control element will appear in this dialog that can be used to alter the value. Depending on the type of parameter (text string, number, multiple choice, on/off switch, instantaneous signal) the appropriate control will appear, with a description next to it. XBoard has no idea what these values mean; it just passes them on to the engine. How this dialog looks is completely determined by the engine, and XBoard just passes it on to the user. Many engines do not have any parameters that can be set by the user, and in that case the dialog will be empty (except for the OK and cancel buttons). UCI engines usually have many parameters. (But these are only visible with a sufficiently modern version of the Polyglot adapter needed to run UCI engines, e.g. Polyglot 1.4.55b.) For native XBoard engines this is less common. .TP .B Hint Displays a move hint from the chess engine. .TP .B Book Displays a list of possible moves from the chess engine's opening book. The exact format depends on what chess engine you are using. With GNU Chess 4, the first column gives moves, the second column gives one possible response for each move, and the third column shows the number of lines in the book that include the move from the first column. If you select this option and nothing happens, the chess engine is out of its book or does not support this feature. .TP .B Move Now Forces the chess engine to move immediately. Chess engine mode only. The `Ctrl-M' key is a keyboard equivalent. .TP .B Retract Move Retracts your last move. In chess engine mode, you can do this only after the chess engine has replied to your move; if the chess engine is still thinking, use `Move Now' first. In ICS mode, `Retract Move' issues the command `takeback 1' or `takeback 2' depending on whether it is your opponent's move or yours. The `Ctrl-X' key is a keyboard equivalent. .TP .B Recently Used Engines At the bottom of the engine menu there can be a list of names of engines that you recently loaded through the Load Engine menu dialog in previous sessions. Clicking on such a name will load that engine as first engine, so you won't have to search for it in your list of installed engines, if that is very long. The maximum number of displayed engine names is set by the `recentEngines'command-line option. .PP .SS Options Menu The following items to set option values appear in the dialog summoned by the general Options menu item. .TP .B Absolute Analysis Scores Controls if scores on the Engine Output window during analysis will be printed from the white or the side-to-move point-of-view. .TP .B Almost Always Queen If this option is on, 7th-rank pawns automatically change into Queens when you pick them up, and when you drag them to the promotion square and release them there, they will promote to that. But when you drag such a pawn backwards first, its identity will start to cycle through the other available pieces. This will continue until you start to move it forward; at which point the identity of the piece will be fixed, so that you can safely put it down on the promotion square. If this option is off, what happens depends on the option `alwaysPromoteToQueen', which would force promotion to Queen when true. Otherwise XBoard would bring up a dialog box whenever you move a pawn to the last rank, asking what piece you want to promote to. .TP .B Animate Dragging If Animate Dragging is on, while you are dragging a piece with the mouse, an image of the piece follows the mouse cursor. If Animate Dragging is off, there is no visual feedback while you are dragging a piece, but if Animate Moving is on, the move will be animated when it is complete. .TP .B Animate Moving If Animate Moving is on, all piece moves are animated. An image of the piece is shown moving from the old square to the new square when the move is completed (unless the move was already animated by Animate Dragging). If Animate Moving is off, a moved piece instantly disappears from its old square and reappears on its new square when the move is complete. The shifted `Ctrl-A' key is a keyboard equivalent. .TP .B Auto Flag If this option is on and one player runs out of time before the other, XBoard will automatically call his flag, claiming a win on time. The shifted `Ctrl-F' key is a keyboard equivalent. In ICS mode, Auto Flag will only call your opponent's flag, not yours, and the ICS may award you a draw instead of a win if you have insufficient mating material. In local chess engine mode, XBoard may call either player's flag and will not take material into account (?). .TP .B Auto Flip View If the Auto Flip View option is on when you start a game, the board will be automatically oriented so that your pawns move from the bottom of the window towards the top. If you are playing a game on an ICS, the board is always oriented at the start of the game so that your pawns move from the bottom of the window towards the top. Otherwise, the starting orientation is determined by the `flipView' command line option; if it is false (the default), White's pawns move from bottom to top at the start of each game; if it is true, Black's pawns move from bottom to top. See \fIUser interface options\fR. .TP .B Blindfold If this option is on, XBoard displays the board as usual but does not display pieces or move highlights. You can still move in the usual way (with the mouse or by typing moves in ICS mode), even though the pieces are invisible. .TP .B Drop Menu Controls if right-clicking the board in crazyhouse / bughouse will pop up a menu to drop a piece on the clicked square (old, deprecated behavior) or allow you to step through an engine PV (new, recommended behavior). .TP .B Enable Variation Trees If this option is on, playing a move in Edit Game or Analyze mode while keeping the Shift key pressed will start a new variation. You can then recall the previous line through the `Revert' menu item. When off, playing a move will truncate the game and append the move irreversibly. .TP .B Hide Thinking If this option is off, the chess engine's notion of the score and best line of play from the current position is displayed as it is thinking. The score indicates how many pawns ahead (or if negative, behind) the chess engine thinks it is. In matches between two machines, the score is prefixed by `W' or `B' to indicate whether it is showing White's thinking or Black's, and only the thinking of the engine that is on move is shown. The shifted `Ctrl-H' key is a keyboard equivalent. .TP .B Highlight Last Move If Highlight Last Move is on, after a move is made, the starting and ending squares remain highlighted. In addition, after you use Backward or Back to Start, the starting and ending squares of the last move to be unmade are highlighted. .TP .B Highlight with Arrow Causes the highlighting described in Highlight Last Move to be done by drawing an arrow between the highlighted squares, so that it is visible even when the width of the grid lines is set to zero. .TP .B Move Sound Enables the sounding of an audible signal when the computer performs a move. For the selection of the sound, see `Sound Options'. If you turn on this option when using XBoard with the Internet Chess Server, you will probably want to give the `set bell 0' command to the ICS, since otherwise the ICS will ring the terminal bell after every move (not just yours). (The `.icsrc' file is a good place for this; see \fIICS options\fR.) .TP .B One-Click Moving If this option is on, XBoard does not wait for you to click both the from- and the to-square, or drag the piece, but performs a move as soon as it is uniqely specified. This applies to clicking an own piece that only has a single legal move, clicking an empty square or opponent piece where only one of your pieces can move (or capture) to. Furthermore, a double-click on a piece that can only make a single capture will cause that capture to be made. Promoting a Pawn by clicking its to-square will suppress the promotion popup or other methods for selecting an under-promotion, and make it promote to Queen. .TP .B Periodic Updates If this option is off (or if you are using a chess engine that does not support periodic updates), the analysis window will only be updated when the analysis changes. If this option is on, the Analysis Window will be updated every two seconds. .TP .B Play Move(s) of Clicked PV If this option is on, right-clicking a PV in the Engine Output window during Analyze mode will cause the first move of that PV to be played. You could also play more than one (or no) PV move by moving the mouse to engage in the PV walk such a right-click will start, to seek out another position along the PV where you want to continue the analysis, before releasing the mouse button. .TP .B Ponder Next Move If this option is off, the chess engine will think only when it is on move. If the option is on, the engine will also think while waiting for you to make your move. The shifted `Ctrl-P' key is a keyboard equivalent. .TP .B Popup Exit Message If this option is on, when XBoard wants to display a message just before exiting, it brings up a modal dialog box and waits for you to click OK before exiting. If the option is off, XBoard prints the message to standard error (the terminal) and exits immediately. .TP .B Popup Move Errors If this option is off, when you make an error in moving (such as attempting an illegal move or moving the wrong color piece), the error message is displayed in the message area. If the option is on, move errors are displayed in small pop-up windows like other errors. You can dismiss an error pop-up either by clicking its OK button or by clicking anywhere on the board, including down-clicking to start a move. .TP .B Scores in Move List If this option is on, XBoard will display the depth and score of engine moves in the Move List, in the format of a PGN comment. .TP .B Show Coords If this option is on, XBoard displays algebraic coordinates along the board's left and bottom edges. .TP .B Show Target Squares If this option is on, all squares a piece that is 'picked up' with the mouse can legally move to are highighted with a fat colored dot in the highlightColor (non-captures) or premoveHighlightColor (captures). Legality testing must be on for XBoard to know how the piece moves. .TP .B Test Legality If this option is on, XBoard tests whether the moves you try to make with the mouse are legal and refuses to let you make an illegal move. The shifted `Ctrl-L' key is a keyboard equivalent. Moves loaded from a file with `Load Game' are also checked. If the option is off, all moves are accepted, but if a local chess engine or the ICS is active, they will still reject illegal moves. Turning off this option is useful if you are playing a chess variant with rules that XBoard does not understand. (Bughouse, suicide, and wild variants where the king may castle after starting on the d file are generally supported with Test Legality on.) .TP .B Flash Moves .PD 0 .TP .B Flash Rate .PD If this option is non-zero, whenever a move is completed, the moved piece flashes the specified number of times. The flash-rate setting determines how rapidly this flashing occurs. .TP .B Animation Speed Determines the duration (in msec) of an animation step, when `Animate Moving' is swiched on. .TP .B Zoom factor in Evaluation Graph Sets the valueof the `evalZoom' option, indicating the factor by which the score interval (-1,1) should be blown up on the vertical axis of the Evaluation Graph. .PP Pops up a sub-menu where you can set the time-control parameters interactively. Allows you to select classical or incremental time controls, set the moves per session, session duration, and time increment. Also allows specification of time-odds factors for one or both engines. If an engine is given a time-odds factor N, all time quota it gets, be it at the beginning of a session or through the time increment or fixed time per move, will be divided by N. The shifted `Alt+T' key is a keyboard equivalent. Pops up a sub-menu where you can set some engine parameters common to most engines, such as hash-table size, tablebase cache size, maximum number of processors that SMP engines can use, and where to find the Polyglot adapter needed to run UCI engines under XBoard. The feature that allows setting of these parameters on engines is new since XBoard 4.3.15, so not many XBoard/WinBoard engines respond to it yet, but UCI engines should. It is also possible to specify a GUI opening book here, i.e. an opening book that XBoard consults for any position a playing engine gets in. It then forces the engine to play the book move, rather than to think up its own, if that position is found in the book. The book can switched on and off independently for either engine. The way book moves are chosen can be influenced through the settings of book depth and variety. After both sides have played more moves than the specified depth, the book will no longer be consulted. When the variety is set to 50, moves will be played with the probability specified in the book. When set to 0, only the move(s) with the highest probability will be played. When set to 100, all listed moves will be played with equal pobability. Other settings interpolate between that. The shifted `Alt+U' key is a keyboard equivalent. Pops up a sub-menu where you can enable or disable various adjudications that XBoard can perform in engine-engine games. The shifted `Alt+J' key is a keyboard equivalent. You can instruct XBoard to detect and terminate the game on checkmate or stalemate, even if the engines would not do so, to verify engine result claims (forfeiting engines that make false claims), rather than naively following the engine, to declare draw on positions which can never be won for lack of mating material, (e.g. KBK), or which are impossible to win unless the opponent seeks its own demise (e.g. KBKN). For these adjudications to work, `Test Legality' should be switched on. It is also possible to instruct XBoard to enforce a 50-move or 3-fold-repeat rule and automatically declare draw (after a user-adjustable number of moves or repeats) even if the engines are prepared to go on. It is also possible to have XBoard declare draw on games that seem to drag on forever, or adjudicate a loss if both engines agree (for 3 consecutive moves) that one of them is behind more than a user-adjustable score threshold. For the latter adjudication to work, XBoard should be able to properly understand the engine's scores. To facilitate the latter, you can inform xboard here if the engines report scores from the viewpoint of white, or from that of their own color. The following options occur in a dialog summoned by the ICS Options menu item. .TP .B Auto Kibitz Setting this option when playing with or aginst a chess program on an ICS will cause the last line of thinking output of the engine before its move to be sent to the ICS in a kibitz command. In addition, any kibitz message received through the ICS from an opponent chess program will be diverted to the engine-output window, (and suppressed in the console), where you can play through its PV by right-clicking it. .TP .B Auto Comment If this option is on, any remarks made on ICS while you are observing or playing a game are recorded as a comment on the current move. This includes remarks made with the ICS commands `say', `tell', `whisper', and `kibitz'. Limitation: remarks that you type yourself are not recognized; XBoard scans only the output from ICS, not the input you type to it. .TP .B Auto Observe If this option is on and you add a player to your `gnotify' list on ICS, XBoard will automatically observe all of that player's games, unless you are doing something else (such as observing or playing a game of your own) when one starts. The games are displayed from the point of view of the player on your gnotify list; that is, his pawns move from the bottom of the window towards the top. Exceptions: If both players in a game are on your gnotify list, if your ICS `highlight' variable is set to 0, or if the ICS you are using does not properly support observing from Black's point of view, you will see the game from White's point of view. .TP .B Auto Raise Board If this option is on, whenever a new game begins, the chessboard window is deiconized (if necessary) and raised to the top of the stack of windows. .TP .B Auto Save If this option is true, at the end of every game XBoard prompts you for a file name and appends a record of the game to the file you specify. Disabled if the `saveGameFile' command-line option is set, as in that case all games are saved to the specified file. See \fILoad and Save options\fR. .TP .B Background Observe Setting this option will make XBoard suppress display of any boards from observed games while you are playing. In stead the last such board will be remembered, and shown to you when you right-click the board. This allows you to peek at your bughouse partner's game when you want, without disturbing your own game too much. .TP .B Dual Board Setting this option in combination with `Background Observe' will display boards of observed games while you are playing on a second board next to that of your own game. .TP .B Get Move List If this option is on, whenever XBoard receives the first board of a new ICS game (or a different game from the one it is currently displaying), it retrieves the list of past moves from the ICS. You can then review the moves with the `Forward' and `Backward' commands or save them with `Save Game'. You might want to turn off this option if you are observing several blitz games at once, to keep from wasting time and network bandwidth fetching the move lists over and over. When you turn this option on from the menu, XBoard immediately fetches the move list of the current game (if any). .TP .B Quiet Play If this option is on, XBoard will automatically issue an ICS `set shout 0' command whenever you start a game and a `set shout 1' command whenever you finish one. Thus, you will not be distracted by shouts from other ICS users while playing. .TP .B Seek Graph Setting this option will cause XBoard to display an graph of currently active seek ads when you left-click the board while idle and logged on to an ICS. .TP .B Auto-Refresh Seek Graph In combination with the `Seek Graph' option this will cause automatic update of the seek graph while it is up. This only works on FICS and ICC, and requires a lot of bandwidth on a busy server. .TP .B Premove .PD 0 .TP .B Premove White .PD .PD 0 .TP .B Premove Black .PD .PD 0 .TP .B First White Move .PD .PD 0 .TP .B First Black Move .PD If this option is on while playing a game on an ICS, you can register your next planned move before it is your turn. Move the piece with the mouse in the ordinary way, and the starting and ending squares will be highlighted with a special color (red by default). When it is your turn, if your registered move is legal, XBoard will send it to ICS immediately; if not, it will be ignored and you can make a different move. If you change your mind about your premove, either make a different move, or double-click on any piece to cancel the move entirely. You can also enter premoves for the first white and black moves of the game. .TP .B ICS Alarm .PD 0 .TP .B ICS Alarm Time .PD When this option is on, an alarm sound is played when your clock counts down to the icsAlarmTime in an ICS game. (By default, the time is 5 seconds, but you can pecify other values with the Alarm Time spin control.) For games with time controls that include an increment, the alarm will sound each time the clock counts down to the icsAlarmTime. By default, the alarm sound is the terminal bell, but on some systems you can change it to a sound file using the soundIcsAlarm option; see below. .TP .B Colorize Messages Ticking this options causes various types of ICS messages do be displayed with different foreground or background colors in the console. The colors can be individually selected for each type, through the accompanying text edits. .PP Summons a dialog where you can set options important for playing automatic matches between two chess programs (e.g. by using the `Machine Match' menu item in the `Mode' menu). .TP .B Tournament file To run a tournament, XBoard needs a file to record its progress, so it can resume the tourney when it is interrupted. When you want to conduct anything more complex than a simple two-player match with the currently loaded engines, (i.e. when you select a list of participants), you must not leave this field blank. When you enter the name of an existing tournament file, XBoard will ignore all other input specified in the dialog, and will take them from that tournament file. This resumes an interrupted tournament, or adds another XBoard agent playing games for it to those that are already doing so. Specifying a not-yet-existing file will cause XBoard to create it, according to the tournament parameters specified in the rest of the dialog, before it starts the tournament on ‘OK’. Provided that you specify participants; without participants no tournament file will be made, but other entered values (e.g. for the file with opening positions) will take effect. Default: configured by the `defaultTourneyName' option. .TP .B Sync after round .PD 0 .TP .B Sync after cycle .PD The sync options, when on, will cause WinBoard to refrain from starting games of the next round or cycle before all games of the previous round or cycle are finished. This guarantees correct ordering in the games file, even when multiple XBoard instances are concurrently playing games for the same tourney. Default: sync after cycle, but not after round. .TP .B Select Engine .PD 0 .TP .B Tourney participants .PD With the Select Engine drop-down list you can pick an engine from your list of installed engines in the settings file, to be added to the tournament. The engines selected so far will be listed in the ‘Tourney participants’ memo. The latter is a normal text edit, so you can use normal text-editing functions to delete engines you selected by accident, or change their order. Do not type names yourself there, because names that do not exactly match one of the names from the drop-down list will lead to undefined behavior. .TP .B Tourney type Here you can specify the type of tournament you want. XBoard’s intrinsic tournament manager support round-robins (type = 0), where each participant plays every other participant, and (multi-)gauntlets, where one (or a few) so-called ‘gauntlet engines’ play an independent set of opponents. In the latter case, you specify the number of gauntlet engines. E.g. if you specified 10 engines, and tourney type = 2, the first 2 engines each play the remaining 8. A value of -1 instructs XBoard to play Swiss; for this to work an external pairing engine must be specified through the `pairingEngine' option. Each Swiss round will be considered a tourney cycle in that case. Default:0 .TP .B Number of tourney cycles .PD 0 .TP .B Default number of Games .PD You can specify tourneys where every two opponents play each other multiple times. Such multiple games can be played in a row, as specified by the ‘number of games per pairing’, or by repeating the entire tournament schedule a number of times (specified by the ‘number of tourney cycles’). The total number of times two engine meet will be the product of these two. Default is 1 cycle; the number of games per pairing is the same as the default number of match games, stored in your settings file through the `defaultMatchGames' option. .TP .B Save Tourney Games File where the tournament games are saved (duplicate of the item in the `Save Game Options'). .TP .B Game File with Opening Lines .PD 0 .TP .B File with Start Positions .PD .PD 0 .TP .B Game Number .PD .PD 0 .TP .B Position Number .PD .PD 0 .TP .B Rewind Index after .PD These items optionally specify the file with move sequences or board positions the tourney games should start from. The corresponding numbers specify the number of the game or position in the file. Here a value -1 means automatic stepping through all games on the file, -2 automatic stepping every two games. The Rewind-Index parameter causes a stepping index to reset to one after reaching a specified value. A setting of -2 for the game number will also be effective in a tournament without specifying a game file, but playing from the GUI book instead. In this case the first (odd) games will randomly select from the book, but the second (even) games will select the same moves from the book as the previous game. (Note this leads to the same opening only if both engines use the GUI book!) Default: No game or position file will be used. The default index if such a file is used is 1. .TP .B Disable own engine bools be default Setting this option reverses the default situation for use of the GUI opening book in tournaments from what it normally is, namely not using it. So unless the engine is installed with an option to explicitly specify it should not use the GUI book (i.e. `-firstHasOwnBookUCI true'), it will be made to use the GUI book. .TP .B Replace Engine .PD 0 .TP .B Upgrade Engine .PD With these two buttons you can alter the participants of an already running tournament. After opening the Match Options dialog on an XBoard that is playing for the tourney, you will see all the tourney parameters in the dialog fields. You can then replace the name of one engine by that of another by editing the `participants' field. (But preserve the order of the others!) Pressing the button after that will cause the substitution. With the `Upgrade Engine' button the substitution will only affect future games. With `Replace Engine' all games the substituted engine has already played will be invalidated, and they will be replayed with the substitute engine. In this latter case the engine must not be playing when you do this, but otherwise there is no need to pause the tournament play for making a substitution. .TP .B Clone Tourney Pressing this button after you have specified an existing tournament file will copy the contents of the latter to the dialog, and then puts the originally proposed name for the tourney file back. You can then run a tourney with the same parameters (possibly after changing the proposed name of the tourney file for the new tourney) by pressing 'OK'. .PP Summons a dialog where you can set the `autoDisplayComment' and `autoDisplayTags' options, (which control popups when viewing loaded games), and specify the rate at which loaded games are auto-played, in seconds per move (which can be a fractional number, like 1.6). You can also set search criteria for determining which games will be displayed in the Game List for a multi-game file, and thus be eligible for loading: .TP .B Elo of strongest player .PD 0 .TP .B Elo of weakest player .PD .PD 0 .TP .B year .PD These numeric fields set thresholds (lower limits) on the Elo rating of the mentioned player, or the date the game was played. Defaults: 0 .TP .B Search mode This setting determines which positions in a game will be considered a match to the position currently displayed in the board window when you press the `find position' button in the Game List. You can search for an exact match, a position that has all shown material in the same place, but might contain additional material, a position that has all Pawns in the same place, but can have the shown material anywhere, a position that can have all shown material anywhere, or a position that has material between certain limits anywhere. For the latter you have to place the material that must be present in the four lowest ranks of the board, and optional additional material in the four highest ranks of the board. You can request the optional material to be balanced. The `narrow' button is similar in fuction to the `find position' button, but only searches in the already selected games, rather than the complete game file, and can thus be used to refine a search based on multiple criteria. .TP .B number of consecutive positions When you are searching by material, rather than for an exact match, this parameter indicates forhowmany consecutive game positions the same amount of material must be on the board before it is considered a match. .TP .B Also match reversed colors .PD 0 .TP .B Also match left-right flipped position .PD When looking for matching positions rather than by material, these settings determine whether mirror images (in case of a vertical flip in combination with color reversal) will be also considered a match. The left-right flipping is only useful after all castling rights have expired (or in Xiangqi). .PP Summons a dialog where you can specify the files on which XBoard should automatically save any played or entered games, (the `saveGameFile' option), or the final position of such games (the `savePositionfile' option). You can also select 'auto-save' without a file name, in which case XBoard will prompt the user for a file name after each game. In ICS mode you can limit the auto-saving to your own games (i.e. suppress saving of observed games). You can also set the default value for the PGN Event tag that will be used for each new game you start. Various options for the format of the game can be specified as well, such as whether scores and depths of engine games should be saved as comments, and if a tag with info about the score with which the engine came out of book should be included. For Chess, always set the format to PGN, rather than "old save stye"! Pops up a dialog where you can select the PGN tags that should appear on the lines in the game list, and their order. Summons a dialog where you can specify the sounds that should accompany various events that can occur XBoard. Most events are only relevant to ICS play, but the move sound is an important exception. For each event listed in the dialog, you can select a standard sound from a menu. You can also select a user-supplied sound file, by typing its name into the designated text-edit field first, and then selecting "Above WAV File" from the menu for the event. A dummy event has been provided for trying out the sounds with the "play" button next to it. The directory with standard sounds, and the external program for playing the sounds can be specified too, but normally you would not touch these once XBoard is properly installed. When a move sound other than 'None' is selected, XBoard alerts you by playing that sound after each of your opponent's moves (or after every move if you are observing a game on the Internet Chess Server). The sound is not played after moves you make or moves read from a saved game file. Selecting this menu item causes the current XBoard settings to be written to the settings file, so they will also apply in future sessions. Note that some settings are 'volatile', and are not saved, because XBoard considers it too unlikely that you want those to apply next time. In particular this applies to the Chess program names, and all options giving information on those Chess programs (such as their directory, if they have their own opening book, if they are UCI or native XBoard), or the variant you are playing. Such options would still be understood when they appear in the settings file in case they were put there with the aid of a text editor, but they would disappear from the file as soon as you save the settings. Note that XBoard no longer pays attention to options values specified in the .Xresources file. (Specifying key bindings there will still work, though.) To alter the default of volatile options, you can use the following method: Rename your ~/.xboardrc settings file (to ~/.yboardrc, say), and create a new file ~/.xboardrc, which only contains the options .nf -settingsFile ~/.yboardrc -saveSettingsFile ~/.yboardrc .fi This will cause your settings to be saved on ~/.yboardrc in the future, so that ~/.xboardrc is no longer overwritten. You can then safely specify volatile options in ~/.xboardrc, either before or after the settingsFile options. Note that when you specify persistent options after the settingsFile options in ~/.xboardrc, you will essentially turn them into volatile options with the specified value as default, because that value will overrule the value loaded from the settings file (being read later). Setting this option has no immediate effect, but causes the settings to be saved when you quit XBoard. What happens then is otherwise identical to what happens when you use select "Save Settings Now", see there. .SS Help Menu .TP .B Info XBoard Displays the XBoard documentation in info format. For this feature to work, you must have the GNU info program installed on your system, and the file `xboard.info' must either be present in the current working directory, or have been installed by the `make install' command when you built XBoard. .TP .B Man XBoard Displays the XBoard documentation in man page format. The `F1' key is a keyboard equivalent. For this feature to work, the file `xboard.6' must have been installed by the `make install' command when you built XBoard, and the directory it was placed in must be on the search path for your system's `man' command. .TP .B About XBoard Shows the current XBoard version number. .PP .SS Other Shortcut Keys .TP .B Show Last Move By hitting `Enter' the last move will be re-animated. .TP .B Load Next Game Loads the next game from the last game record file you loaded. The `Alt+PgDn' key triggers this action. .TP .B Load Previous Game Loads the previous game from the last game record file you loaded. The `Alt+PgUp' key triggers this action. Not available if the last game was loaded from a pipe. .TP .B Reload Same Game Reloads the last game you loaded. Not available if the last game was loaded from a pipe. Currently no keystroke is assigned to this ReloadGameProc. .TP .B Reload Same Position Reloads the last position you loaded. Not available if the last position was loaded from a pipe. Currently no keystroke is assigned to this ReloadPositionProc. .PP You can add or remove shortcut keys using the X resources `form.translations'. Here is an example of what would go in your `.Xresources' file: .nf XBoard*form.translations: \\ Shift?: AboutGameProc() \\n\\ y: AcceptProc() \\n\\ n: DeclineProc() \\n\\ i: NothingProc() .fi Binding a key to `NothingProc' makes it do nothing, thus removing it as a shortcut key. The XBoard commands that can be bound to keys are: .nf AbortProc, AboutGameProc, AboutProc, AcceptProc, AdjournProc, AlwaysQueenProc, AnalysisModeProc, AnalyzeFileProc, AnimateDraggingProc, AnimateMovingProc, AutobsProc, AutoflagProc, AutoflipProc, AutoraiseProc, AutosaveProc, BackwardProc, BlindfoldProc, BookProc, CallFlagProc, CopyGameProc, CopyPositionProc, DebugProc, DeclineProc, DrawProc, EditCommentProc, EditGameProc, EditPositionProc, EditTagsProc, EnterKeyProc, FlashMovesProc, FlipViewProc, ForwardProc, GetMoveListProc, HighlightLastMoveProc, HintProc, IcsAlarmProc, IcsClientProc, IcsInputBoxProc, InfoProc, LoadGameProc, LoadNextGameProc, LoadNextPositionProc, LoadPositionProc, LoadPrevGameProc, LoadPrevPositionProc, LoadSelectedProc, MachineBlackProc, MachineWhiteProc, MailMoveProc, ManProc, MoveNowProc, MoveSoundProc, NothingProc, OldSaveStyleProc, PasteGameProc, PastePositionProc, PauseProc, PeriodicUpdatesProc, PonderNextMoveProc, PopupExitMessageProc, PopupMoveErrorsProc, PremoveProc, QuietPlayProc, QuitProc, ReloadCmailMsgProc, ReloadGameProc, ReloadPositionProc, RematchProc, ResetProc, ResignProc, RetractMoveProc, RevertProc, SaveGameProc, SavePositionProc, ShowCoordsProc, ShowGameListProc, ShowThinkingProc, StopExaminingProc, StopObservingProc, TestLegalityProc, ToEndProc, ToStartProc, TrainingProc, TruncateGameProc, and TwoMachinesProc. .fi .SH OPTIONS This section documents the command-line options to XBoard. You can set these options in two ways: by typing them on the shell command line you use to start XBoard, or by editing the settings file (usually ~/.xboardrc) to alter the value of the setting that was saved there. Some of the options cannot be changed while XBoard is running; others set the initial state of items that can be changed with the \fIOptions\fR menu. Most of the options have both a long name and a short name. To turn a boolean option on or off from the command line, either give its long name followed by the value true or false (`-longOptionName true'), or give just the short name to turn the option on (`-opt'), or the short name preceded by `x' to turn the option off (`-xopt'). For options that take strings or numbers as values, you can use the long or short option names interchangeably. .SS Chess Engine Options .TP .B -tc or -timeControl minutes[:seconds] Each player begins with his clock set to the `timeControl' period. Default: 5 minutes. The additional options `movesPerSession' and `timeIncrement' are mutually exclusive. .TP .B -mps or -movesPerSession moves When both players have made `movesPerSession' moves, a new `timeControl' period is added to both clocks. Default: 40 moves. .TP .B -inc or -timeIncrement seconds If this option is specified, `movesPerSession' is ignored. Instead, after each player's move, `timeIncrement' seconds are added to his clock. Use `-inc 0' if you want to require the entire game to be played in one `timeControl' period, with no increment. Default: -1, which specifies `movesPerSession' mode. .TP .B -clock/-xclock or -clockMode true/false Determines whether or not to display the chess clocks. If clockMode is false, the clocks are not shown, but the side that is to play next is still highlighted. Also, unless `searchTime' is set, the chess engine still keeps track of the clock time and uses it to determine how fast to make its moves. .TP .B -st or -searchTime minutes[:seconds] Tells the chess engine to spend at most the given amount of time searching for each of its moves. Without this option, the chess engine chooses its search time based on the number of moves and amount of time remaining until the next time control. Setting this option also sets clockMode to false. .TP .B -depth or -searchDepth number Tells the chess engine to look ahead at most the given number of moves when searching for a move to make. Without this option, the chess engine chooses its search depth based on the number of moves and amount of time remaining until the next time control. With the option, the engine will cut off its search early if it reaches the specified depth. .TP .B -firstNPS number .PD 0 .TP .B -secondNPS number .PD Tells the chess engine to use an internal time standard based on its node count, rather then wall-clock time, to make its timing decisions. The time in virtual seconds should be obtained by dividing the node count through the given number, like the number was a rate in nodes per second. Xboard will manage the clocks in accordance with this, relying on the number of nodes reported by the engine in its thinking output. If the given number equals zero, it can obviously not be used to convert nodes to seconds, and the time reported by the engine is used to decrement the XBoard clock in stead. The engine is supposed to report in CPU time it uses, rather than wall-clock time, in this mode. This option can provide fairer conditions for engine-engine matches on heavily loaded machines, or with very fast games (where the wall clock is too inaccurate). `showThinking' must be on for this option to work. Default: -1 (off). Not many engines might support this yet! .TP .B -firstTimeOdds factor .PD 0 .TP .B -secondTimeOdds factor .PD Reduces the time given to the mentioned engine by the given factor. If pondering is off, the effect is indistinguishable from what would happen if the engine was running on an n-times slower machine. Default: 1. .TP .B -timeOddsMode mode This option determines how the case is handled where both engines have a time-odds handicap. If mode=1, the engine that gets the most time will always get the nominal time, as specified by the time-control options, and its opponent's time is renormalized accordingly. If mode=0, both play with reduced time. Default: 0. .TP .B -hideThinkingFromHuman true/false Controls the Hide Thinking option. See \fIOptions Menu\fR. Default: true. (Replaces the Show-Thinking option of older xboard versions.) .TP .B -thinking/-xthinking or -showThinking true/false Forces the engine to send thinking output to xboard. Used to be the only way to control if thinking output was displayed in older xboard versions, but as the thinking output in xboard 4.3 is also used for several other purposes (adjudication, storing in PGN file) the display of it is now controlled by the new option Hide Thinking. See \fIOptions Menu\fR. Default: false. (But if xboard needs the thinking output for some purpose, it makes the engine send it despite the setting of this option.) .TP .B -ponder/-xponder or -ponderNextMove true/false Sets the Ponder Next Move menu option. See \fIOptions Menu\fR. Default: true. .TP .B -smpCores number Specifies the maximum number of CPUs an SMP engine is allowed to use. Only works for engines that support the XBoard/WinBoard-protocol cores feature. .TP .B -mg or -matchGames n Automatically runs an n-game match between two chess engines, with alternating colors. If the `loadGameFile' or `loadPositionFile' option is set, XBoard starts each game with the given opening moves or the given position; otherwise, the games start with the standard initial chess position. If the `saveGameFile' option is set, a move record for the match is appended to the specified file. If the `savePositionFile' option is set, the final position reached in each game of the match is appended to the specified file. When the match is over, XBoard displays the match score and exits. Default: 0 (do not run a match). .TP .B -mm/-xmm or -matchMode true/false Setting `matchMode' to true is equivalent to setting `matchGames' to 1. .TP .B -sameColorGames n Automatically runs an n-game match between two chess engines, without alternating colors. Otherwise the same applies as for the `-matchGames' option, over which it takes precedence if both are specified. (See there.) Default: 0 (do not run a match). .TP .B -fcp or -firstChessProgram program Name of first chess engine. Default: `Fairy-Max'. .TP .B -scp or -secondChessProgram program Name of second chess engine, if needed. A second chess engine is started only in Two Machines (match) mode. Default: `Fairy-Max'. .TP .B -fe or -firstEngine nickname This is an alternative to the `fcp' option for specifying the first engine, for engines that were already configured (using the `Load Engine' dialog) in XBoard's settings file. It will not only retrieve the real name of the engine, but also all options configured with it. (E.g. if it is UCI, whether it should use book.) .TP .B -se or -secondEngine nickname As `fe', but for the second engine. .TP .B -fb/-xfb or -firstPlaysBlack true/false In games between two chess engines, firstChessProgram normally plays white. If this option is true, firstChessProgram plays black. In a multi-game match, this option affects the colors only for the first game; they still alternate in subsequent games. .TP .B -fh or -firstHost host .PD 0 .TP .B -sh or -secondHost host .PD Hosts on which the chess engines are to run. The default for each is `localhost'. If you specify another host, XBoard uses `rsh' to run the chess engine there. (You can substitute a different remote shell program for rsh using the `remoteShell' option described below.) .TP .B -fd or -firstDirectory dir .PD 0 .TP .B -sd or -secondDirectory dir .PD Working directories in which the chess engines are to be run. The default is "", which means to run the chess engine in the same working directory as XBoard itself. (See the CHESSDIR environment variable.) This option is effective only when the chess engine is being run on the local host; it does not work if the engine is run remotely using the -fh or -sh option. .TP .B -initString string or -firstInitString .PD 0 .TP .B -secondInitString string .PD The string that is sent to initialize each chess engine for a new game. Default: .nf new random .fi Setting this option from the command line is tricky, because you must type in real newline characters, including one at the very end. In most shells you can do this by entering a `\\' character followed by a newline. Using the character sequence `\\n' in the string should work too, though. If you change this option, don't remove the `new' command; it is required by all chess engines to start a new game. You can remove the `random' command if you like; including it causes GNU Chess 4 to randomize its move selection slightly so that it doesn't play the same moves in every game. Even without `random', GNU Chess 4 randomizes its choice of moves from its opening book. Many other chess engines ignore this command entirely and always (or never) randomize. You can also try adding other commands to the initString; see the documentation of the chess engine you are using for details. .TP .B -firstComputerString string .PD 0 .TP .B -secondComputerString string .PD The string that is sent to the chess engine if its opponent is another computer chess engine. The default is `computer\\n'. Probably the only useful alternative is the empty string (`'), which keeps the engine from knowing that it is playing another computer. .TP .B -reuse/-xreuse or -reuseFirst true/false .PD 0 .TP .B -reuse2/-xreuse2 or -reuseSecond true/false .PD If the option is false, XBoard kills off the chess engine after every game and starts it again for the next game. If the option is true (the default), XBoard starts the chess engine only once and uses it repeatedly to play multiple games. Some old chess engines may not work properly when reuse is turned on, but otherwise games will start faster if it is left on. .TP .B -firstProtocolVersion version-number .PD 0 .TP .B -secondProtocolVersion version-number .PD This option specifies which version of the chess engine communication protocol to use. By default, version-number is 2. In version 1, the "protover" command is not sent to the engine; since version 1 is a subset of version 2, nothing else changes. Other values for version-number are not supported. .TP .B -firstScoreAbs true/false .PD 0 .TP .B -secondScoreAbs true/false .PD If this option is set, the score reported by the engine is taken to be that in favor of white, even when the engine plays black. Important when XBoard uses the score for adjudications, or in PGN reporting. .TP .B -niceEngines priority This option allows you to lower the priority of the engine processes, so that the generally insatiable hunger for CPU time of chess engines does not interfere so much with smooth operation of XBoard (or the rest of your system). Negative values could increase the engine priority, which is not recommended. .TP .B -firstOptions string .PD 0 .TP .B -secondOptions string .PD The given string is a comma-separated list of (option name=option value) pairs, like the following example: "style=Karpov,blunder rate=0". If an option announced by the engine at startup through the feature commands of the XBoard/WinBoard protocol matches one of the option names (i.e. "style" or "blunder rate"), it would be set to the given value (i.e. "Karpov" or 0) through a corresponding option command to the engine. This provided that the type of the value (text or numeric) matches as well. .TP .B -firstNeedsNoncompliantFEN string .PD 0 .TP .B -secondNeedsNoncompliantFEN string .PD The castling rights and e.p. fields of the FEN sent to the mentioned engine with the setboard command will be replaced by the given string. This can for instance be used to run engines that do not understand Chess960 FENs in variant fischerandom, to make them at least understand the opening position, through setting the string to "KQkq -". (Note you also have to give the e.p. field!) Other possible applications are to provide work-arounds for engines that want to see castling and e.p. fields in variants that do not have castling or e.p. (shatranj, courier, xiangqi, shogi) so that XBoard would normally omit them (string = "- -"), or to add variant-specific fields that are not yet supported by XBoard (e.g. to indicate the number of checks in 3check). .TP .B -shuffleOpenings Forces shuffling of the opening setup in variants that normally have a fixed initial position. Shufflings are symmetric for black and white, and exempt King and Rooks in variants with normal castling. Remains in force until a new variant is selected. .PP .SS UCI + WB Engine Settings .TP .B -fUCI or -firstIsUCI true/false .PD 0 .TP .B -sUCI or -secondIsUCI true/false .PD Indicates if the mentioned engine executable file is an UCI engine, and should be run with the aid of the Polyglot adapter rather than directly. Xboard will then pass the other UCI options and engine name to Polyglot on its command line, according to the option `adapterCommand'. .TP .B -fUCCI .PD 0 .TP .B -sUCCI .PD .PD 0 .TP .B -fUSI .PD .PD 0 .TP .B -sUSI .PD Options similar to `fUCI' and `sUCI', except that they use the indicated engine with the protocol adapter specified in the `uxiAdapter' option. This can then be configured for running an UCCI or USI adapter, as the need arises. .TP .B -adapterCommand string The string conatins the command that should be issued by XBoard to start an engine that is accompanied by the `fUCI' option. Any identifier following a percent sign in the command (e.g. %fcp) will be considered the name of an XBoard option, and be replaced by the value of that option at the time the engine is started. For starting the second engine, any leading "f" or "first" in the option name will first be replaced by "s" or "second", before finding its value. Default: 'polyglot -noini -ec "%fcp" -ed "%fd"' .TP .B -uxiAdapter string Similar to `adapterCommand', but used for engines accompanied by the `fUCCI' or `fUSI' option, so you can configure XBoard to be ready to handle more than one flavor of non-native protocols. Default: "" .TP .B -polyglotDir filename Gives the name of the directory in which the Polyglot adapter for UCI engines resides. Default: "". .TP .B -usePolyglotBook true/false Specifies if the Polyglot book should be used as GUI book. .TP .B -polyglotBook filename Gives the filename of the opening book. The book is only used when the `usePolyglotBook' option is set to true, and the option `firstHasOwnBookUCI' or `secondHasOwnBookUCI' applying to the engine is set to false. The engine will be kept in force mode as long as the current position is in book, and XBoard will select the book moves for it. Default: "". .TP .B -fNoOwnBookUCI or -firstXBook or -firstHasOwnBookUCI true/false .PD 0 .TP .B -sNoOwnBookUCI or -secondXBook or -secondHasOwnBookUCI true/false .PD Indicates if the mentioned engine has its own opening book it should play from, rather than using the external book through XBoard. Default: depends on setting of the option `discourageOwnBooks'. .TP .B -discourageOwnBooks true/false When set, newly loaded engines will be assumed to use the GUI book, unless they explicitly specify differently. Otherwise they will be assumed to not use the GUI book, unless the specify differently (e.g. with `firstXBook'). Default: false. .TP .B -bookDepth n Limits the use of the GUI book to the first n moves of each side. Default: 12. .TP .B -bookVariation n A value n from 0 to 100 tunes the choice of moves from the GUI books from totally random to best-only. Default: 50 .TP .B -mcBookMode When this volatile option is specified, the probing algorithm of the GUI book is altered to always select the move that is most under-represented based on its performance. When all moves are played in approximately the right proportion, a book miss will be reported, to give the engine opportunity to explore a new move. In addition score of the moves will be kept track of during the session in a book buffer. By playing an match in this mode, a book will be built from scratch. The only output are the saved games, which can be converted to an actual book later, with the `Save Games as Book' command. This command can also be used to pre-fill the book buffer before adding new games based on the probing algorithm. .TP .B -fn string or -firstPgnName string .PD 0 .TP .B -sn string or -secondPgnName string .PD Indicates the name that should be used for the engine in PGN tags of engine-engine games. Intended to allow you to install verions of the same engine with different settings, and still distinguish them. Default: "". .TP .B -defaultHashSize n Sets the size of the hash table to n MegaBytes. Together with the EGTB cache size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 64. .TP .B -defaultCacheSizeEGTB n Sets the size of the EGTB cache to n MegaBytes. Together with the hash-table size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 4. .TP .B -defaultPathEGTB filename Gives the name of the directory where the end-game tablebases are installed, for UCI engines. Default: "/usr/local/share/egtb". .TP .B -egtFormats string Specifies which end-game tables are installed on the computer, and where. The argument is a comma-separated list of format specifications, each specification consisting of a format name, a colon, and a directory path name, e.g. "nalimov:/usr/local/share/egtb". If the name part matches that of a format that the engine requests through a feature command, xboard will relay the path name for this format to the engine through an egtpath command. One egtpath command for each matching format will be sent. Popular formats are "nalimov" DTM tablebases and "scorpio" bitbases. Default: "". .TP .B -firstChessProgramNames={names} This option lets you customize the drop-down list of chess engine names that appears in the `Load Engine' and `Match Options' dialog. It consists of a list of strings, one per line. When an engine is loaded, the corresponding line is prefixed with "-fcp ", and processed like it appeared on the command line. That means that apart from the engine command, it can contain any list of XBoard options you want to use with this engine. (Commonly used options here are -fd, -firstXBook, -fUCI, -variant.) The value of this option is gradually built as you load new engines through the `Load Engine' menu dialog, with `Add to list' ticked. To change it, edit your settings file with a plain text editor. .PP .SS Tournament options .TP .B -defaultMatchGames n Sets the number of games that will be used for a match between two engines started from the menu to n. Also used as games per pairing in other tournament formats. Default: 10. .TP .B -matchPause n Specifies the duration of the pause between two games of a match or tournament between engines as n milliseconds. Especially engines that do not support ping need this option, to prevent that the move they are thinking on when an opponent unexpectedly resigns will be counted for the next game, (leading to illegal moves there). Default: 10000. .TP .B -tf filename or -tourneyFile filename Specifies the name of the tournament file used in match mode to conduct a multi-player tournament. This file is a special settings file, which stores the description of the tournament (including progress info), through normal options (e.g. for time control, load and save files), and through some special-purpose options listed below. .TP .B -tt number or -tourneyType number Specifies the type of tourney: 0 = round-robin, N>0 = (multi-)gauntlet with N gauntlet engines, -1 = Swiss through external pairing engine. Volatile option, but stored in tourney file. .TP .B -cy number or -tourneyCycles number Specifies the number of cycles in a tourney. Volatile option, but stored in tourney file. .TP .B -participants list The list is a multi-line text string that specifies engines occurring in the `firstChesProgramNames' list in the settings file by their (implied or explicitly given) nicknames, one engine per line. The mentioned engines will play in the tourney. Volatile option, but stored in tourney file. .TP .B -results string The string of +=- characters lists the result of all played games in a toruney. Games currently playing are listed as *, while a space indicates a game that is not yet played or playing . Volatile option, but stored in tourney file. .TP .B -defaultTourneyName string Specifies the name of the tournament file XBoard should propose when the `Match Options' dialog is opened. Any %y, %M, %d, %h, %m, %s in the string are replaced by the current year, month, day of the month, hours, minutes, seconds of the current time, respectively, as two-digit number. A %Y would be replaced by the year as 4-digit number. Default: empty string. .TP .B -pairingEngine filename Specifies the external program to be used to pair the participants in Swiss tourneys. XBoard communicates with this engine in the same way as it communicates with Chess engines. The only commands sent to the pairing engine are “results N string”, (where N is the number of participants, and string the results so far in the format of the results option), and “pairing N”, (where N is the number of the tourney game). To the latter the pairing engine should answer with “A-B”, where A and B are participant numbers (in the range 1-N). (There should be no reply to the results command.) Default: empty string. .TP .B -afterGame string .PD 0 .TP .B -afterTourney string .PD When non-empty, the given string will be executed as a system command after each tournament game, orafterthe tourney completes, respectively. This can be used, for example, to autmatically run a cross-table generator on the PGN file where games are saved, to update the tourney standings. Default: "" .TP .B -syncAfterRound true/false .PD 0 .TP .B -syncAfterCycle true/false .PD Controls whether different instances of XBoard concurrently running the same tournament will wait for each other. Defaults: sync after cycle, but not after round. .TP .B -seedBase number Used to store the seed of the pseudo-random-number generator in the tourneyFile, so that separate instances of XBoard working on the same tourney can take coherent 'random' decisions, such as picking an opening for a given game number. .PP .SS ICS options .TP .B -ics/-xics or -internetChessServerMode true/false Connect with an Internet Chess Server to play chess against its other users, observe games they are playing, or review games that have recently finished. Default: false. .TP .B -icshost or -internetChessServerHost host The Internet host name or address of the chess server to connect to when in ICS mode. Default: `chessclub.com'. Another popular chess server to try is `freechess.org'. If your site doesn't have a working Internet name server, try specifying the host address in numeric form. You may also need to specify the numeric address when using the icshelper option with timestamp or timeseal (see below). .TP .B -icsport or -internetChessServerPort port-number The port number to use when connecting to a chess server in ICS mode. Default: 5000. .TP .B -icshelper or -internetChessServerHelper prog-name An external helper program used to communicate with the chess server. You would set it to "timestamp" for ICC (chessclub.com) or "timeseal" for FICS (freechess.org), after obtaining the correct version of timestamp or timeseal for your computer. See "help timestamp" on ICC and "help timeseal" on FICS. This option is shorthand for `-useTelnet -telnetProgram program'. .TP .B -telnet/-xtelnet or -useTelnet true/false This option is poorly named; it should be called useHelper. If set to true, it instructs XBoard to run an external program to communicate with the Internet Chess Server. The program to use is given by the telnetProgram option. If the option is false (the default), XBoard opens a TCP socket and uses its own internal implementation of the telnet protocol to communicate with the ICS. See \fIFirewalls\fR. .TP .B -telnetProgram prog-name This option is poorly named; it should be called helperProgram. It gives the name of the telnet program to be used with the `gateway' and `useTelnet' options. The default is `telnet'. The telnet program is invoked with the value of `internetChessServerHost' as its first argument and the value of `internetChessServerPort' as its second argument. See \fIFirewalls\fR. .TP .B -gateway host-name If this option is set to a host name, XBoard communicates with the Internet Chess Server by using `rsh' to run the `telnetProgram' on the given host, instead of using its own internal implementation of the telnet protocol. You can substitute a different remote shell program for `rsh' using the `remoteShell' option described below. See \fIFirewalls\fR. .TP .B -internetChessServerCommPort or -icscomm dev-name If this option is set, XBoard communicates with the ICS through the given character I/O device instead of opening a TCP connection. Use this option if your system does not have any kind of Internet connection itself (not even a SLIP or PPP connection), but you do have dial-up access (or a hardwired terminal line) to an Internet service provider from which you can telnet to the ICS. The support for this option in XBoard is minimal. You need to set all communication parameters and tty modes before you enter XBoard. Use a script something like this: .nf stty raw -echo 9600 > /dev/tty00 xboard -ics -icscomm /dev/tty00 .fi Here replace `/dev/tty00' with the name of the device that your modem is connected to. You might have to add several more options to these stty commands. See the man pages for `stty' and `tty' if you run into problems. Also, on many systems stty works on its standard input instead of standard output, so you have to use `<' instead of `>'. If you are using linux, try starting with the script below. Change it as necessary for your installation. .nf #!/bin/sh -f # configure modem and fire up XBoard # configure modem ( stty 2400 ; stty raw ; stty hupcl ; stty -clocal stty ignbrk ; stty ignpar ; stty ixon ; stty ixoff stty -iexten ; stty -echo ) < /dev/modem xboard -ics -icscomm /dev/modem .fi After you start XBoard in this way, type whatever commands are necessary to dial out to your Internet provider and log in. Then telnet to ICS, using a command like `telnet chessclub.com 5000'. Important: See the paragraph below about extra echoes, in \fILimitations\fR. .TP .B -icslogon or -internetChessServerLogonScript file-name Whenever XBoard connects to the Internet Chess Server, if it finds a file with the name given in this option, it feeds the file's contents to the ICS as commands. The default file name is `.icsrc'. Usually the first two lines of the file should be your ICS user name and password. The file can be either in $CHESSDIR, in XBoard's working directory if CHESSDIR is not set, or in your home directory. .TP .B -msLoginDelay delay If you experience trouble logging on to an ICS when using the `-icslogon' option, inserting some delay between characters of the logon script may help. This option adds `delay' milliseconds of delay between characters. Good values to try are 100 and 250. .TP .B -icsinput/-xicsinput or -internetChessServerInputBox true/false Sets the ICS Input Box menu option. See \fIMode Menu\fR. Default: false. .TP .B -autocomm/-xautocomm or -autoComment true/false Sets the Auto Comment menu option. See \fIOptions Menu\fR. Default: false. .TP .B -autoflag/-xautoflag or -autoCallFlag true/false Sets the Auto Flag menu option. See \fIOptions Menu\fR. Default: false. .TP .B -autobs/-xautobs or -autoObserve true/false Sets the Auto Observe menu option. See \fIOptions Menu\fR. Default: false. .TP .B -autoKibitz Enables kibitzing of the engines last thinking output (depth, score, time, speed, PV) before it moved to the ICS, in zippy mode. The option `showThinking' must be switched on for this option to work. Also diverts similar kibitz information of an opponent engine that is playing you through the ICS to the engine-output window, as if the engine was playing locally. .TP .B -seekGraph true/false or -sg Enables displaying of the seek graph by left-clicking the board when you are logged on to an ICS and currently idle. The seek graph show all players currently seeking games on the ICS, plotted according to their rating and the time control of the game they seek, in three different colors (for rated, unrated and wild games). Computer ads are displayed as squares, human ads are dots. Default: false. .TP .B -autoRefresh true/false Enables automatic updating of the seek graph, by having the ICS send a running update of all newly placed and removed seek ads. This consumes a substantial amount of communication bandwidth, and is only supported for FICS and ICC. Default: false. .TP .B -backgroundObserve true/false When true, boards sent to you by the ICS from other games while you are playing (e.g. because you are observing them) will not be automatically displayed. Only a summary of time left and material of both players will appear in the message field above the board. XBoard will remember the last board it has received this way, and will display it in stead of the position in your own game when you press the right mouse button. No other information is stored on such games observed in the background; you cannot save such a game later, or step through its moves. This feature is provided solely for the benefit of bughouse players, to enable them to peek at their partner's game without the need to logon twice. Default: false. .TP .B -dualBoard true/false In combination with -backgroundObserve true, this option will display the board of the background game side by side with that of your own game, so you can have it in view permanently. Any board or holdings info coming in will be displayed on the secondary board immediately. This feature is still experimental and largely unfinished. There is no animation or highlighting of moves on the secondary board. Default: false. .TP .B -disguisePromotedPieces true/false When set promoted Pawns in crazyhouse/bughouse are displayed identical to primordial pieces of the same type, rather than distinguishable. Default: true. .TP .B -moves/-xmoves or -getMoveList true/false Sets the Get Move List menu option. See \fIOptions Menu\fR. Default: true. .TP .B -alarm/-xalarm or -icsAlarm true/false Sets the ICS Alarm menu option. See \fIOptions Menu\fR. Default: true. .TP .B -icsAlarmTime ms Sets the time in milliseconds for the ICS Alarm menu option. See \fIOptions Menu\fR. Default: 5000. .TP .B lowTimeWarning true/false Controls a color change of the board as a warning your time is running out. See \fIOptions Menu\fR. Default: false. .TP .B -pre/-xpre \\fRor\\fB -premove true/false Sets the Premove menu option. See \fIOptions Menu\fR. Default: true. .TP .B -prewhite/-xprewhite or -premoveWhite .PD 0 .TP .B -preblack/-xpreblack or -premoveBlack .PD .PD 0 .TP .B -premoveWhiteText string .PD .PD 0 .TP .B -premoveBlackText string .PD Set the menu options for specifying the first move for either color. See \fIOptions Menu\fR. Defaults: false and empty strings, so no pre-moves. .TP .B -quiet/-xquiet or -quietPlay true/false Sets the Quiet Play menu option. See \fIOptions Menu\fR. Default: false. .TP .B -colorizeMessages or -colorize/-xcolorize Setting colorizeMessages to true tells XBoard to colorize the messages received from the ICS. Colorization works only if your xterm supports ISO 6429 escape sequences for changing text colors. Default: true. .TP .B -colorShout foreground,background,bold .PD 0 .TP .B -colorSShout foreground,background,bold .PD .PD 0 .TP .B -colorCShout foreground,background,bold .PD .PD 0 .TP .B -colorChannel1 foreground,background,bold .PD .PD 0 .TP .B -colorChannel foreground,background,bold .PD .PD 0 .TP .B -colorKibitz foreground,background,bold .PD .PD 0 .TP .B -colorTell foreground,background,bold .PD .PD 0 .TP .B -colorChallege foreground,background,bold .PD .PD 0 .TP .B -colorRequest foreground,background,bold .PD .PD 0 .TP .B -colorSeek foreground,background,bold .PD .PD 0 .TP .B -colorNormal foreground,background,bold .PD These options set the colors used when colorizing ICS messages. All ICS messages are grouped into one of these categories: shout, sshout, channel 1, other channel, kibitz, tell, challenge, request (including abort, adjourn, draw, pause, and takeback), or normal (all other messages). Each foreground or background argument can be one of the following: black, red, green, yellow, blue, magenta, cyan, white, or default. Here ``default'' means the default foreground or background color of your xterm. Bold can be 1 or 0. If background is omitted, ``default'' is assumed; if bold is omitted, 0 is assumed. .TP .B -soundProgram progname If this option is set to a sound-playing program that is installed and working on your system, XBoard can play sound files when certain events occur, listed below. The default program name is "play". If any of the sound options is set to "$", the event rings the terminal bell by sending a ^G character to standard output, instead of playing a sound file. If an option is set to the empty string "", no sound is played for that event. .TP .B -soundDirectory directoryname This option specifies where XBoard will look for sound files, when these are not given as an absolute path name. .TP .B -soundShout filename .PD 0 .TP .B -soundSShout filename .PD .PD 0 .TP .B -soundCShout filename .PD .PD 0 .TP .B -soundChannel filename .PD .PD 0 .TP .B -soundChannel1 filename .PD .PD 0 .TP .B -soundKibitz filename .PD .PD 0 .TP .B -soundTell filename .PD .PD 0 .TP .B -soundChallenge filename .PD .PD 0 .TP .B -soundRequest filename .PD .PD 0 .TP .B -soundSeek filename .PD These sounds are triggered in the same way as the colorization events described above. They all default to "", no sound. They are played only if the colorizeMessages is on. CShout is synonymous with SShout. .TP .B -soundMove filename This sound is used by the Move Sound menu option. Default: "$". .TP .B -soundIcsAlarm filename This sound is used by the ICS Alarm menu option. Default: "$". .TP .B -soundIcsWin filename This sound is played when you win an ICS game. Default: "" (no sound). .TP .B -soundIcsLoss filename This sound is played when you lose an ICS game. Default: "" (no sound). .TP .B -soundIcsDraw filename This sound is played when you draw an ICS game. Default: "" (no sound). .TP .B -soundIcsUnfinished filename This sound is played when an ICS game that you are participating in is aborted, adjourned, or otherwise ends inconclusively. Default: "" (no sound). .PP .SS Load and Save options .TP .B -lgf or -loadGameFile file .PD 0 .TP .B -lgi or -loadGameIndex index .PD If the `loadGameFile' option is set, XBoard loads the specified game file at startup. The file name `-' specifies the standard input. If there is more than one game in the file, XBoard pops up a menu of the available games, with entries based on their PGN (Portable Game Notation) tags. If the `loadGameIndex' option is set to `N', the menu is suppressed and the N th game found in the file is loaded immediately. The menu is also suppressed if `matchMode' is enabled or if the game file is a pipe; in these cases the first game in the file is loaded immediately. Use the `pxboard' shell script provided with XBoard if you want to pipe in files containing multiple games and still see the menu. If the loadGameIndex specifies an index -1, this triggers auto-increment of the index in `matchMode', which means that after every game the index is incremented by one, causing each game of the match to be played from the next game in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each game in the file is used twice (with reversed colors). The `rewindIndex' option causes the index to be reset to the first game of the file when it has reached a specified value. .TP .B -rewindIndex n Causes a position file or game file to be rewound to its beginning after n positions or games in auto-increment `matchMode'. See `loadPositionIndex' and `loadGameIndex'. default: 0 (no rewind). .TP .B -td or -timeDelay seconds Time delay between moves during `Load Game' or `Analyze File'. Fractional seconds are allowed; try `-td 0.4'. A time delay value of -1 tells XBoard not to step through game files automatically. Default: 1 second. .TP .B -sgf or -saveGameFile file If this option is set, XBoard appends a record of every game played to the specified file. The file name `-' specifies the standard output. .TP .B -autosave/-xautosave or -autoSaveGames true/false Sets the Auto Save menu option. See \fIOptions Menu\fR. Default: false. Ignored if `saveGameFile' is set. .TP .B -onlyOwnGames true/false Suppresses auto-saving of ICS observed games. Default: false. .TP .B -lpf or -loadPositionFile file .PD 0 .TP .B -lpi or -loadPositionIndex index .PD If the `loadPositionFile' option is set, XBoard loads the specified position file at startup. The file name `-' specifies the standard input. If the `loadPositionIndex' option is set to N, the Nth position found in the file is loaded; otherwise the first position is loaded. If the loadPositionIndex specifies an index -1, this triggers auto-increment of the index in `matchMode', which means that after every game the index is incremented by one, causing each game of the match to be played from the next position in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each position in the file is used twice (with the engines playing opposite colors). The `rewindIndex' option causes the index to be reset to the first position of the file when it has reached a specified value. .TP .B -spf or -savePositionFile file If this option is set, XBoard appends the final position reached in every game played to the specified file. The file name `-' specifies the standard output. .TP .B -pgnExtendedInfo true/false If this option is set, XBoard saves depth, score and time used for each move that the engine found as a comment in the PGN file. Default: false. .TP .B -pgnEventHeader string Sets the name used in the PGN event tag to string. Default: "Computer Chess Game". .TP .B -pgnNumberTag true/false Include the (unique) sequence number of a tournament game into the saved PGN file as a 'number' tag. Default: false. .TP .B -saveOutOfBookInfo true/false Include the information on how the engine(s) game out of its opening book in a special 'annotator' tag with the PGN file. Default: true. .TP .B -oldsave/-xoldsave or -oldSaveStyle true/false Sets the Old Save Style menu option. See \fIOptions Menu\fR. Default: false. .TP .B -gameListTags string The character string lists the PGN tags that should be printed in the Game List, and their order. The meaning of the codes is e=event, s=site, d=date, o=round, p=players, r=result, w=white Elo, b=black Elo, t=time control, v=variant, a=out-of-book info, c=result comment. Default: "eprd" .TP .B -ini or -settingsFile filename .PD 0 .TP .B -saveSettingsFile filename .PD .PD 0 .TP .B @filename .PD When XBoard encounters an option -settingsFile (or -ini for short), or @filename, it tries to read the mentioned file, and substitutes the contents of it (presumaby more command-line options) in place of the option. In the case of -ini or -settingsFile, the name of a successfully read settings file is also remembered as the file to use for saving settings (automatically on exit, or on user command). An option of the form @filename does not affect saving. The option -saveSettingsFile does specify a name of the file to use for saving, without reading any options from it, and is thus also effective when the file did not exist yet. So the settings will be saved to the file specified in the last -saveSettingsFile or succesfull -settingsFile / -ini command, if any, and in /etc/xboard/xboard.conf otherwise. Usualy the latter is only accessible for the system administrator, though, and will be used to contain system-wide default setings, amongst which a -saveSettingsFile and -settingsFile options to specify a settings file accessible to the individual user, such as ~/.xboardrc in the user's home directory. .TP .B -saveSettingsOnExit true/false Controls saving of options on the settings file. See \fIOptions Menu\fR. Default: true. .PP .SS User interface options .TP .B -display .PD 0 .TP .B -geometry .PD .PD 0 .TP .B -iconic .PD .PD 0 .TP .B -name .PD These and most other standard Xt options are accepted. .TP .B -noGUI Suppresses all GUI functions of XBoard (to speed up automated ultra-fast engine-engine games, which you don't want to watch). There will be no board or clock updates, no printing of moves, and no update of the icon on the task bar in this mode. .TP .B -logoSize N This option controls the drawing of player logos next to the clocks. The integer N specifies the width of the logo in pixels; the logo height will always be half the width. When N = 0, no logos will be diplayed. Default: 0. .TP .B -firstLogo imagefile .PD 0 .TP .B -secondLogo imagefile .PD Specify the images to be used as player logos when `logoSize' is non-zero, next to the white and black clocks, respectively. .TP .B -autoLogo true/false .TP .B -logoDir filename When `autoLogo' is set, XBoard will search for a PNG image file with the name of the engine or ICS in the directory specified by `logoDir'. .TP .B -recentEngines number .PD 0 .TP .B -recentEngineList list .PD When the number is larger than zero, it determines how many recently used engines will be appended at the bottom of the `Engines' menu. The engines will be saved in your settings file as the option `recentEngineList', by their nicknames, and the most recently used one will always be sorted to the top. If the list after that is longer than the specified number, the last one is discarded. Changes in the list will only become visible the next session, provided you saved the settings. Default: 6. .TP .B -oneClickMove true/false When set, this option allows you to enter moves by only clicking the to- or from-square, when only a single legal move to or from that square is possible. Double-clicking a piece (or clicking an already selected piece) will instruct that piece to make the only capture it can legally do. Default: false. .TP .B -movesound/-xmovesound or -ringBellAfterMoves true/false Sets the Move Sound menu option. See \fIOptions Menu\fR. Default: false. For compatibility with old XBoard versions, -bell/-xbell are also accepted as abbreviations for this option. .TP .B -exit/-xexit or -popupExitMessage true/false Sets the Popup Exit Message menu option. See \fIOptions Menu\fR. Default: true. .TP .B -popup/-xpopup or -popupMoveErrors true/false Sets the Popup Move Errors menu option. See \fIOptions Menu\fR. Default: false. .TP .B -queen/-xqueen or -alwaysPromoteToQueen true/false Sets the Always Queen menu option. See \fIOptions Menu\fR. Default: false. .TP .B -sweepPromotions true/false Sets the `Almost Always Promote to Queen' menu option. See \fIOptions Menu\fR. Default: false. .TP .B -legal/-xlegal or -testLegality true/false Sets the Test Legality menu option. See \fIOptions Menu\fR. Default: true. .TP .B -size or -boardSize (sizeName | n1,n2,n3,n4,n5,n6,n7) Determines how large the board will be, by selecting the pixel size of the pieces and setting a few related parameters. The sizeName can be one of: Titanic, giving 129x129 pixel pieces, Colossal 116x116, Giant 108x108, Huge 95x95, Big 87x87, Large 80x80, Bulky 72x72, Medium 64x64, Moderate 58x58, Average 54x54, Middling 49x49, Mediocre 45x45, Small 40x40, Slim 37x37, Petite 33x33, Dinky 29x29, Teeny 25x25, or Tiny 21x21. Xboard installs with a set of scalable (svg) piece images, which it scales to any of the requested sizes. The square size can further be continuously scaled by sizing the board window, but this only adapts the size of the pieces, and has no effect on the width of the grid lines or the font choice (both of which would depend on he selected boardSize). The default depends on the size of your screen; it is approximately the largest size that will fit without clipping. You can select other sizes or vary other layout parameters by providing a list of comma-separated values (with no spaces) as the argument. You do not need to provide all the values; for any you omit from the end of the list, defaults are taken from the nearest built-in size. The value `n1' gives the piece size, `n2' the width of the black border between squares, `n3' the desired size for the clockFont, `n4' the desired size for the coordFont, `n5' the desired size for the messageFont, `n6' the smallLayout flag (0 or 1), and `n7' the tinyLayout flag (0 or 1). All dimensions are in pixels. If the border between squares is eliminated (0 width), the various highlight options will not work, as there is nowhere to draw the highlight. If smallLayout is 1 and `titleInWindow' is true, the window layout is rearranged to make more room for the title. If tinyLayout is 1, the labels on the menu bar are abbreviated to one character each and the buttons in the button bar are made narrower. .TP .B -overrideLineGap n When n >= 0, this forces the width of the black border between squares to n pixels for any board size. Mostly used to suppress the grid entirely by setting n = 0, e.g. in xiangqi or just getting a prettier picture. When n < 0 this the size-dependent width of the grid lines is used. Default: -1. .TP .B -coords/-xcoords or -showCoords true/false Sets the Show Coords menu option. See \fIOptions Menu\fR. Default: false. The `coordFont' option specifies what font to use. .TP .B -autoraise/-xautoraise or -autoRaiseBoard true/false Sets the Auto Raise Board menu option. See \fIOptions Menu\fR. Default: true. .TP .B -autoflip/-xautoflip or -autoFlipView true/false Sets the Auto Flip View menu option. See \fIOptions Menu\fR. Default: true. .TP .B -flip/-xflip or -flipView true/false If Auto Flip View is not set, or if you are observing but not participating in a game, then the positioning of the board at the start of each game depends on the flipView option. If flipView is false (the default), the board is positioned so that the white pawns move from the bottom to the top; if true, the black pawns move from the bottom to the top. In any case, the Flip menu option (see \fIOptions Menu\fR) can be used to flip the board after the game starts. .TP .B -title/-xtitle or -titleInWindow true/false If this option is true, XBoard displays player names (for ICS games) and game file names (for `Load Game') inside its main window. If the option is false (the default), this information is displayed only in the window banner. You probably won't want to set this option unless the information is not showing up in the banner, as happens with a few X window managers. .TP .B -buttons/-xbuttons or -showButtonBar True/False If this option is False, xboard omits the [<<] [<] [P] [>] [>>] button bar from the window, allowing the message line to be wider. You can still get the functions of these buttons using the menus or their keyboard shortcuts. Default: true. .TP .B -evalZoom factor The score interval (-1,1) is blown up on the vertical axis of the Evaluation Graph by the given factor. Default: 1 .TP .B -evalThreshold n Score below n (centiPawn) are plotted as 0 in the Evaluation Graph. Default: 25 .TP .B -mono/-xmono or -monoMode true/false Determines whether XBoard displays its pieces and squares with two colors (true) or four (false). You shouldn't have to specify `monoMode'; XBoard will determine if it is necessary. .TP .B -showTargetSquares true/false Determines whether XBoard can highlight the squares a piece has legal moves to, when you grab that piece with the mouse. Default: false. .TP .B -flashCount count .PD 0 .TP .B -flashRate rate .PD .PD 0 .TP .B -flash/-xflash .PD These options enable flashing of pieces when they land on their destination square. `flashCount' tells XBoard how many times to flash a piece after it lands on its destination square. `flashRate' controls the rate of flashing (flashes/sec). Abbreviations: `flash' sets flashCount to 3. `xflash' sets flashCount to 0. Defaults: flashCount=0 (no flashing), flashRate=5. .TP .B -highlight/-xhighlight or -highlightLastMove true/false Sets the Highlight Last Move menu option. See \fIOptions Menu\fR. Default: false. .TP .B -highlightMoveWithArrow true/false Sets the Highlight with Arrow menu option. See \fIOptions Menu\fR. Default: false. .TP .B -blind/-xblind or -blindfold true/false Sets the Blindfold menu option. See \fIOptions Menu\fR. Default: false. .TP .B -periodic/-xperiodic or -periodicUpdates true/false Controls updating of current move andnode counts in analysis mode. Default: true. .TP .B -fSAN .PD 0 .TP .B -sSAN .PD Causes the PV in thinking output of the mentioned engine to be converted to SAN before it is further processed. Warning: this might lose engine output not understood by the parser, and uses a lot of CPU power. Default: the PV is displayed exactly as the engine produced it. .TP .B -showEvalInMoveHistory true/false Controls whether the evaluation scores and search depth of engine moves are displayed with the move in the move-history window. Default: true. .TP .B -clockFont font The font used for the clocks. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*. .TP .B -coordFont font The font used for rank and file coordinate labels if `showCoords' is true. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*. .TP .B -messageFont font The font used for popup dialogs, menus, comments, etc. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*. .TP .B -fontSizeTolerance tol In the font selection algorithm, a nonscalable font will be preferred over a scalable font if the nonscalable font's size differs by `tol' pixels or less from the desired size. A value of -1 will force a scalable font to always be used if available; a value of 0 will use a nonscalable font only if it is exactly the right size; a large value (say 1000) will force a nonscalable font to always be used if available. Default: 4. .TP .B -pid or -pieceImageDirectory dir This options control what piece images xboard uses. XBoard will look in the specified directory for an image in png or svg format for every piece type, with names like BlackQueen.svg, WhiteKnight.svg etc. When neither of these is found (or no valid directory is specified) XBoard will use the svg piece that was installed with it (from the source-tree directory `svg'). Both svg and png images will be scaled by XBoard to the required size, but the png pieces lose much in quality when scaled too much. .TP .B -whitePieceColor color .PD 0 .TP .B -blackPieceColor color .PD .PD 0 .TP .B -lightSquareColor color .PD .PD 0 .TP .B -darkSquareColor color .PD .PD 0 .TP .B -highlightSquareColor color .PD .PD 0 .TP .B -preoveHighlightColor color .PD .PD 0 .TP .B -lowTimeWarningColor color .PD Colors to use for the pieces, squares, and square highlights. Defaults: .nf -whitePieceColor #FFFFCC -blackPieceColor #202020 -lightSquareColor #C8C365 -darkSquareColor #77A26D -highlightSquareColor #FFFF00 -premoveHighlightColor #FF0000 -lowTimeWarningColor #FF0000 .fi On a grayscale monitor you might prefer: .nf -whitePieceColor gray100 -blackPieceColor gray0 -lightSquareColor gray80 -darkSquareColor gray60 -highlightSquareColor gray100 -premoveHighlightColor gray70 -lowTimeWarningColor gray70 .fi The PieceColor options only work properly if the image files defining the pieces were pure black & white (possibly anti-aliased to produce gray scales and semi-transparancy), like the pieces images that come with the install. Their effect on colored pieces is undefined. The SquareColor option only have an effect when no board textures are used. .TP .B -trueColors true/false When set, this option suppresses the effect of the PieceColor options mentioned above. This is recommended for images that are already colored. .TP .B -useBoardTexture true/false .PD 0 .TP .B -liteBackTextureFile filename .PD .PD 0 .TP .B -darkBackTextureFile filename .PD Indicate the png image files to be used for drawing the board squares, and if they should be used rather than using simple colors. The algorithm for cutting squares out of a given bitmap is such that the picture is perfectly reproduced when a bitmap the size of the complete board is given. Default: false and "" .TP .B -drag/-xdrag or -animateDragging true/false Sets the Animate Dragging menu option. See \fIOptions Menu\fR. Default: true. .TP .B -animate/-xanimate or -animateMoving true/false Sets the Animate Moving menu option. See \fIOptions Menu\fR. Default: true. .TP .B -animateSpeed n Number of milliseconds delay between each animation frame when Animate Moves is on. .TP .B -autoDisplayComment true/false .PD 0 .TP .B -autoDisplayTags true/false .PD If set to true, these options cause the window with the move comments, and the window with PGN tags, respectively, to pop up automatically when such tags or comments are encountered during the replaying a stored or loaded game. Default: true. .TP .B -pasteSelection true/false If this option is set to true, the Paste Position and Paste Game options paste from the currently selected text. If false, they paste from the clipboard. Default: false. .TP .B -autoCopyPV true|false When this option is set, the position displayed on the board when you terminate a PV walk (initiated by a right-click on board or engine-output window) will be automatically put on the clipboard as FEN. Default: false. .TP .B -dropMenu true|false This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) drop menu rather than displaying the position at the end of the principal variation. Default: False. .TP .B -pieceMenu true|false This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) piece menu in Edit Position mode. From this menu you can select the piece to put on the square you clicked to bring up the menu, or select items such as `clear board'. You can also `promote' or `demote' a clicked piece to convert it into an unorthodox piece that is not directly in the menu, or give the move to `black' or `white'. .TP .B -variations true|false When this option is on, you can start new variations in Edit Game or Analyze mode by holding the Shift key down while entering a move. When it is off, the Shift key will be ignored. Default: False. .TP .B -appendPV true|false When this option is on, right-clicking a PV in the Engine Output window will play the first move of that PV in Analyze mode, or as many moves as you walk through by moving the mouse. Default: False. .TP .B -absoluteAnalysisScores true|false When true, scores on the Engine Output window during analysis will be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False. .TP .B -scoreWhite true|false When true, scores will always be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False. .PP .SS Adjudication Options .TP .B -adjudicateLossThreshold n If the given value is non-zero, XBoard adjudicates the game as a loss if both engines agree for a duration of 6 consecutive ply that the score is below the given score threshold for that engine. Make sure the score is interpreted properly by XBoard, using `-firstScoreAbs' and `-secondScoreAbs' if needed. Default: 0 (no adjudication) .TP .B -adjudicateDrawMoves n If the given value is non-zero, XBoard adjudicates the game as a draw if after the given number of moves it was not yet decided. Default: 0 (no adjudication) .TP .B -checkMates true/false If this option is set, XBoard detects all checkmates and stalemates, and ends the game as soon as they occur. Legality-testing must be switched on for this option to work. Default: true .TP .B -testClaims true/false If this option is set, XBoard verifies all result claims made by engines, and those who send false claims will forfeit the game because of it. Legality-testing must be switched on for this option to work. Default: true .TP .B -materialDraws true/false If this option is set, XBoard adjudicates games as draws when there is no sufficient material left to inflict a checkmate. This applies to KBKB with like bishops (any number, actually), and to KBK, KNK and KK. Legality-testing must be switched on for this option to work. Default: true .TP .B -trivialDraws true/false If this option is set, XBoard adjudicates games as draws that cannot be usually won without opponent cooperation. This applies to KBKB with unlike bishops, and to KBKN, KNKN, KNNK, KRKR and KQKQ. The draw is called after 6 ply into these end-games, to allow quick mates that can occur in some exceptional positions to be found by the engines. KQKQ does not really belong in this category, and might be taken out in the future. (When bitbase-based adjudications are implemented.) Legality-testing must be on for this option to work. Default: false .TP .B -ruleMoves n If the given value is non-zero, XBoard adjudicates the game as a draw after the given number of consecutive reversible moves. Engine draw claims are always accepted after 50 moves, irrespective of the given value of n. .TP .B -repeatsToDraw n If the given value is non-zero, xboard adjudicates the game as a draw if a position is repeated the given number of times. Engines draw claims are always accepted after 3 repeats, (on the 3rd occurrence, actually), irrespective of the value of n. Beware that positions that have different castling or en-passant rights do not count as repeats, XBoard is fully e.p. and castling aware! .PP .SS Other options .TP .B -ncp/-xncp or -noChessProgram true/false If this option is true, XBoard acts as a passive chessboard; it does not start a chess engine at all. Turning on this option also turns off clockMode. Default: false. .TP .B -viewer .PD 0 .TP .B -viewerOptions string .PD Presence of the volatile option `viewer' on the command line will cause the value of the persistent option `viewerOptions' as stored in the settings file to be appended to the command line. The `view' option will be used by desktop associations with game or position file types, so that `viewerOptions' can be used to configure the exact mode XBoard will start in when it should act on such a file (e.g. in -ncp mode, or analyzing with your favorite engine). The options are also automatically appended when Board is invoked with a single argument not being an option name, which is then assumed to be the name of a `loadGameFile' or (when the name ends in .fen) a `loadPositionFile'. Default: "-ncp -engineOutputUp false -saveSettingsOnExit false". .TP .B -tourneyOptions string When XBoard is invoked with a single argument that is a file with .trn extension, it will assume this argument to be the value of a `tourneyFile' option, and apped the value of the persistent option `tourneyOptions' as stored in the settings file to the command line. Thus the value of `tourneyOptions' can be used to configure XBoard to automatically start running a tournament when it should act on such a file. Default: "-ncp -mm -saveSettingsOnExit false". .TP .B -mode or -initialMode modename If this option is given, XBoard selects the given modename from the Mode menu after starting and (if applicable) processing the loadGameFile or loadPositionFile option. Default: "" (no selection). Other supported values are MachineWhite, MachineBlack, TwoMachines, Analysis, AnalyzeFile, EditGame, EditPosition, and Training. .TP .B -variant varname Activates preliminary, partial support for playing chess variants against a local engine or editing variant games. This flag is not needed in ICS mode. Recognized variant names are: .nf normal Normal chess wildcastle Shuffle chess, king can castle from d file nocastle Shuffle chess, no castling allowed fischerandom Fischer Random shuffle chess bughouse Bughouse, ICC/FICS rules crazyhouse Crazyhouse, ICC/FICS rules losers Lose all pieces or get mated (ICC wild 17) suicide Lose all pieces including king (FICS) giveaway Try to have no legal moves (ICC wild 26) twokings Weird ICC wild 9 kriegspiel Opponent's pieces are invisible atomic Capturing piece explodes (ICC wild 27) 3check Win by giving check 3 times (ICC wild 25) shatranj An ancient precursor of chess (ICC wild 28) xiangqi Chinese Chess (on a 9x10 board) shogi Japanese Chess (on a 9x9 board & piece drops) capablanca Capablanca Chess (10x8 board, with Archbishop and Chancellor pieces) gothic similar, with a better initial position caparandom An FRC-like version of Capablanca Chess (10x8) janus A game with two Archbishops (10x8 board) courier Medieval intermediate between shatranj and modern Chess (on 12x8 board) falcon Patented 10x8 variant with two Falcon pieces berolina Pawns capture straight ahead, and move diagonal cylinder Pieces wrap around the board edge knightmate King moves as Knight, and vice versa super Superchess (shuffle variant with 4 exo-pieces) makruk Thai Chess (shatranj-like, P promotes on 6th rank) spartan Spartan Chess (black has unorthodox pieces) fairy A catchall variant in which all piece types known to XBoard can participate (8x8) unknown Catchall for other unknown variants .fi NOT ALL BOARDSIZES PROVIDE A COMPLETE SET OF BUILT-IN BITMAPS FOR ALL UN-ORTHODOX PIECES, though. Only in `boardSize' middling and bulky all 22 piece types are provided, while -boardSize petite has most of them. Archbishop, Chancellor and Amazon are supported in every size from petite to bulky. Kings or Amazons are substituted for missing bitmaps. You can still play variants needing un-orthodox pieces in other board sizes providing your own bitmaps through the `bitmapDirectory' or `pixmapDirectory' options. In the shuffle variants, XBoard now does shuffle the pieces, although you can still do it by hand using Edit Position. Some variants are supported only in ICS mode, including bughouse, and kriegspiel. The winning/drawing conditions in crazyhouse (off-board interposition on mate) are not fully understood, but losers, suicide, giveaway, atomic, and 3check should be OK. Berolina and cylinder chess can only be played with legality testing off. In crazyhouse, XBoard now does keep track of off-board pieces. In shatranj it does implement the baring rule when mate detection is switched on. .TP .B -boardHeight N Allows you to set a non-standard number of board ranks in any variant. If the height is given as -1, the default height for the variant is used. Default: -1 .TP .B -boardWidth N Allows you to set a non-standard number of board files in any variant. If the width is given as -1, the default width for the variant is used. With a non-standard width, the initial position will always be an empty board, as the usual opening array will not fit. Default: -1 .TP .B -holdingsSize N Allows you to set a non-standard size for the holdings in any variant. If the size is given as -1, the default holdings size for the variant is used. The first N piece types will go into the holdings on capture, and you will be able to drop them on the board in stead of making a normal move. If size equals 0, there will be no holdings. Default: -1 .TP .B -defaultFrcPosition N Specifies the number of the opening position in shuffle games like Chess960. A value of -1 means the position is randomly generated by XBoard at the beginning of every game. Default: -1 .TP .B -pieceToCharTable string The characters that are used to represent the piece types XBoard knows in FEN diagrams and SAN moves. The string argument has to have an even length (or it will be ignored), as white and black pieces have to be given separately (in that order). The last letter for each color will be the King. The letters before that will be PNBRQ and then a whole host of fairy pieces in an order that has not fully crystallized yet (currently FEACWMOHIJGDVSLU, F=Ferz, Elephant, A=Archbishop, C=Chancellor, W=Wazir, M=Commoner, O=Cannon, H=Nightrider). You should list at least all pieces that occur in the variant you are playing. If you have less than 44 characters in the string, the pieces not mentioned will get assigned a period, and you will not be able to distinguish them in FENs. You can also explicitly assign pieces a period, in which case they will not be counted in deciding which captured pieces can go into the holdings. A tilde '~' as a piece name does mean this piece is used to represent a promoted Pawn in crazyhouse-like games, i.e. on capture it turns back onto a Pawn. A '+' similarly indicates the piece is a shogi-style promoted piece, that should revert to its non-promoted version on capture (rather than to a Pawn). Note that promoted pieces are represented by pieces 11 further in the list. You should not have to use this option often: each variant has its own default setting for the piece representation in FEN, which should be sufficient in normal use. Default: "" .TP .B -pieceNickNames string The characters in the string are interpreted the same way as in the `pieceToCharTable' option. But on input, piece-ID letters are first looked up in the nicknames, and only if not defined there, in the normal pieceToCharTable. This allows you to have two letters designate the same piece, (e.g. N as an alternative to H for Horse in Xiangqi), to make reading of non-compliant notations easier. Default: "" .TP .B -colorNickNames string The side-to-move field in a FEN will be first matched against the letters in the string (first character for white, second for black), before it is matched to the regular 'w' and 'b'. This makes it easier to read non-compliant FENs, which, say, use 'r' for white. Default: "" .TP .B -debug/-xdebug or -debugMode true/false Turns on debugging printout. .TP .B -debugFile filename or -nameOfDebugFile filename Sets the name of the file to which XBoard saves debug information (including all communication to and from the engines). A `%d' in the given file name (e.g. game%d.debug) will be replaced by the unique sequence number of a tournament game, so that the debug output of each game will be written on a separate file. .TP .B -engineDebugOutput number Specifies how XBoard should handle unsolicited output from the engine, with respect to saving it in the debug file. The output is further (hopefully) ignored. If number=0, XBoard refrains from writing such spurious output to the debug file. If number=1, all engine output is written faithfully to the debug file. If number=2, any protocol-violating line is prefixed with a '#' character, as the engine itself should have done if it wanted to submit info for inclusion in the debug file. This option is provided for the benefit of applications that use the debug file as a source of information, such as the broadcaster of live games TLCV / TLCS. Such applications can be protected from spurious engine output that might otherwise confuse them. .TP .B -rsh or -remoteShell shell-name Name of the command used to run programs remotely. The default is `rsh' or `remsh', determined when XBoard is configured and compiled. .TP .B -ruser or -remoteUser user-name User name on the remote system when running programs with the `remoteShell'. The default is your local user name. .TP .B -userName username Name under which the Human player will be listed in the PGN file. Default is the login name on your local computer. .TP .B -delayBeforeQuit number .PD 0 .TP .B -delayAfterQuit number .PD These options specify how long XBoard has to wait before sending a termination signal to rogue engine processes, that do not want to react to the 'quit' command. The second one determines the pause after killing the engine, to make sure it dies. .TP .B -searchMode n The integer n encodes the mode for the `find position' function. Default: 1 (= Exact position match) .TP .B -eloThresholdBoth elo .PD 0 .TP .B -eloThresholdAny elo .PD Defines a lower limit for the Elo rating, which has to be surpassed before a game will be considered when searching for a board position. Default: 0 .TP .B -dateThreshold year Only games not played before the given year will be considered when searching for a board position .PP .SH CHESS SERVERS An "Internet Chess Server", or "ICS", is a place on the Internet where people can get together to play chess, watch other people's games, or just chat. You can use either `telnet' or a client program like XBoard to connect to the server. There are thousands of registered users on the different ICS hosts, and it is not unusual to meet 200 on both chessclub.com and freechess.org. Most people can just type `xboard -ics' to start XBoard as an ICS client. Invoking XBoard in this way connects you to the Internet Chess Club (ICC), a commercial ICS. You can log in there as a guest even if you do not have a paid account. To connect to the largest Free ICS (FICS), use the command `xboard -ics -icshost freechess.org' instead, or substitute a different host name to connect to your favorite ICS. For a full description of command-line options that control the connection to ICS and change the default values of ICS options, see \fIICS options\fR. While you are running XBoard as an ICS client, you use the terminal window that you started XBoard from as a place to type in commands and read information that is not available on the chessboard. The first time you need to use the terminal is to enter your login name and password, if you are a registered player. (You don't need to do this manually; the `icsLogon' option can do it for you. See \fIICS options\fR.) If you are not registered, enter `g' as your name, and the server will pick a unique guest name for you. Some useful ICS commands include .TP .B help to get help on the given . To get a list of possible topics type "help" without topic. Try the help command before you ask other people on the server for help. For example `help register' tells you how to become a registered ICS player. .TP .B who to see a list of people who are logged on. Administrators (people you should talk to if you have a problem) are marked with the character `*', an asterisk. The allow you to display only selected players: For example, `who of' shows a list of players who are interested in playing but do not have an opponent. .TP .B games to see what games are being played .TP .B match [] [] to challenge another player to a game. Both opponents get minutes for the game, and seconds will be added after each move. If another player challenges you, the server asks if you want to accept the challenge; use the `accept' or `decline' commands to answer. .TP .B accept .PD 0 .TP .B decline .PD to accept or decline another player's offer. The offer may be to start a new game, or to agree to a `draw', `adjourn' or `abort' the current game. See \fIAction Menu\fR. If you have more than one pending offer (for example, if more than one player is challenging you, or if your opponent offers both a draw and to adjourn the game), you have to supply additional information, by typing something like `accept ', `accept draw', or `draw'. .TP .B draw .PD 0 .TP .B adjourn .PD .PD 0 .TP .B abort .PD asks your opponent to terminate a game by mutual agreement. Adjourned games can be continued later. Your opponent can either `decline' your offer or accept it (by typing the same command or typing `accept'). In some cases these commands work immediately, without asking your opponent to agree. For example, you can abort the game unilaterally if your opponent is out of time, and you can claim a draw by repetition or the 50-move rule if available simply by typing `draw'. .TP .B finger to get information about the given . (Default: yourself.) .TP .B vars to get a list of personal settings .TP .B set to modify these settings .TP .B observe to observe an ongoing game of the given . .TP .B examine .PD 0 .TP .B oldmoves .PD to review a recently completed game .PP Some special XBoard features are activated when you are in examine mode on ICS. See the descriptions of the menu commands `Forward', `Backward', `Pause', `ICS Client', and `Stop Examining' on the \fIEdit Menu\fR, \fIMode Menu\fR, and \fIAction Menu\fR. .SH FIREWALLS By default, XBoard communicates with an Internet Chess Server by opening a TCP socket directly from the machine it is running on to the ICS. If there is a firewall between your machine and the ICS, this won't work. Here are some recipes for getting around common kinds of firewalls using special options to XBoard. Important: See the paragraph in the below about extra echoes, in \fILimitations\fR. Suppose that you can't telnet directly to ICS, but you can telnet to a firewall host, log in, and then telnet from there to ICS. Let's say the firewall is called `firewall.example.com'. Set command-line options as follows: .nf xboard -ics -icshost firewall.example.com -icsport 23 .fi Then when you run XBoard in ICS mode, you will be prompted to log in to the firewall host. This works because port 23 is the standard telnet login service. Do so, then telnet to ICS, using a command like `telnet chessclub.com 5000', or whatever command the firewall provides for telnetting to port 5000. If your firewall lets you telnet (or rlogin) to remote hosts but doesn't let you telnet to port 5000, you may be able to connect to the chess server on port 23 instead, which is the port the telnet program uses by default. Some chess servers support this (including chessclub.com and freechess.org), while some do not. If your chess server does not allow connections on port 23 and your firewall does not allow you to connect to other ports, you may be able to connect by hopping through another host outside the firewall that you have an account on. For instance, suppose you have a shell account at `foo.edu'. Follow the recipe above, but instead of typing `telnet chessclub.com 5000' to the firewall, type `telnet foo.edu' (or `rlogin foo.edu'), log in there, and then type `telnet chessclub.com 5000'. Suppose that you can't telnet directly to ICS, but you can use rsh to run programs on a firewall host, and that host can telnet to ICS. Let's say the firewall is called `rsh.example.com'. Set command-line options as follows: .nf xboard -ics -gateway rsh.example.com -icshost chessclub.com .fi Then when you run XBoard in ICS mode, it will connect to the ICS by using `rsh' to run the command `telnet chessclub.com 5000' on host `rsh.example.com'. Suppose that you can telnet anywhere you want, but you have to run a special program called `ptelnet' to do so. First, we'll consider the easy case, in which `ptelnet chessclub.com 5000' gets you to the chess server. In this case set command line options as follows: .nf xboard -ics -telnet -telnetProgram ptelnet .fi Then when you run XBoard in ICS mode, it will issue the command `ptelnet chessclub.com 5000' to connect to the ICS. Next, suppose that `ptelnet chessclub.com 5000' doesn't work; that is, your `ptelnet' program doesn't let you connect to alternative ports. As noted above, your chess server may allow you to connect on port 23 instead. In that case, just add the option `-icsport ""' to the above command. But if your chess server doesn't let you connect on port 23, you will have to find some other host outside the firewall and hop through it. For instance, suppose you have a shell account at `foo.edu'. Set command line options as follows: .nf xboard -ics -telnet -telnetProgram ptelnet -icshost foo.edu -icsport "" .fi Then when you run XBoard in ICS mode, it will issue the command `ptelnet foo.edu' to connect to your account at `foo.edu'. Log in there, then type `telnet chessclub.com 5000'. ICC timestamp and FICS timeseal do not work through some firewalls. You can use them only if your firewall gives a clean TCP connection with a full 8-bit wide path. If your firewall allows you to get out only by running a special telnet program, you can't use timestamp or timeseal across it. But if you have access to a computer just outside your firewall, and you have much lower netlag when talking to that computer than to the ICS, it might be worthwhile running timestamp there. Follow the instructions above for hopping through a host outside the firewall (foo.edu in the example), but run timestamp or timeseal on that host instead of telnet. Suppose that you have a SOCKS firewall that will give you a clean 8-bit wide TCP connection to the chess server, but only after you authenticate yourself via the SOCKS protocol. In that case, you could make a socksified version of XBoard and run that. If you are using timestamp or timeseal, you will to socksify it, not XBoard; this may be difficult seeing that ICC and FICS do not provide source code for these programs. Socksification is beyond the scope of this document, but see the SOCKS Web site at http://www.socks.permeo.com/. If you are missing SOCKS, try http://www.funbureau.com/. .SH ENVIRONMENT VARIABLES Game and position files are found in a directory named by the `CHESSDIR' environment variable. If this variable is not set, the current working directory is used. If `CHESSDIR' is set, XBoard actually changes its working directory to `$CHESSDIR', so any files written by the chess engine will be placed there too. .SH LIMITATIONS AND KNOWN BUGS There is no way for two people running copies of XBoard to play each other without going through an Internet Chess Server. Under some circumstances, your ICS password may be echoed when you log on. If you are connecting to the ICS by running telnet on an Internet provider or firewall host, you may find that each line you type is echoed back an extra time after you hit . If your Internet provider is a Unix system, you can probably turn its echo off by typing `stty -echo' after you log in, and/or typing <^E> (Ctrl+E followed by the Enter key) to the telnet program after you have logged into ICS. It is a good idea to do this if you can, because the extra echo can occasionally confuse XBoard's parsing routines. The game parser recognizes only algebraic notation. Many of the following points used to be limitations in XBoard 4.2.7 and earlier, but are now fixed: The internal move legality tester in XBoard 4.3.xx does look at the game history, and is fully aware of castling or en-passant-capture rights. It permits castling with the king on the d file because this is possible in some "wild 1" games on ICS. The piece-drop menu does not check piece drops in bughouse to see if you actually hold the piece you are trying to drop. But this way of dropping pieces should be considered an obsolete feature, now that pieces can be dropped by dragging them from the holdings to the board. Anyway, if you would attempt an illegal move when using a chess engine or the ICS, XBoard will accept the error message that comes back, undo the move, and let you try another. FEN positions saved by XBoard do include correct information about whether castling or en passant are legal, and also handle the 50-move counter. The mate detector does not understand that non-contact mate is not really mate in bughouse. The only problem this causes while playing is minor: a "#" (mate indicator) character will show up after a non-contact mating move in the move list. XBoard will not assume the game is over at that point, not even when the option Detect Mates is on. Edit Game mode always uses the rules of the selected variant, which can be a variant that uses piece drops. You can load and edit games that contain piece drops. The (obsolete) piece menus are not active, but you can perform piece drops by dragging pieces from the holdings. Fischer Random castling is fully understood. You can enter castlings by dragging the King on top of your Rook. You can probably also play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window. The menus may not work if your keyboard is in Caps Lock or Num Lock mode. This seems to be a problem with the Athena menu widget, not an XBoard bug. Also see the ToDo file included with the distribution for many other possible bugs, limitations, and ideas for improvement that have been suggested. .SH REPORTING PROBLEMS You can report bugs and problems with XBoard using the bug tracker at `https://savannah.gnu.org/projects/xboard/' or by sending mail to `'. It can also be useful to report or discuss bugs in the WinBoard Forum at `http://www.open-aurec.com/wbforum/', WinBoard development section. Please use the `script' program to start a typescript, run XBoard with the `-debug' option, and include the typescript output in your message. Also tell us what kind of machine and what operating system version you are using. The command `uname -a' will often tell you this. If you improve XBoard, please send a message about your changes, and we will get in touch with you about merging them in to the main line of development. .SH AUTHORS AND CONTRIBUTORS Chris Sears and Dan Sears wrote the original XBoard. They were responsible for versions 1.0 through 1.2. The color scheme was taken from Wayne Christopher's `XChess' program. Tim Mann was primarily responsible for XBoard versions 1.3 through 4.2.7, and for WinBoard (a port of XBoard to Microsoft Win32) from its inception through version 4.2.7. John Chanak contributed the initial implementation of ICS mode. Evan Welsh wrote `CMail', and Patrick Surry helped in designing, testing, and documenting it. Elmar Bartel contributed the new piece bitmaps introduced in version 3.2. Jochen Wiedmann converted the documentation to texinfo. Frank McIngvale added click/click moving, the Analysis modes, piece flashing, ZIICS import, and ICS text colorization to XBoard. Hugh Fisher added animated piece movement to XBoard, and Henrik Gram added it to WinBoard. Mark Williams contributed the initial (WinBoard-only) implementation of many new features added to both XBoard and WinBoard in version 4.1.0, including copy/paste, premove, icsAlarm, autoFlipView, training mode, auto raise, and blindfold. Ben Nye contributed X copy/paste code for XBoard. In a fork from version 4.2.7, Alessandro Scotti added many elements to the user interface of WinBoard, including the board textures and font-based rendering, the evaluation-graph, move-history and engine-output window. He was also responsible for adding the UCI support. H. G. Muller continued this fork of the project, producing version 4.3. He made WinBoard castling- and e.p.-aware, added variant support with adjustable board sizes, the crazyhouse holdings, and the fairy pieces. In addition he added most of the adjudication options, made WinBoard more robust in dealing with buggy and crashing engines, and extended time control with a time-odds and node-count-based modes. Most of the options that initially were WinBoard only have now been back-ported to XBoard. Michel van den Bergh provided the code for reading Polyglot opening books. Meanwhile, some work continued on the GNU XBoard project maintained at savannah.gnu.org, but version 4.2.8 was never released. Daniel Mehrmann was responsible for much of this work. Most recently, Arun Persaud worked with H. G. Muller to merge all the features of the never-released XBoard/WinBoard 4.2.8 of the GNU XBoard project and the never-released 4.3.16 from H. G.'s fork into a unified XBoard/WinBoard 4.4, which is now available both from the savannah.gnu.org web site and the WinBoard forum. .SH CMAIL The `cmail' program can help you play chess by email with opponents of your choice using XBoard as an interface. You will usually run `cmail' without giving any options. .SS CMail options .TP .B -h Displays `cmail' usage information. .TP .B -c Shows the conditions of the GNU General Public License. See \fICopying\fR. .TP .B -w Shows the warranty notice of the GNU General Public License. See \fICopying\fR. .TP .B -v .PD 0 .TP .B -xv .PD Provides or inhibits verbose output from `cmail' and XBoard, useful for debugging. The `-xv' form also inhibits the cmail introduction message. .TP .B -mail .PD 0 .TP .B -xmail .PD Invokes or inhibits the sending of a mail message containing the move. .TP .B -xboard .PD 0 .TP .B -xxboard .PD Invokes or inhibits the running of XBoard on the game file. .TP .B -reuse .PD 0 .TP .B -xreuse .PD Invokes or inhibits the reuse of an existing XBoard to display the current game. .TP .B -remail Resends the last mail message for that game. This inhibits running XBoard. .TP .B -game The name of the game to be processed. .TP .B -wgames .PD 0 .TP .B -bgames .PD .PD 0 .TP .B -games .PD Number of games to start as White, as Black or in total. Default is 1 as white and none as black. If only one color is specified then none of the other color is assumed. If no color is specified then equal numbers of White and Black games are started, with the extra game being as White if an odd number of total games is specified. .TP .B -me .PD 0 .TP .B -opp .PD A one-word alias for yourself or your opponent. .TP .B -wname .PD 0 .TP .B -bname .PD .PD 0 .TP .B -myname .PD .PD 0 .TP .B -oppname .PD The full name of White, Black, yourself or your opponent. .TP .B -wna .PD 0 .TP .B -bna .PD .PD 0 .TP .B -na .PD .PD 0 .TP .B -oppna .PD The email address of White, Black, yourself or your opponent. .TP .B -dir The directory in which `cmail' keeps its files. This defaults to the environment variable `$CMAIL_DIR' or failing that, `$CHESSDIR', `$HOME/Chess' or `~/Chess'. It will be created if it does not exist. .TP .B -arcdir The directory in which `cmail' archives completed games. Defaults to the environment variable `$CMAIL_ARCDIR' or, in its absence, the same directory as cmail keeps its working files (above). .TP .B -mailprog The program used by cmail to send email messages. This defaults to the environment variable `$CMAIL_MAILPROG' or failing that `/usr/ucb/Mail', `/usr/ucb/mail' or `Mail'. You will need to set this variable if none of the above paths fit your system. .TP .B -logFile A file in which to dump verbose debugging messages that are invoked with the `-v' option. .TP .B -event The PGN Event tag (default `Email correspondence game'). .TP .B -site The PGN Site tag (default `NET'). .TP .B -round The PGN Round tag (default `-', not applicable). .TP .B -mode The PGN Mode tag (default `EM', Electronic Mail). .TP .B Other options Any option flags not listed above are passed through to XBoard. Invoking XBoard through CMail changes the default values of two XBoard options: The default value for `-noChessProgram' is changed to true; that is, by default no chess engine is started. The default value for `-timeDelay' is changed to 0; that is, by default XBoard immediately goes to the end of the game as played so far, rather than stepping through the moves one by one. You can still set these options to whatever values you prefer by supplying them on CMail's command line. See \fIOptions\fR. .PP .SS Starting a CMail Game Type `cmail' from a shell to start a game as white. After an opening message, you will be prompted for a game name, which is optional -- if you simply press , the game name will take the form `you-VS-opponent'. You will next be prompted for the short name of your opponent. If you haven't played this person before, you will also be prompted for his/her email address. `cmail' will then invoke XBoard in the background. Make your first move and select `Mail Move' from the `File' menu. See \fIFile Menu\fR. If all is well, `cmail' will mail a copy of the move to your opponent. If you select `Exit' without having selected `Mail Move' then no move will be made. .SS Answering a Move When you receive a message from an opponent containing a move in one of your games, simply pipe the message through `cmail'. In some mailers this is as simple as typing `| cmail' when viewing the message, while in others you may have to save the message to a file and do `cmail < file' at the command line. In either case `cmail' will display the game using XBoard. If you didn't exit XBoard when you made your first move then `cmail' will do its best to use the existing XBoard instead of starting a new one. As before, simply make a move and select `Mail Move' from the `File' menu. See \fIFile Menu\fR. `cmail' will try to use the XBoard that was most recently used to display the current game. This means that many games can be in progress simultaneously, each with its own active XBoard. If you want to look at the history or explore a variation, go ahead, but you must return to the current position before XBoard will allow you to mail a move. If you edit the game's history you must select `Reload Same Game' from the `File' menu to get back to the original position, then make the move you want and select `Mail Move'. As before, if you decide you aren't ready to make a move just yet you can either select `Exit' without sending a move or just leave XBoard running until you are ready. .SS Multi-Game Messages It is possible to have a `cmail' message carry more than one game. This feature was implemented to handle IECG (International Email Chess Group) matches, where a match consists of one game as white and one as black, with moves transmitted simultaneously. In case there are more general uses, `cmail' itself places no limit on the number of black/white games contained in a message; however, XBoard does. .SS Completing a Game Because XBoard can detect checkmate and stalemate, `cmail' handles game termination sensibly. As well as resignation, the `Action' menu allows draws to be offered and accepted for `cmail' games. For multi-game messages, only unfinished and just-finished games will be included in email messages. When all the games are finished, they are archived in the user's archive directory, and similarly in the opponent's when he or she pipes the final message through `cmail'. The archive file name includes the date the game was started. .SS Known CMail Problems It's possible that a strange conjunction of conditions may occasionally mean that `cmail' has trouble reactivating an existing XBoard. If this should happen, simply trying it again should work. If not, remove the file that stores the XBoard's PID (`game.pid') or use the `-xreuse' option to force `cmail' to start a new XBoard. Versions of `cmail' after 2.16 no longer understand the old file format that XBoard used to use and so cannot be used to correspond with anyone using an older version. Versions of `cmail' older than 2.11 do not handle multi-game messages, so multi-game correspondence is not possible with opponents using an older version. .SH OTHER PROGRAMS YOU CAN USE WITH XBOARD Here are some other programs you can use with XBoard .SS GNU Chess The GNU Chess engine is available from: ftp://ftp.gnu.org/gnu/gnuchess/ You can use XBoard to play a game against GNU Chess, or to interface GNU Chess to an ICS. .SS Fairy-Max Fairy-Max is a derivative from the once World's smallest Chess program micro-Max, which measures only about 100 lines of source code. The main difference with micro-Max is that Fairy-Max loads its move-generator tables from a file, so that the rules for piece movement can be easily configured to implement unorthodox pieces. Fairy-Max can therefore play a large number of variants, normal Chess being one of those. In addition it plays Knightmate, Capablanca and Gothic Chess, Shatranj, Courier Chess, Cylinder chess, Berolina Chess, while the user can easily define new variants. It can be obtained from: http://home.hccnet.nl/h.g.muller/dwnldpage.html .SS HoiChess HoiChess is a not-so-very-strong Chess engine, which comes with a derivative HoiXiangqi, able to play Chinese Chess. It can be obtained from the standard Linux repositories through: sudo apt-get install hoichess .SS Crafty Crafty is a chess engine written by Bob Hyatt. You can use XBoard to play a game against Crafty, hook Crafty up to an ICS, or use Crafty to interactively analyze games and positions for you. Crafty is a strong, rapidly evolving chess program. This rapid pace of development is good, because it means Crafty is always getting better. This can sometimes cause problems with backwards compatibility, but usually the latest version of Crafty will work well with the latest version of XBoard. Crafty can be obtained from its author's FTP site: ftp://ftp.cis.uab.edu/hyatt/. To use Crafty with XBoard, give the -fcp and -fd options as follows, where is the directory in which you installed Crafty and placed its book and other support files. .SS zic2xpm The ``zic2xpm'' program is used to import chess sets from the ZIICS(*) program into XBoard. ``zic2xpm'' is part of the XBoard distribution. ZIICS is available from: ftp://ftp.freechess.org/pub/chess/DOS/ziics131.exe To import ZIICS pieces, do this: .TP .B 1. Unzip ziics131.exe into a directory: .nf unzip -L ziics131.exe -d ~/ziics .fi .TP .B 2. Use zic2xpm to convert a set of pieces to XBoard format. For example, let's say you want to use the FRITZ4 set. These files are named ``fritz4.*'' in the ZIICS distribution. .nf mkdir ~/fritz4 cd ~/fritz4 zic2xpm ~/ziics/fritz4.* .fi .TP .B 3. Give XBoard the ``-pixmap'' option when starting up, e.g.: .nf xboard -pixmap ~/fritz4 .fi .PP (*) ZIICS is a separate copyrighted work of Andy McFarland. The ``ZIICS pieces'' are copyrighted works of their respective creators. Files produced by ``zic2xpm'' are for PERSONAL USE ONLY and may NOT be redistributed without explicit permission from the original creator(s) of the pieces. .SH COPYRIGHT Copyright (C) 1991 Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Digital disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Digital be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. Enhancements copyright (C) 1992-2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. .nf Published by the Free Software Foundation 59 Temple Place - Suite 330 Boston, MA 02111-1307 USA .fi Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License,'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License,'' and this permission notice, may be included in translations approved by the Free Software Foundation instead of in the original English. .SH GNU GENERAL PUBLIC LICENSE .nf Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/' Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. .fi The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program -- to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. .TP .B Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. .TP .B Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. .TP .B Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. .TP .B Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. .TP .B Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. .TP .B Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: The work must carry prominent notices stating that you modified it, and giving a relevant date. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. .TP .B Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. .TP .B Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or Limiting the use for publicity purposes of names of licensors or authors of the material; or Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. .TP .B Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. .TP .B Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. .TP .B Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. .TP .B Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. .TP .B No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. .TP .B Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. .TP .B Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. .TP .B Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. .TP .B Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. .TP .B Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. .nf ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see `http://www.gnu.org/licenses/'. .fi Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: .nf PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. .fi The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see `http://www.gnu.org/licenses/'. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read `http://www.gnu.org/philosophy/why-not-lgpl.html'. xboard-4.7.3/backendz.h0000644000175000001440000000624712262415351011665 00000000000000/* * backendz.h -- Internal interface exported by XBoard backend.c to zippy.c * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef XB_BACKENDZ #define XB_BACKENDZ extern long whiteTimeRemaining, blackTimeRemaining; extern int forwardMostMove; extern char star_match[STAR_MATCH_N][MSG_SIZ]; extern ProcRef firstProgramPR; extern int startedFromSetupPosition; extern int firstMove; extern GameInfo gameInfo; extern void ics_printf P((char *format, ...)); extern void SendToICS P((char *s)); extern int looking_at P((char *, int *, char *)); extern void SendToProgram P((char *message, ChessProgramState *cps)); extern void SendBoard P((ChessProgramState *cps, int moveNum)); void SendTimeRemaining P((ChessProgramState *cps, int/*boolean*/ machineWhite)); extern char ics_handle[]; extern char *ics_prefix; #endif xboard-4.7.3/nevalgraph.c0000644000175000001440000001110312262415351012211 00000000000000/* * Evaluation graph * * Author: Alessandro Scotti (Dec 2005) * Translated to X by H.G.Muller (Nov 2009) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include "common.h" #include "backend.h" #include "dialogs.h" #include "menus.h" #include "evalgraph.h" #include "draw.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif static char *title = N_("Evaluation graph"); Option *disp; /* Module variables */ static Option *EvalCallback P((int button, int x, int y)); static int initDone = FALSE; static void InitializeEvalGraph (Option *opt, int w, int h) { nWidthPB = w, nHeightPB = h; initDone = TRUE; } // The following stuff is really back-end (but too little to bother with a separate file) static void EvalClick (int x, int y) { int index = GetMoveIndexFromPoint( x, y ); if( index >= 0 && index < currLast ) ToNrEvent( index + 1 ); } static Option graphOptions[] = { { 150, 0x9C, 300, NULL, (void*) &EvalCallback, NULL, NULL, Graph , "" }, { 0, 2, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void DisplayEvalGraph () { // back-end painting; calls back front-end primitives for lines, rectangles and text char *t = MakeEvalTitle(_(title)); nWidthPB = disp->max; nHeightPB = disp->value; if(t != title && nWidthPB < 340) t = MakeEvalTitle(nWidthPB < 240 ? "" : _("Eval")); PaintEvalGraph(); GraphExpose(graphOptions, 0, 0, nWidthPB, nHeightPB); SetDialogTitle(EvalGraphDlg, t); } static Option * EvalCallback (int button, int x, int y) { if(!initDone) return NULL; switch(button) { case 10: // expose event /* Create or recreate paint box if needed */ if(x != nWidthPB || y != nHeightPB) { InitializeEvalGraph(&graphOptions[0], x, y); } nWidthPB = x; nHeightPB = y; DisplayEvalGraph(); break; case 1: EvalClick(x, y); // left button default: break; // other buttons ignored } return NULL; // no context menu! } void EvalGraphPopUp () { if (GenericPopUp(graphOptions, _(title), EvalGraphDlg, BoardWindow, NONMODAL, appData.topLevel)) { InitializeEvalGraph(&graphOptions[0], wpEvalGraph.width, wpEvalGraph.height); // first time: add callbacks and initialize pens disp = graphOptions; } else { SetDialogTitle(EvalGraphDlg, _(title)); SetIconName(EvalGraphDlg, _(title)); } MarkMenu("View.EvaluationGraph", EvalGraphDlg); // ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output } void EvalGraphPopDown () { PopDown(EvalGraphDlg); // ShowThinkingEvent(); // [HGM] thinking: might need to shut off thinking output } Boolean EvalGraphIsUp () { return shellUp[EvalGraphDlg]; } int EvalGraphDialogExists () { return DialogExists(EvalGraphDlg); } void EvalGraphProc () { if (!PopDown(EvalGraphDlg)) EvalGraphPopUp(); } // This function is the interface to the back-end. void EvalGraphSet (int first, int last, int current, ChessProgramStats_Move * pvInfo) { /* [AS] Danger! For now we rely on the pvInfo parameter being a static variable! */ currFirst = first; currLast = last; currCurrent = current; currPvInfo = pvInfo; if( DialogExists(EvalGraphDlg) ) { DisplayEvalGraph(); } } xboard-4.7.3/ABOUT-NLS0000644000175000001440000026713312262415351011165 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. 1.1 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. Installers may use special options at configuration time for changing the default behaviour. The command: ./configure --disable-nls will _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl' library and will decide to use it. If not, you may have to to use the `--with-libintl-prefix' option to tell `configure' where to look for it. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.2 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.3 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.4 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of June 2010. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am an ar as ast az be be@latin bg bn_IN bs ca +--------------------------------------------------+ a2ps | [] [] | aegis | | ant-phone | | anubis | | aspell | [] [] | bash | | bfd | | bibshelf | [] | binutils | | bison | | bison-runtime | [] | bluez-pin | [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] [] | cpio | | cppi | | cpplib | [] | cryptsetup | | dfarc | | dialog | [] [] | dico | | diffutils | [] | dink | | doodle | | e2fsprogs | [] | enscript | [] | exif | | fetchmail | [] | findutils | [] | flex | [] | freedink | | gas | | gawk | [] [] | gcal | [] | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] [] | gettext-tools | [] [] | gip | [] | gjay | | gliv | [] | glunarclock | [] [] | gnubiff | | gnucash | [] | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | | gold | | gpe-aerial | | gpe-beam | | gpe-bluetooth | | gpe-calendar | | gpe-clock | [] | gpe-conf | | gpe-contacts | | gpe-edit | | gpe-filemanager | | gpe-go | | gpe-login | | gpe-ownerinfo | [] | gpe-package | | gpe-sketchbook | | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] | gpe-today | [] | gpe-todo | | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | [] [] | gsasl | | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] [] [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] [] | gutenprint | | hello | [] | help2man | | hylafax | | idutils | | indent | [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | | iso_639 | [] [] [] [] | iso_639_3 | | jwhois | | kbd | | keytouch | [] | keytouch-editor | | keytouch-keyboa... | [] | klavaro | [] | latrine | | ld | [] | leafpad | [] [] | libc | [] [] | libexif | () | libextractor | | libgnutls | | libgpewidget | | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | [] | libidn | | lifelines | | liferea | [] [] | lilypond | | linkdr | [] | lordsawar | | lprng | | lynx | [] | m4 | | mailfromd | | mailutils | | make | | man-db | | man-db-manpages | | minicom | | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | | psmisc | | pspp | [] | pwdutils | | radius | [] | recode | [] [] | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] [] | sed | [] [] | sharutils | [] [] | shishi | | skencil | | solfege | | solfege-manual | | soundtracker | | sp | | sysstat | | tar | [] | texinfo | | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] [] | wyslij-po | | xchat | [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] | +--------------------------------------------------+ af am an ar as ast az be be@latin bg bn_IN bs ca 6 0 1 2 3 19 1 10 3 28 3 1 38 crh cs da de el en en_GB en_ZA eo es et eu fa +-------------------------------------------------+ a2ps | [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] () | anubis | [] [] | aspell | [] [] [] [] [] | bash | [] [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] | bison | [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] [] [] | cflow | [] [] | clisp | [] [] [] [] | coreutils | [] [] [] [] | cpio | | cppi | | cpplib | [] [] [] | cryptsetup | [] | dfarc | [] [] [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] | dink | [] [] [] | doodle | [] | e2fsprogs | [] [] [] | enscript | [] [] [] | exif | () [] [] | fetchmail | [] [] () [] [] [] | findutils | [] [] [] | flex | [] [] | freedink | [] [] [] | gas | [] | gawk | [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] [] | gip | [] [] [] [] | gjay | [] | gliv | [] [] [] | glunarclock | [] [] | gnubiff | () | gnucash | [] () () () () | gnuedu | [] [] | gnulib | [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] | gpe-aerial | [] [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] [] [] | gpe-edit | [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] () [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] | grub | [] [] | gsasl | [] | gss | | gst-plugins-bad | [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] () [] | gtkam | [] [] () [] [] | gtkorphan | [] [] [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] [] [] | hello | [] [] [] [] | help2man | [] | hylafax | [] [] | idutils | [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] [] [] [] () [] [] [] () | iso_3166_2 | () | iso_4217 | [] [] [] () [] [] | iso_639 | [] [] [] [] () [] [] | iso_639_3 | [] | jwhois | [] | kbd | [] [] [] [] [] | keytouch | [] [] | keytouch-editor | [] [] | keytouch-keyboa... | [] | klavaro | [] [] [] [] | latrine | [] () | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | [] [] | libgphoto2 | [] () | libgphoto2_port | [] () [] | libgsasl | | libiconv | [] [] [] [] [] | libidn | [] [] [] | lifelines | [] () | liferea | [] [] [] [] [] | lilypond | [] [] [] | linkdr | [] [] [] | lordsawar | [] | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] [] | man-db | | man-db-manpages | | minicom | [] [] [] [] | mkisofs | | myserver | | nano | [] [] [] | opcodes | [] [] | parted | [] [] | pies | | popt | [] [] [] [] [] | psmisc | [] [] [] | pspp | [] | pwdutils | [] | radius | [] | recode | [] [] [] [] [] [] | rosegarden | () () () | rpm | [] [] [] | rush | | sarg | | screem | | scrollkeeper | [] [] [] [] [] | sed | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | | skencil | [] () [] | solfege | [] [] [] | solfege-manual | [] [] | soundtracker | [] [] [] | sp | [] | sysstat | [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] | tin | [] [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] | vice | () () | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] | wyslij-po | | xchat | [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] [] | +-------------------------------------------------+ crh cs da de el en en_GB en_ZA eo es et eu fa 5 64 105 117 18 1 8 0 28 89 18 19 0 fi fr ga gl gu he hi hr hu hy id is it ja ka kn +----------------------------------------------------+ a2ps | [] [] [] [] | aegis | [] [] | ant-phone | [] [] | anubis | [] [] [] [] | aspell | [] [] [] [] | bash | [] [] [] [] | bfd | [] [] [] | bibshelf | [] [] [] [] [] | binutils | [] [] [] | bison | [] [] [] [] | bison-runtime | [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] | buzztard | [] | cflow | [] [] [] | clisp | [] | coreutils | [] [] [] [] [] | cpio | [] [] [] [] | cppi | [] [] | cpplib | [] [] [] | cryptsetup | [] [] [] | dfarc | [] [] [] | dialog | [] [] [] [] [] [] [] | dico | | diffutils | [] [] [] [] [] [] [] [] [] | dink | [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | exif | [] [] [] [] [] [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] | freedink | [] [] [] | gas | [] [] | gawk | [] [] [] [] () [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] [] [] | gjay | [] | gliv | [] () | glunarclock | [] [] [] [] | gnubiff | () [] () | gnucash | () () () () () [] | gnuedu | [] [] | gnulib | [] [] [] [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gold | [] [] | gpe-aerial | [] [] [] | gpe-beam | [] [] [] [] | gpe-bluetooth | [] [] [] [] | gpe-calendar | [] [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] [] | gpe-go | [] [] [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] | gpe-todo | [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] [] | grep | [] [] | grub | [] [] [] [] | gsasl | [] [] [] [] [] | gss | [] [] [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] [] [] | gtkam | [] [] [] [] [] | gtkorphan | [] [] [] | gtkspell | [] [] [] [] [] [] [] [] [] | gutenprint | [] [] [] [] | hello | [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] | iso_15924 | [] () [] [] | iso_3166 | [] () [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | () [] [] [] | iso_4217 | [] () [] [] [] [] | iso_639 | [] () [] [] [] [] [] [] [] | iso_639_3 | () [] [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] [] [] [] | keytouch-editor | [] [] [] [] [] | keytouch-keyboa... | [] [] [] [] [] | klavaro | [] [] | latrine | [] [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] [] () | libc | [] [] [] [] [] | libexif | [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] [] | libidn | [] [] [] [] | lifelines | () | liferea | [] [] [] [] | lilypond | [] [] | linkdr | [] [] [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] [] [] | m4 | [] [] [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] [] | man-db | [] [] | man-db-manpages | [] | minicom | [] [] [] [] [] | mkisofs | [] [] [] [] | myserver | | nano | [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pies | | popt | [] [] [] [] [] [] [] [] [] | psmisc | [] [] [] | pspp | | pwdutils | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () () () () | rpm | [] [] | rush | | sarg | [] | screem | [] [] | scrollkeeper | [] [] [] [] | sed | [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] | shishi | [] | skencil | [] | solfege | [] [] [] [] | solfege-manual | [] [] | soundtracker | [] [] | sp | [] () | sysstat | [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux-ng | [] [] [] [] [] [] | vice | () () () | vmm | [] | vorbis-tools | [] | wastesedge | () () | wdiff | [] | wget | [] [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] [] | +----------------------------------------------------+ fi fr ga gl gu he hi hr hu hy id is it ja ka kn 105 121 53 20 4 8 3 5 53 2 120 5 84 67 0 4 ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne +-----------------------------------------------+ a2ps | [] | aegis | | ant-phone | | anubis | [] [] | aspell | [] | bash | | bfd | | bibshelf | [] [] | binutils | | bison | [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | bombono-dvd | | buzztard | | cflow | | clisp | | coreutils | [] | cpio | | cppi | | cpplib | | cryptsetup | | dfarc | [] | dialog | [] [] [] [] [] | dico | | diffutils | [] [] | dink | | doodle | | e2fsprogs | | enscript | | exif | [] | fetchmail | | findutils | | flex | | freedink | [] | gas | | gawk | | gcal | | gcc | | gettext-examples | [] [] [] [] | gettext-runtime | [] | gettext-tools | [] | gip | [] [] | gjay | | gliv | | glunarclock | [] | gnubiff | | gnucash | () () () () | gnuedu | | gnulib | | gnunet | | gnunet-gtk | | gnutls | [] | gold | | gpe-aerial | [] | gpe-beam | [] | gpe-bluetooth | [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] | gpe-timesheet | [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | | gramadoir | | grep | | grub | | gsasl | | gss | | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] [] [] | gstreamer | | gtick | | gtkam | [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | | hello | [] [] [] | help2man | | hylafax | | idutils | | indent | | iso_15924 | [] [] | iso_3166 | [] [] () [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] | iso_639 | [] [] | iso_639_3 | [] | jwhois | [] | kbd | | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | klavaro | [] | latrine | [] | ld | | leafpad | [] [] [] | libc | [] | libexif | | libextractor | | libgnutls | [] | libgpewidget | [] [] | libgpg-error | | libgphoto2 | | libgphoto2_port | | libgsasl | | libiconv | | libidn | | lifelines | | liferea | | lilypond | | linkdr | | lordsawar | | lprng | | lynx | | m4 | | mailfromd | | mailutils | | make | [] | man-db | | man-db-manpages | | minicom | [] | mkisofs | | myserver | | nano | [] [] | opcodes | | parted | | pies | | popt | [] [] [] | psmisc | | pspp | | pwdutils | | radius | | recode | | rosegarden | | rpm | | rush | | sarg | | screem | | scrollkeeper | [] [] | sed | | sharutils | | shishi | | skencil | | solfege | [] | solfege-manual | | soundtracker | | sp | | sysstat | [] | tar | [] | texinfo | [] | tin | | unicode-han-tra... | | unicode-transla... | | util-linux-ng | | vice | | vmm | | vorbis-tools | | wastesedge | | wdiff | | wget | [] | wyslij-po | | xchat | [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +-----------------------------------------------+ ko ku ky lg lt lv mk ml mn mr ms mt nb nds ne 20 5 10 1 13 48 4 2 2 4 24 10 20 3 1 nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr +---------------------------------------------------+ a2ps | [] [] [] [] [] [] [] [] | aegis | [] [] [] | ant-phone | [] [] | anubis | [] [] [] | aspell | [] [] [] [] [] | bash | [] [] | bfd | [] | bibshelf | [] [] | binutils | [] [] | bison | [] [] [] | bison-runtime | [] [] [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] | bombono-dvd | [] () | buzztard | [] [] | cflow | [] | clisp | [] [] | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cppi | [] | cpplib | [] | cryptsetup | [] | dfarc | [] | dialog | [] [] [] [] | dico | [] | diffutils | [] [] [] [] [] [] | dink | () | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | exif | [] [] [] () [] | fetchmail | [] [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] [] | freedink | [] [] | gas | | gawk | [] [] [] [] | gcal | | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] | gip | [] [] [] [] [] | gjay | | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] | gnubiff | [] () | gnucash | [] () () () | gnuedu | [] | gnulib | [] [] [] [] | gnunet | | gnunet-gtk | | gnutls | [] [] | gold | | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-bluetooth | [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] [] | gphoto2 | [] [] [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | grub | [] [] [] | gsasl | [] [] [] [] | gss | [] [] [] | gst-plugins-bad | [] [] [] [] [] [] | gst-plugins-base | [] [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] [] [] | gstreamer | [] [] [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] [] [] | gutenprint | [] [] | hello | [] [] [] [] | help2man | [] [] | hylafax | [] | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | [] [] [] [] | iso_3166 | [] [] [] [] [] () [] [] [] [] [] [] [] [] | iso_3166_2 | [] [] [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] [] [] | iso_639_3 | [] [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] [] [] | keytouch-editor | [] [] [] | keytouch-keyboa... | [] [] [] | klavaro | [] [] | latrine | [] [] | ld | | leafpad | [] [] [] [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] () [] | libextractor | | libgnutls | [] [] | libgpewidget | [] [] [] | libgpg-error | [] [] | libgphoto2 | [] [] | libgphoto2_port | [] [] [] [] [] | libgsasl | [] [] [] [] [] | libiconv | [] [] [] [] [] | libidn | [] [] | lifelines | [] [] | liferea | [] [] [] [] [] () () [] | lilypond | [] | linkdr | [] [] [] | lordsawar | | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] | make | [] [] [] [] | man-db | [] [] [] | man-db-manpages | [] [] [] | minicom | [] [] [] [] | mkisofs | [] [] [] | myserver | | nano | [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | pies | [] | popt | [] [] [] [] | psmisc | [] [] [] | pspp | [] [] | pwdutils | [] | radius | [] [] [] | recode | [] [] [] [] [] [] [] [] | rosegarden | () () | rpm | [] [] [] | rush | [] [] | sarg | | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] [] [] [] | solfege-manual | [] [] [] | soundtracker | [] | sp | | sysstat | [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | [] | unicode-han-tra... | | unicode-transla... | | util-linux-ng | [] [] [] [] [] | vice | [] | vmm | [] | vorbis-tools | [] [] | wastesedge | [] | wdiff | [] [] | wget | [] [] [] [] [] [] [] | wyslij-po | [] [] [] | xchat | [] [] [] [] [] [] [] [] [] | xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | +---------------------------------------------------+ nl nn or pa pl ps pt pt_BR ro ru rw sk sl sq sr 135 10 4 7 105 1 29 62 47 91 3 54 46 9 37 sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW +---------------------------------------------------+ a2ps | [] [] [] [] [] | 27 aegis | [] | 9 ant-phone | [] [] [] [] | 9 anubis | [] [] [] [] | 15 aspell | [] [] [] | 20 bash | [] [] [] | 12 bfd | [] | 6 bibshelf | [] [] [] | 16 binutils | [] [] | 8 bison | [] [] | 12 bison-runtime | [] [] [] [] [] [] | 29 bluez-pin | [] [] [] [] [] [] [] [] | 37 bombono-dvd | [] | 4 buzztard | [] | 7 cflow | [] [] [] | 9 clisp | | 10 coreutils | [] [] [] [] | 22 cpio | [] [] [] [] [] [] | 13 cppi | [] [] | 5 cpplib | [] [] [] [] [] [] | 14 cryptsetup | [] [] | 7 dfarc | [] | 9 dialog | [] [] [] [] [] [] [] | 30 dico | [] | 2 diffutils | [] [] [] [] [] [] | 30 dink | | 4 doodle | [] [] | 7 e2fsprogs | [] [] [] | 11 enscript | [] [] [] [] | 17 exif | [] [] [] | 16 fetchmail | [] [] [] | 17 findutils | [] [] [] [] [] | 20 flex | [] [] [] [] | 15 freedink | [] | 10 gas | [] | 4 gawk | [] [] [] [] | 18 gcal | [] [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] [] | 34 gettext-runtime | [] [] [] [] [] [] [] | 29 gettext-tools | [] [] [] [] [] [] | 22 gip | [] [] [] [] | 22 gjay | [] | 3 gliv | [] [] [] | 14 glunarclock | [] [] [] [] [] | 19 gnubiff | [] [] | 4 gnucash | () [] () [] () | 10 gnuedu | [] [] | 7 gnulib | [] [] [] [] | 16 gnunet | [] | 1 gnunet-gtk | [] [] [] | 5 gnutls | [] [] [] | 10 gold | [] | 4 gpe-aerial | [] [] [] | 18 gpe-beam | [] [] [] | 19 gpe-bluetooth | [] [] [] | 13 gpe-calendar | [] [] [] [] | 12 gpe-clock | [] [] [] [] [] | 28 gpe-conf | [] [] [] [] | 20 gpe-contacts | [] [] [] | 17 gpe-edit | [] [] [] | 12 gpe-filemanager | [] [] [] [] | 16 gpe-go | [] [] [] [] [] | 25 gpe-login | [] [] [] | 11 gpe-ownerinfo | [] [] [] [] [] | 25 gpe-package | [] [] [] | 13 gpe-sketchbook | [] [] [] | 20 gpe-su | [] [] [] [] [] | 30 gpe-taskmanager | [] [] [] [] [] | 29 gpe-timesheet | [] [] [] [] [] | 25 gpe-today | [] [] [] [] [] [] | 30 gpe-todo | [] [] [] [] | 17 gphoto2 | [] [] [] [] [] | 24 gprof | [] [] [] | 15 gpsdrive | [] [] [] | 11 gramadoir | [] [] [] | 11 grep | [] [] [] | 10 grub | [] [] [] | 14 gsasl | [] [] [] [] | 14 gss | [] [] [] | 11 gst-plugins-bad | [] [] [] [] | 26 gst-plugins-base | [] [] [] [] [] | 24 gst-plugins-good | [] [] [] [] | 24 gst-plugins-ugly | [] [] [] [] [] | 29 gstreamer | [] [] [] [] | 22 gtick | [] [] [] | 13 gtkam | [] [] [] | 20 gtkorphan | [] [] [] | 14 gtkspell | [] [] [] [] [] [] [] [] [] | 45 gutenprint | [] | 10 hello | [] [] [] [] [] [] | 21 help2man | [] [] | 7 hylafax | [] | 5 idutils | [] [] [] [] | 17 indent | [] [] [] [] [] [] | 30 iso_15924 | () [] () [] [] | 16 iso_3166 | [] [] () [] [] () [] [] [] () | 53 iso_3166_2 | () [] () [] | 9 iso_4217 | [] () [] [] () [] [] | 26 iso_639 | [] [] [] () [] () [] [] [] [] | 38 iso_639_3 | [] () | 8 jwhois | [] [] [] [] [] | 16 kbd | [] [] [] [] [] | 15 keytouch | [] [] [] | 16 keytouch-editor | [] [] [] | 14 keytouch-keyboa... | [] [] [] | 14 klavaro | [] | 11 latrine | [] [] [] | 10 ld | [] [] [] [] | 11 leafpad | [] [] [] [] [] [] | 33 libc | [] [] [] [] [] | 21 libexif | [] () | 7 libextractor | [] | 1 libgnutls | [] [] [] | 9 libgpewidget | [] [] [] | 14 libgpg-error | [] [] [] | 9 libgphoto2 | [] [] | 8 libgphoto2_port | [] [] [] [] | 14 libgsasl | [] [] [] | 13 libiconv | [] [] [] [] | 21 libidn | () [] [] | 11 lifelines | [] | 4 liferea | [] [] [] | 21 lilypond | [] | 7 linkdr | [] [] [] [] [] | 17 lordsawar | | 1 lprng | [] | 3 lynx | [] [] [] [] | 17 m4 | [] [] [] [] | 19 mailfromd | [] [] | 3 mailutils | [] | 5 make | [] [] [] [] | 21 man-db | [] [] [] | 8 man-db-manpages | | 4 minicom | [] [] | 16 mkisofs | [] [] | 9 myserver | | 0 nano | [] [] [] [] | 21 opcodes | [] [] [] | 11 parted | [] [] [] [] [] | 15 pies | [] [] | 3 popt | [] [] [] [] [] [] | 27 psmisc | [] [] | 11 pspp | | 4 pwdutils | [] [] | 6 radius | [] [] | 9 recode | [] [] [] [] | 28 rosegarden | () | 0 rpm | [] [] [] | 11 rush | [] [] | 4 sarg | | 1 screem | [] | 3 scrollkeeper | [] [] [] [] [] | 27 sed | [] [] [] [] [] | 30 sharutils | [] [] [] [] [] | 22 shishi | [] | 3 skencil | [] [] | 7 solfege | [] [] [] [] | 16 solfege-manual | [] | 8 soundtracker | [] [] [] | 9 sp | [] | 3 sysstat | [] [] | 15 tar | [] [] [] [] [] [] | 23 texinfo | [] [] [] [] [] | 17 tin | | 4 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux-ng | [] [] [] [] | 20 vice | () () | 1 vmm | [] | 4 vorbis-tools | [] | 6 wastesedge | | 2 wdiff | [] [] | 7 wget | [] [] [] [] [] | 26 wyslij-po | [] [] | 8 xchat | [] [] [] [] [] [] | 36 xdg-user-dirs | [] [] [] [] [] [] [] [] [] [] | 63 xkeyboard-config | [] [] [] | 22 +---------------------------------------------------+ 85 teams sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW 178 domains 119 1 3 3 0 10 65 51 155 17 98 7 41 2618 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If June 2010 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.5 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. xboard-4.7.3/bitmaps/0000755000175000001440000000000012262562300011436 500000000000000xboard-4.7.3/bitmaps/icon_black.bm0000644000175000001440000000160612262415351013770 00000000000000#define icon_black_width 32 #define icon_black_height 32 static unsigned char icon_black_bits[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, 0x18, 0xff, 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0x18, 0xf3, 0xff, 0x7f, 0x04, 0xcc, 0xff, 0x7f, 0x00, 0x90, 0xff, 0x3f, 0x06, 0x20, 0xff, 0x3f, 0x01, 0x40, 0xfe, 0x3f, 0x01, 0xc0, 0xfe, 0x1f, 0x00, 0x80, 0xfc, 0x1f, 0x00, 0x80, 0xfd, 0x0f, 0x00, 0x01, 0xf9, 0x0f, 0x00, 0x00, 0xfb, 0x07, 0x00, 0x00, 0xfa, 0x07, 0xc0, 0x00, 0xf6, 0x13, 0xf0, 0x00, 0xf6, 0x13, 0x78, 0x00, 0xf6, 0x43, 0x7c, 0x00, 0xf6, 0x03, 0x3e, 0x00, 0xf4, 0x07, 0x1f, 0x00, 0xec, 0xff, 0x0f, 0x00, 0xec, 0xff, 0x07, 0x00, 0xec, 0xff, 0x03, 0x00, 0xec, 0xff, 0x03, 0x00, 0xec, 0xff, 0x01, 0x00, 0xec, 0xff, 0x01, 0x00, 0xe8, 0xff, 0x01, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; xboard-4.7.3/bitmaps/checkmark.bm0000644000175000001440000000035212262415351013631 00000000000000#define checkmark_width 11 #define checkmark_height 11 static unsigned char checkmark_bits[] = { 0x0f, 0x04, 0x0f, 0x02, 0x1e, 0x01, 0x3c, 0x01, 0xb8, 0x00, 0x58, 0x00, 0xe8, 0x00, 0xe4, 0x01, 0xc4, 0x03, 0xc2, 0x03, 0x81, 0x07 }; xboard-4.7.3/bitmaps/icon_white.bm0000644000175000001440000000160612262415351014034 00000000000000#define icon_white_width 32 #define icon_white_height 32 static unsigned char icon_white_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0xe7, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xe7, 0x0c, 0x00, 0x80, 0xfb, 0x33, 0x00, 0x80, 0xff, 0x6f, 0x00, 0xc0, 0xf9, 0xdf, 0x00, 0xc0, 0xfe, 0xbf, 0x01, 0xc0, 0xfe, 0x3f, 0x01, 0xe0, 0xff, 0x7f, 0x03, 0xe0, 0xff, 0x7f, 0x02, 0xf0, 0xff, 0xfe, 0x06, 0xf0, 0xff, 0xff, 0x04, 0xf8, 0xff, 0xff, 0x05, 0xf8, 0x3f, 0xff, 0x09, 0xec, 0x0f, 0xff, 0x09, 0xec, 0x87, 0xff, 0x09, 0xbc, 0x83, 0xff, 0x09, 0xfc, 0xc1, 0xff, 0x0b, 0xf8, 0xe0, 0xff, 0x13, 0x00, 0xf0, 0xff, 0x13, 0x00, 0xf8, 0xff, 0x13, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfc, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x13, 0x00, 0xfe, 0xff, 0x17, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; xboard-4.7.3/xboard.texi0000644000175000001440000057042412262562252012113 00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename xboard.info @settitle XBoard @c %**end of header @include version.texi @ifinfo @format INFO-DIR-SECTION Games START-INFO-DIR-ENTRY * xboard: (xboard). An X Window System graphical chessboard. END-INFO-DIR-ENTRY @end format @end ifinfo @titlepage @title XBoard @page @vskip 0pt plus 1filll @include copyright.texi @end titlepage @ifset man .TH xboard 6 "$Date: " "GNU" .SH NAME .PP xboard @- X graphical user interface for chess .SH SYNOPSIS .PP .B xboard [options] .br .B xboard -ics -icshost hostname [options] .br .B xboard -ncp [options] .br .B |pxboard .br .B cmail [options] @end ifset @node Top @top Introduction @cindex introduction @ifset man .SH DESCRIPTION @end ifset XBoard is a graphical chessboard that can serve as a user interface to chess engines (such as GNU Chess), the Internet Chess Servers, electronic mail correspondence chess, or your own collection of saved games. This manual documents version @value{VERSION} of XBoard. @menu * Major modes:: The main things XBoard can do. * Basic operation:: Mouse and keyboard functions. * Menus:: Menus, buttons, and keys. * Options:: Command options supported by XBoard. * Chess Servers:: Using XBoard with an Internet Chess Server (ICS). * Firewalls:: Connecting to a chess server through a firewall. * Environment:: Environment variables. * Limitations:: Known limitations and/or bugs. * Problems:: How and where to report any problems you run into. * Contributors:: People who have helped developing XBoard. * CMail:: Using XBoard for electronic correspondence chess. * Other programs:: Other programs you can use with XBoard. @ifnottex * Copyright:: Copyright notice for this manual. @end ifnottex * Copying:: The GNU General Public License. * Index:: Index of concepts and symbol names. @end menu @node Major modes @chapter Major modes @cindex Major modes XBoard always runs in one of four major modes. You select the major mode from the command line when you start up XBoard. @table @asis @item xboard [options] As an interface to GNU Chess or another chess engine running on your machine, XBoard lets you play a game against the machine, set up arbitrary positions, force variations, watch a game between two chess engines, interactively analyze your stored games or set up and analyze arbitrary positions. (Note: Not all chess engines support analysis.) @item xboard -ics -icshost hostname [options] As Internet Chess Server (ICS) interface, XBoard lets you play against other ICS users, observe games they are playing, or review games that have recently finished. Most of the ICS "wild" chess variants are supported, including bughouse. @item xboard -ncp [options] XBoard can also be used simply as an electronic chessboard to play through games. It will read and write game files and allow you to play through variations manually. You can use it to browse games off the net or review games you have saved. These features are also available in the other modes. @item |pxboard If you want to pipe games into XBoard, use the supplied shell script @file{pxboard}. For example, from the news reader @file{xrn}, find a message with one or more games in it, click the Save button, and type @samp{|pxboard} as the file name. @item cmail [options] As an interface to electronic mail correspondence chess, XBoard works with the cmail program. See @ref{CMail} below for instructions. @end table @node Basic operation @chapter Basic operation @cindex Basic operation To move a piece, you can drag it with the left mouse button, or you can click the left mouse button once on the piece, then once more on the destination square. In crazyhouse, bughouse or shogi you can drag and drop pieces to the board from the holdings squares displayed next to the board. Old behavior, where right-clicking a square brings up a menu where you can select what piece to drop on it can still be selected through the @samp{Drop Menu} option. Only in Edit Position mode right and middle clicking a square is still used to put a piece on it, and the piece to drop is selected by sweeping the mouse vertically with the button held down. The default function of the right mouse button in other modes is to display the position the chess program thinks it will end up in. While moving the mouse vertically with this button pressed XBoard will step through the principal variation to show how this position will be reached. Lines of play displayed in the engine-output window, or PGN variations in the comment window can similarly be played out on the board, by right-clicking on them. Only in Analysis mode, when you walk along a PV, releasing the mouse button will forward the game upto that point, like you entered all previous PV moves. As the display of the PV in that case starts after the first move a simple right-click will play the move the engine indicates. In Analysis mode you can also make a move by grabbing the piece with a double-click of the left mouse button (or while keeping the Ctrl key pressed). In this case the move you enter will not be played, but will be excluded from the analysis of the current position. (Or included if it was already excluded; it is a toggle.) This only works for engines that support this feature. When connected to an ICS, it is possible to call up a graphical representation of players seeking a game in stead of the chess board, when the latter is not in use (i.e. when you are not playing or observing). Left-clicking the display area will switch between this 'seek graph' and the chess board. Hovering the mouse pointer over a dot will show the details of the seek ad in the message field above the board. Left-clicking the dot will challenge that player. Right-clicking a dot will 'push it to the back', to reveal any dots that were hidden behind it. Right-clicking off dots will refresh the graph. Most other XBoard commands are available from the menu bar. The most frequently used commands also have shortcut keys or on-screen buttons. These shortcut keystrokes are mostly non-printable characters. Typing a letter or digit while the board window has focus will bring up a type-in box with the typed letter already in it. You can use that to type a move in siuations where it is your turn to enter a move, type a move number to call up the position after that move in the display, or, in Edit Position mode, type a FEN. Some rarely used parameters can only be set through options on the command line used to invoke XBoard. XBoard uses a settings file, in which it can remember any changes to the settings that are made through menus or command-line options, so they will still apply when you restart XBoard for another session. The settings can be saved into this file automatically when XBoard exits, or on explicit request of the user. The default name for the settings file is /etc/xboard/xboard.conf, but in a standard install this file is only used as a master settings file that determines the system-wide default settings, and defers reading and writing of user settings to a user-specific file like ~/.xboardrc in the user's home directory. When XBoard is iconized, its graphical icon is a white knight if it is White's turn to move, a black knight if it is Black's turn. @node Menus @chapter Menus, buttons, and keys @cindex Menus @menu * File Menu:: Accessing external games and positions. * Edit Menu:: Altering games, positions, PGN tags or comments. * View Menu:: Controlling XBoard's shape and looks. * Mode Menu:: Selecting XBoard's mode. * Action Menu:: Talking to the chess engine or ICS opponents. * Engine Menu:: Controlling settings and actions of the engine(s). * Options Menu:: User preferences. * Help Menu:: Getting help. * Keys:: Other shortcut keys. @end menu @node File Menu @section File Menu @cindex File Menu @cindex Menu, File @table @asis @item New Game @cindex New Game, Menu Item Resets XBoard and the chess engine to the beginning of a new chess game. The @kbd{Ctrl-N} key is a keyboard equivalent. In Internet Chess Server mode, clears the current state of XBoard, then resynchronizes with the ICS by sending a refresh command. If you want to stop playing, observing, or examining an ICS game, use an appropriate command from the Action menu, not @samp{New Game}. @xref{Action Menu}. @item New Shuffle Game @cindex New Shuffle Game, Menu Item Similar to @samp{New Game}, but allows you to specify a particular initial position (according to a standardized numbering system) in chess variants which use randomized opening positions (e.g. Chess960). You can also press the @samp{Pick Fixed} button to let XBoard generate a random number for you. The thus selected opening position will then persistently be chosen on any following New Game command until you use this menu to select another. Selecting position number -1 (or pushing the @samp{Randomize} button) will produce a newly randomized position on any new game. Using this menu item in variants that normally do not shuffle their opening position does cause these variants to become shuffle variants until you use the @samp{New Shuffle Game} menu to explicitly switch the randomization off, or select a new variant. @item New Variant @cindex New variant, Menu Item Allows you to select a new chess variant in non-ICS mode. (In ICS play, the ICS is responsible for deciding which variant will be played, and XBoard adapts automatically.) The shifted @kbd{Alt+V} key is a keyboard equivalent. If you play with an engine, the engine must be able to play the selected variant, or the command will be ignored. XBoard supports all major variants, such as xiangqi, shogi, chess, chess960, Capablanca Chess, shatranj, crazyhouse, bughouse. But not every board size has built-in bitmaps for un-orthodox pieces! Only sizes bulky (72) and middling (49) have all pieces, while size petite (33) has most. These sizes would have to be set at startup through the @code{size} command-line option when you start up XBoard for such variants to be playable. You can overrule the default board format of the selected variant, (e.g. to play suicide chess on a 6 x 6 board), in this dialog, but normally you would not do that, and leave them at '-1', which means 'default'. @item Load Game @cindex Load Game, Menu Item Plays a game from a record file. The @kbd{Ctrl-O} key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the file contains more than one game, a second pop-up dialog displays a list of games (with information drawn from their PGN tags, if any), and you can select the one you want. Alternatively, you can load the Nth game in the file directly, by typing the number @kbd{N} after the file name, separated by a space. The game file parser will accept PGN (portable game notation), or in fact almost any file that contains moves in algebraic notation. Notation of the form @samp{P@@f7} is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. If the file includes a PGN position (FEN tag), or an old-style XBoard position diagram bracketed by @samp{[--} and @samp{--]} before the first move, the game starts from that position. Text enclosed in parentheses, square brackets, or curly braces is assumed to be commentary and is displayed in a pop-up window. Any other text in the file is ignored. PGN variations (enclosed in parentheses) also are treated as comments; however, if you rights-click them in the comment window, XBoard will shelve the current line, and load the the selected variation, so you can step through it. You can later revert to the previous line with the @samp{Revert} command. This way you can walk quite complex varation trees with XBoard. The nonstandard PGN tag [Variant "varname"] functions similarly to the -variant command-line option (see below), allowing games in certain chess variants to be loaded. Note that it must appear before any FEN tag for XBoard to recognize variant FENs appropriately. There is also a heuristic to recognize chess variants from the Event tag, by looking for the strings that the Internet Chess Servers put there when saving variant ("wild") games. @item Load Position @cindex Load Position, Menu Item Sets up a position from a position file. A pop-up dialog prompts you for the file name. The shifted @kbd{Ctrl-O} key is a keyboard equivalent. If the file contains more than one saved position, and you want to load the Nth one, type the number N after the file name, separated by a space. Position files must be in FEN (Forsythe-Edwards notation), or in the format that the Save Position command writes when oldSaveStyle is turned on. @item Load Next Position @cindex Load Next Position, Menu Item Loads the next position from the last position file you loaded. The shifted @kbd{PgDn} key is a keyboard equivalent. @item Load Previous Position @cindex Load Previous Position, Menu Item Loads the previous position from the last position file you loaded. The shifted @kbd{PgUp} key is a keyboard equivalent. Not available if the last position was loaded from a pipe. @item Save Game @cindex Save Game, Menu Item Appends a record of the current game to a file. The @kbd{Ctrl-S} key is a keyboard equivalent. A pop-up dialog prompts you for the file name. If the game did not begin with the standard starting position, the game file includes the starting position used. Games are saved in the PGN (portable game notation) format, unless the oldSaveStyle option is true, in which case they are saved in an older format that is specific to XBoard. Both formats are human-readable, and both can be read back by the @samp{Load Game} command. Notation of the form @samp{P@@f7} is accepted for piece-drops in bughouse games; this is a nonstandard extension to PGN. @item Save Position @cindex Save Position, Menu Item Appends a diagram of the current position to a file. The shifted @kbd{Ctrl+S} key is a keyboard equivalent. A pop-up dialog prompts you for the file name. Positions are saved in FEN (Forsythe-Edwards notation) format unless the @code{oldSaveStyle} option is true, in which case they are saved in an older, human-readable format that is specific to XBoard. Both formats can be read back by the @samp{Load Position} command. @item Save Games as Book @cindex Save Games as Book, Menu Item Creates an opening book from the currently loaded game file. The book will be saved on the file specified in the @samp{Common Engine} options dialog. The value of @samp{Book Depth} specified in that same dialog will be used to determine how many moves of each game will be added to the internal book buffer. This command can take a long time to process, and the size of the buffer is currently limited. At the end the buffer will be saved as a Polyglot book, but the buffer will ot be cleared, so that you can continue adding games from other game files. @item Mail Move @itemx Reload CMail Message @cindex Mail Move, Menu Item @cindex Reload CMail Message, Menu Item See @ref{CMail}. @item Exit @cindex Exit, Menu Item Exits from XBoard. The @kbd{Ctrl-Q} key is a keyboard equivalent. @end table @node Edit Menu @section Edit Menu @cindex Menu, Edit @cindex Edit Menu @table @asis @item Copy Game @cindex Copy Game, Menu Item Copies a record of the current game to an internal clipboard in PGN format and sets the X selection to the game text. The @kbd{Ctrl-C} key is a keyboard equivalent. The game can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Game command. @item Copy Position @cindex Copy Position, Menu Item Copies the current position to an internal clipboard in FEN format and sets the X selection to the position text. The shifted @kbd{Ctrl-C} key is a keyboard equivalent. The position can be pasted to another application (such as a text editor or another copy of XBoard) using that application's paste command. In many X applications, such as xterm and emacs, the middle mouse button can be used for pasting; in XBoard, you must use the Paste Position command. @item Copy Game List @cindex Copy Game List, Menu Item Copies the current game list to the clipboard, and sets the X selection to this text. A format of comma-separated double-quoted strings is used, including all tags, so it can be easily imported into spread-sheet programs. @item Paste Game @cindex Paste Game, Menu Item Interprets the current X selection as a game record and loads it, as with Load Game. The @kbd{Ctrl-V} key is a keyboard equivalent. @item Paste Position @cindex Paste Position, Menu Item Interprets the current X selection as a FEN position and loads it, as with Load Position. The shifted @kbd{Ctrl-V} key is a keyboard equivalent. @item Edit Game @cindex Edit Game, Menu Item Allows you to make moves for both Black and White, and to change moves after backing up with the @samp{Backward} command. The clocks do not run. The @kbd{Ctrl-E} key is a keyboard equivalent. In chess engine mode, the chess engine continues to check moves for legality but does not participate in the game. You can bring the chess engine into the game by selecting @samp{Machine White}, @samp{Machine Black}, or @samp{Two Machines}. In ICS mode, the moves are not sent to the ICS: @samp{Edit Game} takes XBoard out of ICS Client mode and lets you edit games locally. If you want to edit games on ICS in a way that other ICS users can see, use the ICS @kbd{examine} command or start an ICS match against yourself. @item Edit Position @cindex Edit Position, Menu Item Lets you set up an arbitrary board position. The shifted @kbd{Ctrl-E} key is a keyboard equivalent. Use mouse button 1 to drag pieces to new squares, or to delete a piece by dragging it off the board or dragging an empty square on top of it. To drop a new piece on a square, press mouse button 2 or 3 over the square. This puts a white or black pawn in the square, respectively, but you can change that to any other piece type by dragging the mouse down before you release the button. You will then see the piece on the originally clicked square cycle through the available pieces (including those of opposite color), and can release the button when you see the piece you want. To alter the side to move, you can click the clock (the words White and Black above the board) of the side you want to give the move to. To clear the board you can click the clock of the side that alread has the move (which is highlighted in black). The old behavior with a piece menu can still be configured with the aid of the @code{pieceMenu} option. Selecting @samp{Edit Position} causes XBoard to discard all remembered moves in the current game. In ICS mode, changes made to the position by @samp{Edit Position} are not sent to the ICS: @samp{Edit Position} takes XBoard out of @samp{ICS Client} mode and lets you edit positions locally. If you want to edit positions on ICS in a way that other ICS users can see, use the ICS @kbd{examine} command, or start an ICS match against yourself. (See also the ICS Client topic above.) @item Edit Tags @cindex Edit Tags, Menu Item Lets you edit the PGN (portable game notation) tags for the current game. After editing, the tags must still conform to the PGN tag syntax: @example ::= ::= [ ] ::= ::= @end example @noindent See the PGN Standard for full details. Here is an example: @example [Event "Portoroz Interzonal"] [Site "Portoroz, Yugoslavia"] [Date "1958.08.16"] [Round "8"] [White "Robert J. Fischer"] [Black "Bent Larsen"] [Result "1-0"] @end example @noindent Any characters that do not match this syntax are silently ignored. Note that the PGN standard requires all games to have at least the seven tags shown above. Any that you omit will be filled in by XBoard with @samp{?} (unknown value), or @samp{-} (inapplicable value). @item Edit Comment @cindex Edit Comment, Menu Item Adds or modifies a comment on the current position. Comments are saved by @samp{Save Game} and are displayed by @samp{Load Game}, PGN variations will also be printed in this window, and can be promoted to main line by right-clicking them. @samp{Forward}, and @samp{Backward}. @item Edit Book @cindex Edit Book, Menu Item Pops up a window listing the moves available in the GUI book (specified in the @samp{Common Engine Settings} dialog) from the currently displayed position, together with their weights and (optionally in braces) learn info. You can then edit this list, and the new list will be stored back into the book when you press OK. Note that the listed percentages are neither used, nor updated when you change the weights; they are just there as an optical aid. @item Revert @itemx Annotate @cindex Revert, Menu Item @cindex Annotate, Menu Item If you are examining an ICS game and Pause mode is off, Revert issues the ICS command @samp{revert}. In local mode, when you were editing or analyzing a game, and the @code{-variations} command-line option is switched on, you can start a new variation by holding the Shift key down while entering a move not at the end of the game. Variations can also become the currently displayed line by clicking a PGN variation displayed in the Comment window. This can be applied recursively, so that you can analyze variations on variations; each time you create a new variation by entering an alternative move with Shift pressed, or select a new one from the Comment window, the current variation will be shelved. @samp{Revert} allows you to return to the most recently shelved variation. The difference between @samp{Revert} and @samp{Annotate} is that with the latter, the variation you are now abandoning will be added as a comment (in PGN variation syntax, i.e. between parentheses) to the original move where you deviated, for later recalling. The @kbd{Home} key is a keyboard equivalent to @samp{Revert}. @item Truncate Game @cindex Truncate Game, Menu Item Discards all remembered moves of the game beyond the current position. Puts XBoard into @samp{Edit Game} mode if it was not there already. The @kbd{End} key is a keyboard equivalent. @item Backward @cindex Backward, Menu Item @cindex <, Button Steps backward through a series of remembered moves. The @samp{[<]} button and the @kbd{Alt+LeftArrow} key are equivalents, as is turning the mouse wheel towards you. In addition, pressing the Control key steps back one move, and releasing it steps forward again. In most modes, @samp{Backward} only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a chess engine, playing or observing a game on an ICS, or loading a game. If you select @samp{Backward} in any of these situations, you will not be allowed to make a different move. Use @samp{Retract Move} or @samp{Edit Game} if you want to change past moves. If you are examining an ICS game, the behavior of @samp{Backward} depends on whether XBoard is in Pause mode. If Pause mode is off, @samp{Backward} issues the ICS backward command, which backs up everyone's view of the game and allows you to make a different move. If Pause mode is on, @samp{Backward} only backs up your local view. @item Forward @cindex Forward, Menu Item @cindex >, Button Steps forward through a series of remembered moves (undoing the effect of @samp{Backward}) or forward through a game file. The @samp{[>]} button and the @kbd{Alt+RightArrow} key are equivalents, as is turning the mouse wheel away from you. If you are examining an ICS game, the behavior of Forward depends on whether XBoard is in Pause mode. If Pause mode is off, @samp{Forward} issues the ICS forward command, which moves everyone's view of the game forward along the current line. If Pause mode is on, @samp{Forward} only moves your local view forward, and it will not go past the position that the game was in when you paused. @item Back to Start @cindex Back to Start, Menu Item @cindex <<, Button Jumps backward to the first remembered position in the game. The @samp{[<<]} button and the @kbd{Alt+Home} key are equivalents. In most modes, Back to Start only lets you look back at old positions; it does not retract moves. This is the case if you are playing against a local chess engine, playing or observing a game on a chess server, or loading a game. If you select @samp{Back to Start} in any of these situations, you will not be allowed to make different moves. Use @samp{Retract Move} or @samp{Edit Game} if you want to change past moves; or use Reset to start a new game. If you are examining an ICS game, the behavior of @samp{Back to Start} depends on whether XBoard is in Pause mode. If Pause mode is off, @samp{Back to Start} issues the ICS @samp{backward 999999} command, which backs up everyone's view of the game to the start and allows you to make different moves. If Pause mode is on, @samp{Back to Start} only backs up your local view. @item Forward to End @cindex Forward to End, Menu Item @cindex >>, Button Jumps forward to the last remembered position in the game. The @samp{[>>]} button and the @kbd{Alt+End} key are equivalents. If you are examining an ICS game, the behavior of @samp{Forward to End} depends on whether XBoard is in Pause mode. If Pause mode is off, @samp{Forward to End} issues the ICS @samp{forward 999999} command, which moves everyone's view of the game forward to the end of the current line. If Pause mode is on, @samp{Forward to End} only moves your local view forward, and it will not go past the position that the game was in when you paused. @end table @node View Menu @section View Menu @cindex Menu, View @cindex View Menu @table @asis @item Flip View @cindex Flip View, Menu Item Inverts your view of the chess board for the duration of the current game. Starting a new game returns the board to normal. The @kbd{F2} key is a keyboard equivalent. @item Show Engine Output @cindex Show Engine Output, Menu Item Shows or hides a window in which the thinking output of any loaded engines is displayed. The shifted @kbd{Alt+O} key is a keyboard equivalent. XBoard will display lines of thinking output of the same depth ordered by score, (highest score on top), rather than in the order the engine produced them. Usually this amounts to the same, as a normal engine search will only find new PV (and emit it as thinking output) when it searches a move with a higher score than the previous variation. But when the engine is in multi-variation mode this needs not always be true, and it is more convenient for someone analyzing games to see the moves sorted by score. The order in which the engine found them is only of interest to the engine author, and can still be deduced from the time or node count printed with the line. Right-clicking a line in this window, and then moving the mouse vertically with the right button kept down, will make XBoard play through the PV listed there. The use of the board window as 'variation board' will normally end when you release the right button, or when the opponent plays a move. But beware: in Analysis mode, moves thus played out will be added to the game. The Engine-Output pane for each engine will contain a header displaying the multi-PV status and a list of excluded moves in Analysis mode, which are also responsive to right-clicking. @item Show Move History @cindex Show Move History, Menu Item Shows or hides a list of moves of the current game. The shifted @kbd{Alt+H} key is a keyboard equivalent. This list allows you to move the display to any earlier position in the game by clicking on the corresponding move. @item Show Evaluation Graph @cindex Show Evaluation Graph, Menu Item Shows or hides a window which displays a graph of how the engine score(s) evolved as a function of the move number. The shifted @kbd{Alt+E} key is a keyboard equivalent. Clicking on the graph will bring the corresponding position in the board display. @item Show Game List @cindex Show Game List, Menu Item Shows or hides the list of games generated by the last @samp{Load Game} command. The shifted @kbd{Alt+G} key is a keyboard equivalent. @item Tags @cindex Tags, Menu Item Pops up a window which shows the PGN (portable game notation) tags for the current game. For now this is a duplicate of the @samp{Edit Tags} item in the @samp{Edit} menu. @item Comments @cindex Comments, Menu Item Pops up a window which shows any comments to or variations on the current move. For now this is a duplicate of the @samp{Edit Comment} item in the @samp{Edit} menu. @item ICS Input Box @cindex ICS Input Box, Menu Item If this option is set in ICS mode, XBoard creates an extra window that you can use for typing in ICS commands. The input box is especially useful if you want to type in something long or do some editing on your input, because output from ICS doesn't get mixed in with your typing as it would in the main terminal window. @item Open Chat Window @cindex Open Chat Window, Menu Item This menu item opens a window in which you can conduct upto 5 chats with other ICS users (or channels). To use the window, write the name of your chat partner, the channel number, or the words 'shouts', 'whispers', 'cshouts' in the upper field (closing with ). Everything you type in the lowest field will then automatically be sent to the mentioned party, while everything that party sends to you will appear in the central text box, rather than appear in the ICS console. The row of buttons allow you to choose between chat; to start a new chat, just select an empty button, and complete the @samp{Chat partner} field. @item Board @cindex Board, Menu Item Summons a dialog where you can customize the look of the chess board. Here you can specify the directory from which piece images should be taken, when you don't want to use the built-in piece images (see @code{pieceImageDirectory} option), external images to be used for the board squares (@code{liteBackTextureFile} and @code{darkBackTextureFile} options), and square and piece colors for the default pieces. @item Game List Tags @cindex Game List Tags, Menu Item a duplicate of the Game List dialog in the Options menu. @end table @node Mode Menu @section Mode Menu @cindex Menu, Mode @cindex Mode Menu @table @asis @item Machine White @cindex Machine White, Menu Item Tells the chess engine to play White. The @kbd{Ctrl-W} key is a keyboard equivalent. @item Machine Black @cindex Machine Black, Menu Item Tells the chess engine to play Black. The @kbd{Ctrl-B} key is a keyboard equivalent. @item Two Machines @cindex Two Machines, Menu Item Plays a game between two chess engines. The @kbd{Ctrl-T} key is a keyboard equivalent. @item Analysis Mode @cindex Analysis Mode, Menu Item @cindex null move XBoard tells the chess engine to start analyzing the current game/position and shows you the analysis as you move pieces around. The @kbd{Ctrl-A} key is a keyboard equivalent. Note: Some chess engines do not support Analysis mode. To set up a position to analyze, you do the following: 1. Select Edit Position from the Mode Menu 2. Set up the position. Use the middle and right buttons to bring up the white and black piece menus. 3. When you are finished, click on either the Black or White clock to tell XBoard which side moves first. 4. Select Analysis Mode from the Mode Menu to start the analysis. You can now play legal moves to create follow-up positions for the engine to analyze, while the moves will be remembered as a stored game, and then step backward through this game to take the moves back. Note that you can also click on the clocks to set the opposite side to move (adding a so-called @samp{null move} to the game). You can also tell the engine to exclude some moves from analysis. (Engines that do not support the exclude-moves feature will ignore this, however.) The general way to do this is to play the move you want to exclude starting with a double click on the piece. When you use drag-drop moving, the piece you grab with a double click will also remain on its square, to show you that you are not really making the move, but just forbid it from the current position. Playing a thus excluded move a second time will include it again. Excluded moves will be listed as text in a header line in the Engine Output window, and you can also re-include them by right-clicking them there. This header line will also contain the words 'best' and 'tail'; right-clicking those will exclude the currently best move, or all moves not explicitly listed in the header line. Once you leave the current position all memory of excluded moves will be lost when you return there. Selecting this menu item while already in @samp{Analysis Mode} will toggle the participation of the second engine in the analysis. The output of this engine will then be shown in the lower pane of the Engine Output window. The analysis function can also be used when observing games on an ICS with an engine loaded (zippy mode); the engine then will analyse the positions as they occur in the observed game. @item Analyze Game @cindex Analyze Game, Menu Item This option subjects the currently loaded game to automatic analysis by the loaded engine. The @kbd{Ctrl-G} key is a keyboard equivalent. XBoard will start auto-playing the game from the currently displayed position, while the engine is analyzing the current position. The game will be annotated with the results of these analyses. In particlar, the score and depth will be added as a comment, and the PV will be added as a variation. Normally the analysis would stop after reaching the end of the game. But when a game is loaded from a multi-game file while @samp{Analyze Game} was already switched on, the analysis will continue with the next game in the file until the end of the file is reached (or you switch to another mode). The time the engine spends on analyzing each move can be controlled through the command-line option @samp{-timeDelay}, which can also be set from the @samp{Load Game Options} menu dialog. Note: Some chess engines do not support Analysis mode. @item Edit Game Duplicate of the item in the Edit menu. Note that @samp{Edit Game} is the idle mode of XBoard, and can be used to get you out of other modes. E.g. to stop analyzing, stop a game between two engines or stop editing a position. @item Edit Position Duplicate of the item in the Edit menu. @item Training @cindex Training, Menu Item Training mode lets you interactively guess the moves of a game for one of the players. You guess the next move of the game by playing the move on the board. If the move played matches the next move of the game, the move is accepted and the opponent's response is auto-played. If the move played is incorrect, an error message is displayed. You can select this mode only while loading a game (that is, after selecting @samp{Load Game} from the File menu). While XBoard is in @samp{Training} mode, the navigation buttons are disabled. @item ICS Client @cindex ICS Client, Menu Item This is the normal mode when XBoard is connected to a chess server. If you have moved into Edit Game or Edit Position mode, you can select this option to get out. To use xboard in ICS mode, run it in the foreground with the -ics option, and use the terminal you started it from to type commands and receive text responses from the chess server. See @ref{Chess Servers} below for more information. XBoard activates some special position/game editing features when you use the @kbd{examine} or @kbd{bsetup} commands on ICS and you have @samp{ICS Client} selected on the Mode menu. First, you can issue the ICS position-editing commands with the mouse. Move pieces by dragging with mouse button 1. To drop a new piece on a square, press mouse button 2 or 3 over the square. This brings up a menu of white pieces (button 2) or black pieces (button 3). Additional menu choices let you empty the square or clear the board. Click on the White or Black clock to set the side to play. You cannot set the side to play or drag pieces to arbitrary squares while examining on ICC, but you can do so in @kbd{bsetup} mode on FICS. In addition, the menu commands @samp{Forward}, @samp{Backward}, @samp{Pause}, and @samp{Stop Examining} have special functions in this mode; see below. @item Machine Match @cindex Machine match, Menu Item Starts a match between two chess programs, with a number of games and other parameters set through the @samp{Match Options} menu dialog. When a match is already running, selecting this item will make XBoard drop out of match mode after the current game finishes. @item Pause @cindex Pause, Menu Item Pauses updates to the board, and if you are playing against a chess engine, also pauses your clock. To continue, select @samp{Pause} again, and the display will automatically update to the latest position. The @samp{P} button and keyboard @kbd{Pause} key are equivalents. If you select Pause when you are playing against a chess engine and it is not your move, the chess engine's clock will continue to run and it will eventually make a move, at which point both clocks will stop. Since board updates are paused, however, you will not see the move until you exit from Pause mode (or select Forward). This behavior is meant to simulate adjournment with a sealed move. If you select Pause while you are observing or examining a game on a chess server, you can step backward and forward in the current history of the examined game without affecting the other observers and examiners, and without having your display jump forward to the latest position each time a move is made. Select Pause again to reconnect yourself to the current state of the game on ICS. If you select @samp{Pause} while you are loading a game, the game stops loading. You can load more moves manually by selecting @samp{Forward}, or resume automatic loading by selecting @samp{Pause} again. @end table @node Action Menu @section Action Menu @cindex Menu, Action @cindex Action, Menu @table @asis @item Accept @cindex Accept, Menu Item Accepts a pending match offer. The @kbd{F3} key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. @item Decline @cindex Decline, Menu Item Declines a pending offer (match, draw, adjourn, etc.). The @kbd{F4} key is a keyboard equivalent. If there is more than one offer pending, you will have to type in a more specific command instead of using this menu choice. @item Call Flag @cindex Call Flag, Menu Item Calls your opponent's flag, claiming a win on time, or claiming a draw if you are both out of time. The @kbd{F5} key is a keyboard equivalent. You can also call your opponent's flag by clicking on his clock. @item Draw @cindex Draw, Menu Item Offers a draw to your opponent, accepts a pending draw offer from your opponent, or claims a draw by repetition or the 50-move rule, as appropriate. The @kbd{F6} key is a keyboard equivalent. @item Adjourn @cindex Adjourn, Menu Item Asks your opponent to agree to adjourning the current game, or agrees to a pending adjournment offer from your opponent. The @kbd{F7} key is a keyboard equivalent. @item Abort @cindex Abort, Menu Item Asks your opponent to agree to aborting the current game, or agrees to a pending abort offer from your opponent. The @kbd{F8} key is a keyboard equivalent. An aborted game ends immediately without affecting either player's rating. @item Resign @cindex Resign, Menu Item Resigns the game to your opponent. The @kbd{F9} key is a keyboard equivalent. @item Stop Observing @cindex Stop Observing, Menu Item Ends your participation in observing a game, by issuing the ICS observe command with no arguments. ICS mode only. The @kbd{F10} key is a keyboard equivalent. @item Stop Examining @cindex Stop Examining, Menu Item Ends your participation in examining a game, by issuing the ICS unexamine command. ICS mode only. The @kbd{F11} key is a keyboard equivalent. @item Upload to Examine @cindex Upload to Examine, Menu Item Create an examined game of the proper variant on the ICS, and send the game there that is currenty loaded in XBoard (e.g. through pasting or loading from file). You must be connected to an ICS for this to work. @item Adjudicate to White @itemx Adjudicate to Black @itemx Adjudicate Draw @cindex Adjudicate to White, Menu Item @cindex Adjudicate to Black, Menu Item @cindex Adjudicate Draw, Menu Item Terminate an ongoing game in Two-Machines mode (including match mode), with as result a win for white, for black, or a draw, respectively. The PGN file of the game will accompany the result string by the comment "user adjudication". @end table @node Engine Menu @section Engine Menu @cindex Engine Menu @cindex Menu, Engine @table @asis @item Load Engine @cindex Load Engine, Menu Item Pops up a dialog where you can select or specify an engine to be loaded. You will always have to indicate whether you want to load the engine as first or second engine, through the ‘Load menitioned engine as’ drop-down list at the bottom of the dialog. You can even replace engines during a game, without disturbing that game. (Beware that after loading an engine, XBoard will always be in Edit Game mode, so you will have to tell the new engine what to do before it does anything!) When you select an already installed engine from the ‘Select Engine from List’ drop-down list, all other fields of the dialog will be ignored. In other cases, you have to specify the engine executable, possible arguments on the engine command line (if the engine docs say the engine needs any), and the directory where the engine should look for its files (if this cannot be deduced automatically from the specification of the engine executable). You will also have to specify (with the aid of checkboxes) if the engine is UCI. If ‘Add this engine to the list’ is ticked (which it is by default), the engine will be added to the list of installed engines in your settings file, (provided you save the settings!), so that next time you can select it from the drop-down list. You can also specify a ‘nickname’, under which the engine will then appear in that drop-down list, and even choose to use that nickname for it in PGN files for engine-engine games. The info you supply with the checkboxes whether the engine should use GUI book, or (for variant engines) automatically switch to the current variant when loaded, will also be included in the list. For obsolete XBoard engines, which would normally take a long delay to load because XBoard is waiting for a response they will not give, you can tick ‘WB protocol v1’ to speed up the loading process. @item Engine #N Settings @cindex Engine Settings, Menu Item @cindex Engine #1 Settings, Menu Item @cindex Engine #2 Settings, Menu Item Pop up a menu dialog to alter the settings specific to the applicable engine. (The second engine is only accessible once it has been used in Two-Machines mode.) For each parameter the engine allows to be set, a control element will appear in this dialog that can be used to alter the value. Depending on the type of parameter (text string, number, multiple choice, on/off switch, instantaneous signal) the appropriate control will appear, with a description next to it. XBoard has no idea what these values mean; it just passes them on to the engine. How this dialog looks is completely determined by the engine, and XBoard just passes it on to the user. Many engines do not have any parameters that can be set by the user, and in that case the dialog will be empty (except for the OK and cancel buttons). UCI engines usually have many parameters. (But these are only visible with a sufficiently modern version of the Polyglot adapter needed to run UCI engines, e.g. Polyglot 1.4.55b.) For native XBoard engines this is less common. @item Hint @cindex Hint, Menu Item Displays a move hint from the chess engine. @item Book @cindex Book, Menu Item Displays a list of possible moves from the chess engine's opening book. The exact format depends on what chess engine you are using. With GNU Chess 4, the first column gives moves, the second column gives one possible response for each move, and the third column shows the number of lines in the book that include the move from the first column. If you select this option and nothing happens, the chess engine is out of its book or does not support this feature. @item Move Now @cindex Move Now, Menu Item Forces the chess engine to move immediately. Chess engine mode only. The @kbd{Ctrl-M} key is a keyboard equivalent. @item Retract Move @cindex Retract Move, Menu Item Retracts your last move. In chess engine mode, you can do this only after the chess engine has replied to your move; if the chess engine is still thinking, use @samp{Move Now} first. In ICS mode, @samp{Retract Move} issues the command @samp{takeback 1} or @samp{takeback 2} depending on whether it is your opponent's move or yours. The @kbd{Ctrl-X} key is a keyboard equivalent. @item Recently Used Engines @cindex Recently Used Engines, In Menu At the bottom of the engine menu there can be a list of names of engines that you recently loaded through the Load Engine menu dialog in previous sessions. Clicking on such a name will load that engine as first engine, so you won't have to search for it in your list of installed engines, if that is very long. The maximum number of displayed engine names is set by the @code{recentEngines}command-line option. @end table @node Options Menu @section Options Menu @cindex Menu, Options @cindex Options Menu @subsection General Options @cindex General Options, Menu Item The following items to set option values appear in the dialog summoned by the general Options menu item. @table @asis @item Absolute Analysis Scores @cindex Absolute Analysis Scores, Menu Item Controls if scores on the Engine Output window during analysis will be printed from the white or the side-to-move point-of-view. @item Almost Always Queen @cindex Almost Always Queen, Menu Item If this option is on, 7th-rank pawns automatically change into Queens when you pick them up, and when you drag them to the promotion square and release them there, they will promote to that. But when you drag such a pawn backwards first, its identity will start to cycle through the other available pieces. This will continue until you start to move it forward; at which point the identity of the piece will be fixed, so that you can safely put it down on the promotion square. If this option is off, what happens depends on the option @code{alwaysPromoteToQueen}, which would force promotion to Queen when true. Otherwise XBoard would bring up a dialog box whenever you move a pawn to the last rank, asking what piece you want to promote to. @item Animate Dragging @cindex Animate Dragging, Menu Item If Animate Dragging is on, while you are dragging a piece with the mouse, an image of the piece follows the mouse cursor. If Animate Dragging is off, there is no visual feedback while you are dragging a piece, but if Animate Moving is on, the move will be animated when it is complete. @item Animate Moving @cindex Animate Moving, Menu Item If Animate Moving is on, all piece moves are animated. An image of the piece is shown moving from the old square to the new square when the move is completed (unless the move was already animated by Animate Dragging). If Animate Moving is off, a moved piece instantly disappears from its old square and reappears on its new square when the move is complete. The shifted @kbd{Ctrl-A} key is a keyboard equivalent. @item Auto Flag @cindex Auto Flag, Menu Item If this option is on and one player runs out of time before the other, XBoard will automatically call his flag, claiming a win on time. The shifted @kbd{Ctrl-F} key is a keyboard equivalent. In ICS mode, Auto Flag will only call your opponent's flag, not yours, and the ICS may award you a draw instead of a win if you have insufficient mating material. In local chess engine mode, XBoard may call either player's flag and will not take material into account (?). @item Auto Flip View @cindex Auto Flip View, Menu Item If the Auto Flip View option is on when you start a game, the board will be automatically oriented so that your pawns move from the bottom of the window towards the top. If you are playing a game on an ICS, the board is always oriented at the start of the game so that your pawns move from the bottom of the window towards the top. Otherwise, the starting orientation is determined by the @code{flipView} command line option; if it is false (the default), White's pawns move from bottom to top at the start of each game; if it is true, Black's pawns move from bottom to top. @xref{User interface options}. @item Blindfold @cindex Blindfold, Menu Item If this option is on, XBoard displays the board as usual but does not display pieces or move highlights. You can still move in the usual way (with the mouse or by typing moves in ICS mode), even though the pieces are invisible. @item Drop Menu @cindex Drop Menu, Menu Item Controls if right-clicking the board in crazyhouse / bughouse will pop up a menu to drop a piece on the clicked square (old, deprecated behavior) or allow you to step through an engine PV (new, recommended behavior). @item Enable Variation Trees @cindex Enable Variation Trees, Menu Item If this option is on, playing a move in Edit Game or Analyze mode while keeping the Shift key pressed will start a new variation. You can then recall the previous line through the @samp{Revert} menu item. When off, playing a move will truncate the game and append the move irreversibly. @item Hide Thinking @cindex Hide Thinking, Menu Item If this option is off, the chess engine's notion of the score and best line of play from the current position is displayed as it is thinking. The score indicates how many pawns ahead (or if negative, behind) the chess engine thinks it is. In matches between two machines, the score is prefixed by @samp{W} or @samp{B} to indicate whether it is showing White's thinking or Black's, and only the thinking of the engine that is on move is shown. The shifted @kbd{Ctrl-H} key is a keyboard equivalent. @item Highlight Last Move @cindex Highlight Last Move, Menu Item If Highlight Last Move is on, after a move is made, the starting and ending squares remain highlighted. In addition, after you use Backward or Back to Start, the starting and ending squares of the last move to be unmade are highlighted. @item Highlight with Arrow @cindex Highlight with Arrow, Menu Item Causes the highlighting described in Highlight Last Move to be done by drawing an arrow between the highlighted squares, so that it is visible even when the width of the grid lines is set to zero. @item Move Sound @cindex Move Sound, Menu Item Enables the sounding of an audible signal when the computer performs a move. For the selection of the sound, see @samp{Sound Options}. If you turn on this option when using XBoard with the Internet Chess Server, you will probably want to give the @kbd{set bell 0} command to the ICS, since otherwise the ICS will ring the terminal bell after every move (not just yours). (The @file{.icsrc} file is a good place for this; see @ref{ICS options}.) @item One-Click Moving @cindex One-Click Moving, Menu Item If this option is on, XBoard does not wait for you to click both the from- and the to-square, or drag the piece, but performs a move as soon as it is uniqely specified. This applies to clicking an own piece that only has a single legal move, clicking an empty square or opponent piece where only one of your pieces can move (or capture) to. Furthermore, a double-click on a piece that can only make a single capture will cause that capture to be made. Promoting a Pawn by clicking its to-square will suppress the promotion popup or other methods for selecting an under-promotion, and make it promote to Queen. @item Periodic Updates @cindex Periodic Updates, Menu Item If this option is off (or if you are using a chess engine that does not support periodic updates), the analysis window will only be updated when the analysis changes. If this option is on, the Analysis Window will be updated every two seconds. @item Play Move(s) of Clicked PV @cindex Play Move(s) of Clicked PV, Menu Item If this option is on, right-clicking a PV in the Engine Output window during Analyze mode will cause the first move of that PV to be played. You could also play more than one (or no) PV move by moving the mouse to engage in the PV walk such a right-click will start, to seek out another position along the PV where you want to continue the analysis, before releasing the mouse button. @item Ponder Next Move @cindex Ponder Next Move, Menu Item If this option is off, the chess engine will think only when it is on move. If the option is on, the engine will also think while waiting for you to make your move. The shifted @kbd{Ctrl-P} key is a keyboard equivalent. @item Popup Exit Message @cindex Popup Exit Message, Menu Item If this option is on, when XBoard wants to display a message just before exiting, it brings up a modal dialog box and waits for you to click OK before exiting. If the option is off, XBoard prints the message to standard error (the terminal) and exits immediately. @item Popup Move Errors @cindex Popup Move Errors, Menu Item If this option is off, when you make an error in moving (such as attempting an illegal move or moving the wrong color piece), the error message is displayed in the message area. If the option is on, move errors are displayed in small pop-up windows like other errors. You can dismiss an error pop-up either by clicking its OK button or by clicking anywhere on the board, including down-clicking to start a move. @item Scores in Move List @cindex Scores in Move List, Menu Item If this option is on, XBoard will display the depth and score of engine moves in the Move List, in the format of a PGN comment. @item Show Coords @cindex Show Coords, Menu Item If this option is on, XBoard displays algebraic coordinates along the board's left and bottom edges. @item Show Target Squares @cindex Show Target Squares, Menu Item If this option is on, all squares a piece that is 'picked up' with the mouse can legally move to are highighted with a fat colored dot in the highlightColor (non-captures) or premoveHighlightColor (captures). Legality testing must be on for XBoard to know how the piece moves. @item Test Legality @cindex Test Legality, Menu Item If this option is on, XBoard tests whether the moves you try to make with the mouse are legal and refuses to let you make an illegal move. The shifted @kbd{Ctrl-L} key is a keyboard equivalent. Moves loaded from a file with @samp{Load Game} are also checked. If the option is off, all moves are accepted, but if a local chess engine or the ICS is active, they will still reject illegal moves. Turning off this option is useful if you are playing a chess variant with rules that XBoard does not understand. (Bughouse, suicide, and wild variants where the king may castle after starting on the d file are generally supported with Test Legality on.) @item Flash Moves @itemx Flash Rate @cindex Flash Moves, Menu Item @cindex Flash Rate, Menu Item If this option is non-zero, whenever a move is completed, the moved piece flashes the specified number of times. The flash-rate setting determines how rapidly this flashing occurs. @item Animation Speed @cindex Animation Speed, Menu Item Determines the duration (in msec) of an animation step, when @samp{Animate Moving} is swiched on. @item Zoom factor in Evaluation Graph @cindex Zoom factor in Evaluation Graph, Menu Item Sets the valueof the @code{evalZoom} option, indicating the factor by which the score interval (-1,1) should be blown up on the vertical axis of the Evaluation Graph. @end table @subsection Time Control @cindex Time Control, Menu Item Pops up a sub-menu where you can set the time-control parameters interactively. Allows you to select classical or incremental time controls, set the moves per session, session duration, and time increment. Also allows specification of time-odds factors for one or both engines. If an engine is given a time-odds factor N, all time quota it gets, be it at the beginning of a session or through the time increment or fixed time per move, will be divided by N. The shifted @kbd{Alt+T} key is a keyboard equivalent. @subsection Common Engine @cindex Common Engine, Menu Item Pops up a sub-menu where you can set some engine parameters common to most engines, such as hash-table size, tablebase cache size, maximum number of processors that SMP engines can use, and where to find the Polyglot adapter needed to run UCI engines under XBoard. The feature that allows setting of these parameters on engines is new since XBoard 4.3.15, so not many XBoard/WinBoard engines respond to it yet, but UCI engines should. It is also possible to specify a GUI opening book here, i.e. an opening book that XBoard consults for any position a playing engine gets in. It then forces the engine to play the book move, rather than to think up its own, if that position is found in the book. The book can switched on and off independently for either engine. The way book moves are chosen can be influenced through the settings of book depth and variety. After both sides have played more moves than the specified depth, the book will no longer be consulted. When the variety is set to 50, moves will be played with the probability specified in the book. When set to 0, only the move(s) with the highest probability will be played. When set to 100, all listed moves will be played with equal pobability. Other settings interpolate between that. The shifted @kbd{Alt+U} key is a keyboard equivalent. @subsection Adjudications @cindex Adjudications, Menu Item Pops up a sub-menu where you can enable or disable various adjudications that XBoard can perform in engine-engine games. The shifted @kbd{Alt+J} key is a keyboard equivalent. You can instruct XBoard to detect and terminate the game on checkmate or stalemate, even if the engines would not do so, to verify engine result claims (forfeiting engines that make false claims), rather than naively following the engine, to declare draw on positions which can never be won for lack of mating material, (e.g. KBK), or which are impossible to win unless the opponent seeks its own demise (e.g. KBKN). For these adjudications to work, @samp{Test Legality} should be switched on. It is also possible to instruct XBoard to enforce a 50-move or 3-fold-repeat rule and automatically declare draw (after a user-adjustable number of moves or repeats) even if the engines are prepared to go on. It is also possible to have XBoard declare draw on games that seem to drag on forever, or adjudicate a loss if both engines agree (for 3 consecutive moves) that one of them is behind more than a user-adjustable score threshold. For the latter adjudication to work, XBoard should be able to properly understand the engine's scores. To facilitate the latter, you can inform xboard here if the engines report scores from the viewpoint of white, or from that of their own color. @subsection ICS Options @cindex ICS Options, Menu Item The following options occur in a dialog summoned by the ICS Options menu item. @table @asis @item Auto Kibitz @cindex Auto Kibitz, Menu Item Setting this option when playing with or aginst a chess program on an ICS will cause the last line of thinking output of the engine before its move to be sent to the ICS in a kibitz command. In addition, any kibitz message received through the ICS from an opponent chess program will be diverted to the engine-output window, (and suppressed in the console), where you can play through its PV by right-clicking it. @item Auto Comment @cindex Auto Comment, Menu Item If this option is on, any remarks made on ICS while you are observing or playing a game are recorded as a comment on the current move. This includes remarks made with the ICS commands @kbd{say}, @kbd{tell}, @kbd{whisper}, and @kbd{kibitz}. Limitation: remarks that you type yourself are not recognized; XBoard scans only the output from ICS, not the input you type to it. @item Auto Observe @cindex Auto Observe, Menu Item If this option is on and you add a player to your @code{gnotify} list on ICS, XBoard will automatically observe all of that player's games, unless you are doing something else (such as observing or playing a game of your own) when one starts. The games are displayed from the point of view of the player on your gnotify list; that is, his pawns move from the bottom of the window towards the top. Exceptions: If both players in a game are on your gnotify list, if your ICS @code{highlight} variable is set to 0, or if the ICS you are using does not properly support observing from Black's point of view, you will see the game from White's point of view. @item Auto Raise Board @cindex Auto Raise Board, Menu Item If this option is on, whenever a new game begins, the chessboard window is deiconized (if necessary) and raised to the top of the stack of windows. @item Auto Save @cindex Auto Save, Menu Item If this option is true, at the end of every game XBoard prompts you for a file name and appends a record of the game to the file you specify. Disabled if the @code{saveGameFile} command-line option is set, as in that case all games are saved to the specified file. @xref{Load and Save options}. @item Background Observe @cindex Background Observe, Menu Item Setting this option will make XBoard suppress display of any boards from observed games while you are playing. In stead the last such board will be remembered, and shown to you when you right-click the board. This allows you to peek at your bughouse partner's game when you want, without disturbing your own game too much. @item Dual Board @cindex Dual Board, Menu Item Setting this option in combination with @samp{Background Observe} will display boards of observed games while you are playing on a second board next to that of your own game. @item Get Move List @cindex Get Move List, Menu Item If this option is on, whenever XBoard receives the first board of a new ICS game (or a different game from the one it is currently displaying), it retrieves the list of past moves from the ICS. You can then review the moves with the @samp{Forward} and @samp{Backward} commands or save them with @samp{Save Game}. You might want to turn off this option if you are observing several blitz games at once, to keep from wasting time and network bandwidth fetching the move lists over and over. When you turn this option on from the menu, XBoard immediately fetches the move list of the current game (if any). @item Quiet Play @cindex Quiet Play, Menu Item If this option is on, XBoard will automatically issue an ICS @kbd{set shout 0} command whenever you start a game and a @kbd{set shout 1} command whenever you finish one. Thus, you will not be distracted by shouts from other ICS users while playing. @item Seek Graph @cindex Seek Graph, Menu Item Setting this option will cause XBoard to display an graph of currently active seek ads when you left-click the board while idle and logged on to an ICS. @item Auto-Refresh Seek Graph @cindex Auto-Refresh Seek Graph, Menu Item In combination with the @samp{Seek Graph} option this will cause automatic update of the seek graph while it is up. This only works on FICS and ICC, and requires a lot of bandwidth on a busy server. @item Premove @itemx Premove White @itemx Premove Black @itemx First White Move @itemx First Black Move @cindex Premove, Menu Item @cindex Premove White, Menu Item @cindex Premove Black, Menu Item @cindex First White Move, Menu Item @cindex First Black Move, Menu Item If this option is on while playing a game on an ICS, you can register your next planned move before it is your turn. Move the piece with the mouse in the ordinary way, and the starting and ending squares will be highlighted with a special color (red by default). When it is your turn, if your registered move is legal, XBoard will send it to ICS immediately; if not, it will be ignored and you can make a different move. If you change your mind about your premove, either make a different move, or double-click on any piece to cancel the move entirely. You can also enter premoves for the first white and black moves of the game. @item ICS Alarm @itemx ICS Alarm Time @cindex ICS Alarm, Menu Item @cindex ICS Alarm Time, Menu Item When this option is on, an alarm sound is played when your clock counts down to the icsAlarmTime in an ICS game. (By default, the time is 5 seconds, but you can pecify other values with the Alarm Time spin control.) For games with time controls that include an increment, the alarm will sound each time the clock counts down to the icsAlarmTime. By default, the alarm sound is the terminal bell, but on some systems you can change it to a sound file using the soundIcsAlarm option; see below. @item Colorize Messages @cindex Colorize Messages, Menu Item Ticking this options causes various types of ICS messages do be displayed with different foreground or background colors in the console. The colors can be individually selected for each type, through the accompanying text edits. @end table @subsection Match Options @cindex Match Options, Menu Item Summons a dialog where you can set options important for playing automatic matches between two chess programs (e.g. by using the @samp{Machine Match} menu item in the @samp{Mode} menu). @table @asis @item Tournament file @cindex Tournament file, Menu item To run a tournament, XBoard needs a file to record its progress, so it can resume the tourney when it is interrupted. When you want to conduct anything more complex than a simple two-player match with the currently loaded engines, (i.e. when you select a list of participants), you must not leave this field blank. When you enter the name of an existing tournament file, XBoard will ignore all other input specified in the dialog, and will take them from that tournament file. This resumes an interrupted tournament, or adds another XBoard agent playing games for it to those that are already doing so. Specifying a not-yet-existing file will cause XBoard to create it, according to the tournament parameters specified in the rest of the dialog, before it starts the tournament on ‘OK’. Provided that you specify participants; without participants no tournament file will be made, but other entered values (e.g. for the file with opening positions) will take effect. Default: configured by the @code{defaultTourneyName} option. @item Sync after round @itemx Sync after cycle @cindex Sync after round, Menu Item @cindex Sync after cycle, Menu Item The sync options, when on, will cause WinBoard to refrain from starting games of the next round or cycle before all games of the previous round or cycle are finished. This guarantees correct ordering in the games file, even when multiple XBoard instances are concurrently playing games for the same tourney. Default: sync after cycle, but not after round. @item Select Engine @itemx Tourney participants @cindex Select Engine, Menu Item @cindex Tourney participants, Menu Item With the Select Engine drop-down list you can pick an engine from your list of installed engines in the settings file, to be added to the tournament. The engines selected so far will be listed in the ‘Tourney participants’ memo. The latter is a normal text edit, so you can use normal text-editing functions to delete engines you selected by accident, or change their order. Do not type names yourself there, because names that do not exactly match one of the names from the drop-down list will lead to undefined behavior. @item Tourney type @cindex Tourney type, Menu Item Here you can specify the type of tournament you want. XBoard’s intrinsic tournament manager support round-robins (type = 0), where each participant plays every other participant, and (multi-)gauntlets, where one (or a few) so-called ‘gauntlet engines’ play an independent set of opponents. In the latter case, you specify the number of gauntlet engines. E.g. if you specified 10 engines, and tourney type = 2, the first 2 engines each play the remaining 8. A value of -1 instructs XBoard to play Swiss; for this to work an external pairing engine must be specified through the @code{pairingEngine} option. Each Swiss round will be considered a tourney cycle in that case. Default:0 @item Number of tourney cycles @itemx Default number of Games @cindex Number of tourney cycles, Menu Item @cindex Default number of Games, Menu Item You can specify tourneys where every two opponents play each other multiple times. Such multiple games can be played in a row, as specified by the ‘number of games per pairing’, or by repeating the entire tournament schedule a number of times (specified by the ‘number of tourney cycles’). The total number of times two engine meet will be the product of these two. Default is 1 cycle; the number of games per pairing is the same as the default number of match games, stored in your settings file through the @code{defaultMatchGames} option. @item Save Tourney Games @cindex Save Tourney Games, Menu Item File where the tournament games are saved (duplicate of the item in the @samp{Save Game Options}). @item Game File with Opening Lines @itemx File with Start Positions @itemx Game Number @itemx Position Number @itemx Rewind Index after @cindex Game File with Opening Lines, Menu Item @cindex File with Start Positions, Menu Item @cindex Game Number, Menu Item @cindex Position Number, Menu Item @cindex Rewind Index after, Menu Item These items optionally specify the file with move sequences or board positions the tourney games should start from. The corresponding numbers specify the number of the game or position in the file. Here a value -1 means automatic stepping through all games on the file, -2 automatic stepping every two games. The Rewind-Index parameter causes a stepping index to reset to one after reaching a specified value. A setting of -2 for the game number will also be effective in a tournament without specifying a game file, but playing from the GUI book instead. In this case the first (odd) games will randomly select from the book, but the second (even) games will select the same moves from the book as the previous game. (Note this leads to the same opening only if both engines use the GUI book!) Default: No game or position file will be used. The default index if such a file is used is 1. @item Disable own engine bools be default @cindex Disable own engine bools be default, Menu Item Setting this option reverses the default situation for use of the GUI opening book in tournaments from what it normally is, namely not using it. So unless the engine is installed with an option to explicitly specify it should not use the GUI book (i.e. @code{-firstHasOwnBookUCI true}), it will be made to use the GUI book. @item Replace Engine @itemx Upgrade Engine @cindex Replace Engine, Menu Item @cindex Upgrade Engine, Menu Item With these two buttons you can alter the participants of an already running tournament. After opening the Match Options dialog on an XBoard that is playing for the tourney, you will see all the tourney parameters in the dialog fields. You can then replace the name of one engine by that of another by editing the @samp{participants} field. (But preserve the order of the others!) Pressing the button after that will cause the substitution. With the @samp{Upgrade Engine} button the substitution will only affect future games. With @samp{Replace Engine} all games the substituted engine has already played will be invalidated, and they will be replayed with the substitute engine. In this latter case the engine must not be playing when you do this, but otherwise there is no need to pause the tournament play for making a substitution. @item Clone Tourney @cindex CloneTourney, Menu Item Pressing this button after you have specified an existing tournament file will copy the contents of the latter to the dialog, and then puts the originally proposed name for the tourney file back. You can then run a tourney with the same parameters (possibly after changing the proposed name of the tourney file for the new tourney) by pressing 'OK'. @end table @subsection Load Game Options @cindex Load Game Options, Menu Item Summons a dialog where you can set the @code{autoDisplayComment} and @code{autoDisplayTags} options, (which control popups when viewing loaded games), and specify the rate at which loaded games are auto-played, in seconds per move (which can be a fractional number, like 1.6). You can also set search criteria for determining which games will be displayed in the Game List for a multi-game file, and thus be eligible for loading: @table @asis @item Elo of strongest player @itemx Elo of weakest player @itemx year @cindex Elo of strongest player, Menu Item @cindex Elo of weakest player, Menu Item @cindex year, Menu Item These numeric fields set thresholds (lower limits) on the Elo rating of the mentioned player, or the date the game was played. Defaults: 0 @item Search mode @cindex Search mode, Menu Item @cindex find position, Menu Item @cindex narrow, Menu Item This setting determines which positions in a game will be considered a match to the position currently displayed in the board window when you press the @samp{find position} button in the Game List. You can search for an exact match, a position that has all shown material in the same place, but might contain additional material, a position that has all Pawns in the same place, but can have the shown material anywhere, a position that can have all shown material anywhere, or a position that has material between certain limits anywhere. For the latter you have to place the material that must be present in the four lowest ranks of the board, and optional additional material in the four highest ranks of the board. You can request the optional material to be balanced. The @samp{narrow} button is similar in fuction to the @samp{find position} button, but only searches in the already selected games, rather than the complete game file, and can thus be used to refine a search based on multiple criteria. @item number of consecutive positions @cindex number of consecutive positions, Menu Item When you are searching by material, rather than for an exact match, this parameter indicates forhowmany consecutive game positions the same amount of material must be on the board before it is considered a match. @item Also match reversed colors @itemx Also match left-right flipped position @cindex Also match reversed colors, Menu Item @cindex Also match left-right flipped position, Menu Item When looking for matching positions rather than by material, these settings determine whether mirror images (in case of a vertical flip in combination with color reversal) will be also considered a match. The left-right flipping is only useful after all castling rights have expired (or in Xiangqi). @end table @subsection Save Game Options @cindex Save Game Options, Menu Item Summons a dialog where you can specify the files on which XBoard should automatically save any played or entered games, (the @code{saveGameFile} option), or the final position of such games (the @code{savePositionfile} option). You can also select 'auto-save' without a file name, in which case XBoard will prompt the user for a file name after each game. In ICS mode you can limit the auto-saving to your own games (i.e. suppress saving of observed games). You can also set the default value for the PGN Event tag that will be used for each new game you start. Various options for the format of the game can be specified as well, such as whether scores and depths of engine games should be saved as comments, and if a tag with info about the score with which the engine came out of book should be included. For Chess, always set the format to PGN, rather than "old save stye"! @subsection Game List @cindex Game List Tags, Menu Item Pops up a dialog where you can select the PGN tags that should appear on the lines in the game list, and their order. @subsection Sound Options @cindex Sound Options, Menu Item Summons a dialog where you can specify the sounds that should accompany various events that can occur XBoard. Most events are only relevant to ICS play, but the move sound is an important exception. For each event listed in the dialog, you can select a standard sound from a menu. You can also select a user-supplied sound file, by typing its name into the designated text-edit field first, and then selecting "Above WAV File" from the menu for the event. A dummy event has been provided for trying out the sounds with the "play" button next to it. The directory with standard sounds, and the external program for playing the sounds can be specified too, but normally you would not touch these once XBoard is properly installed. When a move sound other than 'None' is selected, XBoard alerts you by playing that sound after each of your opponent's moves (or after every move if you are observing a game on the Internet Chess Server). The sound is not played after moves you make or moves read from a saved game file. @subsection Save Settings Now @cindex Save Settings Now, Menu Item Selecting this menu item causes the current XBoard settings to be written to the settings file, so they will also apply in future sessions. Note that some settings are 'volatile', and are not saved, because XBoard considers it too unlikely that you want those to apply next time. In particular this applies to the Chess program names, and all options giving information on those Chess programs (such as their directory, if they have their own opening book, if they are UCI or native XBoard), or the variant you are playing. Such options would still be understood when they appear in the settings file in case they were put there with the aid of a text editor, but they would disappear from the file as soon as you save the settings. Note that XBoard no longer pays attention to options values specified in the .Xresources file. (Specifying key bindings there will still work, though.) To alter the default of volatile options, you can use the following method: Rename your ~/.xboardrc settings file (to ~/.yboardrc, say), and create a new file ~/.xboardrc, which only contains the options @example -settingsFile ~/.yboardrc -saveSettingsFile ~/.yboardrc @end example @noindent This will cause your settings to be saved on ~/.yboardrc in the future, so that ~/.xboardrc is no longer overwritten. You can then safely specify volatile options in ~/.xboardrc, either before or after the settingsFile options. Note that when you specify persistent options after the settingsFile options in ~/.xboardrc, you will essentially turn them into volatile options with the specified value as default, because that value will overrule the value loaded from the settings file (being read later). @subsection Save Settings on Exit @cindex Save Settings on Exit, Menu Item Setting this option has no immediate effect, but causes the settings to be saved when you quit XBoard. What happens then is otherwise identical to what happens when you use select "Save Settings Now", see there. @node Help Menu @section Help Menu @cindex Menu, Help @cindex Help Menu @table @asis @item Info XBoard @cindex Info XBoard, Menu Item Displays the XBoard documentation in info format. For this feature to work, you must have the GNU info program installed on your system, and the file @file{xboard.info} must either be present in the current working directory, or have been installed by the @samp{make install} command when you built XBoard. @item Man XBoard @cindex Man XBoard, Menu Item Displays the XBoard documentation in man page format. The @kbd{F1} key is a keyboard equivalent. For this feature to work, the file @file{xboard.6} must have been installed by the @samp{make install} command when you built XBoard, and the directory it was placed in must be on the search path for your system's @samp{man} command. @item About XBoard @cindex About XBoard, Menu Item Shows the current XBoard version number. @end table @node Keys @section Other Shortcut Keys @cindex Keys @cindex Shortcut keys @table @asis @item Show Last Move @cindex Show Last Move, Shortcut Key By hitting @kbd{Enter} the last move will be re-animated. @item Load Next Game @cindex Load Next Game, Menu Item Loads the next game from the last game record file you loaded. The @kbd{Alt+PgDn} key triggers this action. @item Load Previous Game @cindex Load Previous Game, Menu Item Loads the previous game from the last game record file you loaded. The @kbd{Alt+PgUp} key triggers this action. Not available if the last game was loaded from a pipe. @item Reload Same Game @cindex Reload Same Game, Menu Item Reloads the last game you loaded. Not available if the last game was loaded from a pipe. Currently no keystroke is assigned to this ReloadGameProc. @item Reload Same Position @cindex Reload Same Position, Menu Item Reloads the last position you loaded. Not available if the last position was loaded from a pipe. Currently no keystroke is assigned to this ReloadPositionProc. @end table You can add or remove shortcut keys using the X resources @code{form.translations}. Here is an example of what would go in your @file{.Xresources} file: @example XBoard*form.translations: \ Shift?: AboutGameProc() \n\ y: AcceptProc() \n\ n: DeclineProc() \n\ i: NothingProc() @end example @noindent Binding a key to @code{NothingProc} makes it do nothing, thus removing it as a shortcut key. The XBoard commands that can be bound to keys are: @example AbortProc, AboutGameProc, AboutProc, AcceptProc, AdjournProc, AlwaysQueenProc, AnalysisModeProc, AnalyzeFileProc, AnimateDraggingProc, AnimateMovingProc, AutobsProc, AutoflagProc, AutoflipProc, AutoraiseProc, AutosaveProc, BackwardProc, BlindfoldProc, BookProc, CallFlagProc, CopyGameProc, CopyPositionProc, DebugProc, DeclineProc, DrawProc, EditCommentProc, EditGameProc, EditPositionProc, EditTagsProc, EnterKeyProc, FlashMovesProc, FlipViewProc, ForwardProc, GetMoveListProc, HighlightLastMoveProc, HintProc, IcsAlarmProc, IcsClientProc, IcsInputBoxProc, InfoProc, LoadGameProc, LoadNextGameProc, LoadNextPositionProc, LoadPositionProc, LoadPrevGameProc, LoadPrevPositionProc, LoadSelectedProc, MachineBlackProc, MachineWhiteProc, MailMoveProc, ManProc, MoveNowProc, MoveSoundProc, NothingProc, OldSaveStyleProc, PasteGameProc, PastePositionProc, PauseProc, PeriodicUpdatesProc, PonderNextMoveProc, PopupExitMessageProc, PopupMoveErrorsProc, PremoveProc, QuietPlayProc, QuitProc, ReloadCmailMsgProc, ReloadGameProc, ReloadPositionProc, RematchProc, ResetProc, ResignProc, RetractMoveProc, RevertProc, SaveGameProc, SavePositionProc, ShowCoordsProc, ShowGameListProc, ShowThinkingProc, StopExaminingProc, StopObservingProc, TestLegalityProc, ToEndProc, ToStartProc, TrainingProc, TruncateGameProc, and TwoMachinesProc. @end example @node Options @chapter Options @cindex Options @cindex Options This section documents the command-line options to XBoard. You can set these options in two ways: by typing them on the shell command line you use to start XBoard, or by editing the settings file (usually ~/.xboardrc) to alter the value of the setting that was saved there. Some of the options cannot be changed while XBoard is running; others set the initial state of items that can be changed with the @ref{Options} menu. Most of the options have both a long name and a short name. To turn a boolean option on or off from the command line, either give its long name followed by the value true or false (@samp{-longOptionName true}), or give just the short name to turn the option on (@samp{-opt}), or the short name preceded by @samp{x} to turn the option off (@samp{-xopt}). For options that take strings or numbers as values, you can use the long or short option names interchangeably. @menu * Chess engine options:: Controlling the chess engine. * UCI + WB Engine Settings:: Setting some very common engine parameters * Tournament options:: Running tournaments and matches between engines. * ICS options:: Connecting to and using ICS. * Load and Save options:: Input/output options. * User interface options:: Look and feel options. * Adjudication Options:: Control adjudication of engine-engine games. * Other options:: Miscellaneous. @end menu @node Chess engine options @section Chess Engine Options @cindex options, Chess engine @cindex Chess engine options @table @asis @item -tc or -timeControl minutes[:seconds] @cindex tc, option @cindex timeControl, option Each player begins with his clock set to the @code{timeControl} period. Default: 5 minutes. The additional options @code{movesPerSession} and @code{timeIncrement} are mutually exclusive. @item -mps or -movesPerSession moves @cindex mps, option @cindex movesPerSession, option When both players have made @code{movesPerSession} moves, a new @code{timeControl} period is added to both clocks. Default: 40 moves. @item -inc or -timeIncrement seconds @cindex inc, option @cindex timeIncrement, option If this option is specified, @code{movesPerSession} is ignored. Instead, after each player's move, @code{timeIncrement} seconds are added to his clock. Use @samp{-inc 0} if you want to require the entire game to be played in one @code{timeControl} period, with no increment. Default: -1, which specifies @code{movesPerSession} mode. @item -clock/-xclock or -clockMode true/false @cindex clock, option @cindex clockMode, option Determines whether or not to display the chess clocks. If clockMode is false, the clocks are not shown, but the side that is to play next is still highlighted. Also, unless @code{searchTime} is set, the chess engine still keeps track of the clock time and uses it to determine how fast to make its moves. @item -st or -searchTime minutes[:seconds] @cindex st, option @cindex searchTime, option Tells the chess engine to spend at most the given amount of time searching for each of its moves. Without this option, the chess engine chooses its search time based on the number of moves and amount of time remaining until the next time control. Setting this option also sets clockMode to false. @item -depth or -searchDepth number @cindex sd, option @cindex searchDepth, option Tells the chess engine to look ahead at most the given number of moves when searching for a move to make. Without this option, the chess engine chooses its search depth based on the number of moves and amount of time remaining until the next time control. With the option, the engine will cut off its search early if it reaches the specified depth. @item -firstNPS number @itemx -secondNPS number @cindex firstNPS, option @cindex secondNPS, option Tells the chess engine to use an internal time standard based on its node count, rather then wall-clock time, to make its timing decisions. The time in virtual seconds should be obtained by dividing the node count through the given number, like the number was a rate in nodes per second. Xboard will manage the clocks in accordance with this, relying on the number of nodes reported by the engine in its thinking output. If the given number equals zero, it can obviously not be used to convert nodes to seconds, and the time reported by the engine is used to decrement the XBoard clock in stead. The engine is supposed to report in CPU time it uses, rather than wall-clock time, in this mode. This option can provide fairer conditions for engine-engine matches on heavily loaded machines, or with very fast games (where the wall clock is too inaccurate). @code{showThinking} must be on for this option to work. Default: -1 (off). Not many engines might support this yet! @item -firstTimeOdds factor @itemx -secondTimeOdds factor @cindex firstTimeOdds, option @cindex secondTimeOdds, option Reduces the time given to the mentioned engine by the given factor. If pondering is off, the effect is indistinguishable from what would happen if the engine was running on an n-times slower machine. Default: 1. @item -timeOddsMode mode @cindex timeOddsMode, option This option determines how the case is handled where both engines have a time-odds handicap. If mode=1, the engine that gets the most time will always get the nominal time, as specified by the time-control options, and its opponent's time is renormalized accordingly. If mode=0, both play with reduced time. Default: 0. @item -hideThinkingFromHuman true/false Controls the Hide Thinking option. @xref{Options Menu}. Default: true. (Replaces the Show-Thinking option of older xboard versions.) @item -thinking/-xthinking or -showThinking true/false @cindex thinking, option @cindex showThinking, option Forces the engine to send thinking output to xboard. Used to be the only way to control if thinking output was displayed in older xboard versions, but as the thinking output in xboard 4.3 is also used for several other purposes (adjudication, storing in PGN file) the display of it is now controlled by the new option Hide Thinking. @xref{Options Menu}. Default: false. (But if xboard needs the thinking output for some purpose, it makes the engine send it despite the setting of this option.) @item -ponder/-xponder or -ponderNextMove true/false @cindex ponder, option @cindex ponderNextMove, option Sets the Ponder Next Move menu option. @xref{Options Menu}. Default: true. @item -smpCores number Specifies the maximum number of CPUs an SMP engine is allowed to use. Only works for engines that support the XBoard/WinBoard-protocol cores feature. @item -mg or -matchGames n @cindex mg, option @cindex matchGames, option Automatically runs an n-game match between two chess engines, with alternating colors. If the @code{loadGameFile} or @code{loadPositionFile} option is set, XBoard starts each game with the given opening moves or the given position; otherwise, the games start with the standard initial chess position. If the @code{saveGameFile} option is set, a move record for the match is appended to the specified file. If the @code{savePositionFile} option is set, the final position reached in each game of the match is appended to the specified file. When the match is over, XBoard displays the match score and exits. Default: 0 (do not run a match). @item -mm/-xmm or -matchMode true/false @cindex mm, option @cindex matchMode, option Setting @code{matchMode} to true is equivalent to setting @code{matchGames} to 1. @item -sameColorGames n @cindex sameColorGames, option Automatically runs an n-game match between two chess engines, without alternating colors. Otherwise the same applies as for the @samp{-matchGames} option, over which it takes precedence if both are specified. (See there.) Default: 0 (do not run a match). @item -fcp or -firstChessProgram program @cindex fcp, option @cindex firstChessProgram, option Name of first chess engine. Default: @file{Fairy-Max}. @item -scp or -secondChessProgram program @cindex scp, option @cindex secondChessProgram, option Name of second chess engine, if needed. A second chess engine is started only in Two Machines (match) mode. Default: @file{Fairy-Max}. @item -fe or -firstEngine nickname @cindex fe, option @cindex firstEngine, option This is an alternative to the @code{fcp} option for specifying the first engine, for engines that were already configured (using the @samp{Load Engine} dialog) in XBoard's settings file. It will not only retrieve the real name of the engine, but also all options configured with it. (E.g. if it is UCI, whether it should use book.) @item -se or -secondEngine nickname @cindex se, option @cindex secondEngine, option As @code{fe}, but for the second engine. @item -fb/-xfb or -firstPlaysBlack true/false @cindex fb, option @cindex firstPlaysBlack, option In games between two chess engines, firstChessProgram normally plays white. If this option is true, firstChessProgram plays black. In a multi-game match, this option affects the colors only for the first game; they still alternate in subsequent games. @item -fh or -firstHost host @itemx -sh or -secondHost host @cindex fh, option @cindex firstHost, option @cindex sh, option @cindex secondHost, option Hosts on which the chess engines are to run. The default for each is @file{localhost}. If you specify another host, XBoard uses @file{rsh} to run the chess engine there. (You can substitute a different remote shell program for rsh using the @code{remoteShell} option described below.) @item -fd or -firstDirectory dir @itemx -sd or -secondDirectory dir @cindex fd, option @cindex firstDirectory, option @cindex sd, option @cindex secondDirectory, option Working directories in which the chess engines are to be run. The default is "", which means to run the chess engine in the same working directory as XBoard itself. (See the CHESSDIR environment variable.) This option is effective only when the chess engine is being run on the local host; it does not work if the engine is run remotely using the -fh or -sh option. @item -initString string or -firstInitString @itemx -secondInitString string @cindex initString, option @cindex firstInitString, option @cindex secondInitString, option The string that is sent to initialize each chess engine for a new game. Default: @example new random @end example @noindent Setting this option from the command line is tricky, because you must type in real newline characters, including one at the very end. In most shells you can do this by entering a @samp{\} character followed by a newline. Using the character sequence @samp{\n} in the string should work too, though. If you change this option, don't remove the @samp{new} command; it is required by all chess engines to start a new game. You can remove the @samp{random} command if you like; including it causes GNU Chess 4 to randomize its move selection slightly so that it doesn't play the same moves in every game. Even without @samp{random}, GNU Chess 4 randomizes its choice of moves from its opening book. Many other chess engines ignore this command entirely and always (or never) randomize. You can also try adding other commands to the initString; see the documentation of the chess engine you are using for details. @item -firstComputerString string @itemx -secondComputerString string @cindex firstComputerString, option @cindex secondComputerString, option The string that is sent to the chess engine if its opponent is another computer chess engine. The default is @samp{computer\n}. Probably the only useful alternative is the empty string (@samp{}), which keeps the engine from knowing that it is playing another computer. @item -reuse/-xreuse or -reuseFirst true/false @itemx -reuse2/-xreuse2 or -reuseSecond true/false @cindex reuse, option @cindex reuseFirst, option @cindex reuse2, option @cindex reuseSecond, option If the option is false, XBoard kills off the chess engine after every game and starts it again for the next game. If the option is true (the default), XBoard starts the chess engine only once and uses it repeatedly to play multiple games. Some old chess engines may not work properly when reuse is turned on, but otherwise games will start faster if it is left on. @item -firstProtocolVersion version-number @itemx -secondProtocolVersion version-number @cindex firstProtocolVersion, option @cindex secondProtocolVersion, option This option specifies which version of the chess engine communication protocol to use. By default, version-number is 2. In version 1, the "protover" command is not sent to the engine; since version 1 is a subset of version 2, nothing else changes. Other values for version-number are not supported. @item -firstScoreAbs true/false @itemx -secondScoreAbs true/false @cindex firstScoreAbs, option @cindex secondScoreAbs, option If this option is set, the score reported by the engine is taken to be that in favor of white, even when the engine plays black. Important when XBoard uses the score for adjudications, or in PGN reporting. @item -niceEngines priority @cindex niceEngines, option This option allows you to lower the priority of the engine processes, so that the generally insatiable hunger for CPU time of chess engines does not interfere so much with smooth operation of XBoard (or the rest of your system). Negative values could increase the engine priority, which is not recommended. @item -firstOptions string @itemx -secondOptions string @cindex firstOptions, option @cindex secondOptions, option The given string is a comma-separated list of (option name=option value) pairs, like the following example: "style=Karpov,blunder rate=0". If an option announced by the engine at startup through the feature commands of the XBoard/WinBoard protocol matches one of the option names (i.e. "style" or "blunder rate"), it would be set to the given value (i.e. "Karpov" or 0) through a corresponding option command to the engine. This provided that the type of the value (text or numeric) matches as well. @item -firstNeedsNoncompliantFEN string @itemx -secondNeedsNoncompliantFEN string @cindex firstNeedsNoncompliantFEN, option @cindex secondNeedsNoncompliantFEN, option The castling rights and e.p. fields of the FEN sent to the mentioned engine with the setboard command will be replaced by the given string. This can for instance be used to run engines that do not understand Chess960 FENs in variant fischerandom, to make them at least understand the opening position, through setting the string to "KQkq -". (Note you also have to give the e.p. field!) Other possible applications are to provide work-arounds for engines that want to see castling and e.p. fields in variants that do not have castling or e.p. (shatranj, courier, xiangqi, shogi) so that XBoard would normally omit them (string = "- -"), or to add variant-specific fields that are not yet supported by XBoard (e.g. to indicate the number of checks in 3check). @item -shuffleOpenings @cindex shuffleOpenings, option Forces shuffling of the opening setup in variants that normally have a fixed initial position. Shufflings are symmetric for black and white, and exempt King and Rooks in variants with normal castling. Remains in force until a new variant is selected. @end table @node UCI + WB Engine Settings @section UCI + WB Engine Settings @cindex Engine Settings @cindex Settings, Engine @table @asis @item -fUCI or -firstIsUCI true/false @itemx -sUCI or -secondIsUCI true/false @cindex fUCI, option @cindex sUCI, option @cindex firstIsUCI, option @cindex secondIsUCI, option Indicates if the mentioned engine executable file is an UCI engine, and should be run with the aid of the Polyglot adapter rather than directly. Xboard will then pass the other UCI options and engine name to Polyglot on its command line, according to the option @code{adapterCommand}. @item -fUCCI @itemx -sUCCI @itemx -fUSI @itemx -sUSI @cindex fUCCI, option @cindex sUCCI, option @cindex fUSI, option @cindex sUSI, option Options similar to @code{fUCI} and @code{sUCI}, except that they use the indicated engine with the protocol adapter specified in the @samp{uxiAdapter} option. This can then be configured for running an UCCI or USI adapter, as the need arises. @item -adapterCommand string @cindex adapterCommand, option The string conatins the command that should be issued by XBoard to start an engine that is accompanied by the @code{fUCI} option. Any identifier following a percent sign in the command (e.g. %fcp) will be considered the name of an XBoard option, and be replaced by the value of that option at the time the engine is started. For starting the second engine, any leading "f" or "first" in the option name will first be replaced by "s" or "second", before finding its value. Default: 'polyglot -noini -ec "%fcp" -ed "%fd"' @item -uxiAdapter string @cindex uxiAdapter, option Similar to @code{adapterCommand}, but used for engines accompanied by the @code{fUCCI} or @code{fUSI} option, so you can configure XBoard to be ready to handle more than one flavor of non-native protocols. Default: "" @item -polyglotDir filename @cindex polyglotDir, option Gives the name of the directory in which the Polyglot adapter for UCI engines resides. Default: "". @item -usePolyglotBook true/false @cindex usePolyglotBook, option Specifies if the Polyglot book should be used as GUI book. @item -polyglotBook filename @cindex polyglotBook, option Gives the filename of the opening book. The book is only used when the @code{usePolyglotBook} option is set to true, and the option @code{firstHasOwnBookUCI} or @code{secondHasOwnBookUCI} applying to the engine is set to false. The engine will be kept in force mode as long as the current position is in book, and XBoard will select the book moves for it. Default: "". @item -fNoOwnBookUCI or -firstXBook or -firstHasOwnBookUCI true/false @itemx -sNoOwnBookUCI or -secondXBook or -secondHasOwnBookUCI true/false @cindex fNoOwnBookUCI, option @cindex sNoOwnBookUCI, option @cindex firstHasOwnBookUCI, option @cindex secondHasOwnBookUCI, option @cindex firstXBook, option @cindex secondXBook, option Indicates if the mentioned engine has its own opening book it should play from, rather than using the external book through XBoard. Default: depends on setting of the option @code{discourageOwnBooks}. @item -discourageOwnBooks true/false @cindex discourageOwnBooks, option When set, newly loaded engines will be assumed to use the GUI book, unless they explicitly specify differently. Otherwise they will be assumed to not use the GUI book, unless the specify differently (e.g. with @code{firstXBook}). Default: false. @item -bookDepth n @cindex bookDepth, option Limits the use of the GUI book to the first n moves of each side. Default: 12. @item -bookVariation n @cindex bookVariation, option A value n from 0 to 100 tunes the choice of moves from the GUI books from totally random to best-only. Default: 50 @item -mcBookMode @cindex mcBookMode, option When this volatile option is specified, the probing algorithm of the GUI book is altered to always select the move that is most under-represented based on its performance. When all moves are played in approximately the right proportion, a book miss will be reported, to give the engine opportunity to explore a new move. In addition score of the moves will be kept track of during the session in a book buffer. By playing an match in this mode, a book will be built from scratch. The only output are the saved games, which can be converted to an actual book later, with the @samp{Save Games as Book} command. This command can also be used to pre-fill the book buffer before adding new games based on the probing algorithm. @item -fn string or -firstPgnName string @itemx -sn string or -secondPgnName string @cindex firstPgnName, option @cindex secondPgnName, option @cindex fn, option @cindex sn, option Indicates the name that should be used for the engine in PGN tags of engine-engine games. Intended to allow you to install verions of the same engine with different settings, and still distinguish them. Default: "". @item -defaultHashSize n @cindex defaultHashSize, option Sets the size of the hash table to n MegaBytes. Together with the EGTB cache size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 64. @item -defaultCacheSizeEGTB n @cindex defaultCacheSizeEGTB, option Sets the size of the EGTB cache to n MegaBytes. Together with the hash-table size this number is also used to calculate the memory setting of XBoard/WinBoard engines, for those that support the memory feature of the XBoard/WinBoard protocol. Default: 4. @item -defaultPathEGTB filename @cindex defaultPathEGTB, option Gives the name of the directory where the end-game tablebases are installed, for UCI engines. Default: "/usr/local/share/egtb". @item -egtFormats string @cindex egtFormats, option Specifies which end-game tables are installed on the computer, and where. The argument is a comma-separated list of format specifications, each specification consisting of a format name, a colon, and a directory path name, e.g. "nalimov:/usr/local/share/egtb". If the name part matches that of a format that the engine requests through a feature command, xboard will relay the path name for this format to the engine through an egtpath command. One egtpath command for each matching format will be sent. Popular formats are "nalimov" DTM tablebases and "scorpio" bitbases. Default: "". @item -firstChessProgramNames=@{names@} This option lets you customize the drop-down list of chess engine names that appears in the @samp{Load Engine} and @samp{Match Options} dialog. It consists of a list of strings, one per line. When an engine is loaded, the corresponding line is prefixed with "-fcp ", and processed like it appeared on the command line. That means that apart from the engine command, it can contain any list of XBoard options you want to use with this engine. (Commonly used options here are -fd, -firstXBook, -fUCI, -variant.) The value of this option is gradually built as you load new engines through the @samp{Load Engine} menu dialog, with @samp{Add to list} ticked. To change it, edit your settings file with a plain text editor. @end table @node Tournament options @section Tournament options @cindex Tournament Options @cindex Options, Tournament @table @asis @item -defaultMatchGames n @cindex defaultMatchGames, option Sets the number of games that will be used for a match between two engines started from the menu to n. Also used as games per pairing in other tournament formats. Default: 10. @item -matchPause n @cindex matchPause, option Specifies the duration of the pause between two games of a match or tournament between engines as n milliseconds. Especially engines that do not support ping need this option, to prevent that the move they are thinking on when an opponent unexpectedly resigns will be counted for the next game, (leading to illegal moves there). Default: 10000. @item -tf filename or -tourneyFile filename @cindex tf, option @cindex tourneyFile, option Specifies the name of the tournament file used in match mode to conduct a multi-player tournament. This file is a special settings file, which stores the description of the tournament (including progress info), through normal options (e.g. for time control, load and save files), and through some special-purpose options listed below. @item -tt number or -tourneyType number @cindex tt, option @cindex tourneyType, option Specifies the type of tourney: 0 = round-robin, N>0 = (multi-)gauntlet with N gauntlet engines, -1 = Swiss through external pairing engine. Volatile option, but stored in tourney file. @item -cy number or -tourneyCycles number @cindex cy, option @cindex tourneyCycles, option Specifies the number of cycles in a tourney. Volatile option, but stored in tourney file. @item -participants list @cindex participants, option The list is a multi-line text string that specifies engines occurring in the @code{firstChesProgramNames} list in the settings file by their (implied or explicitly given) nicknames, one engine per line. The mentioned engines will play in the tourney. Volatile option, but stored in tourney file. @item -results string @cindex results, option The string of +=- characters lists the result of all played games in a toruney. Games currently playing are listed as *, while a space indicates a game that is not yet played or playing . Volatile option, but stored in tourney file. @item -defaultTourneyName string @cindex defaultTourneyName, option Specifies the name of the tournament file XBoard should propose when the @samp{Match Options} dialog is opened. Any %y, %M, %d, %h, %m, %s in the string are replaced by the current year, month, day of the month, hours, minutes, seconds of the current time, respectively, as two-digit number. A %Y would be replaced by the year as 4-digit number. Default: empty string. @item -pairingEngine filename @cindex pairingEngine, option Specifies the external program to be used to pair the participants in Swiss tourneys. XBoard communicates with this engine in the same way as it communicates with Chess engines. The only commands sent to the pairing engine are “results N string”, (where N is the number of participants, and string the results so far in the format of the results option), and “pairing N”, (where N is the number of the tourney game). To the latter the pairing engine should answer with “A-B”, where A and B are participant numbers (in the range 1-N). (There should be no reply to the results command.) Default: empty string. @item -afterGame string @itemx -afterTourney string @cindex afterGame, option @cindex afterTourney, option When non-empty, the given string will be executed as a system command after each tournament game, orafterthe tourney completes, respectively. This can be used, for example, to autmatically run a cross-table generator on the PGN file where games are saved, to update the tourney standings. Default: "" @item -syncAfterRound true/false @itemx -syncAfterCycle true/false @cindex syncAfterRound, option @cindex syncAfterCycle, option Controls whether different instances of XBoard concurrently running the same tournament will wait for each other. Defaults: sync after cycle, but not after round. @item -seedBase number @cindex seedBase, option Used to store the seed of the pseudo-random-number generator in the tourneyFile, so that separate instances of XBoard working on the same tourney can take coherent 'random' decisions, such as picking an opening for a given game number. @end table @node ICS options @section ICS options @cindex ICS options @cindex Options, ICS @table @asis @item -ics/-xics or -internetChessServerMode true/false @cindex ics, option @cindex internetChessServerMode, option Connect with an Internet Chess Server to play chess against its other users, observe games they are playing, or review games that have recently finished. Default: false. @item -icshost or -internetChessServerHost host @cindex icshost, option @cindex internetChessServerHost, option The Internet host name or address of the chess server to connect to when in ICS mode. Default: @code{chessclub.com}. Another popular chess server to try is @code{freechess.org}. If your site doesn't have a working Internet name server, try specifying the host address in numeric form. You may also need to specify the numeric address when using the icshelper option with timestamp or timeseal (see below). @item -icsport or -internetChessServerPort port-number @cindex icsport, option @cindex internetChessServerPort, option The port number to use when connecting to a chess server in ICS mode. Default: 5000. @item -icshelper or -internetChessServerHelper prog-name @cindex icshelper, option @cindex internetChessServerHelper, option An external helper program used to communicate with the chess server. You would set it to "timestamp" for ICC (chessclub.com) or "timeseal" for FICS (freechess.org), after obtaining the correct version of timestamp or timeseal for your computer. See "help timestamp" on ICC and "help timeseal" on FICS. This option is shorthand for @code{-useTelnet -telnetProgram program}. @item -telnet/-xtelnet or -useTelnet true/false @cindex telnet, option @cindex useTelnet, option This option is poorly named; it should be called useHelper. If set to true, it instructs XBoard to run an external program to communicate with the Internet Chess Server. The program to use is given by the telnetProgram option. If the option is false (the default), XBoard opens a TCP socket and uses its own internal implementation of the telnet protocol to communicate with the ICS. @xref{Firewalls}. @item -telnetProgram prog-name @cindex telnetProgram, option This option is poorly named; it should be called helperProgram. It gives the name of the telnet program to be used with the @code{gateway} and @code{useTelnet} options. The default is @file{telnet}. The telnet program is invoked with the value of @code{internetChessServerHost} as its first argument and the value of @code{internetChessServerPort} as its second argument. @xref{Firewalls}. @item -gateway host-name @cindex gateway, option If this option is set to a host name, XBoard communicates with the Internet Chess Server by using @file{rsh} to run the @code{telnetProgram} on the given host, instead of using its own internal implementation of the telnet protocol. You can substitute a different remote shell program for @file{rsh} using the @code{remoteShell} option described below. @xref{Firewalls}. @item -internetChessServerCommPort or -icscomm dev-name @cindex internetChessServerCommPort, option @cindex icscomm, option If this option is set, XBoard communicates with the ICS through the given character I/O device instead of opening a TCP connection. Use this option if your system does not have any kind of Internet connection itself (not even a SLIP or PPP connection), but you do have dial-up access (or a hardwired terminal line) to an Internet service provider from which you can telnet to the ICS. The support for this option in XBoard is minimal. You need to set all communication parameters and tty modes before you enter XBoard. Use a script something like this: @example stty raw -echo 9600 > /dev/tty00 xboard -ics -icscomm /dev/tty00 @end example Here replace @samp{/dev/tty00} with the name of the device that your modem is connected to. You might have to add several more options to these stty commands. See the man pages for @file{stty} and @code{tty} if you run into problems. Also, on many systems stty works on its standard input instead of standard output, so you have to use @samp{<} instead of @samp{>}. If you are using linux, try starting with the script below. Change it as necessary for your installation. @example #!/bin/sh -f # configure modem and fire up XBoard # configure modem ( stty 2400 ; stty raw ; stty hupcl ; stty -clocal stty ignbrk ; stty ignpar ; stty ixon ; stty ixoff stty -iexten ; stty -echo ) < /dev/modem xboard -ics -icscomm /dev/modem @end example @noindent After you start XBoard in this way, type whatever commands are necessary to dial out to your Internet provider and log in. Then telnet to ICS, using a command like @kbd{telnet chessclub.com 5000}. Important: See the paragraph below about extra echoes, in @ref{Limitations}. @item -icslogon or -internetChessServerLogonScript file-name @cindex icslogon, option @cindex internetChessServerLogonScript, option @cindex .icsrc Whenever XBoard connects to the Internet Chess Server, if it finds a file with the name given in this option, it feeds the file's contents to the ICS as commands. The default file name is @file{.icsrc}. Usually the first two lines of the file should be your ICS user name and password. The file can be either in $CHESSDIR, in XBoard's working directory if CHESSDIR is not set, or in your home directory. @item -msLoginDelay delay @cindex msLoginDelay, option If you experience trouble logging on to an ICS when using the @code{-icslogon} option, inserting some delay between characters of the logon script may help. This option adds @code{delay} milliseconds of delay between characters. Good values to try are 100 and 250. @item -icsinput/-xicsinput or -internetChessServerInputBox true/false @cindex icsinput, option @cindex internetChessServerInputBox, option Sets the ICS Input Box menu option. @xref{Mode Menu}. Default: false. @item -autocomm/-xautocomm or -autoComment true/false @cindex autocomm, option @cindex autoComment, option Sets the Auto Comment menu option. @xref{Options Menu}. Default: false. @item -autoflag/-xautoflag or -autoCallFlag true/false @cindex autoflag, option @cindex autoCallFlag, option Sets the Auto Flag menu option. @xref{Options Menu}. Default: false. @item -autobs/-xautobs or -autoObserve true/false @cindex autobs, option @cindex autoObserve, option Sets the Auto Observe menu option. @xref{Options Menu}. Default: false. @item -autoKibitz @cindex autoKibitz, option Enables kibitzing of the engines last thinking output (depth, score, time, speed, PV) before it moved to the ICS, in zippy mode. The option @code{showThinking} must be switched on for this option to work. Also diverts similar kibitz information of an opponent engine that is playing you through the ICS to the engine-output window, as if the engine was playing locally. @item -seekGraph true/false or -sg @cindex seekGraph, option @cindex sg, option Enables displaying of the seek graph by left-clicking the board when you are logged on to an ICS and currently idle. The seek graph show all players currently seeking games on the ICS, plotted according to their rating and the time control of the game they seek, in three different colors (for rated, unrated and wild games). Computer ads are displayed as squares, human ads are dots. Default: false. @item -autoRefresh true/false @cindex autoRefresh, option Enables automatic updating of the seek graph, by having the ICS send a running update of all newly placed and removed seek ads. This consumes a substantial amount of communication bandwidth, and is only supported for FICS and ICC. Default: false. @item -backgroundObserve true/false @cindex backgroundObserve, option When true, boards sent to you by the ICS from other games while you are playing (e.g. because you are observing them) will not be automatically displayed. Only a summary of time left and material of both players will appear in the message field above the board. XBoard will remember the last board it has received this way, and will display it in stead of the position in your own game when you press the right mouse button. No other information is stored on such games observed in the background; you cannot save such a game later, or step through its moves. This feature is provided solely for the benefit of bughouse players, to enable them to peek at their partner's game without the need to logon twice. Default: false. @item -dualBoard true/false @cindex dualBoard, option In combination with -backgroundObserve true, this option will display the board of the background game side by side with that of your own game, so you can have it in view permanently. Any board or holdings info coming in will be displayed on the secondary board immediately. This feature is still experimental and largely unfinished. There is no animation or highlighting of moves on the secondary board. Default: false. @item -disguisePromotedPieces true/false @cindex disguisePromotedPieces, option When set promoted Pawns in crazyhouse/bughouse are displayed identical to primordial pieces of the same type, rather than distinguishable. Default: true. @item -moves/-xmoves or -getMoveList true/false @cindex moves, option @cindex getMoveList, option Sets the Get Move List menu option. @xref{Options Menu}. Default: true. @item -alarm/-xalarm or -icsAlarm true/false @cindex alarm, option @cindex icsAlarm, option Sets the ICS Alarm menu option. @xref{Options Menu}. Default: true. @item -icsAlarmTime ms @cindex icsAlarmTime, option Sets the time in milliseconds for the ICS Alarm menu option. @xref{Options Menu}. Default: 5000. @item lowTimeWarning true/false @cindex lowTimeWarning, option Controls a color change of the board as a warning your time is running out. @xref{Options Menu}. Default: false. @item -pre/-xpre \fRor\fB -premove true/false @cindex pre, option @cindex premove, option Sets the Premove menu option. @xref{Options Menu}. Default: true. @item -prewhite/-xprewhite or -premoveWhite @itemx -preblack/-xpreblack or -premoveBlack @itemx -premoveWhiteText string @itemx -premoveBlackText string @cindex prewhite, option @cindex premoveWhite, option @cindex preblack, option @cindex premoveBlack, option @cindex premoveWhiteText, option @cindex premoveBlackText, option Set the menu options for specifying the first move for either color. @xref{Options Menu}. Defaults: false and empty strings, so no pre-moves. @item -quiet/-xquiet or -quietPlay true/false @cindex quiet, option @cindex quietPlay, option Sets the Quiet Play menu option. @xref{Options Menu}. Default: false. @item -colorizeMessages or -colorize/-xcolorize @cindex Colors @cindex colorize, option @cindex colorizeMessages, option Setting colorizeMessages to true tells XBoard to colorize the messages received from the ICS. Colorization works only if your xterm supports ISO 6429 escape sequences for changing text colors. Default: true. @item -colorShout foreground,background,bold @itemx -colorSShout foreground,background,bold @itemx -colorCShout foreground,background,bold @itemx -colorChannel1 foreground,background,bold @itemx -colorChannel foreground,background,bold @itemx -colorKibitz foreground,background,bold @itemx -colorTell foreground,background,bold @itemx -colorChallege foreground,background,bold @itemx -colorRequest foreground,background,bold @itemx -colorSeek foreground,background,bold @itemx -colorNormal foreground,background,bold @cindex Colors @cindex colorShout, option @cindex colorSShout, option @cindex colorCShout, option @cindex colorChannel1, option @cindex colorChannel, option @cindex colorKibitz, option @cindex colorTell, option @cindex colorChallenge, option @cindex colorRequest, option @cindex colorSeek, option @cindex colorNormal, option These options set the colors used when colorizing ICS messages. All ICS messages are grouped into one of these categories: shout, sshout, channel 1, other channel, kibitz, tell, challenge, request (including abort, adjourn, draw, pause, and takeback), or normal (all other messages). Each foreground or background argument can be one of the following: black, red, green, yellow, blue, magenta, cyan, white, or default. Here ``default'' means the default foreground or background color of your xterm. Bold can be 1 or 0. If background is omitted, ``default'' is assumed; if bold is omitted, 0 is assumed. @item -soundProgram progname @cindex soundProgram, option @cindex Sounds If this option is set to a sound-playing program that is installed and working on your system, XBoard can play sound files when certain events occur, listed below. The default program name is "play". If any of the sound options is set to "$", the event rings the terminal bell by sending a ^G character to standard output, instead of playing a sound file. If an option is set to the empty string "", no sound is played for that event. @item -soundDirectory directoryname @cindex soundDirectory, option @cindex Sounds This option specifies where XBoard will look for sound files, when these are not given as an absolute path name. @item -soundShout filename @itemx -soundSShout filename @itemx -soundCShout filename @itemx -soundChannel filename @itemx -soundChannel1 filename @itemx -soundKibitz filename @itemx -soundTell filename @itemx -soundChallenge filename @itemx -soundRequest filename @itemx -soundSeek filename @cindex soundShout, option @cindex soundSShout, option @cindex soundCShout, option @cindex soundChannel, option @cindex soundChannel1, option @cindex soundKibitz, option @cindex soundTell, option @cindex soundChallenge, option @cindex soundRequest, option @cindex soundSeek, option These sounds are triggered in the same way as the colorization events described above. They all default to "", no sound. They are played only if the colorizeMessages is on. CShout is synonymous with SShout. @item -soundMove filename @cindex soundMove, option This sound is used by the Move Sound menu option. Default: "$". @item -soundIcsAlarm filename @cindex soundIcsAlarm, option This sound is used by the ICS Alarm menu option. Default: "$". @item -soundIcsWin filename @cindex soundIcsWin, option This sound is played when you win an ICS game. Default: "" (no sound). @item -soundIcsLoss filename @cindex soundIcsLoss, option This sound is played when you lose an ICS game. Default: "" (no sound). @item -soundIcsDraw filename @cindex soundIcsDraw, option This sound is played when you draw an ICS game. Default: "" (no sound). @item -soundIcsUnfinished filename @cindex soundIcsUnfinished, option This sound is played when an ICS game that you are participating in is aborted, adjourned, or otherwise ends inconclusively. Default: "" (no sound). @end table @node Load and Save options @section Load and Save options @cindex Options, Load and Save @cindex Load and Save options @table @asis @item -lgf or -loadGameFile file @itemx -lgi or -loadGameIndex index @cindex lgf, option @cindex loadGameFile, option @cindex lgi, option @cindex loadGameIndex, option If the @code{loadGameFile} option is set, XBoard loads the specified game file at startup. The file name @file{-} specifies the standard input. If there is more than one game in the file, XBoard pops up a menu of the available games, with entries based on their PGN (Portable Game Notation) tags. If the @code{loadGameIndex} option is set to @samp{N}, the menu is suppressed and the N th game found in the file is loaded immediately. The menu is also suppressed if @code{matchMode} is enabled or if the game file is a pipe; in these cases the first game in the file is loaded immediately. Use the @file{pxboard} shell script provided with XBoard if you want to pipe in files containing multiple games and still see the menu. If the loadGameIndex specifies an index -1, this triggers auto-increment of the index in @code{matchMode}, which means that after every game the index is incremented by one, causing each game of the match to be played from the next game in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each game in the file is used twice (with reversed colors). The @code{rewindIndex} option causes the index to be reset to the first game of the file when it has reached a specified value. @item -rewindIndex n Causes a position file or game file to be rewound to its beginning after n positions or games in auto-increment @code{matchMode}. See @code{loadPositionIndex} and @code{loadGameIndex}. default: 0 (no rewind). @item -td or -timeDelay seconds @cindex td, option @cindex timeDelay, option Time delay between moves during @samp{Load Game} or @samp{Analyze File}. Fractional seconds are allowed; try @samp{-td 0.4}. A time delay value of -1 tells XBoard not to step through game files automatically. Default: 1 second. @item -sgf or -saveGameFile file @cindex sgf, option @cindex saveGameFile, option If this option is set, XBoard appends a record of every game played to the specified file. The file name @file{-} specifies the standard output. @item -autosave/-xautosave or -autoSaveGames true/false @cindex autosave, option @cindex autoSaveGames, option Sets the Auto Save menu option. @xref{Options Menu}. Default: false. Ignored if @code{saveGameFile} is set. @item -onlyOwnGames true/false @cindex onlyOwnGames, option Suppresses auto-saving of ICS observed games. Default: false. @item -lpf or -loadPositionFile file @itemx -lpi or -loadPositionIndex index @cindex lpf, option @cindex loadPositionFile, option @cindex lpi, option @cindex loadPositionIndex, option If the @code{loadPositionFile} option is set, XBoard loads the specified position file at startup. The file name @file{-} specifies the standard input. If the @code{loadPositionIndex} option is set to N, the Nth position found in the file is loaded; otherwise the first position is loaded. If the loadPositionIndex specifies an index -1, this triggers auto-increment of the index in @code{matchMode}, which means that after every game the index is incremented by one, causing each game of the match to be played from the next position in the file. Similarly, specifying an index value of -2 causes the index to be incremented every two games, so that each position in the file is used twice (with the engines playing opposite colors). The @code{rewindIndex} option causes the index to be reset to the first position of the file when it has reached a specified value. @item -spf or -savePositionFile file @cindex spf, option @cindex savePositionFile, option If this option is set, XBoard appends the final position reached in every game played to the specified file. The file name @file{-} specifies the standard output. @item -pgnExtendedInfo true/false @cindex pgnExtendedInfo, option If this option is set, XBoard saves depth, score and time used for each move that the engine found as a comment in the PGN file. Default: false. @item -pgnEventHeader string @cindex pgnEventHeader, option Sets the name used in the PGN event tag to string. Default: "Computer Chess Game". @item -pgnNumberTag true/false @cindex pgnNumberTag, option Include the (unique) sequence number of a tournament game into the saved PGN file as a 'number' tag. Default: false. @item -saveOutOfBookInfo true/false @cindex saveOutOfBookInfo, option Include the information on how the engine(s) game out of its opening book in a special 'annotator' tag with the PGN file. Default: true. @item -oldsave/-xoldsave or -oldSaveStyle true/false @cindex oldsave, option @cindex oldSaveStyle, option Sets the Old Save Style menu option. @xref{Options Menu}. Default: false. @item -gameListTags string @cindex gameListTags, option The character string lists the PGN tags that should be printed in the Game List, and their order. The meaning of the codes is e=event, s=site, d=date, o=round, p=players, r=result, w=white Elo, b=black Elo, t=time control, v=variant, a=out-of-book info, c=result comment. Default: "eprd" @item -ini or -settingsFile filename @itemx -saveSettingsFile filename @itemx @@filename @cindex saveSettingsFile, option @cindex SettingsFile, option @cindex init, option @cindex at sign, option When XBoard encounters an option -settingsFile (or -ini for short), or @@filename, it tries to read the mentioned file, and substitutes the contents of it (presumaby more command-line options) in place of the option. In the case of -ini or -settingsFile, the name of a successfully read settings file is also remembered as the file to use for saving settings (automatically on exit, or on user command). An option of the form @@filename does not affect saving. The option -saveSettingsFile does specify a name of the file to use for saving, without reading any options from it, and is thus also effective when the file did not exist yet. So the settings will be saved to the file specified in the last -saveSettingsFile or succesfull -settingsFile / -ini command, if any, and in /etc/xboard/xboard.conf otherwise. Usualy the latter is only accessible for the system administrator, though, and will be used to contain system-wide default setings, amongst which a -saveSettingsFile and -settingsFile options to specify a settings file accessible to the individual user, such as ~/.xboardrc in the user's home directory. @item -saveSettingsOnExit true/false @cindex saveSettingsOnExit, option Controls saving of options on the settings file. @xref{Options Menu}. Default: true. @end table @node User interface options @section User interface options @cindex User interface options @cindex Options, User interface @table @asis @item -display @itemx -geometry @itemx -iconic @itemx -name @cindex display, option @cindex geometry, option @cindex iconic, option @cindex resource name, option These and most other standard Xt options are accepted. @item -noGUI @cindex noGUI, option Suppresses all GUI functions of XBoard (to speed up automated ultra-fast engine-engine games, which you don't want to watch). There will be no board or clock updates, no printing of moves, and no update of the icon on the task bar in this mode. @item -logoSize N @cindex logoSize, option This option controls the drawing of player logos next to the clocks. The integer N specifies the width of the logo in pixels; the logo height will always be half the width. When N = 0, no logos will be diplayed. Default: 0. @item -firstLogo imagefile @itemx -secondLogo imagefile @cindex firstLogo, option @cindex secondLogo, option Specify the images to be used as player logos when @code{logoSize} is non-zero, next to the white and black clocks, respectively. @item -autoLogo true/false @item -logoDir filename @cindex autoLogo, option @cindex logoDir, option When @code{autoLogo} is set, XBoard will search for a PNG image file with the name of the engine or ICS in the directory specified by @code{logoDir}. @item -recentEngines number @itemx -recentEngineList list @cindex recentEngines, option @cindex recentEngineList, option When the number is larger than zero, it determines how many recently used engines will be appended at the bottom of the @samp{Engines} menu. The engines will be saved in your settings file as the option @code{recentEngineList}, by their nicknames, and the most recently used one will always be sorted to the top. If the list after that is longer than the specified number, the last one is discarded. Changes in the list will only become visible the next session, provided you saved the settings. Default: 6. @item -oneClickMove true/false @cindex oneClickMove, option When set, this option allows you to enter moves by only clicking the to- or from-square, when only a single legal move to or from that square is possible. Double-clicking a piece (or clicking an already selected piece) will instruct that piece to make the only capture it can legally do. Default: false. @item -movesound/-xmovesound or -ringBellAfterMoves true/false @cindex movesound, option @cindex bell, option @cindex ringBellAfterMoves, option Sets the Move Sound menu option. @xref{Options Menu}. Default: false. For compatibility with old XBoard versions, -bell/-xbell are also accepted as abbreviations for this option. @item -exit/-xexit or -popupExitMessage true/false @cindex exit, option @cindex popupExitMessage, option Sets the Popup Exit Message menu option. @xref{Options Menu}. Default: true. @item -popup/-xpopup or -popupMoveErrors true/false @cindex popup, option @cindex popupMoveErrors, option Sets the Popup Move Errors menu option. @xref{Options Menu}. Default: false. @item -queen/-xqueen or -alwaysPromoteToQueen true/false @cindex queen, option @cindex alwaysPromoteToQueen, option Sets the Always Queen menu option. @xref{Options Menu}. Default: false. @item -sweepPromotions true/false @cindex sweepPromotion, option Sets the @samp{Almost Always Promote to Queen} menu option. @xref{Options Menu}. Default: false. @item -legal/-xlegal or -testLegality true/false @cindex legal, option @cindex testLegality, option Sets the Test Legality menu option. @xref{Options Menu}. Default: true. @item -size or -boardSize (sizeName | n1,n2,n3,n4,n5,n6,n7) @cindex size, option @cindex boardSize, option @cindex board size Determines how large the board will be, by selecting the pixel size of the pieces and setting a few related parameters. The sizeName can be one of: Titanic, giving 129x129 pixel pieces, Colossal 116x116, Giant 108x108, Huge 95x95, Big 87x87, Large 80x80, Bulky 72x72, Medium 64x64, Moderate 58x58, Average 54x54, Middling 49x49, Mediocre 45x45, Small 40x40, Slim 37x37, Petite 33x33, Dinky 29x29, Teeny 25x25, or Tiny 21x21. Xboard installs with a set of scalable (svg) piece images, which it scales to any of the requested sizes. The square size can further be continuously scaled by sizing the board window, but this only adapts the size of the pieces, and has no effect on the width of the grid lines or the font choice (both of which would depend on he selected boardSize). The default depends on the size of your screen; it is approximately the largest size that will fit without clipping. You can select other sizes or vary other layout parameters by providing a list of comma-separated values (with no spaces) as the argument. You do not need to provide all the values; for any you omit from the end of the list, defaults are taken from the nearest built-in size. The value @code{n1} gives the piece size, @code{n2} the width of the black border between squares, @code{n3} the desired size for the clockFont, @code{n4} the desired size for the coordFont, @code{n5} the desired size for the messageFont, @code{n6} the smallLayout flag (0 or 1), and @code{n7} the tinyLayout flag (0 or 1). All dimensions are in pixels. If the border between squares is eliminated (0 width), the various highlight options will not work, as there is nowhere to draw the highlight. If smallLayout is 1 and @code{titleInWindow} is true, the window layout is rearranged to make more room for the title. If tinyLayout is 1, the labels on the menu bar are abbreviated to one character each and the buttons in the button bar are made narrower. @item -overrideLineGap n @cindex overrideLineGap, option When n >= 0, this forces the width of the black border between squares to n pixels for any board size. Mostly used to suppress the grid entirely by setting n = 0, e.g. in xiangqi or just getting a prettier picture. When n < 0 this the size-dependent width of the grid lines is used. Default: -1. @item -coords/-xcoords or -showCoords true/false @cindex coords, option @cindex showCoords, option Sets the Show Coords menu option. @xref{Options Menu}. Default: false. The @code{coordFont} option specifies what font to use. @item -autoraise/-xautoraise or -autoRaiseBoard true/false @cindex autoraise, option @cindex autoRaiseBoard, option Sets the Auto Raise Board menu option. @xref{Options Menu}. Default: true. @item -autoflip/-xautoflip or -autoFlipView true/false @cindex autoflip, option @cindex autoFlipView, option Sets the Auto Flip View menu option. @xref{Options Menu}. Default: true. @item -flip/-xflip or -flipView true/false @cindex flip, option @cindex flipView, option If Auto Flip View is not set, or if you are observing but not participating in a game, then the positioning of the board at the start of each game depends on the flipView option. If flipView is false (the default), the board is positioned so that the white pawns move from the bottom to the top; if true, the black pawns move from the bottom to the top. In any case, the Flip menu option (see @ref{Options Menu}) can be used to flip the board after the game starts. @item -title/-xtitle or -titleInWindow true/false @cindex title, option @cindex titleInWindow, option If this option is true, XBoard displays player names (for ICS games) and game file names (for @samp{Load Game}) inside its main window. If the option is false (the default), this information is displayed only in the window banner. You probably won't want to set this option unless the information is not showing up in the banner, as happens with a few X window managers. @item -buttons/-xbuttons or -showButtonBar True/False @cindex buttons, option @cindex showButtonBar, option If this option is False, xboard omits the [<<] [<] [P] [>] [>>] button bar from the window, allowing the message line to be wider. You can still get the functions of these buttons using the menus or their keyboard shortcuts. Default: true. @item -evalZoom factor @cindex evalZoom, option The score interval (-1,1) is blown up on the vertical axis of the Evaluation Graph by the given factor. Default: 1 @item -evalThreshold n @cindex evalThreshold, option Score below n (centiPawn) are plotted as 0 in the Evaluation Graph. Default: 25 @item -mono/-xmono or -monoMode true/false @cindex mono, option @cindex monoMode, option Determines whether XBoard displays its pieces and squares with two colors (true) or four (false). You shouldn't have to specify @code{monoMode}; XBoard will determine if it is necessary. @item -showTargetSquares true/false @cindex showTargetSquares, option Determines whether XBoard can highlight the squares a piece has legal moves to, when you grab that piece with the mouse. Default: false. @item -flashCount count @itemx -flashRate rate @itemx -flash/-xflash @cindex flashCount, option @cindex flashRate, option @cindex flash, option @cindex xflash, option These options enable flashing of pieces when they land on their destination square. @code{flashCount} tells XBoard how many times to flash a piece after it lands on its destination square. @code{flashRate} controls the rate of flashing (flashes/sec). Abbreviations: @code{flash} sets flashCount to 3. @code{xflash} sets flashCount to 0. Defaults: flashCount=0 (no flashing), flashRate=5. @item -highlight/-xhighlight or -highlightLastMove true/false @cindex highlight, option @cindex highlightLastMove, option Sets the Highlight Last Move menu option. @xref{Options Menu}. Default: false. @item -highlightMoveWithArrow true/false @cindex highlight Arrow, option @cindex highlightMoveWithArrow, option Sets the Highlight with Arrow menu option. @xref{Options Menu}. Default: false. @item -blind/-xblind or -blindfold true/false @cindex blind, option @cindex blindfold, option Sets the Blindfold menu option. @xref{Options Menu}. Default: false. @item -periodic/-xperiodic or -periodicUpdates true/false @cindex periodic, option @cindex periodicUpdates, option Controls updating of current move andnode counts in analysis mode. Default: true. @item -fSAN @itemx -sSAN @cindex fSAN, option @cindex sSAN, option Causes the PV in thinking output of the mentioned engine to be converted to SAN before it is further processed. Warning: this might lose engine output not understood by the parser, and uses a lot of CPU power. Default: the PV is displayed exactly as the engine produced it. @item -showEvalInMoveHistory true/false @cindex showEvalInMoveHistory, option Controls whether the evaluation scores and search depth of engine moves are displayed with the move in the move-history window. Default: true. @item -clockFont font @cindex clockFont, option @cindex Font, clock The font used for the clocks. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*. @item -coordFont font @cindex coordFont, option @cindex Font, coordinates The font used for rank and file coordinate labels if @code{showCoords} is true. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*. @item -messageFont font @cindex messageFont, option @cindex Font, message The font used for popup dialogs, menus, comments, etc. If the option value is a pattern that does not specify the font size, XBoard tries to choose an appropriate font for the board size being used. Default: -*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*. @item -fontSizeTolerance tol @cindex fontSizeTolerance, option In the font selection algorithm, a nonscalable font will be preferred over a scalable font if the nonscalable font's size differs by @code{tol} pixels or less from the desired size. A value of -1 will force a scalable font to always be used if available; a value of 0 will use a nonscalable font only if it is exactly the right size; a large value (say 1000) will force a nonscalable font to always be used if available. Default: 4. @item -pid or -pieceImageDirectory dir @cindex pid, option @cindex pieceImageDirectory, option This options control what piece images xboard uses. XBoard will look in the specified directory for an image in png or svg format for every piece type, with names like BlackQueen.svg, WhiteKnight.svg etc. When neither of these is found (or no valid directory is specified) XBoard will use the svg piece that was installed with it (from the source-tree directory @samp{svg}). Both svg and png images will be scaled by XBoard to the required size, but the png pieces lose much in quality when scaled too much. @item -whitePieceColor color @itemx -blackPieceColor color @itemx -lightSquareColor color @itemx -darkSquareColor color @itemx -highlightSquareColor color @itemx -preoveHighlightColor color @itemx -lowTimeWarningColor color @cindex Colors @cindex whitePieceColor, option @cindex blackPieceColor, option @cindex lightSquareColor, option @cindex darkSquareColor, option @cindex highlightSquareColor, option @cindex premoveHighlightColor, option @cindex lowTimeWarningColor, option Colors to use for the pieces, squares, and square highlights. Defaults: @example -whitePieceColor #FFFFCC -blackPieceColor #202020 -lightSquareColor #C8C365 -darkSquareColor #77A26D -highlightSquareColor #FFFF00 -premoveHighlightColor #FF0000 -lowTimeWarningColor #FF0000 @end example On a grayscale monitor you might prefer: @example -whitePieceColor gray100 -blackPieceColor gray0 -lightSquareColor gray80 -darkSquareColor gray60 -highlightSquareColor gray100 -premoveHighlightColor gray70 -lowTimeWarningColor gray70 @end example The PieceColor options only work properly if the image files defining the pieces were pure black & white (possibly anti-aliased to produce gray scales and semi-transparancy), like the pieces images that come with the install. Their effect on colored pieces is undefined. The SquareColor option only have an effect when no board textures are used. @item -trueColors true/false @cindex trueColors, option When set, this option suppresses the effect of the PieceColor options mentioned above. This is recommended for images that are already colored. @item -useBoardTexture true/false @itemx -liteBackTextureFile filename @itemx -darkBackTextureFile filename @cindex useBoardTexture, option @cindex liteBackTextureFile, option @cindex darkBackTextureFile, option Indicate the png image files to be used for drawing the board squares, and if they should be used rather than using simple colors. The algorithm for cutting squares out of a given bitmap is such that the picture is perfectly reproduced when a bitmap the size of the complete board is given. Default: false and "" @item -drag/-xdrag or -animateDragging true/false @cindex drag, option @cindex animateDragging, option Sets the Animate Dragging menu option. @xref{Options Menu}. Default: true. @item -animate/-xanimate or -animateMoving true/false @cindex animate, option @cindex animateMoving, option Sets the Animate Moving menu option. @xref{Options Menu}. Default: true. @item -animateSpeed n @cindex -animateSpeed, option Number of milliseconds delay between each animation frame when Animate Moves is on. @item -autoDisplayComment true/false @itemx -autoDisplayTags true/false @cindex -autoDisplayComment, option @cindex -autoDisplayTags, option If set to true, these options cause the window with the move comments, and the window with PGN tags, respectively, to pop up automatically when such tags or comments are encountered during the replaying a stored or loaded game. Default: true. @item -pasteSelection true/false @cindex -pasteSelection, option If this option is set to true, the Paste Position and Paste Game options paste from the currently selected text. If false, they paste from the clipboard. Default: false. @item -autoCopyPV true|false @cindex autoCopyPV, option When this option is set, the position displayed on the board when you terminate a PV walk (initiated by a right-click on board or engine-output window) will be automatically put on the clipboard as FEN. Default: false. @item -dropMenu true|false @cindex dropMenu, option This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) drop menu rather than displaying the position at the end of the principal variation. Default: False. @item -pieceMenu true|false @cindex pieceMenu, option This option allows you to emulate old behavior, where the right mouse button brings up the (now deprecated) piece menu in Edit Position mode. From this menu you can select the piece to put on the square you clicked to bring up the menu, or select items such as @kbd{clear board}. You can also @kbd{promote} or @kbd{demote} a clicked piece to convert it into an unorthodox piece that is not directly in the menu, or give the move to @kbd{black} or @kbd{white}. @item -variations true|false @cindex variations, option When this option is on, you can start new variations in Edit Game or Analyze mode by holding the Shift key down while entering a move. When it is off, the Shift key will be ignored. Default: False. @item -appendPV true|false @cindex appendPV, option When this option is on, right-clicking a PV in the Engine Output window will play the first move of that PV in Analyze mode, or as many moves as you walk through by moving the mouse. Default: False. @item -absoluteAnalysisScores true|false @cindex absoluteAnalysisScores, option When true, scores on the Engine Output window during analysis will be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False. @item -scoreWhite true|false @cindex scoreWhite, option When true, scores will always be printed from the white point-of-view, rather than the side-to-move point-of-view. Default: False. @end table @node Adjudication Options @section Adjudication Options @cindex Options, adjudication @table @asis @item -adjudicateLossThreshold n @cindex adjudicateLossThreshold, option If the given value is non-zero, XBoard adjudicates the game as a loss if both engines agree for a duration of 6 consecutive ply that the score is below the given score threshold for that engine. Make sure the score is interpreted properly by XBoard, using @code{-firstScoreAbs} and @code{-secondScoreAbs} if needed. Default: 0 (no adjudication) @item -adjudicateDrawMoves n @cindex adjudicateDrawMoves, option If the given value is non-zero, XBoard adjudicates the game as a draw if after the given number of moves it was not yet decided. Default: 0 (no adjudication) @item -checkMates true/false @cindex checkMates, option If this option is set, XBoard detects all checkmates and stalemates, and ends the game as soon as they occur. Legality-testing must be switched on for this option to work. Default: true @item -testClaims true/false @cindex testClaims, option If this option is set, XBoard verifies all result claims made by engines, and those who send false claims will forfeit the game because of it. Legality-testing must be switched on for this option to work. Default: true @item -materialDraws true/false @cindex materialDraws, option If this option is set, XBoard adjudicates games as draws when there is no sufficient material left to inflict a checkmate. This applies to KBKB with like bishops (any number, actually), and to KBK, KNK and KK. Legality-testing must be switched on for this option to work. Default: true @item -trivialDraws true/false @cindex trivialDraws, option If this option is set, XBoard adjudicates games as draws that cannot be usually won without opponent cooperation. This applies to KBKB with unlike bishops, and to KBKN, KNKN, KNNK, KRKR and KQKQ. The draw is called after 6 ply into these end-games, to allow quick mates that can occur in some exceptional positions to be found by the engines. KQKQ does not really belong in this category, and might be taken out in the future. (When bitbase-based adjudications are implemented.) Legality-testing must be on for this option to work. Default: false @item -ruleMoves n @cindex ruleMoves, option If the given value is non-zero, XBoard adjudicates the game as a draw after the given number of consecutive reversible moves. Engine draw claims are always accepted after 50 moves, irrespective of the given value of n. @item -repeatsToDraw n If the given value is non-zero, xboard adjudicates the game as a draw if a position is repeated the given number of times. Engines draw claims are always accepted after 3 repeats, (on the 3rd occurrence, actually), irrespective of the value of n. Beware that positions that have different castling or en-passant rights do not count as repeats, XBoard is fully e.p. and castling aware! @end table @node Other options @section Other options @cindex Options, miscellaneous @table @asis @item -ncp/-xncp or -noChessProgram true/false @cindex ncp, option @cindex noChessProgram, option If this option is true, XBoard acts as a passive chessboard; it does not start a chess engine at all. Turning on this option also turns off clockMode. Default: false. @item -viewer @itemx -viewerOptions string @cindex viewer, option @cindex viewerOptions, option Presence of the volatile option @code{viewer} on the command line will cause the value of the persistent option @code{viewerOptions} as stored in the settings file to be appended to the command line. The @code{view} option will be used by desktop associations with game or position file types, so that @code{viewerOptions} can be used to configure the exact mode XBoard will start in when it should act on such a file (e.g. in -ncp mode, or analyzing with your favorite engine). The options are also automatically appended when Board is invoked with a single argument not being an option name, which is then assumed to be the name of a @code{loadGameFile} or (when the name ends in .fen) a @code{loadPositionFile}. Default: "-ncp -engineOutputUp false -saveSettingsOnExit false". @item -tourneyOptions string @cindex tourneyOptions, option When XBoard is invoked with a single argument that is a file with .trn extension, it will assume this argument to be the value of a @code{tourneyFile} option, and apped the value of the persistent option @code{tourneyOptions} as stored in the settings file to the command line. Thus the value of @code{tourneyOptions} can be used to configure XBoard to automatically start running a tournament when it should act on such a file. Default: "-ncp -mm -saveSettingsOnExit false". @item -mode or -initialMode modename @cindex mode, option @cindex initalMode, option If this option is given, XBoard selects the given modename from the Mode menu after starting and (if applicable) processing the loadGameFile or loadPositionFile option. Default: "" (no selection). Other supported values are MachineWhite, MachineBlack, TwoMachines, Analysis, AnalyzeFile, EditGame, EditPosition, and Training. @item -variant varname @cindex variant, option Activates preliminary, partial support for playing chess variants against a local engine or editing variant games. This flag is not needed in ICS mode. Recognized variant names are: @example normal Normal chess wildcastle Shuffle chess, king can castle from d file nocastle Shuffle chess, no castling allowed fischerandom Fischer Random shuffle chess bughouse Bughouse, ICC/FICS rules crazyhouse Crazyhouse, ICC/FICS rules losers Lose all pieces or get mated (ICC wild 17) suicide Lose all pieces including king (FICS) giveaway Try to have no legal moves (ICC wild 26) twokings Weird ICC wild 9 kriegspiel Opponent's pieces are invisible atomic Capturing piece explodes (ICC wild 27) 3check Win by giving check 3 times (ICC wild 25) shatranj An ancient precursor of chess (ICC wild 28) xiangqi Chinese Chess (on a 9x10 board) shogi Japanese Chess (on a 9x9 board & piece drops) capablanca Capablanca Chess (10x8 board, with Archbishop and Chancellor pieces) gothic similar, with a better initial position caparandom An FRC-like version of Capablanca Chess (10x8) janus A game with two Archbishops (10x8 board) courier Medieval intermediate between shatranj and modern Chess (on 12x8 board) falcon Patented 10x8 variant with two Falcon pieces berolina Pawns capture straight ahead, and move diagonal cylinder Pieces wrap around the board edge knightmate King moves as Knight, and vice versa super Superchess (shuffle variant with 4 exo-pieces) makruk Thai Chess (shatranj-like, P promotes on 6th rank) spartan Spartan Chess (black has unorthodox pieces) fairy A catchall variant in which all piece types known to XBoard can participate (8x8) unknown Catchall for other unknown variants @end example NOT ALL BOARDSIZES PROVIDE A COMPLETE SET OF BUILT-IN BITMAPS FOR ALL UN-ORTHODOX PIECES, though. Only in @code{boardSize} middling and bulky all 22 piece types are provided, while -boardSize petite has most of them. Archbishop, Chancellor and Amazon are supported in every size from petite to bulky. Kings or Amazons are substituted for missing bitmaps. You can still play variants needing un-orthodox pieces in other board sizes providing your own bitmaps through the @code{bitmapDirectory} or @code{pixmapDirectory} options. In the shuffle variants, XBoard now does shuffle the pieces, although you can still do it by hand using Edit Position. Some variants are supported only in ICS mode, including bughouse, and kriegspiel. The winning/drawing conditions in crazyhouse (off-board interposition on mate) are not fully understood, but losers, suicide, giveaway, atomic, and 3check should be OK. Berolina and cylinder chess can only be played with legality testing off. In crazyhouse, XBoard now does keep track of off-board pieces. In shatranj it does implement the baring rule when mate detection is switched on. @item -boardHeight N @cindex boardHeight, option Allows you to set a non-standard number of board ranks in any variant. If the height is given as -1, the default height for the variant is used. Default: -1 @item -boardWidth N @cindex boardWidth, option Allows you to set a non-standard number of board files in any variant. If the width is given as -1, the default width for the variant is used. With a non-standard width, the initial position will always be an empty board, as the usual opening array will not fit. Default: -1 @item -holdingsSize N @cindex holdingsSize, option Allows you to set a non-standard size for the holdings in any variant. If the size is given as -1, the default holdings size for the variant is used. The first N piece types will go into the holdings on capture, and you will be able to drop them on the board in stead of making a normal move. If size equals 0, there will be no holdings. Default: -1 @item -defaultFrcPosition N @cindex defaultFrcPosition, option Specifies the number of the opening position in shuffle games like Chess960. A value of -1 means the position is randomly generated by XBoard at the beginning of every game. Default: -1 @item -pieceToCharTable string @cindex pieceToCharTable, option The characters that are used to represent the piece types XBoard knows in FEN diagrams and SAN moves. The string argument has to have an even length (or it will be ignored), as white and black pieces have to be given separately (in that order). The last letter for each color will be the King. The letters before that will be PNBRQ and then a whole host of fairy pieces in an order that has not fully crystallized yet (currently FEACWMOHIJGDVSLU, F=Ferz, Elephant, A=Archbishop, C=Chancellor, W=Wazir, M=Commoner, O=Cannon, H=Nightrider). You should list at least all pieces that occur in the variant you are playing. If you have less than 44 characters in the string, the pieces not mentioned will get assigned a period, and you will not be able to distinguish them in FENs. You can also explicitly assign pieces a period, in which case they will not be counted in deciding which captured pieces can go into the holdings. A tilde '~' as a piece name does mean this piece is used to represent a promoted Pawn in crazyhouse-like games, i.e. on capture it turns back onto a Pawn. A '+' similarly indicates the piece is a shogi-style promoted piece, that should revert to its non-promoted version on capture (rather than to a Pawn). Note that promoted pieces are represented by pieces 11 further in the list. You should not have to use this option often: each variant has its own default setting for the piece representation in FEN, which should be sufficient in normal use. Default: "" @item -pieceNickNames string @cindex pieceNickNames, option The characters in the string are interpreted the same way as in the @code{pieceToCharTable} option. But on input, piece-ID letters are first looked up in the nicknames, and only if not defined there, in the normal pieceToCharTable. This allows you to have two letters designate the same piece, (e.g. N as an alternative to H for Horse in Xiangqi), to make reading of non-compliant notations easier. Default: "" @item -colorNickNames string @cindex colorNickNames, option The side-to-move field in a FEN will be first matched against the letters in the string (first character for white, second for black), before it is matched to the regular 'w' and 'b'. This makes it easier to read non-compliant FENs, which, say, use 'r' for white. Default: "" @item -debug/-xdebug or -debugMode true/false @cindex debug, option @cindex debugMode, option Turns on debugging printout. @item -debugFile filename or -nameOfDebugFile filename @cindex debugFile, option @cindex nameOfDebugFile, option Sets the name of the file to which XBoard saves debug information (including all communication to and from the engines). A @kbd{%d} in the given file name (e.g. game%d.debug) will be replaced by the unique sequence number of a tournament game, so that the debug output of each game will be written on a separate file. @item -engineDebugOutput number @cindex engineDebugOutput, option Specifies how XBoard should handle unsolicited output from the engine, with respect to saving it in the debug file. The output is further (hopefully) ignored. If number=0, XBoard refrains from writing such spurious output to the debug file. If number=1, all engine output is written faithfully to the debug file. If number=2, any protocol-violating line is prefixed with a '#' character, as the engine itself should have done if it wanted to submit info for inclusion in the debug file. This option is provided for the benefit of applications that use the debug file as a source of information, such as the broadcaster of live games TLCV / TLCS. Such applications can be protected from spurious engine output that might otherwise confuse them. @item -rsh or -remoteShell shell-name @cindex rsh, option @cindex remoteShell, option Name of the command used to run programs remotely. The default is @file{rsh} or @file{remsh}, determined when XBoard is configured and compiled. @item -ruser or -remoteUser user-name @cindex ruser, option @cindex remoteUser, option User name on the remote system when running programs with the @code{remoteShell}. The default is your local user name. @item -userName username @cindex userName, option Name under which the Human player will be listed in the PGN file. Default is the login name on your local computer. @item -delayBeforeQuit number @itemx -delayAfterQuit number @cindex delayBeforeQuit, option @cindex delayAfterQuit, option These options specify how long XBoard has to wait before sending a termination signal to rogue engine processes, that do not want to react to the 'quit' command. The second one determines the pause after killing the engine, to make sure it dies. @item -searchMode n @cindex searchMode, option The integer n encodes the mode for the @samp{find position} function. Default: 1 (= Exact position match) @item -eloThresholdBoth elo @itemx -eloThresholdAny elo @cindex eloThresholdBoth, option @cindex eloThresholdAny, option Defines a lower limit for the Elo rating, which has to be surpassed before a game will be considered when searching for a board position. Default: 0 @item -dateThreshold year @cindex dateThreshold, option Only games not played before the given year will be considered when searching for a board position @end table @node Chess Servers @chapter Chess Servers @cindex ICS @cindex ICS, addresses @cindex Internet Chess Server An @dfn{Internet Chess Server}, or @dfn{ICS}, is a place on the Internet where people can get together to play chess, watch other people's games, or just chat. You can use either @code{telnet} or a client program like XBoard to connect to the server. There are thousands of registered users on the different ICS hosts, and it is not unusual to meet 200 on both chessclub.com and freechess.org. Most people can just type @kbd{xboard -ics} to start XBoard as an ICS client. Invoking XBoard in this way connects you to the Internet Chess Club (ICC), a commercial ICS. You can log in there as a guest even if you do not have a paid account. To connect to the largest Free ICS (FICS), use the command @kbd{xboard -ics -icshost freechess.org} instead, or substitute a different host name to connect to your favorite ICS. For a full description of command-line options that control the connection to ICS and change the default values of ICS options, see @ref{ICS options}. While you are running XBoard as an ICS client, you use the terminal window that you started XBoard from as a place to type in commands and read information that is not available on the chessboard. The first time you need to use the terminal is to enter your login name and password, if you are a registered player. (You don't need to do this manually; the @code{icsLogon} option can do it for you. @pxref{ICS options}.) If you are not registered, enter @kbd{g} as your name, and the server will pick a unique guest name for you. Some useful ICS commands include @table @kbd @item help @cindex help, ICS command to get help on the given . To get a list of possible topics type @dfn{help} without topic. Try the help command before you ask other people on the server for help. For example @kbd{help register} tells you how to become a registered ICS player. @item who @cindex who, ICS command to see a list of people who are logged on. Administrators (people you should talk to if you have a problem) are marked with the character @samp{*}, an asterisk. The allow you to display only selected players: For example, @kbd{who of} shows a list of players who are interested in playing but do not have an opponent. @item games @cindex games, ICS command to see what games are being played @item match [] [] to challenge another player to a game. Both opponents get minutes for the game, and seconds will be added after each move. If another player challenges you, the server asks if you want to accept the challenge; use the @kbd{accept} or @kbd{decline} commands to answer. @item accept @itemx decline @cindex accept, ICS command @cindex decline, ICS command to accept or decline another player's offer. The offer may be to start a new game, or to agree to a @kbd{draw}, @kbd{adjourn} or @kbd{abort} the current game. @xref{Action Menu}. If you have more than one pending offer (for example, if more than one player is challenging you, or if your opponent offers both a draw and to adjourn the game), you have to supply additional information, by typing something like @kbd{accept }, @kbd{accept draw}, or @kbd{draw}. @item draw @itemx adjourn @itemx abort @cindex draw, ICS command @cindex adjourn, ICS command @cindex abort, ICS command asks your opponent to terminate a game by mutual agreement. Adjourned games can be continued later. Your opponent can either @kbd{decline} your offer or accept it (by typing the same command or typing @kbd{accept}). In some cases these commands work immediately, without asking your opponent to agree. For example, you can abort the game unilaterally if your opponent is out of time, and you can claim a draw by repetition or the 50-move rule if available simply by typing @kbd{draw}. @item finger @cindex finger, ICS command to get information about the given . (Default: yourself.) @item vars @cindex vars, ICS command to get a list of personal settings @item set @cindex set, ICS command to modify these settings @item observe @cindex observe, ICS command to observe an ongoing game of the given . @item examine @itemx oldmoves @cindex examine, ICS command @cindex oldmoves, ICS command to review a recently completed game @end table Some special XBoard features are activated when you are in examine mode on ICS. See the descriptions of the menu commands @samp{Forward}, @samp{Backward}, @samp{Pause}, @samp{ICS Client}, and @samp{Stop Examining} on the @ref{Edit Menu}, @ref{Mode Menu}, and @ref{Action Menu}. @node Firewalls @chapter Firewalls By default, XBoard communicates with an Internet Chess Server by opening a TCP socket directly from the machine it is running on to the ICS. If there is a firewall between your machine and the ICS, this won't work. Here are some recipes for getting around common kinds of firewalls using special options to XBoard. Important: See the paragraph in the below about extra echoes, in @ref{Limitations}. Suppose that you can't telnet directly to ICS, but you can telnet to a firewall host, log in, and then telnet from there to ICS. Let's say the firewall is called @samp{firewall.example.com}. Set command-line options as follows: @example xboard -ics -icshost firewall.example.com -icsport 23 @end example @noindent Then when you run XBoard in ICS mode, you will be prompted to log in to the firewall host. This works because port 23 is the standard telnet login service. Do so, then telnet to ICS, using a command like @samp{telnet chessclub.com 5000}, or whatever command the firewall provides for telnetting to port 5000. If your firewall lets you telnet (or rlogin) to remote hosts but doesn't let you telnet to port 5000, you may be able to connect to the chess server on port 23 instead, which is the port the telnet program uses by default. Some chess servers support this (including chessclub.com and freechess.org), while some do not. If your chess server does not allow connections on port 23 and your firewall does not allow you to connect to other ports, you may be able to connect by hopping through another host outside the firewall that you have an account on. For instance, suppose you have a shell account at @samp{foo.edu}. Follow the recipe above, but instead of typing @samp{telnet chessclub.com 5000} to the firewall, type @samp{telnet foo.edu} (or @samp{rlogin foo.edu}), log in there, and then type @samp{telnet chessclub.com 5000}. Suppose that you can't telnet directly to ICS, but you can use rsh to run programs on a firewall host, and that host can telnet to ICS. Let's say the firewall is called @samp{rsh.example.com}. Set command-line options as follows: @example xboard -ics -gateway rsh.example.com -icshost chessclub.com @end example @noindent Then when you run XBoard in ICS mode, it will connect to the ICS by using @file{rsh} to run the command @samp{telnet chessclub.com 5000} on host @samp{rsh.example.com}. Suppose that you can telnet anywhere you want, but you have to run a special program called @file{ptelnet} to do so. First, we'll consider the easy case, in which @samp{ptelnet chessclub.com 5000} gets you to the chess server. In this case set command line options as follows: @example xboard -ics -telnet -telnetProgram ptelnet @end example @noindent Then when you run XBoard in ICS mode, it will issue the command @samp{ptelnet chessclub.com 5000} to connect to the ICS. Next, suppose that @samp{ptelnet chessclub.com 5000} doesn't work; that is, your @file{ptelnet} program doesn't let you connect to alternative ports. As noted above, your chess server may allow you to connect on port 23 instead. In that case, just add the option @samp{-icsport ""} to the above command. But if your chess server doesn't let you connect on port 23, you will have to find some other host outside the firewall and hop through it. For instance, suppose you have a shell account at @samp{foo.edu}. Set command line options as follows: @example xboard -ics -telnet -telnetProgram ptelnet -icshost foo.edu -icsport "" @end example @noindent Then when you run XBoard in ICS mode, it will issue the command @samp{ptelnet foo.edu} to connect to your account at @samp{foo.edu}. Log in there, then type @samp{telnet chessclub.com 5000}. ICC timestamp and FICS timeseal do not work through some firewalls. You can use them only if your firewall gives a clean TCP connection with a full 8-bit wide path. If your firewall allows you to get out only by running a special telnet program, you can't use timestamp or timeseal across it. But if you have access to a computer just outside your firewall, and you have much lower netlag when talking to that computer than to the ICS, it might be worthwhile running timestamp there. Follow the instructions above for hopping through a host outside the firewall (foo.edu in the example), but run timestamp or timeseal on that host instead of telnet. Suppose that you have a SOCKS firewall that will give you a clean 8-bit wide TCP connection to the chess server, but only after you authenticate yourself via the SOCKS protocol. In that case, you could make a socksified version of XBoard and run that. If you are using timestamp or timeseal, you will to socksify it, not XBoard; this may be difficult seeing that ICC and FICS do not provide source code for these programs. Socksification is beyond the scope of this document, but see the SOCKS Web site at http://www.socks.permeo.com/. If you are missing SOCKS, try http://www.funbureau.com/. @node Environment @chapter Environment variables @cindex Environment variables @cindex CHESSDIR Game and position files are found in a directory named by the @code{CHESSDIR} environment variable. If this variable is not set, the current working directory is used. If @code{CHESSDIR} is set, XBoard actually changes its working directory to @code{$CHESSDIR}, so any files written by the chess engine will be placed there too. @node Limitations @chapter Limitations and known bugs @cindex Limitations @cindex Bugs There is no way for two people running copies of XBoard to play each other without going through an Internet Chess Server. Under some circumstances, your ICS password may be echoed when you log on. If you are connecting to the ICS by running telnet on an Internet provider or firewall host, you may find that each line you type is echoed back an extra time after you hit @key{Enter}. If your Internet provider is a Unix system, you can probably turn its echo off by typing @kbd{stty -echo} after you log in, and/or typing @key{^E}@key{Enter} (Ctrl+E followed by the Enter key) to the telnet program after you have logged into ICS. It is a good idea to do this if you can, because the extra echo can occasionally confuse XBoard's parsing routines. The game parser recognizes only algebraic notation. Many of the following points used to be limitations in XBoard 4.2.7 and earlier, but are now fixed: The internal move legality tester in XBoard 4.3.xx does look at the game history, and is fully aware of castling or en-passant-capture rights. It permits castling with the king on the d file because this is possible in some "wild 1" games on ICS. The piece-drop menu does not check piece drops in bughouse to see if you actually hold the piece you are trying to drop. But this way of dropping pieces should be considered an obsolete feature, now that pieces can be dropped by dragging them from the holdings to the board. Anyway, if you would attempt an illegal move when using a chess engine or the ICS, XBoard will accept the error message that comes back, undo the move, and let you try another. FEN positions saved by XBoard do include correct information about whether castling or en passant are legal, and also handle the 50-move counter. The mate detector does not understand that non-contact mate is not really mate in bughouse. The only problem this causes while playing is minor: a "#" (mate indicator) character will show up after a non-contact mating move in the move list. XBoard will not assume the game is over at that point, not even when the option Detect Mates is on. Edit Game mode always uses the rules of the selected variant, which can be a variant that uses piece drops. You can load and edit games that contain piece drops. The (obsolete) piece menus are not active, but you can perform piece drops by dragging pieces from the holdings. Fischer Random castling is fully understood. You can enter castlings by dragging the King on top of your Rook. You can probably also play Fischer Random successfully on ICS by typing castling moves into the ICS Interaction window. The menus may not work if your keyboard is in Caps Lock or Num Lock mode. This seems to be a problem with the Athena menu widget, not an XBoard bug. Also see the ToDo file included with the distribution for many other possible bugs, limitations, and ideas for improvement that have been suggested. @node Problems @chapter Reporting problems @cindex Bugs @cindex Bug reports @cindex Reporting bugs @cindex Problems @cindex Reporting problems You can report bugs and problems with XBoard using the bug tracker at @code{https://savannah.gnu.org/projects/xboard/} or by sending mail to @code{}. It can also be useful to report or discuss bugs in the WinBoard Forum at @code{http://www.open-aurec.com/wbforum/}, WinBoard development section. Please use the @file{script} program to start a typescript, run XBoard with the @samp{-debug} option, and include the typescript output in your message. Also tell us what kind of machine and what operating system version you are using. The command @samp{uname -a} will often tell you this. If you improve XBoard, please send a message about your changes, and we will get in touch with you about merging them in to the main line of development. @node Contributors @chapter Authors and contributors @cindex Authors @cindex Contributors Chris Sears and Dan Sears wrote the original XBoard. They were responsible for versions 1.0 through 1.2. The color scheme was taken from Wayne Christopher's @code{XChess} program. Tim Mann was primarily responsible for XBoard versions 1.3 through 4.2.7, and for WinBoard (a port of XBoard to Microsoft Win32) from its inception through version 4.2.7. John Chanak contributed the initial implementation of ICS mode. Evan Welsh wrote @code{CMail}, and Patrick Surry helped in designing, testing, and documenting it. Elmar Bartel contributed the new piece bitmaps introduced in version 3.2. Jochen Wiedmann converted the documentation to texinfo. Frank McIngvale added click/click moving, the Analysis modes, piece flashing, ZIICS import, and ICS text colorization to XBoard. Hugh Fisher added animated piece movement to XBoard, and Henrik Gram added it to WinBoard. Mark Williams contributed the initial (WinBoard-only) implementation of many new features added to both XBoard and WinBoard in version 4.1.0, including copy/paste, premove, icsAlarm, autoFlipView, training mode, auto raise, and blindfold. Ben Nye contributed X copy/paste code for XBoard. In a fork from version 4.2.7, Alessandro Scotti added many elements to the user interface of WinBoard, including the board textures and font-based rendering, the evaluation-graph, move-history and engine-output window. He was also responsible for adding the UCI support. H. G. Muller continued this fork of the project, producing version 4.3. He made WinBoard castling- and e.p.-aware, added variant support with adjustable board sizes, the crazyhouse holdings, and the fairy pieces. In addition he added most of the adjudication options, made WinBoard more robust in dealing with buggy and crashing engines, and extended time control with a time-odds and node-count-based modes. Most of the options that initially were WinBoard only have now been back-ported to XBoard. Michel van den Bergh provided the code for reading Polyglot opening books. Meanwhile, some work continued on the GNU XBoard project maintained at savannah.gnu.org, but version 4.2.8 was never released. Daniel Mehrmann was responsible for much of this work. Most recently, Arun Persaud worked with H. G. Muller to merge all the features of the never-released XBoard/WinBoard 4.2.8 of the GNU XBoard project and the never-released 4.3.16 from H. G.'s fork into a unified XBoard/WinBoard 4.4, which is now available both from the savannah.gnu.org web site and the WinBoard forum. @node CMail @chapter CMail @cindex cmail The @file{cmail} program can help you play chess by email with opponents of your choice using XBoard as an interface. You will usually run @file{cmail} without giving any options. @menu * CMail options:: Invoking CMail. * CMail game:: Starting a CMail game. * CMail answer:: Answering a move. * CMail multi:: Multiple games in one message. * CMail completion:: Completing a game. * CMail trouble:: Known CMail problems. @end menu @node CMail options @section CMail options @table @asis @item -h Displays @file{cmail} usage information. @item -c Shows the conditions of the GNU General Public License. @xref{Copying}. @item -w Shows the warranty notice of the GNU General Public License. @xref{Copying}. @item -v @itemx -xv Provides or inhibits verbose output from @file{cmail} and XBoard, useful for debugging. The @code{-xv} form also inhibits the cmail introduction message. @item -mail @itemx -xmail Invokes or inhibits the sending of a mail message containing the move. @item -xboard @itemx -xxboard Invokes or inhibits the running of XBoard on the game file. @item -reuse @itemx -xreuse Invokes or inhibits the reuse of an existing XBoard to display the current game. @item -remail Resends the last mail message for that game. This inhibits running XBoard. @item -game The name of the game to be processed. @item -wgames @itemx -bgames @itemx -games Number of games to start as White, as Black or in total. Default is 1 as white and none as black. If only one color is specified then none of the other color is assumed. If no color is specified then equal numbers of White and Black games are started, with the extra game being as White if an odd number of total games is specified. @item -me @itemx -opp A one-word alias for yourself or your opponent. @item -wname @itemx -bname @itemx -myname @itemx -oppname The full name of White, Black, yourself or your opponent. @item -wna @itemx -bna @itemx -na @itemx -oppna The email address of White, Black, yourself or your opponent. @item -dir The directory in which @file{cmail} keeps its files. This defaults to the environment variable @code{$CMAIL_DIR} or failing that, @code{$CHESSDIR}, @file{$HOME/Chess} or @file{~/Chess}. It will be created if it does not exist. @item -arcdir The directory in which @file{cmail} archives completed games. Defaults to the environment variable @code{$CMAIL_ARCDIR} or, in its absence, the same directory as cmail keeps its working files (above). @item -mailprog The program used by cmail to send email messages. This defaults to the environment variable @code{$CMAIL_MAILPROG} or failing that @file{/usr/ucb/Mail}, @file{/usr/ucb/mail} or @file{Mail}. You will need to set this variable if none of the above paths fit your system. @item -logFile A file in which to dump verbose debugging messages that are invoked with the @samp{-v} option. @item -event The PGN Event tag (default @samp{Email correspondence game}). @item -site The PGN Site tag (default @samp{NET}). @item -round The PGN Round tag (default @samp{-}, not applicable). @item -mode The PGN Mode tag (default @samp{EM}, Electronic Mail). @item Other options Any option flags not listed above are passed through to XBoard. Invoking XBoard through CMail changes the default values of two XBoard options: The default value for @samp{-noChessProgram} is changed to true; that is, by default no chess engine is started. The default value for @samp{-timeDelay} is changed to 0; that is, by default XBoard immediately goes to the end of the game as played so far, rather than stepping through the moves one by one. You can still set these options to whatever values you prefer by supplying them on CMail's command line. @xref{Options}. @end table @node CMail game @section Starting a CMail Game Type @file{cmail} from a shell to start a game as white. After an opening message, you will be prompted for a game name, which is optional---if you simply press @key{Enter}, the game name will take the form @samp{you-VS-opponent}. You will next be prompted for the short name of your opponent. If you haven't played this person before, you will also be prompted for his/her email address. @file{cmail} will then invoke XBoard in the background. Make your first move and select @samp{Mail Move} from the @samp{File} menu. @xref{File Menu}. If all is well, @file{cmail} will mail a copy of the move to your opponent. If you select @samp{Exit} without having selected @samp{Mail Move} then no move will be made. @node CMail answer @section Answering a Move When you receive a message from an opponent containing a move in one of your games, simply pipe the message through @file{cmail}. In some mailers this is as simple as typing @kbd{| cmail} when viewing the message, while in others you may have to save the message to a file and do @kbd{cmail < file} at the command line. In either case @file{cmail} will display the game using XBoard. If you didn't exit XBoard when you made your first move then @file{cmail} will do its best to use the existing XBoard instead of starting a new one. As before, simply make a move and select @samp{Mail Move} from the @samp{File} menu. @xref{File Menu}. @file{cmail} will try to use the XBoard that was most recently used to display the current game. This means that many games can be in progress simultaneously, each with its own active XBoard. If you want to look at the history or explore a variation, go ahead, but you must return to the current position before XBoard will allow you to mail a move. If you edit the game's history you must select @samp{Reload Same Game} from the @samp{File} menu to get back to the original position, then make the move you want and select @samp{Mail Move}. As before, if you decide you aren't ready to make a move just yet you can either select @samp{Exit} without sending a move or just leave XBoard running until you are ready. @node CMail multi @section Multi-Game Messages It is possible to have a @file{cmail} message carry more than one game. This feature was implemented to handle IECG (International Email Chess Group) matches, where a match consists of one game as white and one as black, with moves transmitted simultaneously. In case there are more general uses, @file{cmail} itself places no limit on the number of black/white games contained in a message; however, XBoard does. @node CMail completion @section Completing a Game Because XBoard can detect checkmate and stalemate, @file{cmail} handles game termination sensibly. As well as resignation, the @samp{Action} menu allows draws to be offered and accepted for @file{cmail} games. For multi-game messages, only unfinished and just-finished games will be included in email messages. When all the games are finished, they are archived in the user's archive directory, and similarly in the opponent's when he or she pipes the final message through @file{cmail}. The archive file name includes the date the game was started. @node CMail trouble @section Known CMail Problems It's possible that a strange conjunction of conditions may occasionally mean that @file{cmail} has trouble reactivating an existing XBoard. If this should happen, simply trying it again should work. If not, remove the file that stores the XBoard's PID (@file{game.pid}) or use the @samp{-xreuse} option to force @file{cmail} to start a new XBoard. Versions of @file{cmail} after 2.16 no longer understand the old file format that XBoard used to use and so cannot be used to correspond with anyone using an older version. Versions of @file{cmail} older than 2.11 do not handle multi-game messages, so multi-game correspondence is not possible with opponents using an older version. @node Other programs @chapter Other programs you can use with XBoard @cindex Other programs Here are some other programs you can use with XBoard @menu * GNU Chess:: The GNU Chess engine. * Fairy-Max:: The Fairy-Max chess engine. * HoiChess:: The HoiChess chess engine. * Crafty:: The Crafty chess engine. * zic2xpm:: The program used to import chess sets from ZIICS. @end menu @node GNU Chess @section GNU Chess The GNU Chess engine is available from: ftp://ftp.gnu.org/gnu/gnuchess/ You can use XBoard to play a game against GNU Chess, or to interface GNU Chess to an ICS. @node Fairy-Max @section Fairy-Max Fairy-Max is a derivative from the once World's smallest Chess program micro-Max, which measures only about 100 lines of source code. The main difference with micro-Max is that Fairy-Max loads its move-generator tables from a file, so that the rules for piece movement can be easily configured to implement unorthodox pieces. Fairy-Max can therefore play a large number of variants, normal Chess being one of those. In addition it plays Knightmate, Capablanca and Gothic Chess, Shatranj, Courier Chess, Cylinder chess, Berolina Chess, while the user can easily define new variants. It can be obtained from: http://home.hccnet.nl/h.g.muller/dwnldpage.html @node HoiChess @section HoiChess HoiChess is a not-so-very-strong Chess engine, which comes with a derivative HoiXiangqi, able to play Chinese Chess. It can be obtained from the standard Linux repositories through: sudo apt-get install hoichess @node Crafty @section Crafty Crafty is a chess engine written by Bob Hyatt. You can use XBoard to play a game against Crafty, hook Crafty up to an ICS, or use Crafty to interactively analyze games and positions for you. Crafty is a strong, rapidly evolving chess program. This rapid pace of development is good, because it means Crafty is always getting better. This can sometimes cause problems with backwards compatibility, but usually the latest version of Crafty will work well with the latest version of XBoard. Crafty can be obtained from its author's FTP site: ftp://ftp.cis.uab.edu/hyatt/. To use Crafty with XBoard, give the -fcp and -fd options as follows, where is the directory in which you installed Crafty and placed its book and other support files. @node zic2xpm @section zic2xpm The ``zic2xpm'' program is used to import chess sets from the ZIICS(*) program into XBoard. ``zic2xpm'' is part of the XBoard distribution. ZIICS is available from: ftp://ftp.freechess.org/pub/chess/DOS/ziics131.exe To import ZIICS pieces, do this: @table @asis @item 1. Unzip ziics131.exe into a directory: @example unzip -L ziics131.exe -d ~/ziics @end example @item 2. Use zic2xpm to convert a set of pieces to XBoard format. For example, let's say you want to use the FRITZ4 set. These files are named ``fritz4.*'' in the ZIICS distribution. @example mkdir ~/fritz4 cd ~/fritz4 zic2xpm ~/ziics/fritz4.* @end example @item 3. Give XBoard the ``-pixmap'' option when starting up, e.g.: @example xboard -pixmap ~/fritz4 @end example @end table (*) ZIICS is a separate copyrighted work of Andy McFarland. The ``ZIICS pieces'' are copyrighted works of their respective creators. Files produced by ``zic2xpm'' are for PERSONAL USE ONLY and may NOT be redistributed without explicit permission from the original creator(s) of the pieces. @ifnottex @node Copyright @unnumbered Copyright @include copyright.texi @end ifnottex @node Copying @unnumbered GNU GENERAL PUBLIC LICENSE @include gpl.texinfo @c noman @node Index @unnumbered Index @printindex cp @contents @c end noman @bye xboard-4.7.3/themes/0000755000175000001440000000000012262415351011267 500000000000000xboard-4.7.3/themes/shogi/0000755000175000001440000000000012262415351012400 500000000000000xboard-4.7.3/themes/shogi/WhiteGoldSilver.svg0000644000175000001440000001126712262415351016123 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteAdvisor.svg0000644000175000001440000003445612262415351015465 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackGoldLance.svg0000644000175000001440000001247212262415351015634 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteRook.svg0000644000175000001440000002750112262415351014761 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackCrownedRook.svg0000644000175000001440000002203512262415351016234 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackGoldPawn.svg0000644000175000001440000000657412262415351015525 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackGoldKnight.svg0000644000175000001440000001177712262415351016045 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteGoldKnight.svg0000644000175000001440000001041712262415351016077 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteBishop.svg0000644000175000001440000002400612262415351015270 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackCrownedBishop.svg0000644000175000001440000001757712262415351016565 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackKing.svg0000644000175000001440000002522612262415351014675 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteGold.svg0000644000175000001440000003106512262415351014734 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackRook.svg0000644000175000001440000003105312262415351014712 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteKing.svg0000644000175000001440000002365412262415351014744 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteGoldLance.svg0000644000175000001440000001111312262415351015667 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteLance.svg0000644000175000001440000002554112262415351015073 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackLance.svg0000644000175000001440000002711412262415351015025 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackGold.svg0000644000175000001440000003243712262415351014674 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackBishop.svg0000644000175000001440000002536212262415351015232 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteCrownedBishop.svg0000644000175000001440000001621412262415351016614 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteGoldPawn.svg0000644000175000001440000000521612262415351015561 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhitePawn.svg0000644000175000001440000002317012262415351014752 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackKnight.svg0000644000175000001440000003151312262415351015225 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteKnight.svg0000644000175000001440000003013712262415351015272 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackGoldSilver.svg0000644000175000001440000001264712262415351016062 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackAdvisor.svg0000644000175000001440000003603112262415351015410 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/WhiteCrownedRook.svg0000644000175000001440000002045412262415351016303 00000000000000 image/svg+xml xboard-4.7.3/themes/shogi/BlackPawn.svg0000644000175000001440000002454212262415351014712 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/0000755000175000001440000000000012262415351012727 500000000000000xboard-4.7.3/themes/xiangqi/BlackCanon.svg0000644000175000001440000002747212262415351015377 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteAdvisor.svg0000644000175000001440000002311412262415351016001 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteRook.svg0000644000175000001440000003007012262415351015303 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteGold.svg0000644000175000001440000002717412262415351015271 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackRook.svg0000644000175000001440000002321312262415351015240 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackGold.svg0000644000175000001440000003133112262415351015213 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhitePawn.svg0000644000175000001440000002346412262415351015307 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackKnight.svg0000644000175000001440000002600712262415351015556 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteCanon.svg0000644000175000001440000003127712262415351015441 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteKnight.svg0000644000175000001440000003143612262415351015624 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackElephant.svg0000644000175000001440000003135212262415351016071 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/WhiteElephant.svg0000644000175000001440000002402112262415351016130 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackAdvisor.svg0000644000175000001440000001741712262415351015746 00000000000000 image/svg+xml xboard-4.7.3/themes/xiangqi/BlackPawn.svg0000644000175000001440000002506112262415351015236 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/0000755000175000001440000000000012262415351012177 500000000000000xboard-4.7.3/themes/Mono/WhiteGoldSilver.svg0000644000175000001440000001076112262415351015720 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackCanon.svg0000644000175000001440000001360412262415351014637 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_silver_promoted.svg0000644000175000001440000001126712262415351017255 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteAdvisor.svg0000644000175000001440000001123412262415351015251 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_pawn.svg0000644000175000001440000002317012262415351015001 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_pawn_promoted.svg0000644000175000001440000000521612262415351016713 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteHawk.svg0000644000175000001440000001734612262415351014546 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackGoldLance.svg0000644000175000001440000001137712262415351015436 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteRook.svg0000644000175000001440000001000112262415351014543 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_rook.svg0000644000175000001440000002750112262415351015010 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackCrownedRook.svg0000644000175000001440000001153112262415351016032 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteNightrider.svg0000644000175000001440000001177112262415351015747 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackArchbishop.svg0000644000175000001440000001734412262415351015670 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_White.svg0000644000175000001440000000214412262415351014404 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_knight.svg0000644000175000001440000003013712262415351015321 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackHawk.svg0000644000175000001440000002233112262415351014470 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_lance_promoted.svg0000644000175000001440000001111312262415351017021 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackGoldPawn.svg0000644000175000001440000001051112262415351015306 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackQueen.svg0000644000175000001440000001475412262415351014665 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteQueen.svg0000644000175000001440000002114212262415351014716 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackGoldKnight.svg0000644000175000001440000001217612262415351015636 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteGoldKnight.svg0000644000175000001440000001044412262415351015676 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_bishop_promoted.svg0000644000175000001440000001621412262415351017232 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_knight_promoted.svg0000644000175000001440000001041712262415351017231 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteBishop.svg0000644000175000001440000001342512262415351015072 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteArchbishop.svg0000644000175000001440000001413112262415351015723 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackCobra.svg0000644000175000001440000001631212262415351014626 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackCrownedBishop.svg0000644000175000001440000001603312262415351016346 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackKing.svg0000644000175000001440000001614612262415351014475 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/icon_black.svg0000644000175000001440000000673112262415351014733 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackMarshall.svg0000644000175000001440000001661312262415351015347 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Clear.svg0000644000175000001440000000200712262415351014350 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteCommoner.svg0000644000175000001440000001120612262415351015420 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackPrincess.svg0000644000175000001440000002064112262415351015366 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteUnicorn.svg0000644000175000001440000001435112262415351015262 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackUnicorn.svg0000644000175000001440000001364412262415351015222 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteGold.svg0000644000175000001440000001051412262415351014527 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackRook.svg0000644000175000001440000001161712262415351014515 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_bishop.svg0000644000175000001440000002400612262415351015317 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteKing.svg0000644000175000001440000001214212262415351014531 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteGoldLance.svg0000644000175000001440000001053112262415351015471 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteCobra.svg0000644000175000001440000001214412262415351014671 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteMarshall.svg0000644000175000001440000001404612262415351015411 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Analyzing.svg0000644000175000001440000000375312262415351015267 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteLance.svg0000644000175000001440000000664312262415351014674 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteChancellor.svg0000644000175000001440000002310112262415351015710 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackLance.svg0000644000175000001440000001023112262415351014614 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackGold.svg0000644000175000001440000001156012262415351014465 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhitePrincess.svg0000644000175000001440000001703612262415351015436 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackBishop.svg0000644000175000001440000001663312262415351015032 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteCrownedBishop.svg0000644000175000001440000001260012262415351016406 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/icon_white.svg0000644000175000001440000000627312262415351015000 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteGoldPawn.svg0000644000175000001440000000765012262415351015364 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhitePawn.svg0000644000175000001440000000507612262415351014556 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackKnight.svg0000644000175000001440000001127412262415351015026 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Ponder.svg0000644000175000001440000000370312262415351014555 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_lance.svg0000644000175000001440000002554112262415351015122 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_silver.svg0000644000175000001440000003445612262415351015351 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteCanon.svg0000644000175000001440000001035112262415351014677 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_rook_promoted.svg0000644000175000001440000002045412262415351016721 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteKnight.svg0000644000175000001440000001224412262415351015070 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackElephant.svg0000644000175000001440000002310012262415351015331 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Unknown.svg0000644000175000001440000000220512262415351014761 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteElephant.svg0000644000175000001440000001641412262415351015407 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackNightrider.svg0000644000175000001440000001263312262415351015701 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackGoldSilver.svg0000644000175000001440000001160412262415351015651 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Black.svg0000644000175000001440000000503112262415351014336 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/eo_Thinking.svg0000644000175000001440000002006712262415351015103 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackAdvisor.svg0000644000175000001440000001307612262415351015213 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackCommoner.svg0000644000175000001440000001334712262415351015364 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_gold.svg0000644000175000001440000003106512262415351014763 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/shogi_king.svg0000644000175000001440000002365412262415351014773 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/WhiteCrownedRook.svg0000644000175000001440000001073512262415351016103 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackChancellor.svg0000644000175000001440000002030212262415351015644 00000000000000 image/svg+xml xboard-4.7.3/themes/Mono/BlackPawn.svg0000644000175000001440000000660712262415351014513 00000000000000 image/svg+xml xboard-4.7.3/version.texi0000644000175000001440000000014212262562277012311 00000000000000@set UPDATED 6 January 2014 @set UPDATED-MONTH January 2014 @set EDITION 4.7.3 @set VERSION 4.7.3 xboard-4.7.3/moves.c0000644000175000001440000024371512262562252011236 00000000000000/* * moves.c - Move generation and checking * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #if HAVE_STRING_H # include #else /* not HAVE_STRING_H */ # include #endif /* not HAVE_STRING_H */ #include "common.h" #include "backend.h" #include "moves.h" #include "parser.h" int WhitePiece P((ChessSquare)); int BlackPiece P((ChessSquare)); int SameColor P((ChessSquare, ChessSquare)); int PosFlags(int index); extern signed char initialRights[BOARD_FILES]; /* [HGM] all rights enabled, set in InitPosition */ int quickFlag; int WhitePiece (ChessSquare piece) { return (int) piece >= (int) WhitePawn && (int) piece < (int) BlackPawn; } int BlackPiece (ChessSquare piece) { return (int) piece >= (int) BlackPawn && (int) piece < (int) EmptySquare; } #if 0 int SameColor (ChessSquare piece1, ChessSquare piece2) { return ((int) piece1 >= (int) WhitePawn && /* [HGM] can be > King ! */ (int) piece1 < (int) BlackPawn && (int) piece2 >= (int) WhitePawn && (int) piece2 < (int) BlackPawn) || ((int) piece1 >= (int) BlackPawn && (int) piece1 < (int) EmptySquare && (int) piece2 >= (int) BlackPawn && (int) piece2 < (int) EmptySquare); } #else #define SameColor(piece1, piece2) (piece1 < EmptySquare && piece2 < EmptySquare && (piece1 < BlackPawn) == (piece2 < BlackPawn)) #endif char pieceToChar[] = { 'P', 'N', 'B', 'R', 'Q', 'F', 'E', 'A', 'C', 'W', 'M', 'O', 'H', 'I', 'J', 'G', 'D', 'V', 'L', 'S', 'U', 'K', 'p', 'n', 'b', 'r', 'q', 'f', 'e', 'a', 'c', 'w', 'm', 'o', 'h', 'i', 'j', 'g', 'd', 'v', 'l', 's', 'u', 'k', 'x' }; char pieceNickName[EmptySquare]; char PieceToChar (ChessSquare p) { if((int)p < 0 || (int)p >= (int)EmptySquare) return('x'); /* [HGM] for safety */ return pieceToChar[(int) p]; } int PieceToNumber (ChessSquare p) /* [HGM] holdings: count piece type, ignoring non-participating piece types */ { int i=0; ChessSquare start = (int)p >= (int)BlackPawn ? BlackPawn : WhitePawn; while(start++ != p) if(pieceToChar[(int)start-1] != '.') i++; return i; } ChessSquare CharToPiece (int c) { int i; if(c == '.') return EmptySquare; for(i=0; i< (int) EmptySquare; i++) if(pieceNickName[i] == c) return (ChessSquare) i; for(i=0; i< (int) EmptySquare; i++) if(pieceToChar[i] == c) return (ChessSquare) i; return EmptySquare; } void CopyBoard (Board to, Board from) { int i, j; for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) to[i][j] = from[i][j]; for (j = 0; j < BOARD_FILES; j++) // [HGM] gamestate: copy castling rights and ep status to[VIRGIN][j] = from[VIRGIN][j], to[CASTLING][j] = from[CASTLING][j]; to[HOLDINGS_SET] = 0; // flag used in ICS play } int CompareBoards (Board board1, Board board2) { int i, j; for (i = 0; i < BOARD_HEIGHT; i++) for (j = 0; j < BOARD_WIDTH; j++) { if (board1[i][j] != board2[i][j]) return FALSE; } return TRUE; } /* Call callback once for each pseudo-legal move in the given position, except castling moves. A move is pseudo-legal if it is legal, or if it would be legal except that it leaves the king in check. In the arguments, epfile is EP_NONE if the previous move was not a double pawn push, or the file 0..7 if it was, or EP_UNKNOWN if we don't know and want to allow all e.p. captures. Promotion moves generated are to Queen only. */ void GenPseudoLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, ChessSquare filter) // speed: only do moves with this piece type { int rf, ff; int i, j, d, s, fs, rs, rt, ft, m; int epfile = (signed char)board[EP_STATUS]; // [HGM] gamestate: extract ep status from board int promoRank = gameInfo.variant == VariantMakruk || gameInfo.variant == VariantGrand ? 3 : 1; for (rf = 0; rf < BOARD_HEIGHT; rf++) for (ff = BOARD_LEFT; ff < BOARD_RGHT; ff++) { ChessSquare piece; int rookRange; if(board[rf][ff] == EmptySquare) continue; if ((flags & F_WHITE_ON_MOVE) != (board[rf][ff] < BlackPawn)) continue; // [HGM] speed: wrong color rookRange = 1000; m = 0; piece = board[rf][ff]; if(PieceToChar(piece) == '~') piece = (ChessSquare) ( DEMOTED piece ); if(filter != EmptySquare && piece != filter) continue; if(gameInfo.variant == VariantShogi) piece = (ChessSquare) ( SHOGI piece ); switch ((int)piece) { /* case EmptySquare: [HGM] this is nonsense, and conflicts with Shogi cases */ default: /* can't happen ([HGM] except for faries...) */ break; case WhitePawn: if(gameInfo.variant == VariantXiangqi) { /* [HGM] capture and move straight ahead in Xiangqi */ if (rf < BOARD_HEIGHT-1 && !SameColor(board[rf][ff], board[rf + 1][ff]) ) { callback(board, flags, NormalMove, rf, ff, rf + 1, ff, closure); } /* and move sideways when across the river */ for (s = -1; s <= 1; s += 2) { if (rf >= BOARD_HEIGHT>>1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !WhitePiece(board[rf][ff+s]) ) { callback(board, flags, NormalMove, rf, ff, rf, ff+s, closure); } } break; } if (rf < BOARD_HEIGHT-1 && board[rf + 1][ff] == EmptySquare) { callback(board, flags, rf >= BOARD_HEIGHT-1-promoRank ? WhitePromotion : NormalMove, rf, ff, rf + 1, ff, closure); } if (rf <= (BOARD_HEIGHT>>1)-3 && board[rf+1][ff] == EmptySquare && // [HGM] grand: also on 3rd rank on 10-board gameInfo.variant != VariantShatranj && /* [HGM] */ gameInfo.variant != VariantCourier && /* [HGM] */ board[rf+2][ff] == EmptySquare ) { callback(board, flags, NormalMove, rf, ff, rf+2, ff, closure); } for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && ((flags & F_KRIEGSPIEL_CAPTURE) || BlackPiece(board[rf + 1][ff + s]))) { callback(board, flags, rf >= BOARD_HEIGHT-1-promoRank ? WhitePromotion : NormalMove, rf, ff, rf + 1, ff + s, closure); } if (rf >= BOARD_HEIGHT+1>>1) {// [HGM] grand: 4th & 5th rank on 10-board if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && (epfile == ff + s || epfile == EP_UNKNOWN) && rf < BOARD_HEIGHT-3 && board[rf][ff + s] == BlackPawn && board[rf+1][ff + s] == EmptySquare) { callback(board, flags, WhiteCapturesEnPassant, rf, ff, rf+1, ff + s, closure); } } } break; case BlackPawn: if(gameInfo.variant == VariantXiangqi) { /* [HGM] capture straight ahead in Xiangqi */ if (rf > 0 && !SameColor(board[rf][ff], board[rf - 1][ff]) ) { callback(board, flags, NormalMove, rf, ff, rf - 1, ff, closure); } /* and move sideways when across the river */ for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT>>1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !BlackPiece(board[rf][ff+s]) ) { callback(board, flags, NormalMove, rf, ff, rf, ff+s, closure); } } break; } if (rf > 0 && board[rf - 1][ff] == EmptySquare) { callback(board, flags, rf <= promoRank ? BlackPromotion : NormalMove, rf, ff, rf - 1, ff, closure); } if (rf >= (BOARD_HEIGHT+1>>1)+2 && board[rf-1][ff] == EmptySquare && // [HGM] grand gameInfo.variant != VariantShatranj && /* [HGM] */ gameInfo.variant != VariantCourier && /* [HGM] */ board[rf-2][ff] == EmptySquare) { callback(board, flags, NormalMove, rf, ff, rf-2, ff, closure); } for (s = -1; s <= 1; s += 2) { if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && ((flags & F_KRIEGSPIEL_CAPTURE) || WhitePiece(board[rf - 1][ff + s]))) { callback(board, flags, rf <= promoRank ? BlackPromotion : NormalMove, rf, ff, rf - 1, ff + s, closure); } if (rf < BOARD_HEIGHT>>1) { if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && (epfile == ff + s || epfile == EP_UNKNOWN) && rf > 2 && board[rf][ff + s] == WhitePawn && board[rf-1][ff + s] == EmptySquare) { callback(board, flags, BlackCapturesEnPassant, rf, ff, rf-1, ff + s, closure); } } } break; case WhiteUnicorn: case BlackUnicorn: case WhiteKnight: case BlackKnight: mounted: for (i = -1; i <= 1; i += 2) for (j = -1; j <= 1; j += 2) for (s = 1; s <= 2; s++) { rt = rf + i*s; ft = ff + j*(3-s); if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) && ( gameInfo.variant != VariantXiangqi || board[rf+i*(s-1)][ff+j*(2-s)] == EmptySquare) && !SameColor(board[rf][ff], board[rt][ft])) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } break; case SHOGI WhiteKnight: for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-2 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf + 2][ff + s])) { callback(board, flags, NormalMove, rf, ff, rf + 2, ff + s, closure); } } break; case SHOGI BlackKnight: for (s = -1; s <= 1; s += 2) { if (rf > 1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf - 2][ff + s])) { callback(board, flags, NormalMove, rf, ff, rf - 2, ff + s, closure); } } break; case WhiteCannon: case BlackCannon: for (d = 0; d <= 1; d++) for (s = -1; s <= 1; s += 2) { m = 0; for (i = 1;; i++) { rt = rf + (i * s) * d; ft = ff + (i * s) * (1 - d); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (m == 0 && board[rt][ft] == EmptySquare) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (m == 1 && board[rt][ft] != EmptySquare && !SameColor(board[rf][ff], board[rt][ft]) ) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare && m++) break; } } break; /* Gold General (and all its promoted versions) . First do the */ /* diagonal forward steps, then proceed as normal Wazir */ case SHOGI WhiteWazir: case SHOGI (PROMOTED WhitePawn): case SHOGI (PROMOTED WhiteKnight): case SHOGI (PROMOTED WhiteQueen): case SHOGI (PROMOTED WhiteFerz): for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf + 1][ff + s])) { callback(board, flags, NormalMove, rf, ff, rf + 1, ff + s, closure); } } goto finishGold; case SHOGI BlackWazir: case SHOGI (PROMOTED BlackPawn): case SHOGI (PROMOTED BlackKnight): case SHOGI (PROMOTED BlackQueen): case SHOGI (PROMOTED BlackFerz): for (s = -1; s <= 1; s += 2) { if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && !SameColor(board[rf][ff], board[rf - 1][ff + s])) { callback(board, flags, NormalMove, rf, ff, rf - 1, ff + s, closure); } } case WhiteWazir: case BlackWazir: finishGold: for (d = 0; d <= 1; d++) for (s = -1; s <= 1; s += 2) { rt = rf + s * d; ft = ff + s * (1 - d); if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) && !SameColor(board[rf][ff], board[rt][ft]) && (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) ) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } break; case WhiteAlfil: case BlackAlfil: /* [HGM] support Shatranj pieces */ for (rs = -1; rs <= 1; rs += 2) for (fs = -1; fs <= 1; fs += 2) { rt = rf + 2 * rs; ft = ff + 2 * fs; if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) && ( gameInfo.variant != VariantXiangqi || board[rf+rs][ff+fs] == EmptySquare && (2*rf < BOARD_HEIGHT) == (2*rt < BOARD_HEIGHT) ) && !SameColor(board[rf][ff], board[rt][ft])) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantXiangqi) continue; // classical Alfil rt = rf + rs; // in unknown variant we assume Modern Elephant, which can also do one step ft = ff + fs; if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) && !SameColor(board[rf][ff], board[rt][ft])) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } if(gameInfo.variant == VariantSpartan) for(fs = -1; fs <= 1; fs += 2) { ft = ff + fs; if (!(ft < BOARD_LEFT || ft >= BOARD_RGHT) && board[rf][ft] == EmptySquare) callback(board, flags, NormalMove, rf, ff, rf, ft, closure); } break; /* Make Dragon-Horse also do Dababba moves outside Shogi, for better disambiguation in variant Fairy */ case WhiteCardinal: case BlackCardinal: for (d = 0; d <= 1; d++) // Dababba moves that Rook cannot do for (s = -2; s <= 2; s += 4) { rt = rf + s * d; ft = ff + s * (1 - d); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue; if (SameColor(board[rf][ff], board[rt][ft])) continue; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } /* Shogi Dragon Horse has to continue with Wazir after Bishop */ case SHOGI WhiteCardinal: case SHOGI BlackCardinal: m++; /* Capablanca Archbishop continues as Knight */ case WhiteAngel: case BlackAngel: m++; /* Shogi Bishops are ordinary Bishops */ case SHOGI WhiteBishop: case SHOGI BlackBishop: case WhiteBishop: case BlackBishop: for (rs = -1; rs <= 1; rs += 2) for (fs = -1; fs <= 1; fs += 2) for (i = 1;; i++) { rt = rf + (i * rs); ft = ff + (i * fs); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } if(m==1) goto mounted; if(m==2) goto finishGold; /* Bishop falls through */ break; /* Shogi Lance is unlike anything, and asymmetric at that */ case SHOGI WhiteQueen: for(i = 1;; i++) { rt = rf + i; ft = ff; if (rt >= BOARD_HEIGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } break; case SHOGI BlackQueen: for(i = 1;; i++) { rt = rf - i; ft = ff; if (rt < 0) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } break; /* Make Dragon-King Dababba & Rook-like outside Shogi, for better disambiguation in variant Fairy */ case WhiteDragon: case BlackDragon: for (d = 0; d <= 1; d++) // Dababba moves that Rook cannot do for (s = -2; s <= 2; s += 4) { rt = rf + s * d; ft = ff + s * (1 - d); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT || board[rf+rt>>1][ff+ft>>1] == EmptySquare) continue; if (SameColor(board[rf][ff], board[rt][ft])) continue; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } if(gameInfo.variant == VariantSpartan) rookRange = 2; // in Spartan Chess restrict range to modern Dababba goto doRook; /* Shogi Dragon King has to continue as Ferz after Rook moves */ case SHOGI WhiteDragon: case SHOGI BlackDragon: m++; /* Capablanca Chancellor sets flag to continue as Knight */ case WhiteMarshall: case BlackMarshall: m++; m += (gameInfo.variant == VariantSpartan); // in Spartan Chess Chancellor is used for Dragon King. /* Shogi Rooks are ordinary Rooks */ case SHOGI WhiteRook: case SHOGI BlackRook: case WhiteRook: case BlackRook: doRook: for (d = 0; d <= 1; d++) for (s = -1; s <= 1; s += 2) for (i = 1;; i++) { rt = rf + (i * s) * d; ft = ff + (i * s) * (1 - d); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare || i == rookRange) break; } if(m==1) goto mounted; if(m==2) goto finishSilver; break; case WhiteQueen: case BlackQueen: for (rs = -1; rs <= 1; rs++) for (fs = -1; fs <= 1; fs++) { if (rs == 0 && fs == 0) continue; for (i = 1;; i++) { rt = rf + (i * rs); ft = ff + (i * fs); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } } break; /* Shogi Pawn and Silver General: first the Pawn move, */ /* then the General continues like a Ferz */ case WhiteMan: if(gameInfo.variant != VariantMakruk) goto commoner; case SHOGI WhitePawn: case SHOGI WhiteFerz: if (rf < BOARD_HEIGHT-1 && !SameColor(board[rf][ff], board[rf + 1][ff]) ) callback(board, flags, NormalMove, rf, ff, rf + 1, ff, closure); if(piece != SHOGI WhitePawn) goto finishSilver; break; case BlackMan: if(gameInfo.variant != VariantMakruk) goto commoner; case SHOGI BlackPawn: case SHOGI BlackFerz: if (rf > 0 && !SameColor(board[rf][ff], board[rf - 1][ff]) ) callback(board, flags, NormalMove, rf, ff, rf - 1, ff, closure); if(piece == SHOGI BlackPawn) break; case WhiteFerz: case BlackFerz: finishSilver: /* [HGM] support Shatranj pieces */ for (rs = -1; rs <= 1; rs += 2) for (fs = -1; fs <= 1; fs += 2) { rt = rf + rs; ft = ff + fs; if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue; if (!SameColor(board[rf][ff], board[rt][ft]) && (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) ) callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } break; case WhiteSilver: case BlackSilver: m++; // [HGM] superchess: use for Centaur commoner: case SHOGI WhiteKing: case SHOGI BlackKing: case WhiteKing: case BlackKing: // walking: for (i = -1; i <= 1; i++) for (j = -1; j <= 1; j++) { if (i == 0 && j == 0) continue; rt = rf + i; ft = ff + j; if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue; if (SameColor(board[rf][ff], board[rt][ft])) continue; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); } if(m==1) goto mounted; break; case WhiteNightrider: case BlackNightrider: for (i = -1; i <= 1; i += 2) for (j = -1; j <= 1; j += 2) for (s = 1; s <= 2; s++) { int k; for(k=1;; k++) { rt = rf + k*i*s; ft = ff + k*j*(3-s); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } } break; Amazon: /* First do Bishop,then continue like Chancellor */ for (rs = -1; rs <= 1; rs += 2) for (fs = -1; fs <= 1; fs += 2) for (i = 1;; i++) { rt = rf + (i * rs); ft = ff + (i * fs); if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break; if (SameColor(board[rf][ff], board[rt][ft])) break; callback(board, flags, NormalMove, rf, ff, rt, ft, closure); if (board[rt][ft] != EmptySquare) break; } m++; goto doRook; // Use Lance as Berolina / Spartan Pawn. case WhiteLance: if(gameInfo.variant == VariantSuper) goto Amazon; if (rf < BOARD_HEIGHT-1 && BlackPiece(board[rf + 1][ff])) callback(board, flags, rf >= BOARD_HEIGHT-1-promoRank ? WhitePromotion : NormalMove, rf, ff, rf + 1, ff, closure); for (s = -1; s <= 1; s += 2) { if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && board[rf + 1][ff + s] == EmptySquare) callback(board, flags, rf >= BOARD_HEIGHT-1-promoRank ? WhitePromotion : NormalMove, rf, ff, rf + 1, ff + s, closure); if (rf == 1 && ff + 2*s >= BOARD_LEFT && ff + 2*s < BOARD_RGHT && board[3][ff + 2*s] == EmptySquare ) callback(board, flags, NormalMove, rf, ff, 3, ff + 2*s, closure); } break; case BlackLance: if(gameInfo.variant == VariantSuper) goto Amazon; if (rf > 0 && WhitePiece(board[rf - 1][ff])) callback(board, flags, rf <= promoRank ? BlackPromotion : NormalMove, rf, ff, rf - 1, ff, closure); for (s = -1; s <= 1; s += 2) { if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT && board[rf - 1][ff + s] == EmptySquare) callback(board, flags, rf <= promoRank ? BlackPromotion : NormalMove, rf, ff, rf - 1, ff + s, closure); if (rf == BOARD_HEIGHT-2 && ff + 2*s >= BOARD_LEFT && ff + 2*s < BOARD_RGHT && board[rf-2][ff + 2*s] == EmptySquare ) callback(board, flags, NormalMove, rf, ff, rf-2, ff + 2*s, closure); } break; case WhiteFalcon: // [HGM] wild: for wildcards, self-capture symbolizes move to anywhere case BlackFalcon: case WhiteCobra: case BlackCobra: callback(board, flags, NormalMove, rf, ff, rf, ff, closure); break; } } } typedef struct { MoveCallback cb; VOIDSTAR cl; } GenLegalClosure; int rFilter, fFilter; // [HGM] speed: sorry, but I get a bit tired of this closure madness Board xqCheckers, nullBoard; extern void GenLegalCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void GenLegalCallback (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { register GenLegalClosure *cl = (GenLegalClosure *) closure; if(rFilter >= 0 && rFilter != rt || fFilter >= 0 && fFilter != ft) return; // [HGM] speed: ignore moves with wrong to-square if (!(flags & F_IGNORE_CHECK) ) { int check, promo = (gameInfo.variant == VariantSpartan && kind == BlackPromotion); if(promo) { int r, f, kings=0; for(r=0; r= 2) promo = 0; else board[rf][ff] = BlackKing; // [HGM] spartan: promote to King before check-test } check = CheckTest(board, flags, rf, ff, rt, ft, kind == WhiteCapturesEnPassant || kind == BlackCapturesEnPassant); if(promo) board[rf][ff] = BlackLance; if(check) return; } if (flags & F_ATOMIC_CAPTURE) { if (board[rt][ft] != EmptySquare || kind == WhiteCapturesEnPassant || kind == BlackCapturesEnPassant) { int r, f; ChessSquare king = (flags & F_WHITE_ON_MOVE) ? WhiteKing : BlackKing; if (board[rf][ff] == king) return; for (r = rt-1; r <= rt+1; r++) { for (f = ft-1; f <= ft+1; f++) { if (r >= 0 && r < BOARD_HEIGHT && f >= BOARD_LEFT && f < BOARD_RGHT && board[r][f] == king) return; } } } } cl->cb(board, flags, kind, rf, ff, rt, ft, cl->cl); } typedef struct { int rf, ff, rt, ft; ChessMove kind; int captures; // [HGM] losers } LegalityTestClosure; /* Like GenPseudoLegal, but (1) include castling moves, (2) unless F_IGNORE_CHECK is set in the flags, omit moves that would leave the king in check, and (3) if F_ATOMIC_CAPTURE is set in the flags, omit moves that would destroy your own king. The CASTLE_OK flags are true if castling is not yet ruled out by a move of the king or rook. Return TRUE if the player on move is currently in check and F_IGNORE_CHECK is not set. [HGM] add castlingRights parameter */ int GenLegal (Board board, int flags, MoveCallback callback, VOIDSTAR closure, ChessSquare filter) { GenLegalClosure cl; int ff, ft, k, left, right, swap; int ignoreCheck = (flags & F_IGNORE_CHECK) != 0; ChessSquare wKing = WhiteKing, bKing = BlackKing, *castlingRights = board[CASTLING]; int inCheck = !ignoreCheck && CheckTest(board, flags, -1, -1, -1, -1, FALSE); // kludge alert: this would mark pre-existing checkers if status==1 cl.cb = callback; cl.cl = closure; xqCheckers[EP_STATUS] *= 2; // quasi: if previous CheckTest has been marking, we now set flag for suspending same checkers if(filter == EmptySquare) rFilter = fFilter = -1; // [HGM] speed: do not filter on square if we do not filter on piece GenPseudoLegal(board, flags, GenLegalCallback, (VOIDSTAR) &cl, filter); if (inCheck) return TRUE; /* Generate castling moves */ if(gameInfo.variant == VariantKnightmate) { /* [HGM] Knightmate */ wKing = WhiteUnicorn; bKing = BlackUnicorn; } for (ff = BOARD_WIDTH>>1; ff >= (BOARD_WIDTH-1)>>1; ff-- /*ics wild 1*/) { if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_KCASTLE_OK) && board[0][ff] == wKing && board[0][ff + 1] == EmptySquare && board[0][ff + 2] == EmptySquare && board[0][BOARD_RGHT-3] == EmptySquare && board[0][BOARD_RGHT-2] == EmptySquare && board[0][BOARD_RGHT-1] == WhiteRook && castlingRights[0] != NoRights && /* [HGM] check rights */ ( castlingRights[2] == ff || castlingRights[6] == ff ) && (ignoreCheck || (!CheckTest(board, flags, 0, ff, 0, ff + 1, FALSE) && !CheckTest(board, flags, 0, ff, 0, BOARD_RGHT-3, FALSE) && (gameInfo.variant != VariantJanus || !CheckTest(board, flags, 0, ff, 0, BOARD_RGHT-2, FALSE)) && !CheckTest(board, flags, 0, ff, 0, ff + 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? WhiteKingSideCastle : WhiteKingSideCastleWild, 0, ff, 0, ff + ((gameInfo.boardWidth+2)>>2) + (gameInfo.variant == VariantJanus), closure); } if ((flags & F_WHITE_ON_MOVE) && (flags & F_WHITE_QCASTLE_OK) && board[0][ff] == wKing && board[0][ff - 1] == EmptySquare && board[0][ff - 2] == EmptySquare && board[0][BOARD_LEFT+2] == EmptySquare && board[0][BOARD_LEFT+1] == EmptySquare && board[0][BOARD_LEFT+0] == WhiteRook && castlingRights[1] != NoRights && /* [HGM] check rights */ ( castlingRights[2] == ff || castlingRights[6] == ff ) && (ignoreCheck || (!CheckTest(board, flags, 0, ff, 0, ff - 1, FALSE) && !CheckTest(board, flags, 0, ff, 0, BOARD_LEFT+3, FALSE) && !CheckTest(board, flags, 0, ff, 0, ff - 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? WhiteQueenSideCastle : WhiteQueenSideCastleWild, 0, ff, 0, ff - ((gameInfo.boardWidth+2)>>2), closure); } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_KCASTLE_OK) && board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff + 1] == EmptySquare && board[BOARD_HEIGHT-1][ff + 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_RGHT-3] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_RGHT-2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_RGHT-1] == BlackRook && castlingRights[3] != NoRights && /* [HGM] check rights */ ( castlingRights[5] == ff || castlingRights[7] == ff ) && (ignoreCheck || (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 1, FALSE) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_RGHT-3, FALSE) && (gameInfo.variant != VariantJanus || !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_RGHT-2, FALSE)) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? BlackKingSideCastle : BlackKingSideCastleWild, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + ((gameInfo.boardWidth+2)>>2) + (gameInfo.variant == VariantJanus), closure); } if (!(flags & F_WHITE_ON_MOVE) && (flags & F_BLACK_QCASTLE_OK) && board[BOARD_HEIGHT-1][ff] == bKing && board[BOARD_HEIGHT-1][ff - 1] == EmptySquare && board[BOARD_HEIGHT-1][ff - 2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_LEFT+2] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_LEFT+1] == EmptySquare && board[BOARD_HEIGHT-1][BOARD_LEFT+0] == BlackRook && castlingRights[4] != NoRights && /* [HGM] check rights */ ( castlingRights[5] == ff || castlingRights[7] == ff ) && (ignoreCheck || (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_LEFT+3, FALSE) && !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 2, FALSE)))) { callback(board, flags, ff==BOARD_WIDTH>>1 ? BlackQueenSideCastle : BlackQueenSideCastleWild, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - ((gameInfo.boardWidth+2)>>2), closure); } } if((swap = gameInfo.variant == VariantSChess) || flags & F_FRC_TYPE_CASTLING) { /* generate all potential FRC castling moves (KxR), ignoring flags */ /* [HGM] test if the Rooks we find have castling rights */ /* In S-Chess we generate RxK for allowed castlings, for gating at Rook square */ if ((flags & F_WHITE_ON_MOVE) != 0) { ff = castlingRights[2]; /* King file if we have any rights */ if(ff != NoRights && board[0][ff] == WhiteKing) { if (appData.debugMode) { fprintf(debugFP, "FRC castling, %d %d %d %d %d %d\n", castlingRights[0],castlingRights[1],ff,castlingRights[3],castlingRights[4],castlingRights[5]); } ft = castlingRights[0]; /* Rook file if we have H-side rights */ left = ff+1; right = BOARD_RGHT-2; if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ for(k=left; k<=right && ft != NoRights; k++) /* first test if blocked */ if(k != ft && board[0][k] != EmptySquare) ft = NoRights; for(k=left; k BOARD_LEFT+2) for(k=left+1; k<=right && ft != NoRights; k++) /* then if not checked */ if(!ignoreCheck && CheckTest(board, flags, 0, ff, 0, k, FALSE)) ft = NoRights; if(ft != NoRights && board[0][ft] == WhiteRook) callback(board, flags, WhiteASideCastleFR, 0, swap ? ft : ff, 0, swap ? ff : ft, closure); } } else { ff = castlingRights[5]; /* King file if we have any rights */ if(ff != NoRights && board[BOARD_HEIGHT-1][ff] == BlackKing) { ft = castlingRights[3]; /* Rook file if we have H-side rights */ left = ff+1; right = BOARD_RGHT-2; if(ff == BOARD_RGHT-2) left = right = ff-1; /* special case */ for(k=left; k<=right && ft != NoRights; k++) /* first test if blocked */ if(k != ft && board[BOARD_HEIGHT-1][k] != EmptySquare) ft = NoRights; for(k=left; k BOARD_LEFT+2) for(k=left+1; k<=right && ft != NoRights; k++) /* then if not checked */ if(!ignoreCheck && CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, k, FALSE)) ft = NoRights; if(ft != NoRights && board[BOARD_HEIGHT-1][ft] == BlackRook) callback(board, flags, BlackASideCastleFR, BOARD_HEIGHT-1, swap ? ft : ff, BOARD_HEIGHT-1, swap ? ff : ft, closure); } } } return FALSE; } typedef struct { int rking, fking; int check; } CheckTestClosure; extern void CheckTestCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void CheckTestCallback (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { register CheckTestClosure *cl = (CheckTestClosure *) closure; if (rt == cl->rking && ft == cl->fking) { if(xqCheckers[EP_STATUS] >= 2 && xqCheckers[rf][ff]) return; // checker is piece with suspended checking power cl->check++; xqCheckers[rf][ff] = xqCheckers[EP_STATUS] & 1; // remember who is checking (if status == 1) } } /* If the player on move were to move from (rf, ff) to (rt, ft), would he leave himself in check? Or if rf == -1, is the player on move in check now? enPassant must be TRUE if the indicated move is an e.p. capture. The possibility of castling out of a check along the back rank is not accounted for (i.e., we still return nonzero), as this is illegal anyway. Return value is the number of times the king is in check. */ int CheckTest (Board board, int flags, int rf, int ff, int rt, int ft, int enPassant) { CheckTestClosure cl; ChessSquare king = flags & F_WHITE_ON_MOVE ? WhiteKing : BlackKing; ChessSquare captured = EmptySquare; /* Suppress warnings on uninitialized variables */ if(gameInfo.variant == VariantXiangqi) king = flags & F_WHITE_ON_MOVE ? WhiteWazir : BlackWazir; if(gameInfo.variant == VariantKnightmate) king = flags & F_WHITE_ON_MOVE ? WhiteUnicorn : BlackUnicorn; if (rt >= 0) { if (enPassant) { captured = board[rf][ft]; board[rf][ft] = EmptySquare; } else { captured = board[rt][ft]; } if(rf == DROP_RANK) board[rt][ft] = ff; else { // [HGM] drop board[rt][ft] = board[rf][ff]; board[rf][ff] = EmptySquare; } } /* For compatibility with ICS wild 9, we scan the board in the order a1, a2, a3, ... b1, b2, ..., h8 to find the first king, and we test only whether that one is in check. */ for (cl.fking = BOARD_LEFT+0; cl.fking < BOARD_RGHT; cl.fking++) for (cl.rking = 0; cl.rking < BOARD_HEIGHT; cl.rking++) { if (board[cl.rking][cl.fking] == king) { cl.check = 0; if(gameInfo.variant == VariantXiangqi) { /* [HGM] In Xiangqi opposing Kings means check as well */ int i, dir; dir = (king >= BlackPawn) ? -1 : 1; for( i=cl.rking+dir; i>=0 && i=0 && i0 ? BlackWazir : WhiteWazir) ) cl.check++; } GenPseudoLegal(board, flags ^ F_WHITE_ON_MOVE, CheckTestCallback, (VOIDSTAR) &cl, EmptySquare); if(gameInfo.variant != VariantSpartan || cl.check == 0) // in Spartan Chess go on to test if other King is checked too goto undo_move; /* 2-level break */ } } undo_move: if (rt >= 0) { if(rf != DROP_RANK) // [HGM] drop board[rf][ff] = board[rt][ft]; if (enPassant) { board[rf][ft] = captured; board[rt][ft] = EmptySquare; } else { board[rt][ft] = captured; } } return cl.fking < BOARD_RGHT ? cl.check : 1000; // [HGM] atomic: return 1000 if we have no king } ChessMove LegalDrop (Board board, int flags, ChessSquare piece, int rt, int ft) { // [HGM] put drop legality testing in separate routine for clarity int n; if(appData.debugMode) fprintf(debugFP, "LegalDrop: %d @ %d,%d)\n", piece, ft, rt); if(board[rt][ft] != EmptySquare) return ImpossibleMove; // must drop to empty square n = PieceToNumber(piece); if((gameInfo.holdingsWidth == 0 || (flags & F_WHITE_ON_MOVE ? board[n][BOARD_WIDTH-1] : board[BOARD_HEIGHT-1-n][0]) != piece) && gameInfo.variant != VariantBughouse) // in bughouse we don't check for availability, because ICS doesn't always tell us return ImpossibleMove; // piece not available if(gameInfo.variant == VariantShogi) { // in Shogi lots of drops are forbidden! if((piece == WhitePawn || piece == WhiteQueen) && rt == BOARD_HEIGHT-1 || (piece == BlackPawn || piece == BlackQueen) && rt == 0 || piece == WhiteKnight && rt > BOARD_HEIGHT-3 || piece == BlackKnight && rt < 2 ) return IllegalMove; // e.g. where dropped piece has no moves if(piece == WhitePawn || piece == BlackPawn) { int r; for(r=1; rcaptures++; // [HGM] losers: count legal captures if (rf == cl->rf && ff == cl->ff && rt == cl->rt && ft == cl->ft) cl->kind = kind; } ChessMove LegalityTest (Board board, int flags, int rf, int ff, int rt, int ft, int promoChar) { LegalityTestClosure cl; ChessSquare piece, filterPiece; if(quickFlag) flags = flags & ~1 | quickFlag & 1; // [HGM] speed: in quick mode quickFlag specifies side-to-move. if(rf == DROP_RANK) return LegalDrop(board, flags, ff, rt, ft); piece = filterPiece = board[rf][ff]; if(PieceToChar(piece) == '~') filterPiece = DEMOTED piece; /* [HGM] Cobra and Falcon are wildcard pieces; consider all their moves legal */ /* (perhaps we should disallow moves that obviously leave us in check?) */ if(piece == WhiteFalcon || piece == BlackFalcon || piece == WhiteCobra || piece == BlackCobra) return CheckTest(board, flags, rf, ff, rt, ft, FALSE) ? IllegalMove : NormalMove; cl.rf = rf; cl.ff = ff; cl.rt = rFilter = rt; // [HGM] speed: filter on to-square cl.ft = fFilter = ft; cl.kind = IllegalMove; cl.captures = 0; // [HGM] losers: prepare to count legal captures. if(flags & F_MANDATORY_CAPTURE) filterPiece = EmptySquare; // [HGM] speed: do not filter in suicide, to find all captures GenLegal(board, flags, LegalityTestCallback, (VOIDSTAR) &cl, filterPiece); if((flags & F_MANDATORY_CAPTURE) && cl.captures && board[rt][ft] == EmptySquare && cl.kind != WhiteCapturesEnPassant && cl.kind != BlackCapturesEnPassant) return(IllegalMove); // [HGM] losers: if there are legal captures, non-capts are illegal if(promoChar == 'x') promoChar = NULLCHAR; // [HGM] is this ever the case? if(gameInfo.variant == VariantSChess && promoChar && promoChar != '=' && board[rf][ff] != WhitePawn && board[rf][ff] != BlackPawn) { if(board[rf][ff] < BlackPawn) { // white if(rf != 0) return IllegalMove; // must be on back rank if(!(board[VIRGIN][ff] & VIRGIN_W)) return IllegalMove; // non-virgin if(board[PieceToNumber(CharToPiece(ToUpper(promoChar)))][BOARD_WIDTH-2] == 0) return ImpossibleMove;// must be in stock } else { if(rf != BOARD_HEIGHT-1) return IllegalMove; if(!(board[VIRGIN][ff] & VIRGIN_B)) return IllegalMove; // non-virgin if(board[BOARD_HEIGHT-1-PieceToNumber(CharToPiece(ToLower(promoChar)))][1] == 0) return ImpossibleMove; } } else if(gameInfo.variant == VariantShogi) { /* [HGM] Shogi promotions. '=' means defer */ if(rf != DROP_RANK && cl.kind == NormalMove) { ChessSquare piece = board[rf][ff]; if(promoChar == PieceToChar(BlackQueen)) promoChar = NULLCHAR; /* [HGM] Kludge */ if(promoChar == 'd' && (piece == WhiteRook || piece == BlackRook) || promoChar == 'h' && (piece == WhiteBishop || piece == BlackBishop) || promoChar == 'g' && (piece <= WhiteFerz || piece <= BlackFerz && piece >= BlackPawn) ) promoChar = '+'; // allowed ICS notations if(appData.debugMode)fprintf(debugFP,"SHOGI promoChar = %c\n", promoChar ? promoChar : '-'); if(promoChar != NULLCHAR && promoChar != '+' && promoChar != '=') return CharToPiece(promoChar) == EmptySquare ? ImpossibleMove : IllegalMove; else if(flags & F_WHITE_ON_MOVE) { if( (int) piece < (int) WhiteWazir && (rf >= BOARD_HEIGHT - BOARD_HEIGHT/3 || rt >= BOARD_HEIGHT - BOARD_HEIGHT/3) ) { if( (piece == WhitePawn || piece == WhiteQueen) && rt > BOARD_HEIGHT-2 || piece == WhiteKnight && rt > BOARD_HEIGHT-3) /* promotion mandatory */ cl.kind = promoChar == '=' ? IllegalMove : WhitePromotion; else /* promotion optional, default is defer */ cl.kind = promoChar == '+' ? WhitePromotion : WhiteNonPromotion; } else cl.kind = promoChar == '+' ? IllegalMove : NormalMove; } else { if( (int) piece < (int) BlackWazir && (rf < BOARD_HEIGHT/3 || rt < BOARD_HEIGHT/3) ) { if( (piece == BlackPawn || piece == BlackQueen) && rt < 1 || piece == BlackKnight && rt < 2 ) /* promotion obligatory */ cl.kind = promoChar == '=' ? IllegalMove : BlackPromotion; else /* promotion optional, default is defer */ cl.kind = promoChar == '+' ? BlackPromotion : BlackNonPromotion; } else cl.kind = promoChar == '+' ? IllegalMove : NormalMove; } } } else if (promoChar != NULLCHAR) { if(promoChar == '=') cl.kind = IllegalMove; else // [HGM] shogi: no deferred promotion outside Shogi if (cl.kind == WhitePromotion || cl.kind == BlackPromotion) { ChessSquare piece = CharToPiece(flags & F_WHITE_ON_MOVE ? ToUpper(promoChar) : ToLower(promoChar)); if(piece == EmptySquare) cl.kind = ImpossibleMove; // non-existing piece if(gameInfo.variant == VariantSpartan && cl.kind == BlackPromotion ) { if(promoChar != PieceToChar(BlackKing)) { if(CheckTest(board, flags, rf, ff, rt, ft, FALSE)) cl.kind = IllegalMove; // [HGM] spartan: only promotion to King was possible if(piece == BlackLance) cl.kind = ImpossibleMove; } else { // promotion to King allowed only if we do not haave two yet int r, f, kings = 0; for(r=0; rcount++; } /* Return MT_NONE, MT_CHECK, MT_CHECKMATE, or MT_STALEMATE */ int MateTest (Board board, int flags) { MateTestClosure cl; int inCheck, r, f, myPieces=0, hisPieces=0, nrKing=0; ChessSquare king = flags & F_WHITE_ON_MOVE ? WhiteKing : BlackKing; for(r=0; r= (int)king - (int)WhiteKing + (int)WhitePawn) myPieces++; else hisPieces++; } } switch(gameInfo.variant) { // [HGM] losers: extinction wins case VariantShatranj: if(hisPieces == 1) return myPieces > 1 ? MT_BARE : MT_DRAW; default: break; case VariantAtomic: if(nrKing == 0) return MT_NOKING; break; case VariantLosers: if(myPieces == 1) return MT_BARE; } cl.count = 0; inCheck = GenLegal(board, flags, MateTestCallback, (VOIDSTAR) &cl, EmptySquare); // [HGM] 3check: yet to do! if (cl.count > 0) { return inCheck ? MT_CHECK : MT_NONE; } else { if(gameInfo.holdingsWidth && gameInfo.variant != VariantSuper && gameInfo.variant != VariantGreat && gameInfo.variant != VariantSChess && gameInfo.variant != VariantGrand) { // drop game int r, f, n, holdings = flags & F_WHITE_ON_MOVE ? BOARD_WIDTH-1 : 0; for(r=0; r hisPieces ? MT_STAINMATE : MT_STEALMATE; else if(gameInfo.variant == VariantLosers) return inCheck ? MT_TRICKMATE : MT_STEALMATE; else if(gameInfo.variant == VariantGiveaway) return MT_STEALMATE; // no check exists, stalemated = win return inCheck ? MT_CHECKMATE : (gameInfo.variant == VariantXiangqi || gameInfo.variant == VariantShatranj || gameInfo.variant == VariantShogi) ? MT_STAINMATE : MT_STALEMATE; } } extern void DisambiguateCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void DisambiguateCallback (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { register DisambiguateClosure *cl = (DisambiguateClosure *) closure; int wildCard = FALSE; ChessSquare piece = board[rf][ff]; // [HGM] wild: for wild-card pieces rt and rf are dummies if(piece == WhiteFalcon || piece == BlackFalcon || piece == WhiteCobra || piece == BlackCobra) wildCard = TRUE; if ((cl->pieceIn == EmptySquare || cl->pieceIn == board[rf][ff] || PieceToChar(board[rf][ff]) == '~' && cl->pieceIn == (ChessSquare)(DEMOTED board[rf][ff]) ) && (cl->rfIn == -1 || cl->rfIn == rf) && (cl->ffIn == -1 || cl->ffIn == ff) && (cl->rtIn == -1 || cl->rtIn == rt || wildCard) && (cl->ftIn == -1 || cl->ftIn == ft || wildCard)) { cl->count++; if(cl->count == 1 || board[rt][ft] != EmptySquare) { // [HGM] oneclick: if multiple moves, be sure we remember capture cl->piece = board[rf][ff]; cl->rf = rf; cl->ff = ff; cl->rt = wildCard ? cl->rtIn : rt; cl->ft = wildCard ? cl->ftIn : ft; cl->kind = kind; } cl->captures += (board[rt][ft] != EmptySquare); // [HGM] oneclick: count captures } } void Disambiguate (Board board, int flags, DisambiguateClosure *closure) { int illegal = 0; char c = closure->promoCharIn; if(quickFlag) flags = flags & ~1 | quickFlag & 1; // [HGM] speed: in quick mode quickFlag specifies side-to-move. closure->count = closure->captures = 0; closure->rf = closure->ff = closure->rt = closure->ft = 0; closure->kind = ImpossibleMove; rFilter = closure->rtIn; // [HGM] speed: only consider moves to given to-square fFilter = closure->ftIn; if(quickFlag) { // [HGM] speed: try without check test first, because if that is not ambiguous, we are happy GenLegal(board, flags|F_IGNORE_CHECK, DisambiguateCallback, (VOIDSTAR) closure, closure->pieceIn); if(closure->count > 1) { // gamble did not pay off. retry with check test to resolve ambiguity closure->count = closure->captures = 0; closure->rf = closure->ff = closure->rt = closure->ft = 0; closure->kind = ImpossibleMove; GenLegal(board, flags, DisambiguateCallback, (VOIDSTAR) closure, closure->pieceIn); // [HGM] speed: only pieces of requested type } } else GenLegal(board, flags, DisambiguateCallback, (VOIDSTAR) closure, closure->pieceIn); // [HGM] speed: only pieces of requested type if (closure->count == 0) { /* See if it's an illegal move due to check */ illegal = 1; GenLegal(board, flags|F_IGNORE_CHECK, DisambiguateCallback, (VOIDSTAR) closure, closure->pieceIn); if (closure->count == 0) { /* No, it's not even that */ if(!appData.testLegality && closure->pieceIn != EmptySquare) { int f, r; // if there is only a single piece of the requested type on the board, use that closure->rt = closure->rtIn, closure->ft = closure->ftIn; for(r=0; rpieceIn) closure->count++, closure->rf = r, closure->ff = f; if(closure->count > 1) illegal = 0; // ambiguous } if(closure->count == 0) { if (appData.debugMode) { int i, j; for(i=BOARD_HEIGHT-1; i>=0; i--) { for(j=0; jpiece != WhitePawn && closure->piece != BlackPawn) { if(closure->piece < BlackPawn) { // white if(closure->rf != 0) closure->kind = IllegalMove; // must be on back rank if(!(board[VIRGIN][closure->ff] & VIRGIN_W)) closure->kind = IllegalMove; // non-virgin if(board[PieceToNumber(CharToPiece(ToUpper(c)))][BOARD_WIDTH-2] == 0) closure->kind = ImpossibleMove;// must be in stock } else { if(closure->rf != BOARD_HEIGHT-1) closure->kind = IllegalMove; if(!(board[VIRGIN][closure->ff] & VIRGIN_B)) closure->kind = IllegalMove; // non-virgin if(board[BOARD_HEIGHT-1-PieceToNumber(CharToPiece(ToLower(c)))][1] == 0) closure->kind = ImpossibleMove; } } else if(gameInfo.variant == VariantShogi) { /* [HGM] Shogi promotions. On input, '=' means defer, '+' promote. Afterwards, c is set to '+' for promotions, NULL other */ if(closure->rfIn != DROP_RANK && closure->kind == NormalMove) { ChessSquare piece = closure->piece; if (c == 'd' && (piece == WhiteRook || piece == BlackRook) || c == 'h' && (piece == WhiteBishop || piece == BlackBishop) || c == 'g' && (piece <= WhiteFerz || piece <= BlackFerz && piece >= BlackPawn) ) c = '+'; // allowed ICS notations if(c != NULLCHAR && c != '+' && c != '=') closure->kind = IllegalMove; // otherwise specifying a piece is illegal else if(flags & F_WHITE_ON_MOVE) { if( (int) piece < (int) WhiteWazir && (closure->rf >= BOARD_HEIGHT-(BOARD_HEIGHT/3) || closure->rt >= BOARD_HEIGHT-(BOARD_HEIGHT/3)) ) { if( (piece == WhitePawn || piece == WhiteQueen) && closure->rt > BOARD_HEIGHT-2 || piece == WhiteKnight && closure->rt > BOARD_HEIGHT-3) /* promotion mandatory */ closure->kind = c == '=' ? IllegalMove : WhitePromotion; else /* promotion optional, default is defer */ closure->kind = c == '+' ? WhitePromotion : WhiteNonPromotion; } else closure->kind = c == '+' ? IllegalMove : NormalMove; } else { if( (int) piece < (int) BlackWazir && (closure->rf < BOARD_HEIGHT/3 || closure->rt < BOARD_HEIGHT/3) ) { if( (piece == BlackPawn || piece == BlackQueen) && closure->rt < 1 || piece == BlackKnight && closure->rt < 2 ) /* promotion obligatory */ closure->kind = c == '=' ? IllegalMove : BlackPromotion; else /* promotion optional, default is defer */ closure->kind = c == '+' ? BlackPromotion : BlackNonPromotion; } else closure->kind = c == '+' ? IllegalMove : NormalMove; } } if(closure->kind == WhitePromotion || closure->kind == BlackPromotion) c = '+'; else if(closure->kind == WhiteNonPromotion || closure->kind == BlackNonPromotion) c = '='; } else if (closure->kind == WhitePromotion || closure->kind == BlackPromotion) { if(c == NULLCHAR) { // missing promoChar on mandatory promotion; use default for variant if(gameInfo.variant == VariantShatranj || gameInfo.variant == VariantCourier || gameInfo.variant == VariantMakruk) c = PieceToChar(BlackFerz); else if(gameInfo.variant == VariantGreat) c = PieceToChar(BlackMan); else if(gameInfo.variant == VariantGrand) closure->kind = closure->rt != 0 && closure->rt != BOARD_HEIGHT-1 ? NormalMove : AmbiguousMove; // no default in Grand Chess else c = PieceToChar(BlackQueen); } else if(c == '=') closure->kind = IllegalMove; // no deferral outside Shogi } else if (c != NULLCHAR) closure->kind = IllegalMove; closure->promoChar = ToLower(c); // this can be NULLCHAR! Note we keep original promoChar even if illegal. if(c != '+' && c != '=' && c != NULLCHAR && CharToPiece(flags & F_WHITE_ON_MOVE ? ToUpper(c) : ToLower(c)) == EmptySquare) closure->kind = ImpossibleMove; // but we cannot handle non-existing piece types! if (closure->count > 1) { closure->kind = AmbiguousMove; } if (illegal) { /* Note: If more than one illegal move matches, but no legal moves, we return IllegalMove, not AmbiguousMove. Caller can look at closure->count to detect this. */ closure->kind = IllegalMove; } } typedef struct { /* Input */ ChessSquare piece; int rf, ff, rt, ft; /* Output */ ChessMove kind; int rank; int file; int either; } CoordsToAlgebraicClosure; extern void CoordsToAlgebraicCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void CoordsToAlgebraicCallback (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { register CoordsToAlgebraicClosure *cl = (CoordsToAlgebraicClosure *) closure; if ((rt == cl->rt && ft == cl->ft || rt == rf && ft == ff) && // [HGM] null move matches any toSquare (board[rf][ff] == cl->piece || PieceToChar(board[rf][ff]) == '~' && (ChessSquare) (DEMOTED board[rf][ff]) == cl->piece) ) { if (rf == cl->rf) { if (ff == cl->ff) { cl->kind = kind; /* this is the move we want */ } else { cl->file++; /* need file to rule out this move */ } } else { if (ff == cl->ff) { cl->rank++; /* need rank to rule out this move */ } else { cl->either++; /* rank or file will rule out this move */ } } } } /* Convert coordinates to normal algebraic notation. promoChar must be NULLCHAR or 'x' if not a promotion. */ ChessMove CoordsToAlgebraic (Board board, int flags, int rf, int ff, int rt, int ft, int promoChar, char out[MOVE_LEN]) { ChessSquare piece; ChessMove kind; char *outp = out, c; CoordsToAlgebraicClosure cl; if (rf == DROP_RANK) { if(ff == EmptySquare) { strncpy(outp, "--",3); return NormalMove; } // [HGM] pass /* Bughouse piece drop */ *outp++ = ToUpper(PieceToChar((ChessSquare) ff)); *outp++ = '@'; *outp++ = ft + AAA; if(rt+ONE <= '9') *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } *outp = NULLCHAR; return (flags & F_WHITE_ON_MOVE) ? WhiteDrop : BlackDrop; } if (promoChar == 'x') promoChar = NULLCHAR; piece = board[rf][ff]; if(PieceToChar(piece)=='~') piece = (ChessSquare)(DEMOTED piece); switch (piece) { case WhitePawn: case BlackPawn: kind = LegalityTest(board, flags, rf, ff, rt, ft, promoChar); if (kind == IllegalMove && !(flags&F_IGNORE_CHECK)) { /* Keep short notation if move is illegal only because it leaves the player in check, but still return IllegalMove */ kind = LegalityTest(board, flags|F_IGNORE_CHECK, rf, ff, rt, ft, promoChar); if (kind == IllegalMove) break; kind = IllegalMove; } /* Pawn move */ *outp++ = ff + AAA; if (ff == ft && board[rt][ft] == EmptySquare) { /* [HGM] Xiangqi has straight noncapts! */ /* Non-capture; use style "e5" */ if(rt+ONE <= '9') *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } } else { /* Capture; use style "exd5" */ if(gameInfo.variant != VariantXiangqi || board[rt][ft] != EmptySquare ) *outp++ = 'x'; /* [HGM] Xiangqi has sideway noncaptures across river! */ *outp++ = ft + AAA; if(rt+ONE <= '9') *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } } /* Use promotion suffix style "=Q" */ *outp = NULLCHAR; if (promoChar != NULLCHAR) { if(gameInfo.variant == VariantShogi) { /* [HGM] ... but not in Shogi! */ *outp++ = promoChar == '=' ? '=' : '+'; } else { *outp++ = '='; *outp++ = ToUpper(promoChar); } *outp = NULLCHAR; } return kind; case WhiteKing: case BlackKing: /* Fabien moved code: FRC castling first (if KxR), wild castling second */ /* Code added by Tord: FRC castling. */ if((piece == WhiteKing && board[rt][ft] == WhiteRook) || (piece == BlackKing && board[rt][ft] == BlackRook)) { if(ft > ff) safeStrCpy(out, "O-O", MOVE_LEN); else safeStrCpy(out, "O-O-O", MOVE_LEN); return LegalityTest(board, flags, rf, ff, rt, ft, promoChar); } /* End of code added by Tord */ /* Test for castling or ICS wild castling */ /* Use style "O-O" (oh-oh) for PGN compatibility */ else if (rf == rt && rf == ((piece == WhiteKing) ? 0 : BOARD_HEIGHT-1) && (ft - ff > 1 || ff - ft > 1) && // No castling if legal King move (on narrow boards!) ((ff == BOARD_WIDTH>>1 && (ft == BOARD_LEFT+2 || ft == BOARD_RGHT-2)) || (ff == (BOARD_WIDTH-1)>>1 && (ft == BOARD_LEFT+1 || ft == BOARD_RGHT-3)))) { if(ft==BOARD_LEFT+1 || ft==BOARD_RGHT-2) snprintf(out, MOVE_LEN, "O-O%c%c", promoChar ? '/' : 0, ToUpper(promoChar)); else snprintf(out, MOVE_LEN, "O-O-O%c%c", promoChar ? '/' : 0, ToUpper(promoChar)); /* This notation is always unambiguous, unless there are kings on both the d and e files, with "wild castling" possible for the king on the d file and normal castling possible for the other. ICS rules for wild 9 effectively make castling illegal for either king in this situation. So I am not going to worry about it; I'll just generate an ambiguous O-O in this case. */ return LegalityTest(board, flags, rf, ff, rt, ft, promoChar); } /* else fall through */ default: /* Piece move */ cl.rf = rf; cl.ff = ff; cl.rt = rFilter = rt; // [HGM] speed: filter on to-square cl.ft = fFilter = ft; cl.piece = piece; cl.kind = IllegalMove; cl.rank = cl.file = cl.either = 0; c = PieceToChar(piece) ; GenLegal(board, flags, CoordsToAlgebraicCallback, (VOIDSTAR) &cl, c!='~' ? piece : (DEMOTED piece)); // [HGM] speed if (cl.kind == IllegalMove && !(flags&F_IGNORE_CHECK)) { /* Generate pretty moves for moving into check, but still return IllegalMove. */ GenLegal(board, flags|F_IGNORE_CHECK, CoordsToAlgebraicCallback, (VOIDSTAR) &cl, c!='~' ? piece : (DEMOTED piece)); if (cl.kind == IllegalMove) break; cl.kind = IllegalMove; } /* Style is "Nf3" or "Nxf7" if this is unambiguous, else "Ngf3" or "Ngxf7", else "N1f3" or "N5xf7", else "Ng1f3" or "Ng5xf7". */ if( c == '~' || c == '+') { /* [HGM] print nonexistent piece as its demoted version */ piece = (ChessSquare) (DEMOTED piece); } if(c=='+') *outp++ = c; *outp++ = ToUpper(PieceToChar(piece)); if (cl.file || (cl.either && !cl.rank)) { *outp++ = ff + AAA; } if (cl.rank) { if(rf+ONE <= '9') *outp++ = rf + ONE; else { *outp++ = (rf+ONE-'0')/10 + '0';*outp++ = (rf+ONE-'0')%10 + '0'; } } if(board[rt][ft] != EmptySquare) *outp++ = 'x'; *outp++ = ft + AAA; if(rt+ONE <= '9') *outp++ = rt + ONE; else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; } if (gameInfo.variant == VariantShogi) { /* [HGM] in Shogi non-pawns can promote */ *outp++ = promoChar; // Don't bother to correct move type, return value is never used! } else if (gameInfo.variant != VariantSuper && promoChar && (piece == WhiteLance || piece == BlackLance) ) { // Lance sometimes represents Pawn *outp++ = '='; *outp++ = ToUpper(promoChar); } else if (gameInfo.variant == VariantSChess && promoChar) { // and in S-Chess we have gating *outp++ = '/'; *outp++ = ToUpper(promoChar); } *outp = NULLCHAR; return cl.kind; case EmptySquare: /* Moving a nonexistent piece */ break; } /* Not a legal move, even ignoring check. If there was a piece on the from square, use style "Ng1g3" or "Ng1xe8"; if there was a pawn or nothing (!), use style "g1g3" or "g1xe8". Use "x" if a piece was on the to square, even a piece of the same color. */ outp = out; c = 0; if (piece != EmptySquare && piece != WhitePawn && piece != BlackPawn) { int r, f; for(r=0; r= BOARD_HEIGHT/2) return; // Pawn before river can be chased if(board[rf][ff] == WhitePawn || board[rf][ff] == BlackPawn) return; // Pawns are allowed to chase if(board[rf][ff] == WhiteWazir || board[rf][ff] == BlackWazir) return; // King is allowed to chase // move cannot be excluded from being a chase trivially (based on attacker and victim); save it on chaseStack chaseStack[chaseStackPointer].rf = rf; chaseStack[chaseStackPointer].ff = ff; chaseStack[chaseStackPointer].rt = rt; chaseStack[chaseStackPointer].ft = ft; chaseStackPointer++; } extern void ExistingAtacksCallback P((Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure)); void ExistingAttacksCallback (Board board, int flags, ChessMove kind, int rf, int ff, int rt, int ft, VOIDSTAR closure) { // for removing pre-exsting captures from the chaseStack, to be left with newly created ones int i; register ChaseClosure *cl = (ChaseClosure *) closure; //closure tells us the move played in the repeat loop if(board[rt][ft] == EmptySquare) return; // no capture if(rf == cl->rf && ff == cl->ff) { // attacks with same piece from new position are not considered new rf = cl->rt; ff = cl->ft; // doctor their fromSquare so they will be recognized in chaseStack } // search move in chaseStack, and delete it if it occurred there (as we know now it is not a new capture) for(i=0; irt && ft == cl->ft) cl->recaptures++; // count legal recaptures to this square if(appData.debugMode && board[rt][ft] != EmptySquare) fprintf(debugFP, "try %c%c%c%c=%d\n", ff+AAA, rf+ONE,ft+AAA, rt+ONE, cl->recaptures); } extern char moveList[MAX_MOVES][MOVE_LEN]; int PerpetualChase (int first, int last) { // this routine detects if the side to move in the 'first' position is perpetually chasing (when not checking) int i, j, k, tail; ChaseClosure cl; ChessSquare captured; preyStackPointer = 0; // clear stack of chased pieces for(i=first; i= (int) BlackPawn) attacker = BLACK_TO_WHITE attacker; // convert to white, as piecee type if(victim >= (int) BlackPawn) victim = BLACK_TO_WHITE victim; if((attacker == WhiteKnight || attacker == WhiteCannon) && victim == WhiteRook) continue; // C or H attack on R is always chase; leave on chaseStack if(attacker == victim) { if(LegalityTest(boards[i+1], PosFlags(i+1), chaseStack[j].rt, chaseStack[j].ft, chaseStack[j].rf, chaseStack[j].ff, NULLCHAR) == NormalMove) { // we can capture back with equal piece, so this is no chase but a sacrifice chaseStack[j] = chaseStack[--chaseStackPointer]; // delete the capture from the chaseStack j--; /* ! */ continue; } } // the attack is on a lower piece, or on a pinned or blocked equal one CopyBoard(xqCheckers, nullBoard); xqCheckers[EP_STATUS] = 1; CheckTest(boards[i+1], PosFlags(i+1), -1, -1, -1, -1, FALSE); // if we deliver check with our move, the checkers get marked // test if the victim is protected by a true protector. First make the capture. captured = boards[i+1][chaseStack[j].rt][chaseStack[j].ft]; boards[i+1][chaseStack[j].rt][chaseStack[j].ft] = boards[i+1][chaseStack[j].rf][chaseStack[j].ff]; boards[i+1][chaseStack[j].rf][chaseStack[j].ff] = EmptySquare; // Then test if the opponent can recapture cl.recaptures = 0; // prepare closure to pass recapture square and count moves to it cl.rt = chaseStack[j].rt; cl.ft = chaseStack[j].ft; if(appData.debugMode) { fprintf(debugFP, "test if we can recapture %c%c\n", cl.ft+AAA, cl.rt+ONE); } xqCheckers[EP_STATUS] = 2; // causes GenLegal to ignore the checks we delivered with the move, in real life evaded before we captured GenLegal(boards[i+1], PosFlags(i+1), ProtectedCallback, &cl, EmptySquare); // try all moves xqCheckers[EP_STATUS] = 0; // disable quasi-legal moves again // unmake the capture boards[i+1][chaseStack[j].rf][chaseStack[j].ff] = boards[i+1][chaseStack[j].rt][chaseStack[j].ft]; boards[i+1][chaseStack[j].rt][chaseStack[j].ft] = captured; // if a recapture was found, piece is protected, and we are not chasing it. if(cl.recaptures) { // attacked piece was defended by true protector, no chase chaseStack[j] = chaseStack[--chaseStackPointer]; // so delete from chaseStack j--; /* ! */ } } // chaseStack now contains all moves that chased if(appData.debugMode) { int n; for(n=0; n WinBoard Convergence * Exporting the game list (XB) * A move type-in box (XB) * New-style Move History window (XB) ** Version 4.5.3a ** (see http://www.gnu.org/software/xboard/whats_new/4.5.3a/ ) * only changes to Winboard : build non JAW by default, fix compile errors ** Version 4.5.3 ** (see http://www.gnu.org/software/xboard/whats_new/4.5.3/ ) * fixes of major bugs: * In the file-browse dialog . and .. no longer mask other files if they are non-first in the directory * Fix XBoard crash on showing an empty Engine Settings dialog, printing a message in stead * The XBoard Game List can now handle files with more than 1900 games, by paging through them * The state of the Move-History window is now remembered by XBoard even when the Engine-Output window is up * Fix crash on switching sounds in WinBoard under Windows Vista * Fix empty-string option values on XBoard command line (which were ignored) * Fix spurious vertical scrolling in XBoard Engine-Output window on clicking in it * Obey an engine's san feature when sending book moves to it * Fix XBoard crash when 'filtering' made Game List empty * Suppress clearing of Engine-Output window on automatic updates in analyze mode * Force Move-History refresh after loading/reverting variation * Fix closing brace, when joining two comments to same move * fixes of minor bugs: * Suppress playing sounds when no -soundProgram is set * Fix display of last move of last match game * Update window title after last game of match * Never one-click move when legality testing is off * Suppress playing book move when total weigth of all moves is zero * Restore echo after ^C killed XBoard during ICS password * Fix default of -remoteUser, which could cause crash when playing remote engines * Fix recognition of separators between options in -adapterCommand command line * Fix button sizing in generic popup * Fix translatability of 'Spartan Chess' menu item WB * Remove some duplicats from WB language template file * Fix spurious 'Unfinished' sounds during ICS examining * Fix bug in handling of partner command in zippy-mode bughouse games * Create more space in some WB dialogs to accomodate translations * Improvements benefitting the speaking version for the visually impaired (WB): * Implement NVDA support in JAWS version * Fix translation of spoken composite messages * Fix JAWS reading of Engine-Settings dialog by removing group-boxes * Add tab stops in WB generic popup * Reorder controls in Engine-Setings dialog WB, so they are tabbed through in logical order * fixed compiler warnings/errors and portability: * Fix use of random function in XBoard shuffle dialog callback * Fix inconsistent type of the variable 'shuffleOpenings' * Silence warnings during rpm build * Fix warnings XBoard file browser * Fix some warnings and header-file improvement * misc: * Add -at and -opt options as alternative for @, as work-around for Windows shortcut bug * Make occurrence of unknown option in settings file non-fatal * Stale output no longer lingers in the engine-output window when a new game starts * Popdown (stale) Comment window on new game ** Version 4.5.2a (Winboard only)** (see http://www.gnu.org/software/xboard/whats_new/4.5.2/ ) * Fix Engine Settings button options in WinBoard ** Version 4.5.2 ** (see http://www.gnu.org/software/xboard/whats_new/4.5.2/ ) * Main new feature: * Added many option dialogs and reworked some of the old ones * bugfixes, packaging and install: * Fix nps bug * Fix flipBlack option XBoard with board texture * Fix two bugs in reading position diagram * Fix parsing bug of FRC castling * Fix bugs in FRC castling rights * Fix display of promotion piece in ICS superchess * Fix path browsing in WinBoard * Fix use of game/position file in first match game * Fix build on Mac OS X * install bitmaps and sounds during "make install" * some minor bug fixes * code cleanup (e.g. 64 bit warnings, removed malloc.h) ** Version 4.5.1 ** (see http://www.gnu.org/software/xboard/whats_new/4.5.1/ ) * bugfixes: * Revert "Implement -reset option feature in WinBoard" * Fix deselection of greyed-out variant button (WB) * Put warning in HTML help * Fix unmarked translation * Fix Alfil bug * Fix variant janus size prefix * Fix Xiangqi King facing * Fix showing of user move after adjudication * Make language choice from menu persistent * Fix ICS channel 0 * Fix some resource leaks * fixed packaging issues: * add DIFFSTAT and SHORTLOG to tar-ball * added history.c to the tar-ball. Needed for Winboard * fixed compiler warnings/errors: * added missing header file for sprintf * added missing #includes and missing prototypes to filebrowser * Fix MSVC compilability * Fix 64-bit Windows compilability * Fix MSVC snprintf problem * fixed configure problems: * fixed configure script to correctly detect Xaw3d library * updated configure.ac to check for Xaw header files * misc: * Fix two typos in option names in texi file ** Version 4.5.0 ** (see http://www.gnu.org/software/xboard/whats_new/4.5.0/ for more details) General ------- * User specific settings files * More logical (and standard) menu structure * Translation into other languages (WB) * Walking the PV of an engine * Exploring variations * Playing through PGN variations * Annotating a game with analysis results * Editing Comments * Controlling move choice of the GUI book * Keeping the clock in sync in tournaments * Starting an engine match from the menu * Fixed thinking time per move * Improved multi-PV support * Where your pieces can move to * Editing crazyhouse holdings * Thai Chess (Makruk) and Seirawan Chess * Non-compliant FEN and SAN input * Improved Xiangqi adjudications * Allowing engines to setup a position Merging XBoard & WinBoard ------------------------------ * Evaluation graph (XB) * Settings file (XB) * Filtering the game list (XB) * Game-List options dialog (XB) * Recalling the ICS input history (XB) * Aribtrary board textures (XB) * Highlight arrow (XB) ICS-client Enhancements ----------------------- * Maintaining a healty ICS connection * Claiming a draw after your move * ICS seek graph * One-click moving * Observing your bughouse partner * Improved Chat-Box interface (WB) * Uploading games to an ICS * Side-by-side boards ** Version 4.4.4 ** * Repair exit-popup deadlock patch * Fix bug in sending "usermove" when forcing book moves * Let move parser return ImpossibleMove for off-board moves * Prevent engine stall on perpetual-chase evasion * Pop down old tags on loadng new game in WinBoard * Fix game end during dragging * Repair animate dragging * Fix bug in sending cores command to engine * Fix parsing of SAN shogi promotions * Fix variant switch on PGN loading * Allow -flipBlack to work with font-based piece rendering * Allow font-based piece rendering in board sizes below petite * Fix WinBoard game-list title * Fix deadlock in match-result display * Fix regression in colorization of zippy-matched commands * Fix zippy handling of draw offers from ICS * Make some more zippy code obey the --disable-zippy flag * Remove unnecessary double equals from configure.ac. * Cut board squares out of texture bitmap more cleverly ** Version 4.4.3 ** * Add variant Makruk * Implement castling for variant CRC * Extensive bugfix of -autoKibitz * Accept for changing chat partner * Change opening array -variant fairy * Send continuation lines to chat box they belong to * Use -keepAlive option to determine connection health * Fix of ancient WinBoard bug: check value of int options * Fix bug for incommensurate time odds * Fix piece-to-char table -variant fairy * Fix TwoKings ICS castling-rights bug * Fix reading castling rights FEN in knightmate and twokings * Fix OO-castling in FRC after pasting FEN * Fix bug in display of logos * Fix highlighting bug in XBoard * Match handles with multiple titles for channel Chat Boxes * Make WinBoard makefiles use parser.c in XBoard directory * Added missing sounds files to be able to compile on windows * Added logo files for xboard * Bugfix stale first-click * Fix copying of WB Chat Window contents * Fix XB crash on giving keyboard focus to non-text widget * Bugfix copying from Chat Box, own lines * Fix 'mamer bug' in Chat Boxes * Fix copying of kibitzed lines from WB Engine-Output window * Do not recognize non-ICS variants from PGN event tag * Remake programVersion string after receiving engine features * Set keyboard focus at startup to board window * Fix window-position upset on failing engine start in WinBoard * Allow lower-case promochar in moves of type h8=Q * Small bugfixed for JAWS version * Small bugfixes ** Version 4.4.2 ** * add Winboard source files into tar-ball * remove trailing \r in xboard output * double buffer size to prevent overflow * fix problem with empty string in -firstNeedsNoncompliantFEN * updates makefiles to include dependency on config.h * correctly apply some check boxes from the option menu * score sign in analysis mode * fix for bug #28077: xboard needs to link against x11 * fix castling rights when copying FEN to clipboard (again) * fixed some outstanding pixmaps * fix the irritating wandering off of the MoveHistory window in XBoard on opening/closing. * use xtell for talking to handles, but tell for talking into a channel. * fix bug in bughouse drop menu * removing some rather verbose debug messages that seem no longer needed. * fix engine-sync on move-number type-in bug * fix declaration of engineOutputDialogUp * fix double start of zippy engine after switch to gothic * the last move before the time control now gets its time listed in the PGN * fix casting rights after FEN pasting * fix crash on engine crash * fixed build on openbsd * cleaned up some debug messages and typos * removed files that should only be in the windboard directory * added missing library for build on OS X ** Version 4.4.1 ** * added chat windows to keep track of multiple conversations (WinBoard only) * allow the result comment as a display item in the game list * added a "Mute All Sounds" item in the WinBoard Options menu * new -forceIllegalMoves option * new -keepAlive option (for ICS play) * ported -autoDisplayComment and -autoDisplayTags to xboard, controling popups * replaces analysispopup with engineoutputpopup in xboard * allow copy/paste position and game to use clipboard (xboard) * updated several bitmaps (xboard) * Made the beep sounds for JAWS board navigation configurable through command-line options * added the result comment to the game-list tags when the game list is exported to the clipboard * updated RTF docs * fixed premove problem * fixed engine did not start playing when out of GUI book on second move with white * fix bug using opening books (file were not closed) * fixed crash when opening Engine #1 Settings when there were no text-edit options in the dialog * fixed loading of games from command lines, fixes cmail bug * fix joining lines split by ICS and resizing terminal window when using ICS (new option -keepLineBreaksICS, -wrapContinuationSequence, -useInternalWrap) * fixed -autoDisplayComment * fixed wrong default value for engineDebugOutput in xboard * swapped 'tell' and 'message' parsing order for correct colorization. * fixed parse bug for pgn files * fix for edit-position "moves" being sent by XBoard to the engine * bugfix for protocol extensions: egtbpath -> egtpath * fix bug in parser * further bugfixes: #8847, #10990, #27427, #27642, #27666, #27667, #27668, #27715, #27751, #27760, #27772, #27799, #27826 and several small ones * use "make distcheck" to generate tar-balls * prepared a system to internationalize winboard menus * improved mouse handler * rewrote wevalgraph for better frontend/backend separation * code cleanup ** Version 4.4.0 ** A new release of both XBoard and WinBoard is now available. Version 4.4.0 includes many changes. It is the first major release of xboard/winboard after a fork of the project after version 4.2.7. It includes small changes made in the main line and changes made by a fork of Alessandro Scotti and lots of changes made afterwards by H.G. Muller (released as versions 4.3.x). This release represents a unified version of all changes made after the fork. It includes many new features and bugfixes. You can get both XBoard and WinBoard from the Savannah project pages: https://savannah.gnu.org/projects/xboard/ If you find a bug, please report it in the bug tracker at https://savannah.gnu.org/projects/xboard/ or by email to bug-xboard (AT) gnu.org. ** Version 4.3.16 ** New command-line options /niceEngines=N for adjusting the priority of engine processes so they don't soak up all your system resources /firstOptions="..." Allows the setting of options that engines define through the feature option="..." commands /secondOptions="..." /firstLogo=filename.bmp Displays the mentioned bitmap next to the clock (with H:W =1:2 aspect ratio) (WB only) /secondLogo=filename.bmp /autoLogo=false get logo files automatically from engineDirectory\logo.bmp General enhancements: * New WB-protocol command: 'feature option="NAME -TYPE VALUE OTHER"', which engines can use to define options * New WB-protocol command: 'option NAME VALUE' used to set value of engine-defned options. * implements /delayAfterQuit and /delayBeforeQuit in XBoard, and uses SIGKILL to terminate rogue engine processes ** Version 4.3.15 ** New command-line options /rewindIndex=N (for the new auto-increment mode of the loadGameIndex or loadPositionIndex in match mode) /sameColorGames=N (for playing a match where the same player has white all the time) /egtFormats="..." (for specifying where various end-game tables are installed on the computer) New menu items + Time-odds factors can be set in the time-control dialog + Nr of CPUs for SMP engines can be set in the Options -> UCI dialog + Own-Book options can be switched from the Options -> UCI dialog + The ScoreIsAbs options can be set from the Options -> Engine dialog + New-Variant menu adds Superchess General Enhancements: * WinBoard engines can now also use the Polyglot opening book (implemented as general GUI book) * New WB-protocol commands memory, cores and egtpath make interactive setting of these parameters possible on WB engines * New Polyglot is available that relays the interactive setting of these parameters to UCI engines * Match mode suports an auto-increment mode, so that all games or positions from a file can be played * Draw claims with Kings and an arbitrary number of like Bishops (e.g. KBBKB) are accepted The source tree in original xboard 4.2.7 format can now be compiled under Cygwin with the aid of the cygwin.mak file in the ~/winboard/ subdirectory of the source releasy, after you put the hep-file from an executabl distribution there. Maefiles for other compilers are not updated since 4.2.7, as I do not have those compilers. ** Version 4.3.14 ** This relaese was not made by the GNU xboard team, but by H.G.Muller. It mainly contains developments on WinBoard. Nevertheless, an attempt has been started to back-port the enormous number of improvements that have been made to WinBoard since the Linux and Windows developments branched to xboard. This is reflected by the source tree now having the same format as that of xboard 4.2.7, including all the xboard sources. An enormous amount of work still has to be done to make the xboard version fully equivalent to WinBoard, especially on user-interface side. As a modest beginning, the xboard source files have been patched to allow their compilation with the newer back-end files from WinBoard. To this end, the number of piece types in xboard has been increased from 6 to 22, and the WinBoard bitmaps have been converted to xboard source format (.bm) and are included in the xboard bitmaps directory. Other quick patches include the coloring of the board squares (for xiangqi and holdings), and some code in the user-move handling to suppress all moves into or out of the area between board and holdings in crazyhouse, and the treatment of king-captures-own-piece as a possibly valid move (for FRC castling). This should make it possible to run xboard with the new back-end files without too much inconvenience. New xboard command-line options have been added to make the added back-end features available. The include the new variants (as argument of the old -variant option), -boardWidth, -boardHeight and -holdingsSize. Be sure to call xboard with "-boardSize middling" or "-boardSize bulky" if you want to play with fairy pieces, or xboard might crash due to unavailability of bitmaps. Other added xboard options are: ADJUDICATION OPTIONS: -checkMates -testClaims -materialDraws -trivialDraws -ruleMoves -repeatsToDraw -adjudicateLossThreshold -firstScoreAbsolute -secondScoreAbsolute TIME-CONTROL OPTIONS -firstTimeOdds -secondTimeOdds -timeOddsMode -firstNPS -secondNPS GENERAL OPTIONS -matchPause -engineDebugOutput -userName -pgnExtendedInfo -pgnEventHeader -hideThinkingFromHuman This is all completely untested, but as the options merely switch on well-tested code in the back-end, there should not be too many problems with them. Bugs can be reported in the WinBoard forum. ** Version 4.3.14k ** Compared to version 4.3.13 described below, this version features New command-line options: /autoKibitz (for relaying the PV info of the engine to the ICS) /userName="..." (for setting the name of the Human player, also as menu) /engineDebugOutput=N (controlling the writing of engine output to debug file) /firstNPS=N (for time management by node count or CPU time) /secondNPS=N (likewise for the other engine) New Menu items + Enter Username (same as /userName command-line option) + Save Diagram (for saving the Chessboard display as bitmap file) + Machine Both (not implemented yet, but menu item already provided) + New-Variant menu adds CRC, Janus and Berolina (the latter only with legality testing off!) + Any variant can be played from a shuffled opening setup Bugfixes: * Problems with switching the variant in ICS zippy mode solved * In ICS observing mode game history is now fully accessible * Moves are not fed to engine in zippy mode, when observing a game from a variant unknown to the engine * a problem with loading PGN of FRC games with move disambiguation and initial castling rights was fixed. * A bug in the clock display that made previous versions of WinBoard crash for tiny displays is fixed General enhancements: * variant name displayed in title bar in ICS mode, when not 'normal' * when receiving a challenge in ICS zippy mode, it is checked if the engine supports the variant (/zippyVariants="..." can still be used to limit the allowed variants, and for protocol-1 engines is still the only thing to go on) * when loading a game from a PGN file, WB automatically switches to the variant specified in the PGN tags * when starting from a loaded position (using /loadPositionFile), this position will be used on subsequent 'New Game' commands as well (until we switch variant) New is also that the source tree is now brought back in the original WinBoard 4.2.7 format, including xboard source files. Note, however, that the xboard sources are from an older date, and I did not test if they still compile together with the much newer backend sources. I did add code in xboard.c to recognize the new command-line options I added since then, and in so far they are back-end options that should be enough to make them work. This is completely untested, though; I did not even try to compile it. Last time anyone built a working xboard.exe from this was at a stage where WinBoard did have adjustable board size, allowing it to play Xiangqi. But no crazyhouse holdings yet. ** Version 4.3.13a ** This version of WinBoard_F fixes several bugs in 4.3.12, and also addse a few new features. The new features include: - some more fairy pieces, so that each side now has 22 piece types in stead of 17, making most fairy pieces available in board size "petite" (next to "bulky" and "middling"), making the ArchBishop and Chancellor, as well as one wildcard piece (the Lance) available in all sizes from "petite" to "bulky". - The FRC support is fully fixed, both in local and ICS mode. - A mechanism is provided for safe draw claiming in cases where a 3-fold repetition woud occur only after your own move. In this case a draw will be awarded by WinBoard if the engine sends "offer draw" before making its move. - Genuine draw offers are not passed on immediately to the opponent but held up to when the offerer announces its move. - Variants FRC, Cylinder and Falcon are added to the "New Variant..." menu. - Support for playing time-odds games is added. (Options /firstTimeOdds, /secondTimeOdds, /timeOddsMode) - A mechanism is provided for attaching WinBoard options to the engine command, to create options that follow the engine (e.g. time odds) in a tournament run under a tournament manager. Bugfixes include: - Shatranj in ICS mode (did not work at all before) - Some draw adjudications (QRKR was mistaken for KRKR, and KBKB with like Bishops is now recognized) - time info in the PGN is now correct ** Winboard_F.4.3.12 release notes This WinBoard (beta-)version is derived from Allessandro Scotti's Winboard_x, and supports the following new options, mainly in the area of adjudication of engine-engine games, improved Crazyhouse support, and allowing variants with non-conventional pieces and or board sizes. (All option are shown here with their default values): /variant=normal This (already existing) option has been expanded with several new variants, involving non-conventional pieces and deviating board sizes. The board size is automatically adapted to the selected variant, unless explicitly overruled (see below). The new variants are (with default board size, files x ranks, in parentheses): variant name Game board description knightmate Knightmate (8x8) Variant where the King moves as a Knight, and vice versa capablanca Capablanca Chess (10x8) Variant featuring Archbishop and Chancellor as new pieces gothic Gothic Chess (10x8) Same as Capablanca, with a more interesting opening position courier Courier Chess (12x8) a Medieval form that combines elements of Shatranj and modern Chess shogi Shogi (9x9) Japanese Chess xiangqi Xiangqi (9x10) Chinese Chess fairy Fairy Chess (8x8) Variant were you can use all pieces of other variants together The variant can be set from the newly added "File -> New Variant..." sub-menu. Extra board files are indicated by the letters i, j, k, l, ... For boards with more than 9 ranks, the counting starts at zero! More than 10 ranks is not tested and unlikely to work in the area of PGN saving / reading. Non-FIDE pieces will be referred to in FENs and PGN by letters that depend on the variant, and might collide with piece designators in other variants. E.g. in Xiangqi 'C' is a Cannon, in Capablanca Chess it is a Chancellor. Pieces that do not belong in a variant cannot be addressed in FEN and PGN either, for as long as that variant is selected, unless the letter assignment is overruled with the aid of the /pieceToCharTable option. The variant is not saved in the winboard.ini file; on start-up we always get variant "normal" unless we use the command-line option, or have added the option to the winboard.ini file manually (in which case it will disappear when this file is overwritten by WinBoard saving its options). WinBoard_F knows the movement of all pieces occurring in Capablanca Chess (of which FIDE Chess is a subset), Shatranj, Courier, Xiangqi and 9x9 Shogi, so that these games can be played with legality testing enabled. /pieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" Each piece that WinBoard knows (in its legality test) has a letter associated with it, by which it will be referred to in FEN or PGN. The default assignment can be overruled with this option. The value has to be a string of even length, with at least 12 characters. The first half of the string designates the white pieces, the second half the black. The last letter for each color will be assigned to the King. (This is the piece that moves as an orthodox King; note that Nightmate and Xiangqi have a different royal piece.) All letters before it will be assigned to the other pieces in the order: P Pawn (move often depends on variant) N Knight (move subtly different in Xiangqi (where it is written as H) or Shogi) B Bishop R Rook Q Queen (Lance L in Shogi) F Ferz/General (The Shatranj 'Queen' and Xiangqi 'Adviser', used for Silver General S in Shogi.) W Wazir/GrandVizer (Gold General G in Shogi, in Xiangqi it is royal and denoted by K) E Alfil/Elephant (Moves subtly different in Xiangqi vs Shatranj/Courier) M Commoner/Man O Cannon/Pao U Unicorn (representation of Royal Knight in Knightmate, used as promoted Pawn in Shogi) H Nightrider (Promoted Knight in Shogi and CrazyHouse) A Archbishop/Cardinal (Promoted Bishop in Shogi and CrazyHouse) C Chancellor/Marshall (Promoted Rook in Shogi and CrazyHouse) G Grasshopper (Promoted Queen in Crazyhouse, promoted Lance in Shogi) S (Promoted Silver in Shogi) K King Pieces that are not mentioned (because the argument has less than 34 characters) will remain disabled. Mentioned pieces can be disabled by assigning them a '.' (period). They are then not recognized in FEN or PGN input. Non-FIDE pieces that are not assigned a letter will also not appear on the promotion menu. It is not advisable to disable a piece that is present in the opening position of the selected variant, though. Promoted pieces that need to be distinguished from original pieces of the same type (because of demotion on capture and transfer to the holdings) will be indicated by the letter for the unpromoted piece with a '+' in front of it (Shogi), or by the letter of the promoted piece with a '~' after it (Crazyhouse, Bughouse, in general everything with holdings that is not Shogi). To achieve this, they should be assigned the characters '+' or '~', respectively. All the new pieces have a native bitmap representation in the board sizes 'bulky' and 'middling'. For all window sizes that do not support such fairy bitmaps, promoted NBRQ are represented as a 2-sizes-smaller normal piece symbol, so that Crazyhouse can be played at any size. People disliking the fairy representations might even prefer this. There is an enhanced 'Edit Position' menu popup (right-clicking on the squares after selecting this mode in the main menu), featuring some common non-FIDE pieces, and 'promote' and 'demote' options to make those not directly in the menu. The promotion popup shows ArchBishop and Chancellor in Capablanca and Gothic, (or in fact in any game where this piece is not disabled or a promoted version of a normal piece), and leaves only the options YES / NO in Shogi. In Xiangqi there are no promotions. /fontPieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" This option is similar to /pieceToCharTable, but sets the font character that is used to display the piece on the screen (when font-based rendering is in use), rather than in the FEN or PGN. The default setting should work with George Tsavdaris' WinboardF font, which uses the 'intuitive' mapping of font characters to symbols. With font-based rendering the fairy pieces can be used at any board size. Note that UHACGS are also used to represent the promoted versions of PNBRQF, in games like Crazyhouse and Shogi, where the promotion has to be undone on capture. In such games you are likely to prefer a different representation of those pieces then when they represent true fairy pieces. /flipBlack=FALSE Traditional Shogi bitmaps are only included for size "moderate". For other sizes you must depend on font-based rendering. /detectMate=TRUE /testClaim=TRUE /materialDraws=TRUE /trivialDraws=FALSE /ruleMoves=51 /repeatsToDraw=6 The option /materialDraws=TRUE causes games with insufficient mating material to be adjudicated immediately as draws, in case the engines would not claim these draws. This applies to KK, KNK and KBK. The option /trivialDraws adjudicates KNNK, KBKB, KNKN, KBKN, KRKR and KQKQ to draws after 3 moves (to allow for a quick tactical win). Note that in KQKQ this might not be sound, but that problem would disappear once bitbase probing is implemented. Clocks The flag-fell condition is now indicated as '(!)' behind the displayed time, to eliminate the necessity for overwriting the message in the title bar (which might contain indispensible information in match mode). Other improvements / changes Castling rights and e.p. rights are now fully maintained, and considered in legality testing. They are imported from and written to FEN, as is the 50-move counter. (When reading an incomplete FEN they are still guessed, though.) The time (in sec, or min:sec) is now always stored together with the PV information to the PGN, if storing the latter was requested (through ticking "extended PGN info" in "Options -> General..."). The saved time is the WinBoard clock time (as opposed to the time reported by the engine). ** Winboard_F.4.3.8 release notes This Winboard supports the following new options (shown here with their default values): /variant=normal This (already existing) option has been expanded with several new variants, involving non-conventional pieces and deviating board sizes. The board size is automatically adapted to the selected variant, unless explicitly overruled (see below). The new variants are (with default board size, files x ranks, in parentheses): variant name Game board description knightmate Knightmate (8x8) Variant where the King moves as a Knight, and vice versa capablanca Capablanca Chess (10x8) Variant featuring Archbishop and Chancellor as new pieces gothic Gothic Chess (10x8) Same as Capablanca, with a more interesting opening position courier Courier Chess (12x8) a Medieval form that combines elements of Shatranj and modern Chess shogi Shogi (9x9) Japanese Chess xiangqi Xiangqi (9x10) Chinese Chess fairy Fairy Chess (8x8) Variant were you can use all pieces of other variants together The variant can be set from the newly added "File -> New Variant..." sub-menu. Extra board files are indicated by the letters i, j, k, l, ... For boards with more than 9 ranks, the counting starts at zero! Non-FIDE pieces will be referred to in FENs and PGN by letters that depend on the variant, and might collide with piece designators in other variants. E.g. in Xiangqi 'C' is a Cannon, in Capablanca Chess it is a Chancellor. Pieces that do not belong in a variant cannot be addressed in FEN and PGN either as long as that variant is selected, unless the letter assignment is overruled by the /pieceToCharTable option. The variant is not saved in the winboard.ini file; on start-up we always get variant "normal" unless we use the command-line opton, or have added the option to the winboard.ini file manually (in which case it will disappear when this file is overwritten). WinBoard_F knows the movement of all pieces occurring in Capablanca Chess (of which FIDE Chess is a subset), Shatranj, Courier, Xiangqi and 9x9 Shogi, so that these games can be played with legality testing enabled. /pieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" Each piece that WinBoard knows (in its legality test) has a letter associated with it, by which it will be referred to in FEN or PGN. The default assignment can be overruled with this option. The value has to be a string of even length, with at least 12 characters. The first half of the string designates the white pieces, the second half the black. The last letter for each color will be assigned to the King. (This is the piece that moves as an orthodox King; note that Nightmate and Xiangqi have a different royal piece.) All letters before it will be assigned to the other pieces in the order: P Pawn (move often depends on variant) N Knight (move subtly different in Xiangqi (where it is written as H) or Shogi) B Bishop R Rook Q Queen (Lance L in Shogi) F Ferz/General (Silver General S in Shogi) W Wazir/GrandVizer (Gold General G in Shogi, in Xiangqi it is royal and denoted by K) E Alfil/Elephant (Moves subtly different in Xiangqi vs Shatranj/Courier) M Commoner/Man O Cannon/Pao U Unicorn (representation of Royal Knight in Knightmate, used as promoted Pawn in Shogi) H Nightrider (Promoted Knight in Shogi and CrazyHouse) A Archbishop/Cardinal (Promoted Bishop in Shogi and CrazyHouse) C Chancellor/Marshall (Promoted Rook in Shogi and CrazyHouse) G Grasshopper (Promoted Queen in Crazyhouse, promoted Lance in Shogi) S (Promoted Silver in Shogi) K King Pieces that are not mentioned (because the argument has less than 34 characters) will remain disabled. Mentioned pieces can be disabled by assigning them a '.' (period). They are then not recognized in FEN or PGN input. It is not advisable to disable a piece that is present in the opening position of the selected variant, though. Promoted pieces that need to be distinguished from original pieces of the same type (because of demotion on capture and transfer to the holdings) will be indicated by the letter for the unpromoted piece with a '+' in front of it (Shogi), or by the letter of the promoted piece with a '~' after it (Crazyhouse, Bughouse, in general everything with holdings that is not Shogi). All the new pieces have a native biytmap representation in the board sizes 'bulky' and 'middling'. For all window sizes that do not support such fairy bitmaps, promoted NBRQ are represented as a 2-sizes-smaller normal piece symbol, so that Crazyhouse can be played at any size. People disliking the fairy representations might even prefer that. There is an enhanced 'Edit Position' menu popup (right-clicking on the squares after selecting this mode in the main menu), featuring some common non-FIDE pieces, and 'promote' and 'demote' options to make those not directly in the menu. The promotion popup shows ArchBishop and Chancellor in Capablanca and Gothic, (or in fact in any game where this piece is not disabled), and leaves only the options YES / NO in Shogi. In Xiangqi there are no promotions. /alphaRank=FALSE This option does not seem to work for reading PGN files. Saving works fine. For now, using it is not recommended. In the future it might be redefined as only affecting engine-engine communication, . /flipBlack=FALSE Setting this option will cause upside-down display of the native piece bitmaps used to represent the pieces of the side that plays black, as would be needed for a traditional representation of Shogi pieces. It can be set from the "Options -> Board..." sub-menu, and it is saved in the winboard.ini file. For now, traditional Shogi bitmaps are not included, though. Other improvements / changes Castling rights and e.p. rights are now fully maintained, and considered in legality testing. They are imported from and written to FEN, as is the 50-move counter. The time (in sec, or min:sec) is now always stored together with the PV information to the PGN, if storing the latter was requested (through ticking 'extended PGN info' in "Options -> General..."). The saved time is the Winboard clock time (as opposed to the time reported by the engine). ** Winboard_F.4.3.7 release notes This Winboard supports the following new options (shown here with their default values): /variant=normal This (already existing) option has been expanded with several new variants, involving non-conventional pieces and deviating board sizes. The board size is automatically adapted to the selected variant, unless explicitly overruled (see below). The new variants are (with default board size, files x ranks, in parentheses): variant name Game board description knightmate Knightmate (8x8) Variant where the King moves as a Knight, and vice versa capablanca Capablanca Chess (10x8) Variant featuring Archbishop and Chancellor as new pieces gothic Gothic Chess (10x8) Same as Capablanca, with a more interesting opening position courier Courier Chess (12x8) a Medieval form that combines elements of Shatranj and modern Chess shogi Shogi (9x9) Japanese Chess xiangqi Xiangqi (9x10) Chinese Chess fairy Fairy Chess (8x8) Variant were you can use all pieces of other variants together The variant can be set from the newly added "File -> New Variant..." sub-menu. Extra board files are indicated by the letters i, j, k, l, ... For boards with more than 9 ranks, the counting starts at zero! Non-FIDE pieces will be referred to in FENs and PGN by letters that depend on the variant, and might collide with piece designators in other variants. E.g. in Xiangqi 'C' is a Cannon, in Capablanca Chess it is a Chancellor. Pieces that do not belong in a variant cannot be addressed in FEN and PGN either as long as that variant is selected, unless the letter assignment is overruled by the /pieceToCharTable option. The variant is not saved in the winboard.ini file; on start-up we always get variant "normal" unless we use the command-line opton, or have added the option to the winboard.ini file manually (in which case it will disappear when this file is overwritten). WinBoard_F knows the movement of all pieces occurring in Capablanca Chess (of which FIDE Chess is a subset), Shatranj, Courier, Xiangqi and 9x9 Shogi, so that these games can be played with legality testing enabled. /pieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" Each piece that WinBoard knows (in its legality test) has a letter associated with it, by which it will be referred to in FEN or PGN. The default assignment can be overruled with this option. The value has to be a string of even length, with at least 12 characters. The first half of the string designates the white pieces, the second half the black. The last letter for each color will be assigned to the King. (This is the piece that moves as an orthodox King; note that Nightmate and Xiangqi have a different royal piece.) All letters before it will be assigned to the other pieces in the order: P Pawn (move often depends on variant) N Knight (move subtly different in Xiangqi (where it is written as H) or Shogi) B Bishop R Rook Q Queen (Lance L in Shogi) F Ferz/General (Silver General S in Shogi) W Wazir/GrandVizer (Gold General G in Shogi, in Xiangqi it is royal and denoted by K) E Alfil/Elephant (Moves subtly different in Xiangqi vs Shatranj/Courier) M Commoner/Man O Cannon/Pao U Unicorn (representation of Royal Knight in Knightmate, used as promoted Pawn in Shogi) H Nightrider (Promoted Knight in Shogi and CrazyHouse) A Archbishop/Cardinal (Promoted Bishop in Shogi and CrazyHouse) C Chancellor/Marshall (Promoted Rook in Shogi and CrazyHouse) G Grasshopper (Promoted Queen in Crazyhouse, promoted Lance in Shogi) S (Promoted Silver in Shogi) K King Pieces that are not mentioned (because the argument has less than 34 characters) will remain disabled. Mentioned pieces can be disabled by assigning them a '.' (period). They are then not recognized in FEN or PGN input. It is not advisable to disable a piece that is present in the opening position of the selected variant, though. Promoted pieces that need to be distinguished from original pieces of the same type (because of demotion on capture and transfer to the holdings) will be indicated by the letter for the unpromoted piece with a '+' in front of it (Shogi), or by the letter of the promoted piece with a '~' after it (Crazyhouse, Bughouse, in general everything with holdings that is not Shogi). All the new pieces have a native biytmap representation in the board sizes 'bulky' and 'middling'. For all window sizes that do not support such fairy bitmaps, promoted NBRQ are represented as a 2-sizes-smaller normal piece symbol, so that Crazyhouse can be played at any size. People disliking the fairy representations might even prefer that. There is an enhanced 'Edit Position' menu popup (right-clicking on the squares after selecting this mode in the main menu), featuring some common non-FIDE pieces, and 'promote' and 'demote' options to make those not directly in the menu. The promotion popup shows ArchBishop and Chancellor in Capablanca and Gothic, (or in fact in any game where this piece is not disabled), and leaves only the options YES / NO in Shogi. In Xiangqi there are no promotions. /fontPieceToCharTable="PNBRQFWEMOUHACGSKpnbrqfwemouhacgsk" This option is similar to /pieceToCharTable, but sets the font character that is used to display the piece on the screen (when font-based rendering is in use), rather than in the FEN or PGN. The default setting should work with the WinboardF font, which uses the 'intuitive' mapping of font characters to symbols. Note that UHACGS are also used to represent the promoted versions of PNBRQF, in games like Crazyhouse and Shogi, where the promotion has to be undone on capture. /boardWidth=-1 /boardHeight=-1 Set a number of files and ranks of the playing board to a value that will override the defaults for the variant that is selected. A value of -1 means the variant default board size will be used for the corresponding parameter (and is itself the default value of these options). These parameters can be set in the "Files -> New Variant..." sub-menu, where they are reset to the default -1 is you OK the chosen variant without typing something to overrule it. These parameters are saved in the winboard.ini file. (But unless you saved while a variant with board-size override was selected, they will always be saved as -1.) A variant with a non-standard board size will be communicated to the engine(s) with the board size prefixed to the variant name, e.g. "variant 12x8_capablanca". In protocol 2 the engine must first enable this feature by sending "boardsizeFxR" amongst the accepted variants, where F is the maximum number of files, and R the maximum number of ranks, as decimal numbers. /holdingsSize=-1 Set the size of the holdings for dropable pieces to a value that will override the default for the variant that is selected. A value of -1 means the variant default holdings size will be used for that parameter (and is itself the default value of this options). This parameter can be set in the Files -> New Variant... sub-menu, where it is reset to the default -1 is you OK the chosen variant without typing something to overrule it. This parameters is saved in the winboard.ini file. To disable holdings, set their size to 0. They will then not be displayed. For non-zero holding size N, the holdings are displayed left and right of the board, and piece drops can be effected by dragging pieces from the holdings to the drop square. In bughouse, the holdings will be filled by the ICS. In all other variants, captured pieces will go into the holdings (after reversing their color). Only the first N pieces of the /pieceToCharTable argument will go into the holdings. All other pieces will be converted to Pawns. (In Shogi, however they will be demoted in the regular way before determining if they fit.) Pieces that are disabled (per default and per /pieceToCharTable option) might not be counted when determining what are the first N pieces. Non-standard holdingsize will be communicated to the engine by prefixing it (together with the board size, even if this is standard) to the variant name, e.g. "variant 7x7+5_shogi". In protocol 2 the engine should enable this feature by sending "holdingsH" amongst the variant names, where H is the maximum acceptable holdings size as a decimal number. /alphaRank=FALSE When this parameter is true, a-h are converted to 1-9, and vice versa, in all move output and input (to PGN files or SAN move display as well as in communication with the engine). This might be useful for Shogi, where conventionally one uses letters to designate ranks, and digits to designate files. Engines that want to use this option must make sure pieces are never represented by lower case! This option can be set from the Files -> New Variant... menu, where it defaults to FALSE unless you explicitly set it. It is not saved in the winboard.ini file. Note that the PGN format in Shogi also leaves out the trailing '+' as check indicator: In Shogi such a trailing '+' means promotion, while a trailing '=' means defer promotion. Prefix '+' signs are used on moves with promoted pieces, disambiguation is done western SAN style. /allWhite=FALSE Causes the outline of the 'white' pieces to be superimposed onto the 'black' piece symbols as well (as a black outline) when native bitmaps are used (as opposed to font-based rendering). This is useful if we choose a very light color to represent the 'black' pieces. It might be particularly useful in Shogi, where the conventional representation of the 'black' pieces is as upside-down white pieces, so that both colors would be white. This option is saved in the winboard.ini file, and can be set in the "Options -> Board..." sub-menu. /flipBlack=FALSE This option is reserved for future use. It will cause upside-down display of the 'black' native piece bitmaps, as would be needed for Shogi. For now it can be set from the "Options -> Board..." sub-menu, and it is saved in the winboard.ini file, but it is ignored. /detectMate=TRUE /testClaim=TRUE /materialDraws=TRUE /trivialDraws=FALSE /ruleMoves=51 /repeatsToDraw=6 These are all options that only affect engine-engine play, and can be set from the "Options -> Engine..." sub-menu. They are all related to adjudication of games by the GUI. Legality checking must be switched on for them to work. If /detectMate is TRUE, the GUI recognizes checkmate and stalemate (but not in games with holdings!), and ends the game accordingly before the engines can claim. This is convenient for play with engines that fail to claim, and just exit. With /testClaim set, all result and illegal-move claims by engines that claim more than their own loss are scrutinized for validity, and false claims result in forfeit of the game. Useful with buggy engines. The option /materialDraws=TRUE causes games with insufficient mating material to be adjudicated immediately as draws, in case the engines would not claim them. The option /trivialDraws adjudicates KNNK, KBKB, KNKN, KBKN, KRKR and KQKQ to draws after 3 moves (to allow for a quick tactical win. Note that in KQKQ this might not be sound, but that problem would disappear once bitbase probing is added). The /ruleMoves determine after how many reversible moves the game is adjudicated as a draw. Setting this to 0 turns this option off. Draw claims by the engine are still accepted (by /testClaim) after 50 reversible moves, even if /ruleMoves species a larger number. Note that it is perfectly legal according to FIDE rules to play on after 50 reversible moves, but in tournaments having two engines that want to play on forever is a nuisance in endings like KBNKR, where one of the engines thinks it is ahead and can avoids repeats virtually forever. The option /repeatsToDraw makes the GUI adjudicate a game as draw after the same position has occurred the specified number of times. If it is set to a value > 3, engines can still claim the draw after 3-fold repeat. All these options are saved in the winboard.ini file. Clocks There is an "Options -> flip Clocks" command, that swaps the position of white and black clocks (convenient in over-the-board matches, where the screen is next to the board, and you want your own time to be displayed on your side of the screen). The clocks can be adjusted in "edit game" mode: right-clicking them adds one minute, left-clicking subtracts one minute. (Also for OTB matches, to keep them synchronized with the official match clock.) The flag-fell condition is now indicated as (!) behind the time. Other improvements Castling rights and e.p. rights are now fully maintained, and considered in legality testing. They are imported from and written to FEN, as is the 50-move counter. ** Winboard_F 4.3.2 These are the release notes of Winboard_F 4.3.2, which is released under the GPL. This version was derived from Allessandro Scotti's Winboard_x 4.2.7 source files. It only includes the files that were changed: config.h common.h parser.h moves.h resource.h winboard.c backend.c moves.c parser.l winboard.rc and some bitmaps for piece symbols I made modifications in the following areas: 1) Adjudication and claim verification 2) Fairy pieces and board sizes other than 8x8 3) Miscellaneous Miscellaneous /matchPause=10000 is an option to set the length of the pause between two games of a match. The value is in msec, default value is 10000 (I will present all newly implemented options with their default value as example). Be aware that some engines might not be stopped yet if you make the pause too small, but might still be puking output, which then will interfere with the next game. But the fixed value of 10 sec of the old Winboard seemed like overdoing it. Time info in PGN When you ask for the PV-info to be stored in the PGN (a Winboard_x option), it now also stores the time spent on the move with it. Flag fell In engine-engine games the messge "white/black/both" flag(s) fell" no longer appears in the window caption, but as an exclamation point behind the clock time. (To prevent the annoying overwriting of the normal header line). Adjudications and Claim verification. These functions are only present in engine-engine games, and only if legality-testing is switched on. (The latter will be typically switched off in games with bizarre rules, which the GUI doesn't know, and in that case the GUI can never have an opinion on the outcome of a game.) Illegal-move forfeit As soon as one of the engines plays an illegal move, it forfeits the game. This feature was already present, but it should be 100% reliable now, as it also takes e.p. and castling rights into account, rather than erring on the safe side. Illegal-move claim From the above, it follows that any illegal-move claims by an engine must be false, and will result in forfeiting the game. (In Winboard_x this message is ignored, causing the game or match to hang.) Checkmate adjudication As soon as one of the engines does a move that results in checkmate, the GUI declares the game won, without waiting for the engine to claim it. Insufficient mating material As soon as the material on the board has shrunk to KK, KNK or KBK, the game is declared draw. /adjudicateLossThreshold=0 This option was already present in Winboard_x, (to declare a game lost for which both engines agree for 3 moves that the score is below the given threshold), but a non-zero value is now also used to enable the following adjudications. If you only want the latter, just make the threshold impossibly low (-40000 will usually do the trick). Trivial draws If we are 3 moves into a KQKQ, KRKR, KBKB KBKN or KNKN end-game, the game is adjudicated as draw. /repeatsToDraw=6 When the specified number of repeats occurs, the game is adjudicated draw. Should keep track of e.p. and castling rights. This does not require legality-testing to be switched on. The engines retain the legal right to claim after a 3-fold repetition, though. If you set this parameter to 3 or less, they will never get the chance. Better not set it to 1 or less. /ruleMoves=51 After the given number of full moves without capture or Pawn move, the game is adjudicated draw. Even without legality testing. The engines retain the legal right to claim after 50 moves. /testClaims=FALSE When enabled, this option verifies all result claims made by the engines, and overrules the claim if it is false (forfeiting the game for the claimer). An engine can still safely claim a win for its opponent on a nonsense reason, though; this is taken to be the equivalent of 'resign'. Draw claims (made before a draw adjudication) are checked against the 50-move, 3-fold-repetition or insufficient-material rules. Win claims are always considered false, as the GUI adjudicates checkmates (and stalemates) before any engine can claim them. Fairy-Chess support /boardWidth=8 Sets the number of files on the board. The additional files are named i, j, k, l... in PGN, and should be indicated this way in communicating moves to and from the engine. Currently works upto 12. No guarantees on how the rest of the display (clocks, etc.) looks if you make this number < 8. /boardHeight=8 Sets the number of ranks. Extra ranks are numbered 9, 10, 11... in PGN. This is so far largely untested, and unlikely to work for double-digit ranks. Displaying boards with upto 12 ranks seems to work, though, but double-digit ranks might cause all kind of unforseen problems in PGN file and move parser, or in communication with the engine. To avoid such problems as much as possible, in boards with more than 9 ranks the counting of ranks will start at zero rather than one! /fontPieceToCharTable="......." This paramater, controlling the mapping of font symbols to piece types, was already present in Winboard_x. The default is dependent on the font selected with the /renderPiecesWithFont option. It can now accept upto 32 pieces, but the length should always be even. The first half designates the white pieces, the second half the black, both in the order PNBRACHFEWDOGMQK. (The letters mentioned here are the letters by which the pieces will be indicated in PGN and FEN notation, what you have to give as argument depends on the font you use. A black king might be 'l', for instance). If you give fewer then 32 pieces, this will go at the expense of what is just before Queen. So the last two symbols you give for each color are always Queen and King, the others are assigned in the order Pawn, Knight, ... Pieces that do not get a symbol assigned will remain invisible. fairy-FEN support The letters ACDEFGHMOW are accepted in FENs in addition to the regular PNBRQK,(and of course the lower case versions for black), and are passed to the engine in a setboard or edit menu. Double-digit skips are acceptable in FENs. 'x' is interpreted as a skip of 10. Castling rights should no longer be ignored. (Doesn't work for FRC yet, though.) The 50-move-plies field should also be meaningful now. Legality testing for Fairy pieces There is a build in notion of what some of the new pieces can do, according to A = Archbishop (aka Cardinal) = N+B C = Chancellor (aka Marshall) = N+R F = Ferz (aka General), moves 1 step diagonal W = Wazir (aka Grand Vizer), moves 1 step orthogonal E = Elephant (aka Alfil), jumps 2 steps diagonal D = Dabbabah (aka War Machine), jumps 2 steps orthogonal M = Man (aka Commoner), moves as King, but is not a royal piece O = Cannon, moves along Rook lines, but cannot capture unless it jumps over exactly one piece (friend or foe), and captures the first piece it encounters thereafter. It can only jump if it captures something. The piece jumped over (the 'platform') is not affected. The other pieces have not yet any moves implemented: H = Nightrider G = Grasshopper In games that use the mentioned pieces as described (Shatranj, Courier, Capablanca Chess) you can leave legality testing on. If you use them to represent pieces that move differently, you should switch legality testing off. Pawn moves Pawn motion is made dependent on the variant played: in Shatranj and Courier the double move is forbidden. In those games promotions are always to Ferz. In Capablanca Chess the ArchBishop and Chancellor also appear as choices in the promotion popup box. /variant="normal" Several new variants names are added (replacing "variant31" upto "variant36"). They affect the initial position. (Board size has to be set separately.) They are: courier (a Medieval predecessor of modern Chess, played on a 12x8 board) capablanca (on a 10x8 board, featuring Archbishop and Chancellor) gothic (as Capablanca, but with a more exciting initial setup) xiangqi (Chinese Chess) shogi (Japanese Chess, no support yet) fairy (This variant plays on 8x8 with HEW in stead of NBR on the Queen side, so that all back-rank pieces are (potentially) different) Make sure the selected board size matches the variant; this is not automatic Xiangqi and Shogi support (or lack thereof) Xiangqi is only partially supported. The board display is western-style (the pieces play on squares, rather than grid intersections). The legality testing uses the Shatranj Knight and Elephant, that cannot be blocked, and thus allows some moves that should be illegal in Xiangqi. The Palace region is indicated on the board, but there is no testing if the King or Mandarins (implemented as ordinary Ferzes) leave the Palace. SAN might be non-standard, as it uses O to indicate Cannon. Most of this will be fixed in a future version. Shogi is not yet supported at all, first the shaky implementation of Crazyhouse will have to be beefed up. xboard-4.7.3/board.h0000644000175000001440000001010112262415351011153 00000000000000/* * board.h -- header for XBoard: variables shared by xboard.c and board.c * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* This magic number is the number of intermediate frames used in each half of the animation. For short moves it's reduced by 1. The total number of frames will be factor * 2 + 1. */ #define kFactor 4 /* Variables for doing smooth animation. This whole thing would be much easier if the board was double-buffered, but that would require a fairly major rewrite. */ #define DISP 4 typedef enum { Game=0, Player, NrOfAnims } AnimNr; typedef struct { short int x, y; } Pnt; typedef struct { Pnt startSquare, prevFrame, mouseDelta; int startColor; int dragPiece; Boolean dragActive; int startBoardX, startBoardY; } AnimState; extern AnimState anims[]; void DrawPolygon P((Pnt arrow[], int nr)); void DrawOneSquare P((int x, int y, ChessSquare piece, int square_color, int marker, char *tString, char *bString, int align)); void DrawDot P((int marker, int x, int y, int r)); void DrawGrid P((void)); int SquareColor P((int row, int column)); void ScreenSquare P((int column, int row, Pnt *pt, int *color)); void BoardSquare P((int x, int y, int *column, int *row)); void FrameDelay P((int time)); void InsertPiece P((AnimNr anr, ChessSquare piece)); void DrawBlank P((AnimNr anr, int x, int y, int startColor)); void CopyRectangle P((AnimNr anr, int srcBuf, int destBuf, int srcX, int srcY, int width, int height, int destX, int destY)); void SetDragPiece P((AnimNr anr, ChessSquare piece)); void DragPieceMove P((int x, int y)); void DrawBorder P((int x, int y, int type, int odd)); void FlashDelay P((int flash_delay)); void SwitchWindow P((int main)); extern int damage[2][BOARD_RANKS][BOARD_FILES]; extern Option *currBoard; xboard-4.7.3/xboard-tourney.desktop0000644000175000001440000000210112262415351014271 00000000000000[Desktop Entry] Name=Xboard Name[af]=X-bord Name[ar]=Xboard Name[bg]=Xboard Name[bn]=এক্সবোর্ড Name[cs]=Xboard Name[da]=Xboard Name[de]=Xboard Name[el]=Xboard Name[es]=Xboard Name[et]=Xboard Name[fi]=XBoard Name[fr]=XBoard Name[gl]=Xboard Name[hi]=एक्सबोर्ड Name[hr]=Xboard Name[hu]=XBoard Name[it]=XBoard Name[ja]=Xboard Name[km]=XBoard Name[ko]=X보드 Name[lt]=Xboard Name[mr]=Xबोर्ड Name[nb]=Xboard Name[nl]=Xboard Name[pa]=Xboard Name[pl]=Xboard Name[pt]=Xboard Name[pt_BR]=Xboard Name[ru]=Xboard Name[sk]=Xboard Name[sv]=Xboard Name[ta]=பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): எக்ஸ்போர்ட் Name[th]=Xboard Name[tr]=XBoard Name[uk]=Xboard Name[vi]=XBoard Name[xh]=Ibhodi ye-X Name[zh_CN]=X 国际象棋 Name[zh_TW]=Xboard 國際象棋 Name[zu]=I-Xboard Comment=Resume XBoard chess tourney GenericName=X-windows chess board Type=Application Categories=Game;BoardGame; Exec=xboard -mm -tf %f Icon=xboard NoDisplay=true Terminal=false MimeType=application/x-xboard-trn; xboard-4.7.3/copyright.texi0000644000175000001440000000461612262415351012634 00000000000000 @setfilename copyright.info Copyright @copyright{} 1991 Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Digital disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Digital be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. Enhancements copyright @copyright{} 1992-2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. @format Published by the Free Software Foundation 59 Temple Place - Suite 330 Boston, MA 02111-1307 USA @end format Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through Tex and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License,'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License,'' and this permission notice, may be included in translations approved by the Free Software Foundation instead of in the original English. xboard-4.7.3/usystem.h0000644000175000001440000000563412262415351011614 00000000000000/* * usystem.h -- stuff shared between XBoard's xboard.c and uconnect.c * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ typedef struct { int attr, bg, fg; } TextColors; #define CPNone 0 #define CPReal 1 #define CPComm 2 #define CPSock 3 #define CPLoop 4 typedef int CPKind; typedef struct { CPKind kind; int pid; int fdTo, fdFrom; } ChildProc; extern char *oldICSInteractionTitle; char *ExpandPathName P((char *path)); int MySearchPath P((char *installDir, char *name, char *fullname)); int MyGetFullPathName P((char *name, char *fullname)); void PlaySoundForColor P((ColorClass cc)); xboard-4.7.3/mkinstalldirs0000644000175000001440000000123412262415351012525 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here xboard-4.7.3/Makefile.am0000644000175000001440000002415612262562252011771 00000000000000bin_PROGRAMS = xboard ### if we are compiling with ZIPPY we need some extra source files if ZIPPY ZPY = zippy.c zippy.h else ZPY = endif ### define sources for the front-end and backend GTKsources = gtk/xboard.c gtk/xboard.h \ gtk/xoptions.c gtk/xtimer.c \ gtk/xengineoutput.c Xsources = xaw/xboard.c xaw/xboard.h \ xaw/xengineoutput.c \ xaw/xgamelist.c xaw/xgamelist.h \ xaw/xhistory.c xaw/xhistory.h \ xaw/xoptions.c \ bitmaps/checkmark.bm bitmaps/icon_black.bm bitmaps/icon_white.bm if withGTK FRONTENDsources = $(GTKsources) FRONTENDextras = $(Xsources) headers = -I gtk endif if withXaw FRONTENDsources = $(Xsources) FRONTENDextras = $(GTKsources) headers = -I xaw -DX11 endif xboard_SOURCES = backend.c backend.h backendz.h \ book.c \ childio.c childio.h \ common.h \ frontend.h \ gamelist.c ngamelist.c \ gettext.h \ lists.c lists.h \ moves.c moves.h \ parser.c parser.h \ pgntags.c \ uci.c \ args.h xboard2.h \ board.c board.h \ draw.c draw.h \ dialogs.c dialogs.h \ engineoutput.c nengineoutput.c engineoutput.h \ evalgraph.c nevalgraph.c evalgraph.h \ history.c nhistory.c \ menus.c menus.h \ usounds.c usystem.c usystem.h \ $(ZPY) $(FRONTENDsources) ### SUBDIRS = po xboard_LDADD = -lm @FRONTEND_LIBS@ @X_LIBS@ @LIBINTL@ @CAIRO_LIBS@ EXTRA_DIST = pixmaps themes png sounds winboard \ xboard.texi gpl.texinfo texi2man texinfo.tex xboard.man xboard.desktop xboard-config.desktop \ xboard-fen-viewer.desktop xboard-pgn-viewer.desktop xboard-tourney.desktop xboard.xml \ COPYRIGHT FAQ.html engine-intf.html ics-parsing.txt readme.htm zippy.README \ xboard.conf.in SHORTLOG DIFFSTAT history.c ABOUT-NLS $(FRONTENDextras) DISTCLEANFILES = stamp-h GITVERSION=$(shell sh -c 'git describe --dirty --always 2>/dev/null') AM_CPPFLAGS=-DINFODIR='"$(infodir)"' @X_CFLAGS@ @CAIRO_CFLAGS@ @FRONTEND_CFLAGS@ -DSYSCONFDIR='"$(sysconfdir)"' \ -DLOCALEDIR='"$(localedir)"' -DSVGDIR='"$(svgdir)"' -D__GIT_VERSION='"$(GITVERSION)"' $(headers) ACLOCAL_AMFLAGS = -I m4 info_TEXINFOS = xboard.texi xboard_TEXINFOS = copyright.texi man6_MANS = xboard.man ### config file sysconf_DATA = xboard.conf ### icon files icondir = $(datadir)/icons/hicolor/48x48/apps dist_icon_DATA = xboard.png svgicondir = $(datadir)/icons/hicolor/scalable/apps dist_svgicon_DATA = xboard.svg ### desktop files for KDE and gnome Applicationsdir = $(datadir)/applications Applications_DATA = xboard.desktop xboard-fen-viewer.desktop xboard-pgn-viewer.desktop xboard-tourney.desktop xboard-config.desktop ### mime file mimedir = $(datadir)/mime/packages mime_DATA = xboard.xml ### directory and files for svgs svgdir = $(datadir)/games/xboard/themes/default dist_svg_DATA = svg/icon_white.svg svg/icon_black.svg \ svg/BlackAdvisor.svg svg/WhiteAdvisor.svg \ svg/BlackArchbishop.svg svg/WhiteArchbishop.svg \ svg/BlackBishop.svg svg/WhiteBishop.svg \ svg/BlackCanon.svg svg/WhiteCanon.svg \ svg/BlackChancellor.svg svg/WhiteChancellor.svg \ svg/BlackCobra.svg svg/WhiteCobra.svg \ svg/BlackCommoner.svg svg/WhiteCommoner.svg \ svg/BlackCrownedBishop.svg svg/WhiteCrownedBishop.svg \ svg/BlackCrownedRook.svg svg/WhiteCrownedRook.svg \ svg/BlackElephant.svg svg/WhiteElephant.svg \ svg/BlackGoldKnight.svg svg/WhiteGoldKnight.svg \ svg/BlackGoldLance.svg svg/WhiteGoldLance.svg \ svg/BlackGoldPawn.svg svg/WhiteGoldPawn.svg \ svg/BlackGoldSilver.svg svg/WhiteGoldSilver.svg \ svg/BlackGold.svg svg/WhiteGold.svg \ svg/BlackHawk.svg svg/WhiteHawk.svg \ svg/BlackKing.svg svg/WhiteKing.svg \ svg/BlackKnight.svg svg/WhiteKnight.svg \ svg/BlackLance.svg svg/WhiteLance.svg \ svg/BlackMarshall.svg svg/WhiteMarshall.svg \ svg/BlackNightrider.svg svg/WhiteNightrider.svg \ svg/BlackPawn.svg svg/WhitePawn.svg \ svg/BlackPrincess.svg svg/WhitePrincess.svg \ svg/BlackQueen.svg svg/WhiteQueen.svg \ svg/BlackRook.svg svg/WhiteRook.svg \ svg/BlackUnicorn.svg svg/WhiteUnicorn.svg \ svg/eo_Analyzing.svg svg/eo_Black.svg \ svg/eo_Clear.svg svg/eo_Ponder.svg \ svg/eo_Thinking.svg svg/eo_Unknown.svg \ svg/eo_White.svg shogidir = $(datadir)/games/xboard/themes/shogi dist_shogi_DATA = \ themes/shogi/WhiteGold.svg themes/shogi/WhiteCrownedBishop.svg\ themes/shogi/WhiteBishop.svg themes/shogi/WhiteKing.svg\ themes/shogi/WhiteKnight.svg themes/shogi/WhiteGoldKnight.svg\ themes/shogi/WhiteLance.svg themes/shogi/WhiteGoldLance.svg\ themes/shogi/WhitePawn.svg themes/shogi/WhiteGoldPawn.svg\ themes/shogi/WhiteRook.svg themes/shogi/WhiteCrownedRook.svg\ themes/shogi/WhiteAdvisor.svg themes/shogi/WhiteGoldSilver.svg\ themes/shogi/BlackGold.svg themes/shogi/BlackCrownedBishop.svg\ themes/shogi/BlackBishop.svg themes/shogi/BlackKing.svg\ themes/shogi/BlackKnight.svg themes/shogi/BlackGoldKnight.svg\ themes/shogi/BlackLance.svg themes/shogi/BlackGoldLance.svg\ themes/shogi/BlackPawn.svg themes/shogi/BlackGoldPawn.svg\ themes/shogi/BlackRook.svg themes/shogi/BlackCrownedRook.svg\ themes/shogi/BlackAdvisor.svg themes/shogi/BlackGoldSilver.svg xiangqidir = $(datadir)/games/xboard/themes/xiangqi dist_xiangqi_DATA = themes/xiangqi/BlackAdvisor.svg themes/xiangqi/WhiteAdvisor.svg \ themes/xiangqi/BlackCanon.svg themes/xiangqi/WhiteCanon.svg \ themes/xiangqi/BlackElephant.svg themes/xiangqi/WhiteElephant.svg \ themes/xiangqi/BlackKnight.svg themes/xiangqi/WhiteKnight.svg \ themes/xiangqi/BlackGold.svg themes/xiangqi/WhiteGold.svg \ themes/xiangqi/BlackPawn.svg themes/xiangqi/WhitePawn.svg \ themes/xiangqi/BlackRook.svg themes/xiangqi/WhiteRook.svg ### directory and files for pixmaps pixmapsdir = $(datadir)/games/xboard/pixmaps/textures dist_pixmaps_DATA = pixmaps/cross32.xpm pixmaps/cross48.xpm pixmaps/board32.xpm pixmaps/board48.xpm pixmaps/ini32.xpm pixmaps/ini48.xpm ### directory and files for pngs pngdir = $(datadir)/games/xboard/themes/textures dist_png_DATA = png/hatch.png png/wood_d.png png/wood_l.png png/xqboard.png ### directory and files for sound files soundsdir = $(datadir)/games/xboard/sounds dist_sounds_DATA = \ sounds/cymbal.wav sounds/pop2.wav sounds/slap.wav sounds/ding1.wav sounds/laser.wav \ sounds/woodthunk.wav sounds/gong.wav sounds/penalty.wav sounds/honkhonk.wav sounds/phone.wav ### set correct dir in xboard.conf edit = sed -e 's|@pngdir[@]|$(pngdir)|g' \ -e 's|@soundsdir[@]|$(soundsdir)|g' xboard.conf: Makefile $(srcdir)/xboard.conf.in @echo ' 'GEN ' ' $@; @rm -f $@ $@.tmp @$(edit) $(srcdir)/$@.in >$@.tmp @mv $@.tmp $@ distclean-local: -rm -f xboard.conf ### the man page depends on several files, so we add a special rule xboard.man: xboard.texi copyright.texi gpl.texinfo version.texi $(srcdir)/texi2man $(srcdir)/xboard.texi > xboard.man || (rm -f xboard.man ; false) ### install mime-type files and corresponding icons and menu entries if enabled during configure install-data-hook: install-mime-database uninstall-hook: uninstall-mime-database install-mime-database: if ENABLE_UPDATE_MIMEDB -if test -z "$(DESTDIR)" -a -n "$(XDG_MIME)" -a -n "$(XDG_DESKTOP_MENU)" -a -n "$(XDG_ICON_RESOURCE)" ; then \ $(XDG_MIME) install --mode system --novendor xboard.xml ;\ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-pgn-viewer.desktop;\ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-fen-viewer.desktop;\ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-tourney.desktop;\ $(XDG_DESKTOP_MENU) install --mode system --novendor xboard-config.desktop;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/board32.xpm application-x-chess-pgn;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/cross32.xpm application-x-xboard-trn;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 32 pixmaps/ini32.xpm application-x-xboard-opt;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/board48.xpm application-x-chess-pgn;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/cross48.xpm application-x-xboard-trn;\ $(XDG_ICON_RESOURCE) install --context mimetypes --size 48 pixmaps/ini48.xpm application-x-xboard-opt;\ fi endif uninstall-mime-database: if ENABLE_UPDATE_MIMEDB -if test -z "$(DESTDIR)" -a -n "$(XDG_MIME)" -a -n "$(XDG_DESKTOP_MENU)" -a -n "$(XDG_ICON_RESOURCE)" ; then \ $(XDG_MIME) uninstall --mode system --novendor xboard.xml;\ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-pgn-viewer.desktop;\ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-fen-viewer.desktop;\ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-tourney.desktop;\ $(XDG_DESKTOP_MENU) uninstall --mode system --novendor xboard-config.desktop;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 board32.xpm application-x-chess-pgn;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 cross32.xpm application-x-xboard-trn;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 32 ini32.xpm application-x-xboard-opt;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 board48.xpm application-x-chess-pgn;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 cross48.xpm application-x-xboard-trn;\ $(XDG_ICON_RESOURCE) uninstall --context mimetypes --size 48 ini48.xpm application-x-xboard-opt;\ fi endif xboard-4.7.3/xboard-fen-viewer.desktop0000644000175000001440000000207112262415351014641 00000000000000[Desktop Entry] Name=Xboard Name[af]=X-bord Name[ar]=Xboard Name[bg]=Xboard Name[bn]=এক্সবোর্ড Name[cs]=Xboard Name[da]=Xboard Name[de]=Xboard Name[el]=Xboard Name[es]=Xboard Name[et]=Xboard Name[fi]=XBoard Name[fr]=XBoard Name[gl]=Xboard Name[hi]=एक्सबोर्ड Name[hr]=Xboard Name[hu]=XBoard Name[it]=XBoard Name[ja]=Xboard Name[km]=XBoard Name[ko]=X보드 Name[lt]=Xboard Name[mr]=Xबोर्ड Name[nb]=Xboard Name[nl]=Xboard Name[pa]=Xboard Name[pl]=Xboard Name[pt]=Xboard Name[pt_BR]=Xboard Name[ru]=Xboard Name[sk]=Xboard Name[sv]=Xboard Name[ta]=பெயர்(எக்ஸ்போர்ட்.டெஸ்க்டாப்): எக்ஸ்போர்ட் Name[th]=Xboard Name[tr]=XBoard Name[uk]=Xboard Name[vi]=XBoard Name[xh]=Ibhodi ye-X Name[zh_CN]=X 国际象棋 Name[zh_TW]=Xboard 國際象棋 Name[zu]=I-Xboard Comment=XBoard FEN display GenericName=X-windows chess board Type=Application Categories=Game;BoardGame; Exec=xboard -ncp -lpf %f Icon=xboard NoDisplay=true Terminal=false MimeType=application/x-chess-fen; xboard-4.7.3/engine-intf.html0000644000175000001440000030352312262562252013024 00000000000000 Chess Engine Communication Protocol

Chess Engine Communication Protocol

Tim Mann & H.G.Muller

Version 2; implemented in xboard/WinBoard 4.2.1 and later. (Sept 3, 2009)
Changes since version 1 are indicated in red.
Changes for WinBoard 4.3.xx are indicated in green.
Changes for WinBoard 4.4.xx are indicated in blue.


1. Introduction

This document is a set of rough notes on the protocol that xboard and WinBoard use to communicate with gnuchessx and other chess engines. These notes may be useful if you want to connect a different chess engine to xboard. Throughout the notes, "xboard" means both xboard and WinBoard except where they are specifically contrasted.

There are two reasons I can imagine someone wanting to do this:

  1. You have, or are developing, a chess engine but you don't want to write your own graphical interface.
  2. You have, or are developing,a chess engine, and you want to interface it to the Internet Chess Server.

In case (2), if you are using xboard, you will need to configure the "Zippy" code into it, but WinBoard includes this code already. See the file zippy.README in the xboard or WinBoard distribution for more information.

These notes are unpolished, but I've attempted to make them complete in this release. If you notice any errors, omissions, or misleading statements, let me know.

I'd like to hear from everyone who is trying to interface their own chess engine to xboard/WinBoard. Please join the mailing list for authors of xboard/WinBoard compatible chess engines and post a message about what you're doing. The list is now hosted by Yahoo Groups; you can join at http://groups.yahoo.com/group/chess-engines, or you can read the list there without joining. The list is filtered to prevent spam.

Note that the WinBoard 4.3.xx line was developed independently of the original GNU project, by H.G.Muller. If you have questions about WinBoard 4.3.xx, or want to report bugs in it, report them in the appropriate section of the WinBoard forum.

2. Connection

An xboard chess engine runs as a separate process from xboard itself, connected to xboard through a pair of anonymous pipes. The engine does not have to do anything special to set up these pipes. xboard sets up the pipes itself and starts the engine with one pipe as its standard input and the other as its standard output. The engine then reads commands from its standard input and writes responses to its standard output. This is, unfortunately, a little more complicated to do right than it sounds; see section 6 below.

And yes, contrary to some people's expectations, exactly the same thing is true for WinBoard. Pipes and standard input/output are implemented in Win32 and work fine. You don't have to use DDE, COM, DLLs, BSOD, or any of the other infinite complexity that Microsoft has created just to talk between two programs. A WinBoard chess engine is a Win32 console program that simply reads from its standard input and writes to its standard output. See sections 5 and 6 below for additional details.

3. Debugging

To diagnose problems in your engine's interaction with xboard, use the -debug flag on xboard's command line to see the messages that are being exchanged. In WinBoard, these messages are written to the file WinBoard.debug instead of going to the screen.

You can turn debug mode on or off while WinBoard is running by pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard is running by binding DebugProc to a shortcut key (and pressing the key!); see the instructions on shortcut keys in the xboard man page.

While your engine is running under xboard/WinBoard, you can send a command directly to the engine by pressing Shift+1 (xboard) or Alt+1 (WinBoard 4.0.3 and later). This brings up a dialog that you can type your command into. Press Shift+2 (Alt+2) instead to send to the second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier, Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict with typing the @-sign on some European keyboards.

4. How it got this way

Originally, xboard was just trying to talk to the existing command-line interface of GNU Chess 3.1+ and 4, which was designed for people to type commands to. So the communication protocol is very ad-hoc. It might have been good to redesign it early on, but because xboard and GNU Chess are separate programs, I didn't want to force people to upgrade them together to versions that matched. I particularly wanted to keep new versions of xboard working with old versions of GNU Chess, to make it easier to compare the play of old and new gnuchess versions. I didn't foresee the need for a clean protocol to be used with other chess engines in the future.

Circumstances have changed over the years, and now there are many more engines that work with xboard. I've had to make the protocol description more precise, I've added some features that GNU Chess does not support, and I've specified the standard semantics of a few features to be slightly different from what GNU Chess 4 does.

This release of the protocol specification is the first to carry a version number of its own -- version 2. Previous releases simply carried a last-modified date and were loosely tied to specific releases of xboard and WinBoard. The version number "1" applies generally to all those older versions of the protocol.

Protocol version 2 remains compatible with older engines but has several new capabilities. In particular, it adds the "feature" command, a new mechanism for making backward-compatible changes and extensions to the protocol. Engines that do not support a particular new feature do not have to use it; new features are not enabled unless the engine specifically requests them using the feature command. If an engine does not send the feature command at all, the protocol behavior is nearly identical to version 1. Several new features can be selected by the feature command in version 2, including the "ping" command (recommended for all engines), the "setboard" command, and many optional parameters. Additional features will probably be added in future versions.

If it is necessary to have a separate name, it would be best to refer to the protocol including the green additions as version 2f. I really don't think it is a different protocol from version 2, though. I just tried to clarify some ambiguities in the original definition, now that the WinBoard 4.3.xx line has implemented them in a specific way. The hand-shaking protocol for features as defined in protocol 2 perfectly allows addition of an occasional new features without any need for stepping up the protocol version number, and I think refraining from the latter would enormously lower the barrier for actual implementation of these features in engines.
The two really new things are the engine debug comments, and the "nps" command. The former merely tries to regulate an extremely common existing pactice of having engines dump debug messages on WinBoard in an unprotected way, as usually you get away with that.

5. WinBoard requires Win32 engines

Due to some Microsoft brain damage that I don't understand, WinBoard does not work with chess engines that were compiled to use a DOS extender for 32-bit addressing. (Probably not with 16-bit DOS or Windows programs either.) WinBoard works only with engines that are compiled for the Win32 API. You can get a free compiler that targets the Win32 API from http://sources.redhat.com/cygwin/. I think DJGPP 2.x should also work if you use the RSXNTDJ extension, but I haven't tried it. Of course, Microsoft Visual C++ will work. Most likely the other commercial products that support Win32 will work too (Borland, etc.), but I have not tried them. Delphi has been successfully used to write engines for WinBoard; if you want to do this, Tony Werten has donated some sample code that should help you get started.

6. Hints on input/output

Beware of using buffered I/O in your chess engine. The C stdio library, C++ streams, and the I/O packages in most other languages use buffering both on input and output. That means two things. First, when your engine tries to write some characters to xboard, the library stashes them in an internal buffer and does not actually write them to the pipe connected to xboard until either the buffer fills up or you call a special library routine asking for it to be flushed. (In C stdio, this routine is named fflush.) Second, when your engine tries to read some characters from xboard, the library does not read just the characters you asked for -- it reads all the characters that are currently available (up to some limit) and stashes any characters you are not yet ready for in an internal buffer. The next time you ask to read, you get the characters from the buffer (if any) before the library tries to read more data from the actual pipe.

Why does this cause problems? First, on the output side, remember that your engine produces output in small quantities (say, a few characters for a move, or a line or two giving the current analysis), and that data always needs to be delivered to xboard/WinBoard for display immediately. If you use buffered output, the data you print will sit in a buffer in your own address space instead of being delivered.

You can usually fix the output buffering problem by asking for the buffering to be turned off. In C stdio, you do this by calling setbuf(stdout, NULL). A more laborious and error-prone method is to carefully call fflush(stdout) after every line you output; I don't recommend this. In C++, you can try cout.setf(ios::unitbuf), which is documented in current editions of "The C++ Programming Language," but not older ones. Another C++ method that might work is cout.rdbuf()->setbuf(NULL, 0). Alternatively, you can carefully call cout.flush() after every line you output; again, I don't recommend this.

Another way to fix the problem is to use unbuffered operating system calls to write directly to the file descriptor for standard output. On Unix, this means write(1, ...) -- see the man page for write(2). On Win32, you can use either the Unix-like _write(1, ...) or Win32 native routines like WriteFile.

Second, on the input side, you are likely to want to poll during your search and stop it if new input has come in. If you implement pondering, you'll need this so that pondering stops when the user makes a move. You should also poll during normal thinking on your move, so that you can implement the "?" (move now) command, and so that you can respond promptly to a "result", "force", or "quit" command if xboard wants to end the game or terminate your engine. Buffered input makes polling more complicated -- when you poll, you must stop your search if there are either characters in the buffer or characters available from the underlying file descriptor.

The most direct way to fix this problem is to use unbuffered operating system calls to read (and poll) the underlying file descriptor directly. On Unix, use read(0, ...) to read from standard input, and use select() to poll it. See the man pages read(2) and select(2). (Don't follow the example of GNU Chess 4 and use the FIONREAD ioctl to poll for input. It is not very portable; that is, it does not exist on all versions of Unix, and is broken on some that do have it.) On Win32, you can use either the Unix-like _read(0, ...) or the native Win32 ReadFile() to read. Unfortunately, under Win32, the function to use for polling is different depending on whether the input device is a pipe, a console, or something else. (More Microsoft brain damage here -- did they never hear of device independence?) For pipes, you can use PeekNamedPipe to poll (even when the pipe is unnamed). For consoles, you can use GetNumberOfConsoleInputEvents. For sockets only, you can use select(). It might be possible to use WaitForSingleObject more generally, but I have not tried it. Some code to do these things can be found in Crafty's utility.c, but I don't guarantee that it's all correct or optimal.

A second way to fix the problem might be to ask your I/O library not to buffer on input. It should then be safe to poll the underlying file descriptor as described above. With C, you can try calling setbuf(stdin, NULL). However, I have never tried this. Also, there could be problems if you use scanf(), at least with certain patterns, because scanf() sometimes needs to read one extra character and "push it back" into the buffer; hence, there is a one-character pushback buffer even if you asked for stdio to be unbuffered. With C++, you can try cin.rdbuf()->setbuf(NULL, 0), but again, I have never tried this.

A third way to fix the problem is to check whether there are characters in the buffer whenever you poll. C I/O libraries generally do not provide any portable way to do this. Under C++, you can use cin.rdbuf()->in_avail(). This method has been reported to work with EXchess. Remember that if there are no characters in the buffer, you still have to poll the underlying file descriptor too, using the method described above.

A fourth way to fix the problem is to use a separate thread to read from stdin. This way works well if you are familiar with thread programming. This thread can be blocked waiting for input to come in at all times, while the main thread of your engine does its thinking. When input arrives, you have the thread put the input into a buffer and set a flag in a global variable. Your search routine then periodically tests the global variable to see if there is input to process, and stops if there is. WinBoard and my Win32 ports of ICC timestamp and FICS timeseal use threads to handle multiple input sources.

7. Signals

Engines that run on Unix need to be concerned with two Unix signals: SIGTERM and SIGINT. This applies both to engines that run under xboard and (the unusual case of) engines that WinBoard remotely runs on a Unix host using the -firstHost or -secondHost feature. It does not apply to engines that run on Windows, because Windows does not have Unix-style signals. Beginning with version 2, you can now turn off the use of either or both signals. See the "feature" command in section 9 below.

First, when an engine is sent the "quit" command, it is also given a SIGTERM signal shortly afterward to make sure it goes away. If your engine reliably responds to "quit", and the signal causes problems for you, you should either ignore it by calling signal(SIGTERM, SIG_IGN) at the start of your program, or disable it with the "feature" command.

Second, xboard will send an interrupt signal (SIGINT) at certain times when it believes the engine may not be listening to user input (thinking or pondering). WinBoard currently does this only when the engine is running remotely using the -firstHost or -secondHost feature, not when it is running locally. You probably need to know only enough about this grungy feature to keep it from getting in your way.

The SIGINTs are basically tailored to the needs of GNU Chess 4 on systems where its input polling code is broken or disabled. Because they work in a rather peculiar way, it is recommended that you either ignore SIGINT by having your engine call signal(SIGINT, SIG_IGN), or disable it with the "feature" command.

Here are details for the curious. If xboard needs to send a command when it is the chess engine's move (such as before the "?" command), it sends a SIGINT first. If xboard needs to send commands when it is not the chess engine's move, but the chess engine may be pondering (thinking on its opponent's time) or analyzing (analysis or analyze file mode), xboard sends a SIGINT before the first such command only. Another SIGINT is not sent until another move is made, even if xboard issues more commands. This behavior is necessary for GNU Chess 4. The first SIGINT stops it from pondering until the next move, but on some systems, GNU Chess 4 will die if it receives a SIGINT when not actually thinking or pondering.

There are two reasons why WinBoard does not send the Win32 equivalent of SIGINT (which is called CTRL_C_EVENT) to local engines. First, the Win32 GNU Chess 4 port does not need it. Second, I could not find a way to get it to work. Win32 seems to be designed under the assumption that only console applications, not windowed applications, would ever want to send a CTRL_C_EVENT.

8. Commands from xboard to the engine

All commands from xboard to the engine end with a newline (\n), even where that is not explicitly stated. All your output to xboard must be in complete lines; any form of prompt or partial line will cause problems.

At the beginning of each game, xboard sends an initialization string. This is currently "new\nrandom\n" unless the user changes it with the initString or secondInitString option.

xboard normally reuses the same chess engine process for multiple games. At the end of a game, xboard will send the "force" command (see below) to make sure your engine stops thinking about the current position. It will later send the initString again to start a new game. If your engine can't play multiple games, you can disable reuse either with the "feature" command (beginning in protocol version 2; see below) or with xboard's -xreuse (or -xreuse2) command line option. xboard will then ask the process to quit after each game and start a new process for the next game.

xboard
This command will be sent once immediately after your engine process is started. You can use it to put your engine into "xboard mode" if that is needed. If your engine prints a prompt to ask for user input, you must turn off the prompt and output a newline when the "xboard" command comes in.
protover N

Beginning in protocol version 2 (in which N=2), this command will be sent immediately after the "xboard" command. If you receive some other command immediately after "xboard" (such as "new"), you can assume that protocol version 1 is in use. The "protover" command is the only new command that xboard always sends in version 2. All other new commands to the engine are sent only if the engine first enables them with the "feature" command. Protocol versions will always be simple integers so that they can easily be compared.

Your engine should reply to the protover command by sending the "feature" command (see below) with the list of non-default feature settings that you require, if any.

Your engine should never refuse to run due to receiving a higher protocol version number than it is expecting! New protocol versions will always be compatible with older ones by default; the larger version number is simply a hint that additional "feature" command options added in later protocol versions may be accepted.

accepted
rejected
These commands may be sent to your engine in reply to the "feature" command; see its documentation below.
new
Reset the board to the standard chess starting position. Set White on move. Leave force mode and set the engine to play Black. Associate the engine's clock with Black and the opponent's clock with White. Reset clocks and time controls to the start of a new game. Use wall clock for time measurement. Stop clocks. Do not ponder on this move, even if pondering is on. Remove any search depth limit previously set by the sd command.
variant VARNAME
If the game is not standard chess, but a variant, this command is sent after "new" and before the first move or "edit" command. Currently defined variant names are:
wildcastleShuffle chess where king can castle from d file
nocastleShuffle chess with no castling at all
fischerandomFischer Random
bughouseBughouse, ICC/FICS rules
crazyhouseCrazyhouse, ICC/FICS rules
losersWin by losing all pieces or getting mated (ICC)
suicideWin by losing all pieces including king, or by having fewer pieces when one player has no legal moves (FICS)
giveawayWin by losing all pieces including king, or by having no legal moves (ICC)
twokingsWeird ICC wild 9
kriegspielKriegspiel (engines not supported)
atomicAtomic
3checkWin by giving check 3 times
xiangqi Chinese Chess (9x10 board)
shogi Japanese Chess (9x9 bord)
capablancaCapablanca Chess (10x8 board, with Archbishop and Chancellor)
gothic Gothic Chess (10x8 board, same with better opening setup)
falcon Falcon Chess (10x8 board, with two Falcon pieces)
shatranj ancient Arabic Chess, with Elephants and General in stead of B and Q
courier Courier Chess (12x8 board, a medieval precursor of modern Chess
knightmate King moves as Knight and vice versa
berolina Pawns capture straight ahead, and move diagonally
janus Janus Chess (10x8, with two Archbishops)
caparandom shuffle variant like FRC (10x8 board)
cylinder Pieces wrap around between side edges, like board is a cylinder
super Superchess: a shuffle variant with 4 fairy pieces on 8x8 board
great Great Shatranj: sliders are replaced by corresponding short-range pieces on a 10x8 board
unknownUnknown variant (not supported)
quit
The chess engine should immediately exit. This command is used when xboard is itself exiting, and also between games if the -xreuse command line option is given (or -xreuse2 for the second engine). See also Signals above.
random
This command is specific to GNU Chess 4. You can either ignore it completely (that is, treat it as a no-op) or implement it as GNU Chess does. The command toggles "random" mode (that is, it sets random = !random). In random mode, the engine adds a small random value to its evaluation function to vary its play. The "new" command sets random mode off.
force
Set the engine to play neither color ("force mode"). Stop clocks. The engine should check that moves received in force mode are legal and made in the proper turn, but should not think, ponder, or make moves of its own.
go
Leave force mode and set the engine to play the color that is on move. Associate the engine's clock with the color that is on move, the opponent's clock with the color that is not on move. Start the engine's clock. Start thinking and eventually make a move.
playother
(This command is new in protocol version 2. It is not sent unless you enable it with the feature command.) Leave force mode and set the engine to play the color that is not on move. Associate the opponent's clock with the color that is on move, the engine's clock with the color that is not on move. Start the opponent's clock. If pondering is enabled, the engine should begin pondering. If the engine later receives a move, it should start thinking and eventually reply.
white

(This command is obsolete as of protocol version 2, but is still sent in some situations to accommodate older engines unless you disable it with the feature command.) Set White on move. Set the engine to play Black. Stop clocks.

black
(This command is obsolete as of protocol version 2, but is still sent in some situations to accommodate older engines unless you disable it with the feature command.) Set Black on move. Set the engine to play White. Stop clocks.
level MPS BASE INC
Set time controls. See the Time Control section below.
st TIME
Set time controls. See the Time Control section below.
sd DEPTH

The engine should limit its thinking to DEPTH ply. The commands "level" or "st" and "sd" can be used together in an orthogonal way. If both are issued, the engine should observe both limitations: In the protocol, the "sd" command isn't a time control. It doesn't say that your engine has unlimited time but must search to exactly the given depth. It says that you should pay attention to the time control as normal, but cut off the search at the specified depth even if you have time to search deeper. If you don't have time to search to the specified depth, given your normal time management algorithm, then you will want to stop sooner than the given depth.

The "new" command should set the search depth back to unlimited. This is already stated in the spec. The "level" command should not affect the search depth. As it happens, xboard/WinBoard currently always sends sd (if needed) right after level, but that isn't part of the spec.

nps NODE_RATE
The engine should not use wall-clock time to make its timing decisions, but an own internal time measure based on the number of nodes it has searched (and will report as "thinking output", see section 10), converted to seconds through dividing by the given NODE_RATE. Example: after receiving the commands "st 8" and "nps 10000", the engine should never use more that 80,000 nodes in the search for any move. In this mode, the engine should report user CPU time used (in its thinking output), rather than wall-clock time. This even holds if NODE_RATE is given as 0, but in that case it should also use the user CPU time for its timing decisions. The effect of an "nps" command should persist until the next "new" command.
time N
Set a clock that always belongs to the engine. N is a number in centiseconds (units of 1/100 second). Even if the engine changes to playing the opposite color, this clock remains with the engine.
otim N

Set a clock that always belongs to the opponent. N is a number in centiseconds (units of 1/100 second). Even if the opponent changes to playing the opposite color, this clock remains with the opponent.

If needed for purposes of board display in force mode (where the engine is not participating in the game) the time clock should be associated with the last color that the engine was set to play, the otim clock with the opposite color.

This business of "clocks remaining with the engine" is apparently so ambiguous that many engines implement it wrong. The clocks in fact always remain with the color. Which clock reading is relayed with "time", and which by "otim", is determined by which side the engine plays. Note that the way the clocks operate and receive extra time (in accordance with the selected time control) is not affected in any way by which moves are made by the engine, which by the opponent, and which were forced.

Beginning in protocol version 2, if you can't handle the time and otim commands, you can use the "feature" command to disable them; see below. The following techniques from older protocol versions also work: You can ignore the time and otim commands (that is, treat them as no-ops), or send back "Error (unknown command): time" the first time you see "time".

MOVE

See below for the syntax of moves. If the move is illegal, print an error message; see the section "Commands from the engine to xboard". If the move is legal and in turn, make it. If not in force mode, stop the opponent's clock, start the engine's clock, start thinking, and eventually make a move.

When xboard sends your engine a move, it normally sends coordinate algebraic notation. Examples:

Normal moves:e2e4
Pawn promotion:e7e8q
Castling:e1g1, e1c1, e8g8, e8c8
Bughouse/crazyhouse drop:P@h3
ICS Wild 0/1 castling:d1f1, d1b1, d8f8, d8b8
FischerRandom castling:O-O, O-O-O (oh, not zero)

Note that on boards with more than 9 ranks, counting of the ranks starts at 0.

Beginning in protocol version 2, you can use the feature command to select SAN (standard algebraic notation) instead; for example, e4, Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. Note that the last form, P@h3, is a extension to the PGN standard's definition of SAN, which does not support bughouse or crazyhouse.

xboard doesn't reliably detect illegal moves, because it does not keep track of castling unavailability due to king or rook moves, or en passant availability. If xboard sends an illegal move, send back an error message so that xboard can retract it and inform the user; see the section "Commands from the engine to xboard".

usermove MOVE
By default, moves are sent to the engine without a command name; the notation is just sent as a line by itself. Beginning in protocol version 2, you can use the feature command to cause the command name "usermove" to be sent before the move. Example: "usermove e2e4".
?

Move now. If your engine is thinking, it should move immediately; otherwise, the command should be ignored (treated as a no-op). It is permissible for your engine to always ignore the ? command. The only bad consequence is that xboard's Move Now menu command will do nothing.

It is also permissible for your engine to move immediately if it gets any command while thinking, as long as it processes the command right after moving, but it's preferable if you don't do this. For example, xboard may send post, nopost, easy, hard, force, quit, or other commands while the engine is on move.

ping N

In this command, N is a decimal number. When you receive the command, reply by sending the string pong N, where N is the same number you received. Important: You must not reply to a "ping" command until you have finished executing all commands that you received before it. Pondering does not count; if you receive a ping while pondering, you should reply immediately and continue pondering. Because of the way xboard uses the ping command, if you implement the other commands in this protocol, you should never see a "ping" command when it is your move; however, if you do, you must not send the "pong" reply to xboard until after you send your move. For example, xboard may send "?" immediately followed by "ping". If you implement the "?" command, you will have moved by the time you see the subsequent ping command. Similarly, xboard may send a sequence like "force", "new", "ping". You must not send the pong response until after you have finished executing the "new" command and are ready for the new game to start.

The ping command is new in protocol version 2 and will not be sent unless you enable it with the "feature" command. Its purpose is to allow several race conditions that could occur in previous versions of the protocol to be fixed, so it is highly recommended that you implement it. It is especially important in simple engines that do not ponder and do not poll for input while thinking, but it is needed in all engines.

draw
The engine's opponent offers the engine a draw. To accept the draw, send "offer draw". To decline, ignore the offer (that is, send nothing). If you're playing on ICS, it's possible for the draw offer to have been withdrawn by the time you accept it, so don't assume the game is over because you accept a draw offer. Continue playing until xboard tells you the game is over. See also "offer draw" below.
result RESULT {COMMENT}
After the end of each game, xboard will send you a result command. You can use this command to trigger learning. RESULT is either 1-0, 0-1, 1/2-1/2, or *, indicating whether white won, black won, the game was a draw, or the game was unfinished. The COMMENT string is purely a human-readable comment; its content is unspecified and subject to change. In ICS mode, it is passed through from ICS uninterpreted. Example:
result 1-0 {White mates}

Here are some notes on interpreting the "result" command. Some apply only to playing on ICS ("Zippy" mode).

If you won but did not just play a mate, your opponent must have resigned or forfeited. If you lost but were not just mated, you probably forfeited on time, or perhaps the operator resigned manually. If there was a draw for some nonobvious reason, perhaps your opponent called your flag when he had insufficient mating material (or vice versa), or perhaps the operator agreed to a draw manually.

You will get a result command even if you already know the game ended -- for example, after you just checkmated your opponent. In fact, if you send the "RESULT {COMMENT}" command (discussed below), you will simply get the same thing fed back to you with "result" tacked in front. You might not always get a "result *" command, however. In particular, you won't get one in local chess engine mode when the user stops playing by selecting Reset, Edit Game, Exit or the like.

setboard FEN

The setboard command is the new way to set up positions, beginning in protocol version 2. It is not used unless it has been selected with the feature command. Here FEN is a position in Forsythe-Edwards Notation, as defined in the PGN standard. Note that this PGN standard referred to here only applies to normal Chess; Obviously in variants that cannot be described by a FEN for normal Chess, e.g. because the board is not 8x8, other pieces then PNBRQK participate, there are holdings that need to be specified, etc., xboard will use a FEN format that is standard or suitable for that varant. In particular, in FRC or CRC, WinBoard will use Shredder-FEN or X-FEN standard, i.e. it can use the rook-file indicator letter to represent a castling right (like HAha) whenever it wants, but if it uses KQkq, this will always refer to the outermost rook on the given side.

Illegal positions: Note that either setboard or edit can be used to send an illegal position to the engine. The user can create any position with xboard's Edit Position command (even, say, an empty board, or a board with 64 white kings and no black ones). If your engine receives a position that it considers illegal, I suggest that you send the response "tellusererror Illegal position", and then respond to any attempted move with "Illegal move" until the next new, edit, or setboard command.

edit

The edit command is the old way to set up positions. For compatibility with old engines, it is still used by default, but new engines may prefer to use the feature command (see below) to cause xboard to use setboard instead. The edit command puts the chess engine into a special mode, where it accepts the following subcommands:

cchange current piece color, initially white
Pa4 (for example)place pawn of current color on a4
xa4 (for example)empty the square a4 (not used by xboard)
#clear board
.leave edit mode

See the Idioms section below for additional subcommands used in ChessBase's implementation of the protocol.

The edit command does not change the side to move. To set up a black-on-move position, xboard uses the following command sequence:

    new
    force
    a2a3
    edit
    <edit commands>
    .

This sequence is used to avoid the "black" command, which is now considered obsolete and which many engines never did implement as specified in this document.

After an edit command is complete, if a king and a rook are on their home squares, castling is assumed to be available to them. En passant capture is assumed to be illegal on the current move regardless of the positions of the pawns. The clock for the 50 move rule starts at zero, and for purposes of the draw by repetition rule, no prior positions are deemed to have occurred. In FRC or CRC, any rook and king put on the back rank should be considered to have castling rights, even if it later becomes apparent that they cannot be both in the initial position, because the position just set up is asymmetric. It is upto WinBoard to find work-around in cases where this is not desired, similar to the "black kludge" shown above, by setting up an earlier position, and then do a move to destroy castling rights or create e.p. rights. (Don't bet your life on it...)

hint
If the user asks for a hint, xboard sends your engine the command "hint". Your engine should respond with "Hint: xxx", where xxx is a suggested move. If there is no move to suggest, you can ignore the hint command (that is, treat it as a no-op).
bk
If the user selects "Book" from the xboard menu, xboard will send your engine the command "bk". You can send any text you like as the response, as long as each line begins with a blank space or tab (\t) character, and you send an empty line at the end. The text pops up in a modal information dialog.
undo
If the user asks to back up one move, xboard will send you the "undo" command. xboard will not send this command without putting you in "force" mode first, so you don't have to worry about what should happen if the user asks to undo a move your engine made. (GNU Chess 4 actually switches to playing the opposite color in this case.)
remove
If the user asks to retract a move, xboard will send you the "remove" command. It sends this command only when the user is on move. Your engine should undo the last two moves (one for each player) and continue playing the same color.
hard
Turn on pondering (thinking on the opponent's time, also known as "permanent brain"). xboard will not make any assumption about what your default is for pondering or whether "new" affects this setting.
easy
Turn off pondering.
post
Turn on thinking/pondering output. See Thinking Output section.
nopost
Turn off thinking/pondering output.
analyze
Enter analyze mode. See Analyze Mode section.
name X
This command informs the engine of its opponent's name. When the engine is playing on a chess server, xboard obtains the opponent's name from the server. When the engine is playing locally against a human user, xboard obtains the user's login name from the local operating system. When the engine is playing locally against another engine, xboard uses either the other engine's filename or the name that the other engine supplied in the myname option to the feature command. By default, xboard uses the name command only when the engine is playing on a chess server. Beginning in protocol version 2, you can change this with the name option to the feature command; see below.
rating
In ICS mode, xboard obtains the ICS opponent's rating from the "Creating:" message that appears before each game. (This message may not appear on servers using outdated versions of the FICS code.) In Zippy mode, it sends these ratings on to the chess engine using the "rating" command. The chess engine's own rating comes first, and if either opponent is not rated, his rating is given as 0. In the future this command may also be used in other modes, if ratings are known. Example:
rating 2600 1500
ics HOSTNAME
If HOSTNAME is "-", the engine is playing against a local opponent; otherwise, the engine is playing on an Internet Chess Server (ICS) with the given hostname. This command is new in protocol version 2 and is not sent unless the engine has enabled it with the "feature" command. Example: "ics freechess.org"
computer
The opponent is also a computer chess engine. Some engines alter their playing style when they receive this command.
pause
resume
(These commands are new in protocol version 2 and will not be sent unless feature pause=1 is set. At this writing, xboard actually does not use the commands at all, but it or other interfaces may use them in the future.) The "pause" command puts the engine into a special state where it does not think, ponder, or otherwise consume significant CPU time. The current thinking or pondering (if any) is suspended and both player's clocks are stopped. The only command that the interface may send to the engine while it is in the paused state is "resume". The paused thinking or pondering (if any) resumes from exactly where it left off, and the clock of the player on move resumes running from where it stopped.
memory N
This command informs the engine on how much memory it is allowed to use maximally, in MegaBytes. On receipt of this command, the engine should adapt the size of its hash tables accordingly. This command does only fix the total memory use, the engine has to decide for itself (or be configured by the user by other means) how to divide up the available memory between the various tables it wants to use (e.g. main hash, pawn hash, tablebase cache, bitbases). This command will only be sent to engines that have requested it through the memory feature, and only at the start of a game, as the first of the commands to relay engine option settings just before each "new" command.
cores N
This command informs the engine on how many CPU cores it is allowed to use maximally. This could be interpreted as the number of search threads for SMP engines. (Threads that do not consume significant amounts of CPU time, like I/O threads, need not be included in the count.) This command will only be sent to engines that have requested it through the smp feature. The engine should be able to respond to the "cores" command any time during a game, but it is allowed to finish a search in progress before procesing the command. (Obeying the command should take priority over finishing a ponder search, though.) In any case it will be sent at the start of every game as the last command to relay engine option settings before the "new" command.
egtpath TYPE PATH
This command informs the engine in which directory (given by the PATH argument) it can find end-game tables of the specified TYPE. The TYPE argument can be any character string which does not contain spaces. Currently nalimov and scorpio are defined types, for Nalimov tablebases and Scorpio bitbases, respectively, but future developers of other formats are free to define their own format names. The GUI simply matches the TYPE names the engine says it supports with those that the user supplied when configuring xboard. For every match, it sends a separate "y" command. The PATH argument would normally (for Nalimov) be the pathname of the directory the EGT files are in, but could also be the name of a file, or in fact anything the particular EGT type requires. It is upto the developer of the EGT format to specify the syntax of this parameter. This command will only be sent to engines that have told the GUI they support EGTs of the given TYPE through the egt feature. It will be sent at the start of each game, before the "new" command.
option NAME[=VALUE]
This command changes the setting of the option NAME defined by the engine (through an earlier feature command) to the given VALUE. XBoard will in general have no idea what the option means, and will send the command only when a user changes the value of this option through a menu, or at startup of the engine (before the first 'cores' command or, if that is not sent, the first 'new' command) in reaction to command-line options. The NAME echoes back to the engine the string that was identified as an option NAME in the feature command defining the option. The VALUE is of the type (numeric or text or absent) that was implied by the option type specified in this feature command, i.e. with 'spin' and 'check' options VALUE will be a decimal integer (in the latter case 0 or 1), with 'combo' and 'string' options VALUE will be a text string, and with 'button' and 'save' options no VALUE will be sent at all.
exclude MOVE
include MOVE
exclude all
include all
These commands change the set of moves that the engine should consider in the root node of its search, by removing or adding the mentioned MOVE from this set. After reaching a new position, (e.g. through a usermove, undo, new or setboard command), or after receiving "include all", this set should always be reset to all legal moves from that position. If the set of moves changes during a search, the engine could start a new search from scratch, or it can try to be smart, and continue the current search with the new set of moves (e.g. after exclusion of a move that has not been searched yet in the current iteration). After "exclude all", the engine would have no legal moves in the root, which logically should make it behave as if it is (stale)mated, but it is allowed to defer any effects of this command on a search in progress to when the set gets non-empty again through addition of a move. These commands will only be sent to engines that have requested such through the exclude feature.
setscore SCORE DEPTH
This command instructs the engine to treat future search requests on the current position (also when it is encountered inside a larger search tree) upto the given DEPTH as if these result is SCORE centi-Pawn in favor of the side that has the move in this position. It is entirely up to the engine to decide when the effect of this option should expire. (E.g. it could last upto the next "new" or "quit" command, or even into future sessions until the user explicitly clears it through an engine-defined option.) This command will only be sent to engines that have requested it through the setscore feature.

Bughouse commands:

xboard now supports bughouse engines when in Zippy mode. See zippy.README for information on Zippy mode and how to turn on the bughouse support. The bughouse move format is given above. xboard sends the following additional commands to the engine when in bughouse mode. Commands to inform your engine of the partner's game state may be added in the future.

partner <player>
<player> is now your partner for future games. Example:
partner mann
partner
Meaning: You no longer have a partner.
ptell <text>
Your partner told you <text>, either with a ptell or an ordinary tell.
holding [<white>] [<black>]
White currently holds <white>; black currently holds <black>. Example:
holding [PPPRQ] []
holding [<white>] [<black>] <color><piece>
White currently holds <white>; black currently holds <black>, after <color> acquired <piece>. Example:
holding [PPPRQ] [R] BR

9. Commands from the engine to xboard

In general, an engine should not send any output to xboard that is not described in this document. As the protocol is extended, newer versions of xboard may recognize additional strings as commands that were previously not assigned a meaning.

feature FEATURE1=VALUE1 FEATURE2=VALUE2 ...

Beginning with version 2, the protocol includes the "feature" command, which lets your engine control certain optional protocol features. Feature settings are written as FEATURE=VALUE, where FEATURE is a name from the list below and VALUE is the value to be assigned. Features can take string, integer, or boolean values; the type of value is listed for each feature. String values are written in double quotes (for example, feature myname="Miracle Chess 0.9"), integers are written in decimal, and boolean values are written as 0 for false, 1 for true. Any number of features can be set in one feature command, or multiple feature commands can be given.

Your engine should send one or more feature commands immediately after receiving the "protover" command, since xboard needs to know the values of some features before sending further commands to the engine. Because engines that predate protocol version 2 do not send "feature", xboard uses a timeout mechanism: when it first starts your engine, it sends "xboard" and "protover N", then listens for feature commands for two seconds before sending any other commands. To end this timeout and avoid the wait, set the feature "done=1" at the end of your last feature command. To increase the timeout, if needed, set the feature "done=0" before your first feature command and "done=1" at the end. If needed, it is okay for your engine to set done=0 soon as it starts, even before it receives the xboard and protover commands. This can be useful if your engine takes a long time to initialize itself. It should be harmless even if you are talking to a (version 1) user interface that does not understand the "feature" command, since such interfaces generally ignore commands from the engine that they do not understand.

The feature command is designed to let the protocol change without breaking engines that were written for older protocol versions. When a new feature is added to the protocol, its default value is always chosen to be compatible with older versions of the protocol that did not have the feature. Any feature that your engine does not set in a "feature" command retains its default value, so as the protocol changes, you do not have to change your engine to keep up with it unless you want to take advantage of a new feature. Because some features are improvements to the protocol, while others are meant to cater to engines that do not implement all the protocol features, the recommended setting for a feature is not always the same as the default setting. The listing below gives both default and recommended settings for most features.

You may want to code your engine so as to be able to work with multiple versions of the engine protocol. Protocol version 1 does not send the protover command and does not implement the feature command; if you send a feature command in protocol version 1, it will have no effect and there will be no response. In protocol version 2 or later, each feature F that you set generates the response "accepted F" if the feature is implemented, or "rejected F" if it is not. Thus an engine author can request any feature without having to keep track of which protocol version it was introduced in; you need only check whether the feature is accepted or rejected. This mechanism also makes it possible for a user interface author to implement a subset of a protocol version by rejecting some features that are defined in that version; however, you should realize that engine authors are likely to code for xboard and may not be prepared to have a feature that they depend on be rejected. If the GUI rejects an option feature because of the syntax of the value, it should print the value string with the "rejected" command, e.g. "rejected option nonsense" in response to receiving feature option="nonsense".

Here are the features that are currently defined.

ping (boolean, default 0, recommended 1)
If ping=1, xboard may use the protocol's new "ping" command; if ping=0, xboard will not use the command.
setboard (boolean, default 0, recommended 1)
If setboard=1, xboard will use the protocol's new "setboard" command to set up positions; if setboard=0, it will use the older "edit" command.
playother (boolean, default 0, recommended 1)
If playother=1, xboard will use the protocol's new "playother" command when appropriate; if playother=0, it will not use the command.
san (boolean, default 0)
If san=1, xboard will send moves to the engine in standard algebraic notation (SAN); for example, Nf3. If san=0, xboard will send moves in coordinate notation; for example, g1f3. See MOVE in section 8 above for more details of both kinds of notation.
usermove (boolean, default 0)
If usermove=1, xboard will send moves to the engine with the command "usermove MOVE"; if usermove=0, xboard will send just the move, with no command name.
time (boolean, default 1, recommended 1)
If time=1, xboard will send the "time" and "otim" commands to update the engine's clocks; if time=0, it will not.
draw (boolean, default 1, recommended 1)
If draw=1, xboard will send the "draw" command if the engine's opponent offers a draw; if draw=0, xboard will not inform the engine about draw offers. Note that if draw=1, you may receive a draw offer while you are on move; if this will cause you to move immediately, you should set draw=0.
sigint (boolean, default 1)
If sigint=1, xboard may send SIGINT (the interrupt signal) to the engine as section 7 above; if sigint=0, it will not.
sigterm (boolean, default 1)
If sigterm=1, xboard may send SIGTERM (the termination signal) to the engine as section 7 above; if sigterm=0, it will not.
reuse (boolean, default 1, recommended 1)
If reuse=1, xboard may reuse your engine for multiple games. If reuse=0 (or if the user has set the -xreuse option on xboard's command line), xboard will kill the engine process after every game and start a fresh process for the next game.
analyze (boolean, default 1, recommended 1)
If analyze=0, xboard will not try to use the "analyze" command; it will pop up an error message if the user asks for analysis mode. If analyze=1, xboard will try to use the command if the user asks for analysis mode.
myname (string, default determined from engine filename)
This feature lets you set the name that xboard will use for your engine in window banners, in the PGN tags of saved game files, and when sending the "name" command to another engine.
variants (string, see text below)
This feature indicates which chess variants your engine accepts. It should be a comma-separated list of variant names. See the table under the "variant" command in section 8 above. If you do not set this feature, xboard will assume by default that your engine supports all variants. (However, the -zippyVariants command-line option still limits which variants will be accepted in Zippy mode.) It is recommended that you set this feature to the correct value for your engine (just "normal" in most cases) rather than leaving the default in place, so that the user will get an appropriate error message if he tries to play a variant that your engine does not support.
If your engine can play variants on a deviating board size, like capablanca on an 8x8 board, or capablanca crazyhouse, it can list them amongst the variants with a prefix spcifying board size plus holdings size, like 8x8+0_capablanca or 10x8+7_capablanca. If it is capable of playing any variant with an arbitrary board size, it should list "boardsize" as one of the variants. If there is a maximum to the board size, this can be prefixed, e.g. "12x10+0_boardsize".
colors (boolean, default 1, recommended 0)
If colors=1, xboard uses the obsolete "white" and "black" commands in a stylized way that works with most older chess engines that require the commands. See the "Idioms" section below for details. If colors=0, xboard does not use the "white" and "black" commands at all.
ics (boolean, default 0)
If ics=1, xboard will use the protocol's new "ics" command to inform the engine of whether or not it is playing on a chess server; if ics=0, it will not.
name (boolean, see text below)
If name=1, xboard will use the protocol's "name" command to inform the engine of the opponent's name; if name=0, it will not. By default, name=1 if the engine is playing on a chess server; name=0 if not.
pause (boolean, default 0)
If pause=1, xboard may use the protocol's new "pause" command; if pause=0, xboard assumes that the engine does not support this command.
nps (boolean, default ?)
If nps=1, it means the engine supports the nps command. If nps=0, it means the engine does not support it, and WinBoard should refrain from sending it. Default is that WinBoard sends it, in an attempt to try out if the engine understand it. The engine should properly respond with "Error (unkown command): nps" if it does not implement it, (as any protocol version pre-scribes), or WinBoard might assume that the engine did understand the command. In that case the use of different time standards that ensues could lead to time forfeits for the engine.
debug (boolean, default 0)
If debug=1, it means the engine wants to send debug output prefixed by '#', which WinBoard should ignore, except for including it in the winboard.debug file. As this feature is added to protocol 2 ony late, so that not all protocol-2 supporting versions of WinBoard might implement it, it is important that engines check if WinBoard accepts the feature. If the feature is rejected, engines must refrain from sending the debug output, or do so at their own risk.
memory (boolean, default 0)
If memory=1, the size of the total amount of memory available for the memory-consuming tables of the engine (e.g. hash, EGTB cache) will be set by the GUI through the "memory" command.
smp (boolean, default 0)
If smp=1, the GUI will send the "cores" command to the engine to inform it how many CPU cores it can use. Note that sending smp=1 does not imply the engine can use more than one CPU; just that it wants to receive the "cores" command.
egt (string, see text below)
This feature indicates which end-game table formats the engine supports. It should be a comma-separated list of format names. See under the "egtpath" command in section 8 above. If you do not set this feature, xboard will assume the engine does not support end-game tables, and will not send any "egtpath" commands to inform the engine about their whereabouts.
option (string, see text below)
This feature is used by the engine to define an option command to appear in a GUI menu, so that the user can change the corresponding setting of the engine through the GUI interactively. The string describes the option by defining a name, type, current value and (sometimes) the acceptable value range. Unlike other features, option features are accumulated by the GUI, and the GUI must be able to add a new option to the list at any time, even after having received feature done=1. There are ten different options types, each requiring a slighly different syntax of the defining string:
feature option="NAME -button"
feature option="NAME -save"
feature option="NAME -reset"
feature option="NAME -check VALUE"
feature option="NAME -string VALUE"
feature option="NAME -spin VALUE MIN MAX"
feature option="NAME -combo CHOICE1 /// CHOICE2 ..."
feature option="NAME -slider VALUE MIN MAX"
feature option="NAME -file VALUE"
feature option="NAME -path VALUE"
NAME is an arbitrary alphanumeric string which can contain spaces; the other words in capitals would be replaced by the current (default) setting of the option, (a character string for -string options, a decimal number for -spin and -check options, were the latter uses 1=checked, 0=unchecked), the minimum or maximum value of numeric (-spin) options, or arbitrary text labels (for -combo option). In the latter case, the current value will be preceded by an asterisk. The -file and -path options are similar to -string, but can be used to inform the GUI that the text represents a file name or folder name respectively, so the GUI dialog could add the appropriate browse button to the text-edit field. Similarly, a -slider option is like a -spin, but the GUI might make a different graphical representation for it. A -save option is like a -button, and defines an immediate command to be sent by the engine. With -save the GUI will make sure all current option settings are flushed to the engine before it sends this command. A -reset option is like a -button, but use of it purges the list of options before sending the corresponding option command to the engine. This enables the engine to completely redefine its options or their current settings, by sending a new set of option feature commands to the GUI, terminated by feature done=1. (The effect of sending an option feature for an option with the same name as was defined before, without first receiving a -reset option command, is undefined.)
exclude (boolean, default 0)
If exclude=1 the GUI can send "exclude" and "include" commands to control which moves from the root position should be searched.
setscore (boolean, default 0)
If setscore=1 the GUI can send "setscore" commands to define the score of the current position.
done (integer, no default)
If you set done=1 during the initial two-second timeout after xboard sends you the "xboard" command, the timeout will end and xboard will not look for any more feature commands before starting normal operation. If you set done=0, the initial timeout is increased to one hour; in this case, you must set done=1 before xboard will enter normal operation.
Illegal move: MOVE
Illegal move (REASON): MOVE
If your engine receives a MOVE command that is recognizably a move but is not legal in the current position, your engine must print an error message in one of the above formats so that xboard can pass the error on to the user and retract the move. The (REASON) is entirely optional. Examples:
  Illegal move: e2e4
  Illegal move (in check): Nf3
  Illegal move (moving into check): e1g1

Generally, xboard will never send an ambiguous move, so it does not matter whether you respond to such a move with an Illegal move message or an Error message.

Error (ERRORTYPE): COMMAND
If your engine receives a command it does not understand or does not implement, it should print an error message in the above format so that xboard can parse it. Examples:
  Error (ambiguous move): Nf3
  Error (unknown command): analyze
  Error (command not legal now): undo
  Error (too many parameters): level 1 2 3 4 5 6 7
move MOVE
Your engine is making the move MOVE. Do not echo moves from xboard with this command; send only new moves made by the engine.

For the actual move text from your chess engine (in place of MOVE above), your move should be either

  • in coordinate notation (e.g., e2e4, e7e8q) with castling indicated by the King's two-square move (e.g., e1g1), or
  • in Standard Algebraic Notation (SAN) as defined in the Portable Game Notation standard (e.g, e4, Nf3, O-O, cxb5, Nxe4, e8=Q), with the extension piece@square (e.g., P@f7) to handle piece placement in bughouse and crazyhouse.

xboard itself also accepts some variants of SAN, but for compatibility with non-xboard interfaces, it is best not to rely on this behavior.

Warning: Even though all versions of this protocol specification have indicated that xboard accepts SAN moves, some non-xboard interfaces are known to accept only coordinate notation. See the Idioms section for more information on the known limitations of some non-xboard interfaces. It should be safe to send SAN moves if you receive a "protover 2" (or later) command from the interface, but otherwise it is best to stick to coordinate notation for maximum compatibility. An even more conservative approach would be for your engine to send SAN to the interface only if you have set feature san=1 (which causes the interface to send SAN to you) and have received "accepted san" in reply.

RESULT {COMMENT}
When your engine detects that the game has ended by rule, your engine must output a line of the form "RESULT {comment}" (without the quotes), where RESULT is a PGN result code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Here "by rule" means that the game is definitely over because of what happened on the board. In normal chess, this includes checkmate, stalemate, triple repetition, the 50 move rule, or insufficient material; it does not include loss on time or the like. Examples:
  0-1 {Black mates}
  1-0 {White mates}
  1/2-1/2 {Draw by repetition}
  1/2-1/2 {Stalemate}

xboard relays the result to the user, the ICS, the other engine in Two Machines mode, and the PGN save file as required. Note that "definitey over" above means that sending this command will be taken by WinBoard as an unconditional refusal of the engine to play on, which might cause you to forfeit if the game was in fact not over. This command should thus not be used to offer draws, accept draws, or make draw-by-rule claims that are not yet valid in the current position (but will be after you move). For offering and claiming such draws, "offer draw" should be used.

Note that (in accordance with FIDE rules) only KK, KNK, KBK and KBKB with all bishops on the same color can be claimed as draws on the basis of insufficient mating material. The end-games KNNK, KBKN, KNKN and KBKB with unlike bishops do have mate positions, and cannot be claimed. Complex draws based on locked Pawn chains will not be recognized as draws by most interfaces, so do not claim in such positions, but just offer a draw or play on.

Note to GUI programmers: RESULT commands that the engine sends immediately after its move might be detected by the GUI only after the opponent has moved, because of communication and scheduling delays, no matter how fast the engine sent it. Any judgement of the validity of RESULT claims based on te "current" board position will have to account for this uncertainty.

resign
If your engine wants to resign, it can send the command "resign". Alternatively, it can use the "RESULT {comment}" command if the string "resign" is included in the comment; for example "0-1 {White resigns}". xboard relays the resignation to the user, the ICS, the other engine in Two Machines mode, and the PGN save file as required. Note that many interfaces work more smoothly if you resign before you move.
offer draw
If your engine wants to offer a draw by agreement (as opposed to claiming a draw by rule), it can send the command "offer draw". xboard relays the offer to the user, the ICS, the other engine in Two Machines mode, and the PGN save file as required. In Machine White, Machine Black, or Two Machines mode, the offer is considered valid until your engine has made two more moves. This command must also be used to accept a draw offer. Do not use the 1/2-1/2 command for that, as the offer might be no longer valid, in which case a refusal to play on implied by the RESULT command might make you forfeit the game. "offer draw" should also be used to claim 50-move and 3-fold-repetition draws that will occur after your move, by sending it before making the move. WinBoard will grant draw offers without the opponent having any say in it in situations where draws can be claimed. Only if the draw cannot be claimed, the offer will be passed to your opponent after you make your next move, just before WinBoard relays this move to the opponent.
tellopponent MESSAGE
This command lets the engine give a message to its opponent, independent of whether the opponent is a user on the local machine or a remote ICS user (Zippy mode). MESSAGE consists of any characters, including whitespace, to the end of the line. When the engine is playing against a user on the local machine, xboard pops up an information dialog containing the message. When the engine is playing against an opponent on the ICS (Zippy mode), xboard sends "say MESSAGE\n" to the ICS.
tellothers MESSAGE
This command lets the engine give a message to people watching the game other than the engine's opponent. MESSAGE consists of any characters, including whitespace, to the end of the line. When the engine is playing against a user on the local machine, this command does nothing. When the engine is playing against an opponent on the ICS (Zippy mode), xboard sends "whisper MESSAGE\n" to the ICS.
tellall MESSAGE
This command lets the engine give a message to its opponent and other people watching the game, independent of whether the opponent is a user on the local machine or a remote ICS user (Zippy mode). MESSAGE consists of any characters, including whitespace, to the end of the line. When the engine is playing against a user on the local machine, xboard pops up an information dialog containing the message. When the engine is playing against an opponent on the ICS (Zippy mode), xboard sends "kibitz MESSAGE\n" to the ICS.
telluser MESSAGE
xboard pops up an information dialog containing the message. MESSAGE consists of any characters, including whitespace, to the end of the line.
tellusererror MESSAGE
xboard pops up an error dialog containing the message. MESSAGE consists of any characters, including whitespace, to the end of the line.
askuser REPTAG MESSAGE
Here REPTAG is a string containing no whitespace, and MESSAGE consists of any characters, including whitespace, to the end of the line. xboard pops up a question dialog that says MESSAGE and has a typein box. If the user types in "bar", xboard sends "REPTAG bar" to the engine. The user can cancel the dialog and send nothing.
tellics MESSAGE
In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists of any characters, including whitespace, to the end of the line.
tellicsnoalias MESSAGE
In Zippy mode, xboard sends "xMESSAGE\n" to ICS, where "x" is a character that prevents the ICS from expanding command aliases, if xboard knows of such a character. (On chessclub.com and chess.net, "/" is used; on freechess.org, "$" is used.) MESSAGE consists of any characters, including whitespace, to the end of the line.
# COMMENT
The engine can send any string of printable characters, terminated by a newline, for inclusion in the winboard.debug file, provided the line starts with a '#' character. If the engine has set feature debug=1, it is guaranteed that WinBoard (and any future version of it) will completely ignore these lines in any other respect.

10. Thinking Output

If the user asks your engine to "show thinking", xboard sends your engine the "post" command. It sends "nopost" to turn thinking off. In post mode, your engine sends output lines to show the progress of its thinking. The engine can send as many or few of these lines as it wants to, whenever it wants to. Typically they would be sent when the PV (principal variation) changes or the depth changes. The thinking output should be in the following format:

ply score time nodes pv

Where:

plyInteger giving current search depth.
scoreInteger giving current evaluation in centipawns.
timeCurrent search time in centiseconds (ex:1028 = 10.28 seconds).
nodesNodes searched.
pvFreeform text giving current "best" line. You can continue the pv onto another line if you start each continuation line with at least four space characters.

Example:

  9 156 1084 48000 Nf3 Nc6 Nc3 Nf6

Meaning:

9 ply, score=1.56, time = 10.84 seconds, nodes=48000, PV = "Nf3 Nc6 Nc3 Nf6"

Longer example from actual Crafty output:

  4    109      14   1435  1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6
  4    116      23   2252  1. Nf3 Nc6 2. e4 e6
  4    116      27   2589  1. Nf3 Nc6 2. e4 e6
  5    141      44   4539  1. Nf3 Nc6 2. O-O e5 3. e4
  5    141      54   5568  1. Nf3 Nc6 2. O-O e5 3. e4

You can use the PV to show other things; for instance, while in book, Crafty shows the observed frequency of different reply moves in its book. In situations like this where your engine is not really searching, start the PV with a '(' character:

  0      0       0      0  (e4 64%, d4 24%)

GNU Chess output is very slightly different. The ply number is followed by an extra nonblank character, and the time is in seconds, not hundredths of seconds. For compatibility, xboard accepts the extra character and takes it as a flag indicating the different time units. Example:

 2.     14    0       38   d1d2  e8e7 
 3+     78    0       65   d1d2  e8e7  d2d3 
 3&     14    0       89   d1d2  e8e7  d2d3 
 3&     76    0      191   d1e2  e8e7  e2e3 
 3.     76    0      215   d1e2  e8e7  e2e3 
 4&     15    0      366   d1e2  e8e7  e2e3  e7e6 
 4.     15    0      515   d1e2  e8e7  e2e3  e7e6 
 5+     74    0      702   d1e2  f7f5  e2e3  e8e7  e3f4 
 5&     71    0     1085   d1e2  e8e7  e2e3  e7e6  e3f4 
 5.     71    0     1669   d1e2  e8e7  e2e3  e7e6  e3f4 
 6&     48    0     3035   d1e2  e8e7  e2e3  e7e6  e3e4  f7f5  e4d4 
 6.     48    0     3720   d1e2  e8e7  e2e3  e7e6  e3e4  f7f5  e4d4 
 7&     48    0     6381   d1e2  e8e7  e2e3  e7e6  e3e4  f7f5  e4d4 
 7.     48    0    10056   d1e2  e8e7  e2e3  e7e6  e3e4  f7f5  e4d4 
 8&     66    1    20536   d1e2  e8e7  e2e3  e7e6  e3d4  g7g5  a2a4  f7f5 
 8.     66    1    24387   d1e2  e8e7  e2e3  e7e6  e3d4  g7g5  a2a4  f7f5 
 9&     62    2    38886   d1e2  e8e7  e2e3  e7e6  e3d4  h7h5  a2a4  h5h4 
                           d4e4 
 9.     62    4    72578   d1e2  e8e7  e2e3  e7e6  e3d4  h7h5  a2a4  h5h4 
                           d4e4 
10&     34    7   135944   d1e2  e8e7  e2e3  e7e6  e3d4  h7h5  c2c4  h5h4 
                           d4e4  f7f5  e4f4 
10.     34    9   173474   d1e2  e8e7  e2e3  e7e6  e3d4  h7h5  c2c4  h5h4 
                           d4e4  f7f5  e4f4 

If your engine is pondering (thinking on its opponent's time) in post mode, it can show its thinking then too. In this case your engine may omit the hint move (the move it is assuming its opponent will make) from the thinking lines if and only if it sends xboard the move in the usual "Hint: xxx" format before sending the first line.

11. Time control

xboard supports three styles of time control: conventional chess clocks, the ICS-style incremental clock, and an exact number of seconds per move.

In conventional clock mode, every time control period is the same. That is, if the time control is 40 moves in 5 minutes, then after each side has made 40 moves, they each get an additional 5 minutes, and so on, ad infinitum. At some future time it would be nice to support a series of distinct time controls. This is very low on my personal priority list, but code donations to the xboard project are accepted, so feel free to take a swing at it. I suggest you talk to me first, though.

The command to set a conventional time control looks like this:

  level 40 5 0
  level 40 0:30 0

The 40 means that there are 40 moves per time control. The 5 means there are 5 minutes in the control. In the second example, the 0:30 means there are 30 seconds. The final 0 means that we are in conventional clock mode.

Note that the time parameter in this command is not a pure numeric argument, but in general is a character string, in order to pass the number of seconds. Engines are encouraged to ignore any unexpected characters at the end of this string, i.e. following the MIN or MIN:SEC specification. Future protocol versions might (under control of an appropriate feature) append such extra characters to this argument, in order to inform the engine in advance of the time control it can expect after the current session completes. E.g. "level 40 25+5 0" could mean that the engine has to play 40 moves in 25 minutes, but should expect to get only 5 minutes for the entire remainder of the game after that, rather than another 25 minutes for the next 40 moves. When the time comes, (i.e. after the 40 moves), it will be informed of the time-control change by receiving a new "level 0 5 0" command, but engines with advanced time management might want to plan for this in advance.

The command to set an incremental time control looks like this:

  level 0 2 12

Here the 0 means "play the whole game in this time control period", the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As in conventional clock mode, the second argument to level can be in minutes and seconds.

At the start of the game, each player's clock is set to base minutes. Immediately after a player makes a move, inc seconds are added to his clock. A player's clock counts down while it is his turn. Your flag can be called whenever your clock is zero or negative. (Your clock can go negative and then become positive again because of the increment.)

The number of moves given in the level command (when non-zero) should be taken as the number of moves still to do before the specified time will be added to the clock, if the "level" command is received after some moves have already been played. The time given should be interpreted as the time left on its clock (including any time left over from the previous sessions), and not necessarily the time that will be added to the clock after the specified number of moves has been played. This is only relevant in WinBoard 4.3.xx, which might send the engine "level" commands during a game, just before the engine has to start thinking about the first move of a new time-control session. Example: if at the start of the game "level 40 60 0" was given (40 moves per hour), and the engine receives "level 20 22 0" just before move 41, it should understand that it should do the next 20 moves in 22 minutes (pehaps because the secondary session was 20 moves per 15 minutes, and it had 7 minutes left on its clock after the first 40 moves).

A special rule on some ICS implementations: if you ask for a game with base=0, the clocks really start at 10 seconds instead of 0. xboard itself does not know about this rule, so it passes the 0 on to the engine instead of changing it to 0:10.

ICS also has time odds games. With time odds, each player has his own (base, inc) pair, but otherwise things work the same as in normal games. The Zippy xboard accepts time odds games but ignores the fact that the opponent's parameters are different; this is perhaps not quite the right thing to do, but gnuchess doesn't understand time odds. Time odds games are always unrated.

The command to set an exact number of seconds per move looks like this:

  st 30

This means that each move must be made in at most 30 seconds. Time not used on one move does not accumulate for use on later moves.

12. Analyze Mode

xboard supports analyzing fresh games, edited positions, and games from files. However, all of these look the same from the chess engine's perspective. Basically, the engine just has to respond to the "analyze" command. Beginning in protocol version 2, if your engine does not support analyze mode, it should use the feature command to set analyze=0. The older method of printing the error message "Error (unknown command): analyze" in response to the "analyze" command will also work, however.

To enter analyze mode, xboard sends the command sequence "post", "analyze". Analyze mode in your engine should be similar to force mode, except that your engine thinks about what move it would make next if it were on move. Your engine should accept the following commands while in analyze mode:

  • Any legal move, as in force mode
  • undo   Back up one move and analyze previous position.
  • new   Reset position to start of game but stay in analyze mode.
  • setboard if you have set feature setboard=1; otherwise edit. Exiting edit mode returns to analyze mode.
  • exit   Leave analyze mode.
  • .   Send a search status update (optional); see below.
  • bk   Show book moves from this position, if any; see above.
  • hint   Show the predicted move from this position, if any; see above.

If the user selects "Periodic Updates", xboard will send the string ".\n" to the chess engine periodically during analyze mode, unless the last PV received began with a '(' character.

The chess engine should respond to ".\n" with a line like this:

stat01: time nodes ply mvleft mvtot mvname

Where:

timeElapsed search time in centiseconds (ie: 567 = 5.67 seconds).
nodesNodes searched so far.
plySearch depth so far.
mvleftNumber of moves left to consider at this depth.
mvtotTotal number of moves to consider.
mvnameMove currently being considered (SAN or coordinate notation). Optional; added in protocol version 2.

Examples:

  stat01: 1234 30000 7 5 30
  stat01: 1234 30000 7 5 30 Nf3

Meaning:

After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a total of 30 legal moves, and I have 5 more moves to search before going to depth 8. In the second example, of the 30 legal moves, the one I am currently searching is Nf3.

Implementation of the "." command is optional. If the engine does not respond to the "." command with a "stat01..." line, xboard will stop sending "." commands. If the engine does not implement this command, the analysis window will use a shortened format to display the engine info.

To give the user some extra information, the chess engine can output the strings "++\n" and "--\n", to indicate that the current search is failing high or low, respectively. You don't have to send anything else to say "Okay, I'm not failing high/low anymore." xboard will figure this out itself.

13. Idioms and backward compatibility features

Some engines have variant interpretations of the force/go/white/black, time/otim, and hard/easy command sets. In order to accommodate these older engines, xboard uses these commands only according to the stylized patterns ("idioms") given in this section. The obsolete white and black commands have historically been particularly troublesome, and it is recommended that new engines set the feature colors=0 and/or ignore the commands.

time N
otim N
MOVE
Sent when the opponent makes a move and the engine is already playing the opposite color.
white
go
Sent when the engine is in force mode or playing Black but should switch to playing White. This sequence is sent only when White is already on move. If you set the feature colors=0, "white" is not sent.
black
go
Sent when the engine is in force mode or playing White but should switch to playing Black. This sequence is sent only when Black is already on move. If you set the feature colors=0, "black" is not sent.
white
time N
otim N
black
go
Sent when Black is on move, the engine is in force mode or playing White, and the engine's clock needs to be updated before it starts playing. The initial "white" is a kludge to accommodate GNU Chess 4's variant interpretation of these commands. If you set the feature colors=0, "white" and "black" are not sent.
black
time N
otim N
white
go
Sent when White is on move, the engine is in force mode or playing Black, and the engine's clock needs to be updated before it starts playing. See previous idiom. The initial "black" is a kludge to accommodate GNU Chess 4's variant interpretation of these commands. If you set the feature colors=0, "black" and "white" are not sent.
hard
easy
Sent in sequence to turn off pondering if xboard is not sure whether it is on. When xboard is sure, it will send "hard" or "easy" alone. xboard does this because "easy" is a toggle in GNU Chess 4 but "hard" is an absolute on.

To support older engines, certain additional commands from the engine to xboard are also recognized. (These are commands by themselves, not values to be placed in the comment field of the PGN result code.) These forms are not recommended for new engines; use the PGN result code commands or the resign command instead.

Command Interpreted as
White resigns 0-1 {White resigns}
Black resigns 1-0 {Black resigns}
White 1-0 {White mates}
Black 0-1 {Black mates}
Draw 1/2-1/2 {Draw}
computer mates 1-0 {White mates} or 0-1 {Black mates}
opponent mates 1-0 {White mates} or 0-1 {Black mates}
computer resigns 0-1 {White resigns} or 1-0 {Black resigns}
game is a draw 1/2-1/2 {Draw}
checkmate 1-0 {White mates} or 0-1 {Black mates}

Commands in the above table are recognized if they begin a line and arbitrary characters follow, so (for example) "White mates" will be recognized as "White", and "game is a draw by the 50 move rule" will be recognized as "game is a draw". All the commands are case-sensitive.

An alternative move syntax is also recognized:

Command Interpreted as
NUMBER ... MOVE move MOVE

Here NUMBER means any string of decimal digits, optionally ending in a period. MOVE is any string containing no whitespace. In this command format, xboard requires the "..." even if your engine is playing White. A command of the form NUMBER MOVE will be ignored. This odd treatment of the commands is needed for compatibility with gnuchessx. The original reasons for it are lost in the mists of time, but I suspect it was originally a bug in the earliest versions of xboard, before I started working on it, which someone "fixed" in the wrong way, by creating a special version of gnuchess (gnuchessx) instead of changing xboard.

Any line that contains the words "offer" and "draw" is recognized as "offer draw".

The "Illegal move" message is recognized even if spelled "illegal move" and even if the colon (":") is omitted. This accommodates GNU Chess 4, which prints messages like "Illegal move (no matching move)e2e4", and old versions of Crafty, which print just "illegal move".

In Zippy mode, for compatibility with older versions of Crafty, xboard passes through to ICS any line that begins "kibitz", "whisper", "tell", or "draw". Do not use this feature in new code. Instead, use the commands "tellall", "tellothers", "tellopponent", "tellics" (if needed), "1/2-1/2 {COMMENT}", or "offer draw", as appropriate.

If the engine responds to the "sd DEPTH" command with an error message indicating the command is not supported (such as "Illegal move: sd"), xboard sets an internal flag and subsequently uses the command "depth\nDEPTH" instead, for the benefit of GNU Chess 4. Note the newline in the middle of this command! New engines should not rely on this feature.

If the engine responds to the "st TIME" command with an error message indicating the command is not supported (such as "Illegal move: st"), xboard sets an internal flag and subsequently uses the command "level 1 TIME" instead, for the benefit of GNU Chess 4. Note that this is not a standard use of the level command, as TIME seconds are not added after each player makes 1 move; rather, each move is made in at most TIME seconds. New engines should not implement or rely on this feature.

In support of the -firstHost/-secondHost features, which allow a chess engine to be run on another machine using the rsh protocol, xboard recognizes error messages that are likely to come from rsh as fatal errors. The following messages are currently recognized:

  • unknown host
  • No remote directory
  • not found
  • No such file
  • can't alloc
  • Permission denied

ChessBase/Fritz now implements the xboard/winboard protocol and can use WinBoard-compatible engines in its GUI. ChessBase's version of the protocol is generally the same as version 1, except that they have added the commands fritz, reset, and ponder, and the edit subcommands castle and ep. If you want your engine to work well with the ChessBase/Fritz GUI, you may need to implement these additional commands, and you should also be aware of the peculiar way that ChessBase uses the protocol. See their web page for documentation.

ChessMaster 8000 also implements version 1 of the xboard/winboard protocol and can use WinBoard-compatible engines. The original release of CM8000 also has one additional restriction: only pure coordinate notation (e.g., e2e4) is accepted in the move command. A patch to correct this should be available from The Learning Company (makers of CM8000) in February 2001.

xboard-4.7.3/config.sub0000755000175000001440000010530112247021262011702 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: xboard-4.7.3/zippy.c0000644000175000001440000011221112262415351011237 00000000000000/* * zippy.c -- Implements Zippy the Pinhead chess player on ICS in XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #define HI "hlelo " #if HAVE_UNISTD_H # include #endif #include "common.h" #include "zippy.h" #include "frontend.h" #include "backend.h" #include "backendz.h" char *SendMoveToBookUser P((int nr, ChessProgramState *cps, int initial)); // [HGM] book void HandleMachineMove P((char *message, ChessProgramState *cps)); static char zippyPartner[MSG_SIZ]; static char zippyLastOpp[MSG_SIZ]; static char zippyOffender[MSG_SIZ]; // [HGM] aborter static int zippyConsecGames; static time_t zippyLastGameEnd; extern void mysrandom(unsigned int seed); extern int myrandom(void); void ZippyInit () { char *p; /* Get name of Zippy lines file */ p = getenv("ZIPPYLINES"); if (p != NULL) { appData.zippyLines = p; } /* Get word that Zippy thinks is insulting */ p = getenv("ZIPPYPINHEAD"); if (p != NULL) { appData.zippyPinhead = p; } /* What password is used for remote control? */ p = getenv("ZIPPYPASSWORD"); if (p != NULL) { appData.zippyPassword = p; } /* What password is used for remote commands to gnuchess? */ p = getenv("ZIPPYPASSWORD2"); if (p != NULL) { appData.zippyPassword2 = p; } /* Joke feature for people who try an old password */ p = getenv("ZIPPYWRONGPASSWORD"); if (p != NULL) { appData.zippyWrongPassword = p; } /* While testing, I want to accept challenges from only one person (namely, my "anonymous" account), so I set an environment variable ZIPPYACCEPTONLY. */ p = getenv("ZIPPYACCEPTONLY"); if ( p != NULL ) { appData.zippyAcceptOnly = p; } /* Should Zippy use "i" command? */ /* Defaults to 1=true */ p = getenv("ZIPPYUSEI"); if (p != NULL) { appData.zippyUseI = atoi(p); } /* How does Zippy handle bughouse partnering? */ /* 0=say we can't play, 1=manual partnering, 2=auto partnering */ p = getenv("ZIPPYBUGHOUSE"); if (p != NULL) { appData.zippyBughouse = atoi(p); } /* Does Zippy abort games with Crafty? */ /* Defaults to 0=false */ p = getenv("ZIPPYNOPLAYCRAFTY"); if (p != NULL) { appData.zippyNoplayCrafty = atoi(p); } /* What ICS command does Zippy send at game end? Default: "gameend". */ p = getenv("ZIPPYGAMEEND"); if (p != NULL) { appData.zippyGameEnd = p; } /* What ICS command does Zippy send at game start? Default: none. */ p = getenv("ZIPPYGAMESTART"); if (p != NULL) { appData.zippyGameStart = p; } /* Should Zippy accept adjourns? */ /* Defaults to 0=false */ p = getenv("ZIPPYADJOURN"); if (p != NULL) { appData.zippyAdjourn = atoi(p); } /* Should Zippy accept aborts? */ /* Defaults to 0=false */ p = getenv("ZIPPYABORT"); if (p != NULL) { appData.zippyAbort = atoi(p); } /* Should Zippy play chess variants (besides bughouse)? */ p = getenv("ZIPPYVARIANTS"); if (p != NULL) { appData.zippyVariants = p; } ASSIGN(first.variants, appData.zippyVariants); srandom(time(NULL)); } /* * Routines to implement Zippy talking */ char *swifties[] = { "i acclaims:", "i admonishes:", "i advertises:", "i advises:", "i advocates:", "i affirms:", "i alleges:", "i anathematizes:", "i animadverts:", "i announces:", "i apostrophizes:", "i appeals:", "i applauds:", "i approves:", "i argues:", "i articulates:", "i asserts:", "i asseverates:", "i attests:", "i avers:", "i avows:", "i baas:", "i babbles:", "i banters:", "i barks:", "i bawls:", "i bays:", "i begs:", "i belches:", "i bellows:", "i belts out:", "i berates:", "i beshrews:", "i blabbers:", "i blabs:", "i blares:", "i blasphemes:", "i blasts:", "i blathers:", "i bleats:", "i blithers:", "i blubbers:", "i blurts out:", "i blusters:", "i boasts:", "i brags:", "i brays:", "i broadcasts:", "i burbles:", "i buzzes:", "i cachinnates:", "i cackles:", "i caterwauls:", "i calumniates:", "i caws:", "i censures:", "i chants:", "i chatters:", "i cheeps:", "i cheers:", "i chides:", "i chins:", "i chirps:", "i chortles:", "i chuckles:", "i claims:", "i clamors:", "i clucks:", "i commands:", "i commends:", "i comments:", "i commiserates:", "i communicates:", "i complains:", "i concludes:", "i confabulates:", "i confesses:", "i coos:", "i coughs:", "i counsels:", "i cries:", "i croaks:", "i crows:", "i curses:", "i daydreams:", "i debates:", "i declaims:", "i declares:", "i delivers:", "i denounces:", "i deposes:", "i directs:", "i discloses:", "i disparages:", "i discourses:", "i divulges:", "i documents:", "i drawls:", "i dreams:", "i drivels:", "i drones:", "i effuses:", /*"i ejaculates:",*/ "i elucidates:", "i emotes:", "i endorses:", "i enthuses:", "i entreats:", "i enunciates:", "i eulogizes:", "i exclaims:", "i execrates:", "i exhorts:", "i expatiates:", "i explains:", "i explicates:", "i explodes:", "i exposes:", "i exposits:", "i expostulates: ", "i expounds:", "i expresses:", "i extols:", "i exults:", "i fantasizes:", "i fibs:", "i filibusters:", "i flatters:", "i flutes:", "i fools:", "i free-associates:", "i fulminates:", "i gabbles:", "i gabs:", "i gasps:", "i giggles:", "i gossips:", "i gripes:", "i groans:", "i growls:", "i grunts:", "i guesses:", "i guffaws:", "i gushes:", "i hails:", "i hallucinates:", "i harangues:", "i harmonizes:", "i hectors:", "i hints:", "i hisses:", "i hollers:", "i honks:", "i hoots:", "i hosannas:", "i howls:", "i hums:", "i hypothecates:", "i hypothesizes:", "i imagines:", "i implies:", "i implores:", "i imprecates:", "i indicates:", "i infers:", "i informs everyone:", "i instructs:", "i interjects:", "i interposes:", "i intimates:", "i intones:", "i introspects:", "i inveighs:", "i jabbers:", "i japes:", "i jests:", "i jibes:", "i jives:", "i jokes:", "i joshes:", "i keens:", "i laments:", "i lauds:", "i laughs:", "i lectures:", "i lies:", "i lilts:", "i lisps:", "i maintains:", "i maledicts:", "i maunders:", "i meows:", "i mewls:", "i mimes:", "i minces:", "i moans:", "i moos:", "i mourns:", "i mouths:", "i mumbles:", "i murmurs:", "i muses:", "i mutters:", "i nags:", "i natters:", "i neighs:", "i notes:", "i nuncupates:", "i objurgates:", "i observes:", "i offers:", "i oinks:", "i opines:", "i orates:", "i orders:", "i panegyrizes:", "i pantomimes:", "i pants:", "i peals:", "i peeps:", "i perorates:", "i persuades:", "i petitions:", "i phonates:", "i pipes up:", "i pitches:", "i pleads:", "i points out:", "i pontificates:", "i postulates:", "i praises:", "i prates:", "i prattles:", "i preaches:", "i prescribes:", "i prevaricates:", "i proclaims:", "i projects:", "i pronounces:", "i proposes:", "i proscribes:", "i quacks:", "i queries:", "i questions:", "i quips:", "i quotes:", "i rages:", "i rambles:", "i rants:", "i raps:", "i rasps:", "i rattles:", "i raves:", "i reacts:", "i recites:", "i recommends:", "i records:", "i reiterates:", "i rejoins:", "i releases:", "i remarks:", "i reminisces:", "i remonstrates:", "i repeats:", "i replies:", "i reports:", "i reprimands:", "i reproaches:", "i reproves:", "i resounds:", "i responds:", "i retorts:", "i reveals:", "i reviles:", "i roars:", "i rumbles:", "i sanctions:", "i satirizes:", "i sauces:", "i scolds:", "i screams:", "i screeches:", "i semaphores:", "i sends:", "i sermonizes:", "i shrieks:", "i sibilates:", "i sighs:", "i signals:", "i signifies:", "i signs:", "i sings:", "i slurs:", "i snaps:", "i snarls:", "i sneezes:", "i snickers:", "i sniggers:", "i snivels:", "i snores:", "i snorts:", "i sobs:", "i soliloquizes:", "i sounds off:", "i sounds out:", "i speaks:", "i spews:", "i spits out:", "i splutters:", "i spoofs:", "i spouts:", "i sputters:", "i squalls:", "i squawks:", "i squeaks:", "i squeals:", "i stammers:", "i states:", "i stresses:", "i stutters:", "i submits:", "i suggests:", "i summarizes:", "i sums up:", "i swears:", "i talks:", "i tattles:", "i teases:", "i telegraphs:", "i testifies:", "i threatens:", "i thunders:", "i titters:", "i tongue-lashes:", "i toots:", "i transcribes:", "i transmits:", "i trills:", "i trumpets:", "i twaddles:", "i tweets:", "i twitters:", "i types:", "i upbraids:", "i urges:", "i utters:", "i ventures:", "i vibrates:", "i vilifies:", "i vituperates:", "i vocalizes:", "i vociferates:", "i voices:", "i waffles:", "i wails:", "i warbles:", "i warns:", "i weeps:", "i wheezes:", "i whimpers:", "i whines:", "i whinnies:", "i whistles:", "i wisecracks:", "i witnesses:", "i woofs:", "i writes:", "i yammers:", "i yawps:", "i yells:", "i yelps:", "i yodels:", "i yowls:", "i zings:", }; #define MAX_SPEECH 250 void Speak (char *how, char *whom) { static FILE *zipfile = NULL; static struct stat zipstat; char zipbuf[MAX_SPEECH + 1]; static time_t lastShout = 0; time_t now; char *p; int c, speechlen; if (strcmp(how, "shout") == 0) { now = time((time_t *) NULL); if (now - lastShout < 1*60) return; lastShout = now; if (appData.zippyUseI) { how = swifties[(unsigned) random() % (sizeof(swifties)/sizeof(char *))]; } } if (zipfile == NULL) { zipfile = fopen(appData.zippyLines, "r"); if (zipfile == NULL) { DisplayFatalError("Can't open Zippy lines file", errno, 1); return; } fstat(fileno(zipfile), &zipstat); } for (;;) { fseek(zipfile, (unsigned) random() % zipstat.st_size, 0); do { c = getc(zipfile); } while (c != NULLCHAR && c != '^' && c != EOF); if (c == EOF) continue; while ((c = getc(zipfile)) == '\n') ; if (c == EOF) continue; break; } /* Don't use ics_prefix; we need to let FICS expand the alias i -> it, but use the real command "i" on ICC */ safeStrCpy(zipbuf, how, sizeof(zipbuf)/sizeof(zipbuf[0])); strcat(zipbuf, " "); if (whom != NULL) { strcat(zipbuf, whom); strcat(zipbuf, " "); } speechlen = strlen(zipbuf); p = zipbuf + speechlen; while (++speechlen < MAX_SPEECH) { if (c == NULLCHAR || c == '^') { *p++ = '\n'; *p = '\0'; SendToICS(zipbuf); return; } else if (c == '\n') { *p++ = ' '; do { c = getc(zipfile); } while (c == ' '); } else if (c == EOF) { break; } else { *p++ = c; c = getc(zipfile); } } /* Tried to say something too long, or junk at the end of the file. Try something else. */ Speak(how, whom); /* tail recursion */ } int ZippyCalled (char *str) { return ics_handle[0] != NULLCHAR && StrCaseStr(str, ics_handle) != NULL; } static char opp_name[128][32]; static int num_opps=0; extern ColorClass curColor; static void SetCurColor (ColorClass color) { curColor = color; } static void ColorizeEx (ColorClass color, int cont) { if( appData.colorize ) { Colorize( color, cont ); SetCurColor( color ); } } int ZippyControl (char *buf, int *i) { char *player, *p; char reply[MSG_SIZ]; /* Possibly reject Crafty as opponent */ if (appData.zippyPlay && appData.zippyNoplayCrafty && forwardMostMove < 4 && looking_at(buf, i, "* kibitzes: Hello from Crafty")) { player = StripHighlightAndTitle(star_match[0]); if ((gameMode == IcsPlayingWhite && StrCaseCmp(player, gameInfo.black) == 0) || (gameMode == IcsPlayingBlack && StrCaseCmp(player, gameInfo.white) == 0)) { snprintf(reply, MSG_SIZ, "%ssay This computer does not play Crafty clones\n%sabort\n%s+noplay %s\n", ics_prefix, ics_prefix, ics_prefix, player); SendToICS(reply); } return TRUE; } /* If this is a computer, save the name. Then later, once the */ /* game is really started, we will send the "computer" notice to */ /* the engine. */ if (appData.zippyPlay && looking_at(buf, i, "* is in the computer list")) { int i; for (i=0;i= num_opps) safeStrCpy(opp_name[num_opps++],star_match[0], sizeof(opp_name[num_opps])/sizeof(opp_name[num_opps][0])); } if (appData.zippyPlay && looking_at(buf, i, "* * is a computer *")) { int i; for (i=0;i= num_opps) safeStrCpy(opp_name[num_opps++],star_match[1], sizeof(opp_name[num_opps])/sizeof(opp_name[num_opps][0])); } /* Tells and says */ if (appData.zippyPlay && (looking_at(buf, i, "* offers to be your bughouse partner") || looking_at(buf, i, "* tells you: [automatic message] I chose you"))) { player = StripHighlightAndTitle(star_match[0]); if (appData.zippyBughouse > 1 && first.initDone) { snprintf(reply, MSG_SIZ,"%spartner %s\n", ics_prefix, player); SendToICS(reply); if (strcmp(zippyPartner, player) != 0) { safeStrCpy(zippyPartner, player, sizeof(zippyPartner)/sizeof(zippyPartner[0])); SendToProgram(reply + strlen(ics_prefix), &first); } } else if (appData.zippyBughouse > 0) { snprintf(reply, MSG_SIZ, "%sdecline %s\n", ics_prefix, player); SendToICS(reply); } else { snprintf(reply, MSG_SIZ, "%stell %s This computer cannot play bughouse\n", ics_prefix, player); SendToICS(reply); } return TRUE; } if (appData.zippyPlay && appData.zippyBughouse && first.initDone && looking_at(buf, i, "* agrees to be your partner")) { player = StripHighlightAndTitle(star_match[0]); snprintf(reply, MSG_SIZ, "partner %s\n", player); if (strcmp(zippyPartner, player) != 0) { safeStrCpy(zippyPartner, player, sizeof(zippyPartner)/sizeof(zippyPartner[0])); SendToProgram(reply, &first); } return TRUE; } if (appData.zippyPlay && appData.zippyBughouse && first.initDone && (looking_at(buf, i, "are no longer *'s partner") || looking_at(buf, i, "* tells you: [automatic message] I'm no longer your"))) { player = StripHighlightAndTitle(star_match[0]); if (strcmp(zippyPartner, player) == 0) { zippyPartner[0] = NULLCHAR; SendToProgram("partner\n", &first); } return TRUE; } if (appData.zippyPlay && appData.zippyBughouse && first.initDone && (looking_at(buf, i, "no longer have a bughouse partner") || looking_at(buf, i, "partner has disconnected") || looking_at(buf, i, "partner has just chosen a new partner"))) { zippyPartner[0] = NULLCHAR; SendToProgram("partner\n", &first); return TRUE; } if (appData.zippyPlay && appData.zippyBughouse && first.initDone && looking_at(buf, i, "* (your partner) tells you: *")) { /* This pattern works on FICS but not ICC */ player = StripHighlightAndTitle(star_match[0]); if (strcmp(zippyPartner, player) != 0) { safeStrCpy(zippyPartner, player, sizeof(zippyPartner)/sizeof(zippyPartner[0])); snprintf(reply, MSG_SIZ, "partner %s\n", player); SendToProgram(reply, &first); } snprintf(reply, MSG_SIZ, "ptell %s\n", star_match[1]); SendToProgram(reply, &first); return TRUE; } if (looking_at(buf, i, "* tells you: *") || looking_at(buf, i, "* says: *")) { player = StripHighlightAndTitle(star_match[0]); if (appData.zippyPassword[0] != NULLCHAR && strncmp(star_match[1], appData.zippyPassword, strlen(appData.zippyPassword)) == 0) { p = star_match[1] + strlen(appData.zippyPassword); while (*p == ' ') p++; SendToICS(p); SendToICS("\n"); } else if (appData.zippyPassword2[0] != NULLCHAR && first.initDone && strncmp(star_match[1], appData.zippyPassword2, strlen(appData.zippyPassword2)) == 0) { p = star_match[1] + strlen(appData.zippyPassword2); while (*p == ' ') p++; SendToProgram(p, &first); SendToProgram("\n", &first); } else if (appData.zippyWrongPassword[0] != NULLCHAR && strncmp(star_match[1], appData.zippyWrongPassword, strlen(appData.zippyWrongPassword)) == 0) { p = star_match[1] + strlen(appData.zippyWrongPassword); while (*p == ' ') p++; snprintf(reply, MSG_SIZ, "wrong %s\n", player); SendToICS(reply); } else if (appData.zippyBughouse && first.initDone && strcmp(player, zippyPartner) == 0) { SendToProgram("ptell ", &first); SendToProgram(star_match[1], &first); SendToProgram("\n", &first); } else if (strncmp(star_match[1], HI, 6) == 0) { extern char* programVersion; snprintf(reply, MSG_SIZ, "%stell %s %s\n", ics_prefix, player, programVersion); SendToICS(reply); } else if (strncmp(star_match[1], "W0W!! ", 6) == 0) { extern char* programVersion; snprintf(reply, MSG_SIZ, "%stell %s %s\n", ics_prefix, player, programVersion); SendToICS(reply); } else if (appData.zippyTalk && (((unsigned) random() % 10) < 9)) { if (strcmp(player, ics_handle) != 0) { Speak("tell", player); } } ColorizeEx( ColorTell, FALSE ); return TRUE; } if( appData.colorize && looking_at(buf, i, "* (*) seeking") ) { ColorizeEx(ColorSeek, FALSE); return FALSE; } if (looking_at(buf, i, "* spoofs you:")) { player = StripHighlightAndTitle(star_match[0]); snprintf(reply, MSG_SIZ, "spoofedby %s\n", player); SendToICS(reply); } return FALSE; } int ZippyConverse(char *buf, int *i) { static char lastgreet[MSG_SIZ]; char reply[MSG_SIZ]; int oldi; /* Shouts and emotes */ if (looking_at(buf, i, "--> * *") || looking_at(buf, i, "* shouts: *")) { if (appData.zippyTalk) { char *player = StripHighlightAndTitle(star_match[0]); if (strcmp(player, ics_handle) == 0) { return TRUE; } else if (appData.zippyPinhead[0] != NULLCHAR && StrCaseStr(star_match[1], appData.zippyPinhead) != NULL) { snprintf(reply, MSG_SIZ, "insult %s\n", player); SendToICS(reply); } else if (ZippyCalled(star_match[1])) { Speak("shout", NULL); } } ColorizeEx(ColorShout, FALSE); return TRUE; } if (looking_at(buf, i, "* kibitzes: *")) { if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { char *player = StripHighlightAndTitle(star_match[0]); if (strcmp(player, ics_handle) != 0) { Speak("kibitz", NULL); } } ColorizeEx(ColorKibitz, FALSE); return TRUE; } if (looking_at(buf, i, "* whispers: *")) { if (appData.zippyTalk && ((unsigned) random() % 10) < 9) { char *player = StripHighlightAndTitle(star_match[0]); if (strcmp(player, ics_handle) != 0) { Speak("whisper", NULL); } } ColorizeEx(ColorKibitz, FALSE); return TRUE; } /* Messages */ if ((looking_at(buf, i, ". * (*:*): *") && isdigit(star_match[1][0])) || looking_at(buf, i, ". * at *:*: *")) { if (appData.zippyTalk) { FILE *f; char *player = StripHighlightAndTitle(star_match[0]); if (strcmp(player, ics_handle) != 0) { if (((unsigned) random() % 10) < 9) Speak("message", player); f = fopen("zippy.messagelog", "a"); fprintf(f, "%s (%s:%s): %s\n", player, star_match[1], star_match[2], star_match[3]); fclose(f); } } return TRUE; } /* Channel tells */ oldi = *i; if (looking_at(buf, i, "*(*: *")) { char *channel; if (star_match[0][0] == NULLCHAR || strchr(star_match[0], ' ') || strchr(star_match[1], ' ')) { /* Oops, did not want to match this; probably a message */ *i = oldi; return FALSE; } if (appData.zippyTalk) { channel = strrchr(star_match[1], '('); if (channel == NULL) { channel = star_match[1]; } else { channel++; } channel[strlen(channel)-1] = NULLCHAR; /* Tell to the channel only if someone mentions our name */ if (ZippyCalled(star_match[2])) { Speak("tell", channel); } ColorizeEx( atoi(channel) == 1 ? ColorChannel1 : ColorChannel, FALSE ); } return TRUE; } if (!appData.zippyTalk) return FALSE; if ((looking_at(buf, i, "You have * message") && atoi(star_match[0]) != 0) || looking_at(buf, i, "* has left a message for you") || looking_at(buf, i, "* just sent you a message")) { snprintf(reply, MSG_SIZ, "%smessages\n%sclearmessages *\n", ics_prefix, ics_prefix); SendToICS(reply); return TRUE; } if (looking_at(buf, i, "Notification: * has arrived")) { if (((unsigned) random() % 3) == 0) { char *player = StripHighlightAndTitle(star_match[0]); safeStrCpy(lastgreet, player, sizeof(lastgreet)/sizeof(lastgreet[0])); snprintf(reply, MSG_SIZ, "greet %s\n", player); SendToICS(reply); Speak("tell", player); } } if (looking_at(buf, i, "Notification: * has departed")) { if (((unsigned) random() % 3) == 0) { char *player = StripHighlightAndTitle(star_match[0]); snprintf(reply, MSG_SIZ, "farewell %s\n", player); SendToICS(reply); } } if (looking_at(buf, i, "Not sent -- * is censoring you")) { char *player = StripHighlightAndTitle(star_match[0]); if (strcmp(player, lastgreet) == 0) { snprintf(reply, MSG_SIZ, "%s-notify %s\n", ics_prefix, player); SendToICS(reply); } } if (looking_at(buf, i, "command is currently turned off")) { appData.zippyUseI = 0; } return FALSE; } void ZippyGameStart (char *white, char* black) { if (!first.initDone) { /* Game is starting prematurely. We can't deal with this */ SendToICS(ics_prefix); SendToICS("abort\n"); SendToICS(ics_prefix); SendToICS("say Sorry, the chess program is not initialized yet.\n"); return; } if (appData.zippyGameStart[0] != NULLCHAR) { SendToICS(appData.zippyGameStart); SendToICS("\n"); } } void ZippyGameEnd (ChessMove result, char *resultDetails) { if (appData.zippyAcceptOnly[0] == NULLCHAR && appData.zippyGameEnd[0] != NULLCHAR) { SendToICS(appData.zippyGameEnd); SendToICS("\n"); } zippyLastGameEnd = time(0); if(forwardMostMove < appData.zippyShortGame) safeStrCpy(zippyOffender, zippyLastOpp, sizeof(zippyOffender)/sizeof(zippyOffender[0])); else zippyOffender[0] = 0; // [HGM] aborter } /* * Routines to implement Zippy playing chess */ void ZippyHandleChallenge (char *srated, char *swild, char *sbase, char *sincrement, char *opponent) { char buf[MSG_SIZ]; int i=0; VariantClass variant; char *varname; variant = StringToVariant(swild); varname = VariantName(variant); /* [DM] If icsAnalyzeEngine active we don't accept automatic games */ if (appData.icsActive && appData.icsEngineAnalyze) return; /* If desired, you can insert more code here to decline matches based on rated, variant, base, and increment, but it is easier to use the ICS formula feature instead. */ if (variant == VariantLoadable) { snprintf(buf, MSG_SIZ, "%stell %s This computer can't play wild type %s\n%sdecline %s\n", ics_prefix, opponent, swild, ics_prefix, opponent); SendToICS(buf); return; } if (StrStr(appData.zippyVariants, varname) == NULL || ((i=first.protocolVersion) != 1 && StrStr(first.variants, varname) == NULL) /* [HGM] zippyvar */ ) { snprintf(buf, MSG_SIZ, "%stell %s This computer can't play %s [%s], only %s\n%sdecline %s\n", ics_prefix, opponent, swild, varname, i ? first.variants : appData.zippyVariants, /* [HGM] zippyvar */ ics_prefix, opponent); SendToICS(buf); return; } /* Are we blocking match requests from all but one person? */ if (appData.zippyAcceptOnly[0] != NULLCHAR && StrCaseCmp(opponent, appData.zippyAcceptOnly)) { /* Yes, and this isn't him. Ignore challenge. */ return; } /* Too many consecutive games with same opponent? If so, make him wait until someone else has played or a timeout has elapsed. */ if (appData.zippyMaxGames && strcmp(opponent, zippyLastOpp) == 0 && zippyConsecGames >= appData.zippyMaxGames && difftime(time(0), zippyLastGameEnd) < appData.zippyReplayTimeout) { snprintf(buf, MSG_SIZ, "%stell %s Sorry, you have just played %d consecutive games against %s. To give others a chance, please wait %d seconds or until someone else has played.\n%sdecline %s\n", ics_prefix, opponent, zippyConsecGames, ics_handle, appData.zippyReplayTimeout, ics_prefix, opponent); SendToICS(buf); return; } /* [HGM] aborter: opponent is cheater that aborts games he doesn't like on first move. Make him wait */ if (strcmp(opponent, zippyOffender) == 0 && difftime(time(0), zippyLastGameEnd) < appData.zippyReplayTimeout) { snprintf(buf, MSG_SIZ, "%stell %s Sorry, your previous game against %s was rather short. " " It will wait %d seconds to see if a tougher opponent comes along.\n%sdecline %s\n", ics_prefix, opponent, ics_handle, appData.zippyReplayTimeout, ics_prefix, opponent); SendToICS(buf); return; } /* Engine not yet initialized or still thinking about last game? */ if (!first.initDone || first.lastPing != first.lastPong) { snprintf(buf, MSG_SIZ, "%stell %s I'm not quite ready for a new game yet; try again soon.\n%sdecline %s\n", ics_prefix, opponent, ics_prefix, opponent); SendToICS(buf); return; } snprintf(buf, MSG_SIZ, "%saccept %s\n", ics_prefix, opponent); SendToICS(buf); if (appData.zippyTalk) { Speak("tell", opponent); } } /* Accept matches */ int ZippyMatch (char *buf, int *i) { if (looking_at(buf, i, "* * match * * requested with * (*)")) { ZippyHandleChallenge(star_match[0], star_match[1], star_match[2], star_match[3], StripHighlightAndTitle(star_match[4])); return TRUE; } /* Old FICS 0-increment form */ if (looking_at(buf, i, "* * match * requested with * (*)")) { ZippyHandleChallenge(star_match[0], star_match[1], star_match[2], "0", StripHighlightAndTitle(star_match[3])); return TRUE; } if (looking_at(buf, i, "* has made an alternate proposal of * * match * *.")) { ZippyHandleChallenge(star_match[1], star_match[2], star_match[3], star_match[4], StripHighlightAndTitle(star_match[0])); return TRUE; } /* FICS wild/nonstandard forms */ if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * Loaded from *")) { /* note: star_match[2] can include "[white] " or "[black] " before our own name. */ if(star_match[8] == NULL || star_match[8][0] == 0) // [HGM] chessd: open-source ICS has file on next line ZippyHandleChallenge(star_match[4], star_match[5], star_match[6], star_match[7], StripHighlightAndTitle(star_match[0])); else ZippyHandleChallenge(star_match[4], star_match[8], star_match[6], star_match[7], StripHighlightAndTitle(star_match[0])); return TRUE; } if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * : * * Loaded from *")) { /* note: star_match[2] can include "[white] " or "[black] " before our own name. */ ZippyHandleChallenge(star_match[4], star_match[10], star_match[8], star_match[9], StripHighlightAndTitle(star_match[0])); return TRUE; } /* Regular forms */ if (looking_at(buf, i, "Challenge: * (*) *(*) * * * * : * *") | looking_at(buf, i, "Challenge: * (*) *(*) * * * * * *")) { /* note: star_match[2] can include "[white] " or "[black] " before our own name. */ ZippyHandleChallenge(star_match[4], star_match[5], star_match[8], star_match[9], StripHighlightAndTitle(star_match[0])); return TRUE; } if (looking_at(buf, i, "Challenge: * (*) *(*) * * * *")) { /* note: star_match[2] can include "[white] " or "[black] " before our own name. */ ZippyHandleChallenge(star_match[4], star_match[5], star_match[6], star_match[7], StripHighlightAndTitle(star_match[0])); return TRUE; } if (looking_at(buf, i, "Your opponent offers you a draw") || looking_at(buf, i, "* offers you a draw")) { if (first.sendDrawOffers && first.initDone) { SendToProgram("draw\n", &first); } return TRUE; } if (looking_at(buf, i, "requests that the game be aborted") || looking_at(buf, i, "would like to abort")) { if (appData.zippyAbort || (gameMode == IcsPlayingWhite && whiteTimeRemaining < 0) || (gameMode == IcsPlayingBlack && blackTimeRemaining < 0)) { SendToICS(ics_prefix); SendToICS("abort\n"); } else { SendToICS(ics_prefix); if (appData.zippyTalk) SendToICS("say Whoa no! I am having FUN!!\n"); else SendToICS("say Sorry, this computer doesn't accept aborts.\n"); } return TRUE; } if (looking_at(buf, i, "requests adjournment") || looking_at(buf, i, "would like to adjourn")) { if (appData.zippyAdjourn) { SendToICS(ics_prefix); SendToICS("adjourn\n"); } else { SendToICS(ics_prefix); if (appData.zippyTalk) SendToICS("say Whoa no! I am having FUN playing NOW!!\n"); else SendToICS("say Sorry, this computer doesn't accept adjourns.\n"); } return TRUE; } return FALSE; } /* Initialize chess program with data from the first board * of a new or resumed game. */ void ZippyFirstBoard (int moveNum, int basetime, int increment) { char buf[MSG_SIZ]; int w, b; char *opp = (gameMode==IcsPlayingWhite ? gameInfo.black : gameInfo.white); Boolean sentPos = FALSE; char *bookHit = NULL; // [HGM] book if (!first.initDone) { /* Game is starting prematurely. We can't deal with this */ SendToICS(ics_prefix); SendToICS("abort\n"); SendToICS(ics_prefix); SendToICS("say Sorry, the chess program is not initialized yet.\n"); return; } /* Send the variant command if needed */ if (gameInfo.variant != VariantNormal) { snprintf(buf, MSG_SIZ, "variant %s\n", VariantName(gameInfo.variant)); SendToProgram(buf, &first); } if ((startedFromSetupPosition && moveNum == 0) || (!appData.getMoveList && moveNum > 0)) { SendToProgram("force\n", &first); SendBoard(&first, moveNum); sentPos = TRUE; } snprintf(buf, MSG_SIZ, "level 0 %d %d\n", basetime, increment); SendToProgram(buf, &first); /* Count consecutive games from one opponent */ if (strcmp(opp, zippyLastOpp) == 0) { zippyConsecGames++; } else { zippyConsecGames = 1; safeStrCpy(zippyLastOpp, opp, sizeof(zippyLastOpp)/sizeof(zippyLastOpp[0])); } /* Send the "computer" command if the opponent is in the list we've been gathering. */ for (w=0; w= 0) ? gameInfo.whiteRating : 0; b = (gameInfo.blackRating >= 0) ? gameInfo.blackRating : 0; firstMove = FALSE; if (gameMode == IcsPlayingWhite) { if (first.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", gameInfo.black); SendToProgram(buf, &first); } safeStrCpy(ics_handle, gameInfo.white, MSG_SIZ); snprintf(buf, MSG_SIZ, "rating %d %d\n", w, b); SendToProgram(buf, &first); if (sentPos) { /* Position sent above, engine is in force mode */ if (WhiteOnMove(moveNum)) { /* Engine is on move now */ if (first.sendTime) { if (first.useColors) { SendToProgram("black\n", &first); /*gnu kludge*/ SendTimeRemaining(&first, TRUE); SendToProgram("white\n", &first); } else { SendTimeRemaining(&first, TRUE); } } bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: send go or retrieve book move } else { /* Engine's opponent is on move now */ if (first.usePlayother) { if (first.sendTime) { SendTimeRemaining(&first, TRUE); } SendToProgram("playother\n", &first); } else { /* Need to send a "go" after opponent moves */ firstMove = TRUE; } } } else { /* Position not sent above, move list might be sent later */ if (moveNum == 0) { /* No move list coming; at start of game */ if (first.sendTime) { if (first.useColors) { SendToProgram("black\n", &first); /*gnu kludge*/ SendTimeRemaining(&first, TRUE); SendToProgram("white\n", &first); } else { SendTimeRemaining(&first, TRUE); } } // SendToProgram("go\n", &first); bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: send go or retrieve book move } } } else if (gameMode == IcsPlayingBlack) { if (first.sendName) { snprintf(buf, MSG_SIZ, "name %s\n", gameInfo.white); SendToProgram(buf, &first); } safeStrCpy(ics_handle, gameInfo.black, MSG_SIZ); snprintf(buf, MSG_SIZ, "rating %d %d\n", b, w); SendToProgram(buf, &first); if (sentPos) { /* Position sent above, engine is in force mode */ if (!WhiteOnMove(moveNum)) { /* Engine is on move now */ if (first.sendTime) { if (first.useColors) { SendToProgram("white\n", &first); /*gnu kludge*/ SendTimeRemaining(&first, FALSE); SendToProgram("black\n", &first); } else { SendTimeRemaining(&first, FALSE); } } // SendToProgram("go\n", &first); bookHit = SendMoveToBookUser(forwardMostMove-1, &first, TRUE); // [HGM] book: send go or retrieve book move } else { /* Engine's opponent is on move now */ if (first.usePlayother) { if (first.sendTime) { SendTimeRemaining(&first, FALSE); } SendToProgram("playother\n", &first); } else { /* Need to send a "go" after opponent moves */ firstMove = TRUE; } } } else { /* Position not sent above, move list might be sent later */ /* Nothing needs to be done here */ } } if(bookHit) { // [HGM] book: simulate book reply static char bookMove[MSG_SIZ]; // a bit generous? programStats.depth = programStats.nodes = programStats.time = programStats.score = programStats.got_only_move = 0; sprintf(programStats.movelist, "%s (xbook)", bookHit); safeStrCpy(bookMove, "move ", sizeof(bookMove)/sizeof(bookMove[0])); strcat(bookMove, bookHit); HandleMachineMove(bookMove, &first); } } void ZippyHoldings (char *white_holding, char *black_holding, char *new_piece) { char buf[MSG_SIZ]; if (gameMode != IcsPlayingBlack && gameMode != IcsPlayingWhite) return; snprintf(buf, MSG_SIZ, "holding [%s] [%s] %s\n", white_holding, black_holding, new_piece); SendToProgram(buf, &first); } xboard-4.7.3/ngamelist.c0000644000175000001440000002536712262415351012066 00000000000000/* * ngamelist.c -- Game list window, Xt-independent front-end code for XBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include "common.h" #include "frontend.h" #include "backend.h" #include "dialogs.h" #include "menus.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif static char filterString[MSG_SIZ]; static int listLength, wins, losses, draws, page; int narrowFlag; typedef struct { short int x, y; short int w, h; FILE *fp; char *filename; char **strings; } GameListClosure; static GameListClosure *glc = NULL; static char *filterPtr; static char *list[1003]; static int listEnd; static int GameListPrepare P((int byPos, int narrow)); static void GameListReplace P((int page)); static void GL_Button P((int n)); static Option gamesOptions[] = { { 200, LR|TB, 400, NULL, (void*) list, NULL, NULL, ListBox, "" }, { 0, 0, 100, NULL, (void*) &filterPtr, "", NULL, TextBox, "" }, { 4, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("find position") }, { 2, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("narrow") }, // buttons referred to by ID in value (=first) field! { 3, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("thresholds") }, { 9, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("tags") }, { 5, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("next") }, { 6, SAME_ROW, 0, NULL, (void*) &GL_Button, NULL, NULL, Button, N_("close") }, { 0, SAME_ROW | NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } }; static void GL_Button (int n) { int index; n = gamesOptions[n].value; // use marker in option rather than n itself, for more easy adding/deletng of buttons if (n == 6) { // close PopDown(GameListDlg); return; } if (n == 3) { // thresholds LoadOptionsPopUp(GameListDlg); return; } if (n == 9) { // tags GameListOptionsPopUp(GameListDlg); return; } index = SelectedListBoxItem(&gamesOptions[0]); if (n == 7) { // load if (index < 0) { DisplayError(_("No game selected"), 0); return; } } else if (n == 5) { // next index++; if (index >= listLength || !list[index]) { DisplayError(_("Can't go forward any further"), 0); return; } HighlightWithScroll(&gamesOptions[0], index, listEnd); } else if (n == 8) { // prev index--; if (index < 0) { DisplayError(_("Can't back up any further"), 0); return; } HighlightWithScroll(&gamesOptions[0], index, listEnd); } else if (n == 2 || // narrow n == 4) { // find position char *text; GetWidgetText(&gamesOptions[1], &text); safeStrCpy(filterString, text, sizeof(filterString)/sizeof(filterString[0])); GameListPrepare(True, n == 2); GameListReplace(0); return; } index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line if (cmailMsgLoaded) { CmailLoadGame(glc->fp, index + 1, glc->filename, True); } else { LoadGame(glc->fp, index + 1, glc->filename, True); } } static int GameListCreate (char *name) { int new; if(new = GenericPopUp(gamesOptions, name, GameListDlg, BoardWindow, NONMODAL, appData.topLevel)) AddHandler(&gamesOptions[1], GameListDlg, 4), AddHandler(&gamesOptions[0], GameListDlg, 5); FocusOnWidget(&gamesOptions[0], GameListDlg); return new; } static int GameListPrepare (int byPos, int narrow) { // [HGM] filter: put in separate routine, to make callable from call-back int nstrings; ListGame *lg; char **st, *line; TimeMark t, t2; GetTimeMark(&t); if(st = glc->strings) while(*st) free(*st++); nstrings = ((ListGame *) gameList.tailPred)->number; glc->strings = (char **) malloc((nstrings + 1) * sizeof(char *)); st = glc->strings; lg = (ListGame *) gameList.head; listLength = wins = losses = draws = 0; if(byPos) InitSearch(); while (nstrings--) { int pos = -1; if(!narrow || lg->position >= 0) { // only consider already selected positions when narrowing line = GameListLine(lg->number, &lg->gameInfo); if((filterString[0] == NULLCHAR || SearchPattern( line, filterString )) && (!byPos || (pos=GameContainsPosition(glc->fp, lg)) >= 0) ) { *st++ = line; // [HGM] filter: make adding line conditional. listLength++; if( lg->gameInfo.result == WhiteWins ) wins++; else if( lg->gameInfo.result == BlackWins ) losses++; else if( lg->gameInfo.result == GameIsDrawn ) draws++; if(!byPos) pos = 0; // indicate selected } } if(lg->number % 2000 == 0) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, _("Scanning through games (%d)"), lg->number); DisplayTitle(buf); } lg->position = pos; lg = (ListGame *) lg->node.succ; } if(appData.debugMode) { GetTimeMark(&t2);printf("GameListPrepare %ld msec\n", SubtractTimeMarks(&t2,&t)); } DisplayTitle("XBoard"); *st = NULL; return listLength; } static void GameListReplace (int page) { // filter: put in separate routine, to make callable from call-back char buf[MSG_SIZ], **st=list; int i; if(page) *st++ = _("previous page"); else if(listLength > 1000) *st++ = ""; for(i=0; i<1000; i++) if( !(*st++ = glc->strings[page+i]) ) { st--; break; } listEnd = st - list; if(page + 1000 <= listLength) *st++ = _("next page"); *st = NULL; LoadListBox(&gamesOptions[0], _("no games matched your request"), -1, -1); HighlightWithScroll(&gamesOptions[0], listEnd > 1000, listEnd); snprintf(buf, MSG_SIZ, _("%s - %d/%d games (%d-%d-%d)"), glc->filename, listLength, ((ListGame *) gameList.tailPred)->number, wins, losses, draws); SetDialogTitle(GameListDlg, buf); } void GameListPopUp (FILE *fp, char *filename) { if (glc == NULL) { glc = (GameListClosure *) calloc(1, sizeof(GameListClosure)); glc->x = glc->y = -1; glc->filename = NULL; } GameListPrepare(False, False); // [HGM] filter: code put in separate routine glc->fp = fp; if (glc->filename != NULL) free(glc->filename); glc->filename = StrSave(filename); if (!GameListCreate(filename)) SetIconName(GameListDlg, filename); page = 0; GameListReplace(0); // [HGM] filter: code put in separate routine, and also called to set title MarkMenu("View.GameList", GameListDlg); } FILE * GameFile () { return glc ? glc->fp : NULL; } void GameListDestroy () { if (glc == NULL) return; PopDown(GameListDlg); if (glc->strings != NULL) { char **st; st = glc->strings; while (*st) { free(*st++); } free(glc->strings); } free(glc); glc = NULL; } void ShowGameListProc () { if (glc == NULL) { DisplayError(_("There is no game list"), 0); return; } if (shellUp[GameListDlg]) { PopDown(GameListDlg); return; } GenericPopUp(NULL, NULL, GameListDlg, BoardWindow, NONMODAL, appData.topLevel); // first two args ignored when shell exists! MarkMenu("View.GameList", GameListDlg); GameListHighlight(lastLoadGameNumber); } int GameListClicks (int direction) { int index; if (glc == NULL || listLength == 0) return 1; if(direction == 100) { FocusOnWidget(&gamesOptions[0], GameListDlg); return 1; } index = SelectedListBoxItem(&gamesOptions[0]); if (index < 0) return 1; if(page && (index == 0 && direction < 1 || direction == -4)) { page -= 1000; if(page < 0) page = 0; // safety GameListReplace(page); return 1; } if(index == 1001 && direction >= 0 || listEnd == 1001 && direction == 4) { page += 1000; GameListReplace(page); return 1; } if(direction != 0) { int doLoad = abs(direction) == 3; if(doLoad) direction /= 3; index += direction; if(direction < -1) index = 0; if(direction > 1) index = listEnd-1; if(index < 0 || index >= listEnd) return 1; HighlightWithScroll(&gamesOptions[0], index, listEnd); if(!doLoad) return 1; } index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line if (cmailMsgLoaded) { CmailLoadGame(glc->fp, index + 1, glc->filename, True); } else { LoadGame(glc->fp, index + 1, glc->filename, True); } return 0; } void SetFilter () { char *name; GetWidgetText(&gamesOptions[1], &name); safeStrCpy(filterString, name, sizeof(filterString)/sizeof(filterString[0])); GameListPrepare(False, False); GameListReplace(0); UnCaret(); // filter text-edit FocusOnWidget(&gamesOptions[0], GameListDlg); // listbox } void GameListHighlight (int index) { int i=0; char **st; if (!shellUp[GameListDlg]) return; st = list; while(*st && atoi(*st)number <= 0 ) { DisplayError(_("Game list not loaded or empty"), 0); return False; } /* Copy the list into the global memory block */ if( f != NULL ) { lg = (ListGame *) gameList.head; for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ char * st = GameListLineFull(lg->number, &lg->gameInfo); char *line = GameListLine(lg->number, &lg->gameInfo); if(filterString[0] == NULLCHAR || SearchPattern( line, filterString ) ) fprintf( f, "%s\n", st ); free(st); free(line); lg = (ListGame *) lg->node.succ; } fclose(f); return True; } return False; } xboard-4.7.3/COPYING0000644000175000001440000010451312262415351010761 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . xboard-4.7.3/gettext.h0000644000175000001440000002311212262415351011556 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009, 2011 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef XB_GETTEXT #define XB_GETTEXT /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # undef gettext # define gettext(Msgid) ((const char *) (Msgid)) # undef dgettext # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # undef dcgettext # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # undef dngettext # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # undef dcngettext # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) # undef textdomain # define textdomain(Domainname) ((const char *) (Domainname)) # undef bindtextdomain # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # undef bind_textdomain_codeset # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (translation != msg_ctxt_id) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (!(translation == msg_ctxt_id || translation == msgid_plural)) return translation; } return (n == 1 ? msgid : msgid_plural); } #endif /* XB_GETTEXT */ xboard-4.7.3/lists.h0000644000175000001440000000427512262415351011241 00000000000000/* * lists.c -- Includefile of lists.c * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* * This file could well be a part of backend.c, but I prefer it this * way. */ #ifndef XB_LISTS #define XB_LISTS /* Type definition: Node of a double linked list. */ typedef struct XB_ListNode { struct XB_ListNode *succ; struct XB_ListNode *pred; } ListNode; /* Type definition: Double linked list. * * The list structure consists of two ListNode's: The pred entry of * the head being the succ entry of the tail. Thus a list is empty * if and only if it consists of 2 nodes. :-) */ typedef struct { struct XB_ListNode *head; /* The list structure consists of two */ struct XB_ListNode *tail; /* ListNode's: The pred entry of the */ struct XB_ListNode *tailPred; /* head being the succ entry of the */ } List; /* tail. */ /* Function prototypes */ extern int ListEmpty P((List *)); void ListNew P((List *)); void ListRemove P((ListNode *)); void ListNodeFree P((ListNode *)); ListNode *ListNodeCreate P((size_t)); void ListInsert P((ListNode *, ListNode *)); void ListAddHead P((List *, ListNode *)); void ListAddTail P((List *, ListNode *)); ListNode *ListElem P((List *, int)); #endif xboard-4.7.3/ChangeLog0000644000175000001440000256154312262562252011517 00000000000000ChangeLog for XBoard/WinBoard ----------------------------- (latest entries created by git log --no-merges --pretty="%ai %an <%ae>:%n%s%n%n%b" vlast.. ) 2014-01-05 12:52:46 -0800 Arun Persaud : updated po/pot files 2014-01-05 12:51:50 -0800 Arun Persaud : new version number for release 4.7.3 2014-01-05 10:58:48 -0800 Arun Persaud : updated copyright to 2014 in menu.c 2014-01-05 10:37:56 -0800 Arun Persaud : removed .DS_Store file from git 2014-01-05 10:34:08 -0800 Arun Persaud : Updated copyright notice to 2014 2014-01-05 10:27:53 -0800 Arun Persaud : cleanup some trailing whitespaces 2013-12-29 13:46:40 +0100 H.G. Muller : Fix crash on use of dialog Browse buttons GTK The code to set a filter did not expect multiple extensions, and would cause a buffer overrun when there were. 2013-12-27 20:12:23 +0100 H.G. Muller : Make building of Windows .hlp file optional By using && and || operators in the build recipe, the building of WinBoard with Cygwin is now not aborted whe the Help Compiler is not installed. 2014-01-05 11:47:18 +0100 H.G. Muller : Use __APPLE__ compile switch for OS X It seems that on Apple machines the compiler will always define the symbol __APPLE__, so this is now used instead of OSX, which had to be defined with a -DOSX compiler flag. The gtkmacintegration header is now using <> in stead of "" in its #include. (Strange enough both were working.) 2014-01-04 12:18:30 +0100 H.G. Muller : Expand ~~/ to bundle path (OSX) DATADIR is #defined in WinBoard as "~~" to make the expansion a no-op there. Same for Linux compiles. For OS X it is #defined as a variable, obtained from GTK-OSX at startup. 2013-12-29 23:27:12 +0100 H.G. Muller : Activate ManProc in GTK 2013-12-29 22:14:06 +0100 H.G. Muller : Remove use of strndup The use of strndup was actually unsafe, as the length was passed using an ordinary strlen. strndup was not availableon OS X 10.6, and is now replaced by an ordinary strdup, which should be save enough. 2013-12-29 22:09:10 +0100 H.G. Muller : Put some OSX code into gtk version Under control of #ifdef OSX code is added to integrate the GTK front-end into OS X. This involves moving the menu bar to outside the window, and catching the signal that OS X sends to running applications when opening another instance was requested. Som files are renamed to conform to the file tree of the OS X App package. 2013-12-27 21:47:55 +0100 H.G. Muller : Cure weirdness when dragging outside of board Dragging outside the board (when people maximized the window) did not properly restore background, (leaving a trail of dragged piece). Filling the canvas with white when it is creatd cured this. The problem most likely was that unitialized cairo surfaces had transparancy, and writing back transparancy doesn't helpmuch to erase things. 2013-12-09 14:52:32 +0100 H.G. Muller : Fix sorting of lines in Engine Output Lines tat were fail-lows or fail-ighs should get the scores on the basis of wich they are sorted corrected to that of te line (for the same move) superceding them, so that other moves can rise to above them, when they score higher than the corrected score. 2013-12-05 20:08:35 +0100 H.G. Muller : Make filler variant button inactive 2013-12-05 17:50:21 +0100 H.G. Muller : Fix packing of FRC castlings The routine for packing moves to the internal database format was not working for FRC castlings, totally messing up position search for FRC and CRC. 2013-12-05 16:23:53 +0100 H.G. Muller : Fix Xaw file-browser New Directory Prevent people from using the error messages that will be printed here as directory name by pressing New Directory a second time after first pressing it with an empty or existing name. 2013-12-05 16:14:02 +0100 H.G. Muller : Widen Xaw text entries for larger square sizes Presumably people will use larger fonts if they use larger board squares. (And in any case te default fonts would be larger.) This means they need more space to see what is the current value of text options. 2013-12-05 15:47:26 +0100 H.G. Muller : Remove width limiting of shuffle checkbox 2013-11-28 13:30:40 +0100 H.G. Muller : Allow castling and e.p. to be edited in opening book 2013-09-16 22:32:32 +0200 H.G. Muller : Repair FRC A-side castling legality testing XBoard allowed A-side castling when a rook started on the a-file, and the b-file was blocked. 2013-09-16 22:27:50 +0200 H.G. Muller : Repair XBoard from node-count patch u64 was #defined in backend.h, which unfortunately was almost alwats (Not sure why WinBoard did not suffer from this!) This, and related definitions have now been moved to common.h (which is always #included first). 2013-09-15 20:13:06 +0200 H.G. Muller : WinBoard multi-monitor support A patch provided by Tim Kosse 2013-09-15 19:28:54 +0200 H.G. Muller : Fix node count range The node count was still clipped to 32 bit because one of the structs it passes through (FrontEndProgramStats) had the nodes field declared as an unsigned long. 2013-09-15 19:12:42 +0200 H.G. Muller : Fix adjudication of Giveaway stalemates The case where the side-to-move would win by stalemate was not treated in the Adjudicate switch. 2013-08-30 17:33:59 +0200 H.G. Muller : Fix buffer overflow in parser When a line ended with a comment, the parser had to read a line ahead to check if there was a PGNresult following, without being able to throw away the previous line yet. This could lead to buffer overflow in a long game where every line ended in a comment. The buffer now is cleansed of already parsed data when starting on a new syntactical unit. 2013-08-27 22:55:52 +0200 H.G. Muller : Fix -zippyVariants option Due to the change of cps->variants from (char []) to (char *), copying zippyVariants to it on behalf of v1 engines would no longer work. This is fixed by using ASSIGN() in stead of safeStrCpy(). 2013-08-26 18:25:55 +0200 H.G. Muller : Fix initial board sizing WB The initial board size was based on the assumption the board would be 8x8. This could push auxiliary windows off screen if the board was smaller, after which EnsureOnScreen would undock them and park them in the upper- right corner before the board assumed its true size. InitPos() is now called before the initial sizing to et the board format correctly, InitDrawingSizes() had to be made resitant to calling before a board size was picked for this (because InitPos() might call that too). ActivateTheme() now uses the new board size, not the previous one (as was indicated by size -2), so that -boardSize specifications inside a theme will take effect. Board size petite should not be forbidden for Shogi; all pieces exist there. 2013-08-26 14:40:57 +0200 H.G. Muller : Fix grabbing of selected piece A second static click on a selected piece should deselect it, but an attempt to drag an already selected piece should not 'bounce off'. It was already possible to move a selected piece to another square, but the dragging was not animated. This is now fixed, by only skipping the code to start dragging when the second click is part of the only-move double-click for only capture. (Before it was skipped on any second click.) 2013-08-26 13:35:47 +0200 H.G. Muller : Allow entry of negative numbers in spin control (WB) Windows numeric controls do not accept negative numbers, so in case the range of a spin option can go negative, the style ES_NUMBER should not be set on the control. 2013-08-26 11:37:27 +0200 H.G. Muller : Allow drops / promotions/ deferrals to be edited into book For no real reason only NormalMove would be accepted when parsing the list of book moves. 2013-08-26 11:28:54 +0200 H.G. Muller : Fix GUI book after setup position The routine to send move to the engine would automatically append a 'go' is a preious setboard had put the engine in force mode, but this should not happen on a book hit, where the engine should even be put in force mode if it was not yet there. 2013-07-05 18:32:46 +0200 H.G. Muller : Fix book creation Due to duplicate use of the same file pointer variable the game file would be closed before any games were read from it. 2013-05-20 11:14:01 +0200 H.G. Muller : Make PGN parser immune to unprotected time stamps The parser choked on time stamps of the form dd:dd or dd:dd:dd if one of the fields happened to be 00, because it wouldmistake that for a non-compliant king-side castling. By excluding this interpretation when the 00 is immediately preceded or followed by ':' this is now prevented. 2013-05-05 08:03:00 -0700 Arun Persaud : updated po files for new release (make distcheck) 2013-05-05 07:57:22 -0700 Arun Persaud : new version number for release 4.7.1 2013-05-05 07:53:54 -0700 Arun Persaud : updated Changelog, NEWS, etc. 2013-05-02 22:47:44 +0200 H.G. Muller : Update zippy.README It is explained how to generate multi-line commands for -zipyGameEnd. 2013-04-01 20:43:36 +0200 H.G. Muller : Fix Xaw file browser The 'next page' entry of the Xaw file browser contained a \177 character to keep at sorted at the bottom. This caused trouble for gettext. Now the sorting range is adapted so the 'next page' is never part of it. More seriously, the listbox fill code had a wrong cast when testing for an empty listbox on the first element, so that it only tested the low byte of the pointer, in stead of the entire pointer for NULLness. As a result the contents of the listboxes could suddenly disappear when even when it was non-empty, because the first filename was allocated at an unlucky address. 2013-03-22 19:23:25 +0100 H.G. Muller : Make Chat Box window obey -topLevel option It was always popping up as a dialog of the main board, covering it. One could argue it should always be to-level. 2013-03-19 13:20:24 +0100 H.G. Muller : Fix scrolling of Chat Box Seems the problem is that scroll_to_iter does not work until after some time, needed to calculate line heights. Use scroll_to_mark instead, after clumsily adding a text_mark. 2013-03-17 10:33:31 +0100 H.G. Muller : Fix GTK SetInsertPos SetInsertPos() was not yet ported to GTK, with as a result that the cursor was positioned at the start of a line recalled in the ICS Input Box, rather than at the end. The code also called SetInsertPos to force scrolling to that point in the text (which in Xaw is an automatic side effect). So for multi-line text edits this function calls ScrollToCursor(). For some reason this does not work when replacing texts in the Chat Box memo, when switching chat, although it does work in the same memo when a line is added to the existing text. 2013-03-07 21:38:43 +0100 H.G. Muller : Print score of final position in Analyze Game The score/depth of the final position of the analyed game is added (as an explicit comment) behind the PV of the forelast position. To make this work, a new 'addBraces' mode (3) had to be added to AppendComment, which suppresses stripping of the score/depth from the comment. 2013-03-12 18:50:08 +0100 H.G. Muller : Fix horrible bug in reading scores from PGN Reading scores like -0.94 flipped the sign, because the integer part -0 would read as 0, and thus was no reason for sign flipping. 2013-03-10 12:43:59 +0100 H.G. Muller : Fix disappearence of pieces that were moved illegally Dragging damages the from-square, but it is not marked as such, because selective board redraws to update highlights and such would draw the piece that is really still there, making it flash on the from-square before the position after the move is drawn. This, however, backfires when the move was illegal, as then there is no draw of a new position, and the from-square stays empty. For now this is solved by making DisplayMoveError() order a total redraw. (As this is rare, only done in case of an error, and might even throw up a pop-up, the performance cost of this is acceptable.) 2013-03-20 17:50:33 +0100 H.G. Muller : Fix quoting of book name in tourney file The argument of -polyglotBook was written to the tourney file unquoted, which effectively made it disappear if it was an empty or blank string. 2013-03-07 18:11:31 +0100 H.G. Muller : Provide compatibility with Alien Edition setup command The setup command of the Alien Edition has a board-size specifier (possibly as prefix on a parent-variant name) between pieceToCharTable and FEN. The regular version would choke on that, precluding engines designed for the Alien protocol extension to have their setup processed when running under regular XBoard. This patch makes it skip the extra info. 2013-03-07 17:52:02 +0100 H.G. Muller : Fix saving of analyzed game Anotated games after batch-mode Analyze Game were not auto-saved, because the GameEnds() call supposed to do that was called with a NULL argument for resultDetails. Now it is called with the resultDetails as pre-existing in the gameInfo, or an empty string if none exist. This bug was masked by the fact that in standard game ends (mate, etc.) the analyzing engine would declare game end and supply a message. Also makes a distinction between Analyze Game and regular Analyze mode when resuming analysis after loading a game; only the former now would trigger a batch analysis. 2013-03-07 17:48:45 +0100 H.G. Muller : Fix spurious popup after batch-mode Analyze Game A batch analysis of games was not properly terminated, because the game mode was tested after it had already been changed. No oldGameMode is tested in stead. 2013-03-02 22:21:29 +0100 H.G. Muller : Let XBoard -autoBox option also affect move type-in 2013-03-02 22:17:31 +0100 H.G. Muller : Fix GTK box popup Key values > 255 are used for PgUp, PgDown etc., so to pop up only on printables needs a two-sided test. 2013-03-01 12:50:06 +0100 H.G. Muller : Fix fatal error on unsupported board size When a board size unsupported by the engine was requested through the New Variant dialog, this was discovered while the dialog was still up, causing the error message to pop up as a child of the New Variant dialog, so that it would immediately be taken down as the latter closed. As a result it could not be confirmed, so that XBoard would not exit, and was left in a pathologic state (ignoring window-close). This is fixed by performing Reset (which detects the error) after PopDown of New Variant. 2013-03-01 12:39:40 +0100 H.G. Muller : Accept setup command for non-standard board size The code to test if board-size is standard for the current variant has been moved to a subroutine, to allow its calling when receiving a "setup" command from the engine. 2013-03-01 11:57:01 +0100 H.G. Muller : Fix buffer overflow in feature parsing String features (variants, egt, myname and option) relied on a buf[MSG_SIZ] for processing their value. The Nebiyu engine had combobox options that required more than that. All string features are now stored in allocated memory rather than in static arrays, and StringFeature allocates a buffer of sufficient size for them. Only limitation now is the low-level input buffer in the InputSource threads, whih is a static buffer of 4096 (=INPUT_SOURCE_BUF_SIZE) characters. 2013-02-27 23:44:55 +0100 H.G. Muller : Fix vertical sizing of GTK board The clipping of the boad at the bottom was due to resizing of the clock height when we first write it with a big font. This patch delays calculation of the final size until after the clock height changes. 2013-02-26 21:13:32 -0800 Arun Persaud : Updated German translation 2013-02-26 20:27:24 -0800 Arun Persaud : Updated Ukrainian translations 2013-02-26 17:59:43 +0100 H.G. Muller : Fix of argument error Oops. Pevious patch for skipping unknown multi-line arguments was still buggy. 2013-02-26 17:44:10 +0100 H.G. Muller : Let popping up of WinBoard chatbox for channel open it WinBoard now issues a +ch command for a channel when you pop up a chatbox for that channel. A work-around is added for the fact that the public FICS seems to ignore the first such command. 2013-02-26 17:27:59 +0100 H.G. Muller : Make skipping of unknown option smarter To make XBoard better resistant to the presence of disbanded or future options in its settings file, encountering those is no longer a fatal error. But the error recovery only consisted of skipping the rest of the line. This fails badly on string options with a multi-line value, which is enclosed by {braces}. We now detect that case, to skip to } instead. 2013-02-26 17:15:39 +0100 H.G. Muller : Add -backupSettingsFile option For better configurability of WinBoard, an option is added to optionally read a settings file, namely if no other settings file (other than the master file) was read so far. This can be used to import settings from a previous version, without destroying its settings file. 2013-02-26 16:55:20 +0100 H.G. Muller : Repair WinBoard compile error __GITVERSION was not defined in WinBoard, as it was only defined with a compiler flag by ./configure, which WinBoard does not use. 2013-02-26 16:47:58 +0100 H.G. Muller : Work-around for Xt selection bug In some Xt implementations calling extend-end with 0 params causes a crash, although the mmanual specifies this should default to a call with 'PRIMARY'. The default selection is now explicitly mentioned in all extend-end calls. 2013-02-24 09:31:57 -0800 Christoph Moench-Tegeder : fix bug #38401: xboard.texi doesn't build with texinfo-5.0 (tiny change) xboard-4.7.0's documentation is not buildable with texinfo-5.0, it fails with a lot of error messages from makeinfo like ./xboard.texi:1026: @itemx must follow @item makeinfo seems right, @itemx is not used as described in the texinfo manual. Attached patch puts each item of the "Options" menu in it's own @subsection and formats the description of each item as a @table as neccessary. This way, xboard builds again and the manual doesn't look too bad. 2013-02-24 09:09:54 -0800 Arun Persaud : updated po/pot files 2013-02-24 09:04:48 -0800 Arun Persaud : new version number for developer release 2013-02-20 21:28:36 +0100 H.G. Muller : Try to make life more bearable in Xaw menus The alignment still sucks, but not as much as before. 2013-02-20 19:26:17 +0100 H.G. Muller : Fix -topLevel option This option was copletely ignored, after the refactorig. 2013-02-20 18:16:00 +0100 H.G. Muller : Fix testing for valid window placement Xaw 2013-02-20 12:15:08 +0100 H.G. Muller : Suppress printing of status line in dual-board mode 2013-02-20 11:56:12 +0100 H.G. Muller : Fix sizing of slave board GTK For lack of a known method to specify a default size for Graph widgets, we have to use the same system as for the main board: create with 0x0 size, and measure the size of the outer window to determine margins. After every popup we then resize to the required board size plus these margins. (Awful...) 2013-02-20 10:08:09 +0100 H.G. Muller : Better handling of undefined window parameters Repositioning and resizing a newly created dialog was based on the width parameter of the stored sizing info being valid. Now it is separately tested if the position is valid, so that sizing and moving can be done independently. This allows us to store position info, but not size info for the slave board, so that it automatically will use the size of the main board when first opened. 2013-02-19 19:14:49 +0100 H.G. Muller : Limit debug print to debug mode 2013-02-19 19:14:00 +0100 H.G. Muller : Fix repositioning of GTK windows After 'hide' and 'show' GTK would not position the window in the same place, but center it on the parent. Now we reposition the window after 'show' based on the WindowPlacement data (if available). 2013-02-19 18:52:41 +0100 H.G. Muller : Remember window params of slave board The slave board now has been assigned a WindowPlacement, which is also saved in the settings file, through new options -slaveX/Y/W/H. 2013-02-19 17:48:39 +0100 H.G. Muller : Fix repairing of arrow damage The '2' bit in damage[][] to indicate the arrow was erroneously cleared, rather than kept. 2013-02-18 19:55:20 -0800 Arun Persaud : fix OK-response in gtk dialogs, see c7f8df124 the fix in c7f8df124 needs to be applied to both of those if cases 2013-02-18 17:11:32 -0800 Arun Persaud : removed two more translations from debug output 2013-02-18 17:09:30 -0800 Arun Persaud : fixed segfault of g_markup_printf_escaped which needs utf-8 strings defined text-domain as utf-8 solved this 2013-02-18 13:38:51 -0800 Arun Persaud : fixed gtk-warning 2013-02-18 10:06:36 -0800 Arun Persaud : removed some translation calls for messages in the debug log 2013-02-18 09:46:53 -0800 Arun Persaud : add keyboard shortcuts back into Xaw version 2013-02-17 14:13:30 -0800 Arun Persaud : in debug mode also print the git-version if available during build 2013-02-18 21:19:05 +0100 H.G. Muller : Print game-list timing messages only in debug mode 2013-02-18 21:01:35 +0100 H.G. Muller : Fix title of top-level windows 2013-02-18 18:51:44 +0100 H.G. Muller : Cure GTK warning in top-level windows There is no OK button in top-level windows, so the 'response' signal is not defined, and should not be connected. 2013-02-18 18:33:34 +0100 H.G. Muller : Fix graying of Revert menu item The new code was checkmarking it in stead of enabling it! 2013-02-18 11:38:29 +0100 H.G. Muller : Add -onlyOwnGames option This suppresses auto-saving of ICS observed games. 2013-02-18 11:17:16 +0100 H.G. Muller : Allow display of 50-move counter in zippy mode No chance it could be considered cheating there. 2013-02-18 10:48:53 +0100 H.G. Muller : Add new vertical pixel fudge With the new GTK window type the board is 13 pixels too small. 2013-02-18 10:29:17 +0100 H.G. Muller : Don't add PV moves on board clicking in AnalyzeMode Playing PV moves by right-clicking the PV was only intended for clicks in the engine Output window, selecting from multi-PV analysis output, where by default it plays only the first move. PV walkig by right-clicking the board, however, would start the walk at the end even in AnalyzeMode, and thus add the entire PV. Which is probably not useful. So adding moves in that case has now completely been suppressed, so it can be used for harmless viewing of the latest PV. The behavior has also been made subject to a persistent Boolean option -appendPV, configured to true, with a checkbox in General Options. A checkbox has also been added there for controlling the -variations option, which is now also configured to true. 2013-02-18 10:25:40 +0100 H.G. Muller : Remove checkbox for 'Move Sound' This function is better controlled from the Sounds dialog. 2013-02-18 09:59:48 +0100 H.G. Muller : Make switching between board windows absolute Selecting the window in which to draw the board when the slave board for -dualBoard was up was done by a toggle. For unknown reason this could cause a situation where the drawing took place in the other window than the intended one. The code is made more robust by explicitly specifying which window to draw in, based on the partnerUp flag. 2013-02-18 09:50:48 +0100 H.G. Muller : Warn about experimental nature of dual board The message field, which for now is unused, now contains a warning message. 2013-02-17 10:49:21 -0800 Arun Persaud : add close buttons to gtk windows use windows instead of dialogs for toplevel elements 2013-02-16 19:02:52 -0800 Arun Persaud : keyboard accelerators for both front ends. moved them out of the string definition, so that gtk can add them automatically. Also wrote a function that loads them for X11. TODO: add them again when creating X11 menu names 2013-02-15 11:03:02 -0800 Arun Persaud : added rotated shogi pieces for -flipback option and moved them to the themes directory 2013-02-14 17:27:27 -0800 Arun Persaud : add test for pkg-config exit configure in case we can't find it. 2013-02-14 13:02:08 +0100 H.G. Muller : Only perform e.p. capture if there are rights The heuristic for e.p. capture was such that any non-forward move with a Pawn to an empty square would delete the piece behind its new location (Xiangqi exempted). This is now limited to cases where EP_STATUS indicates that the deleted piece was a Pawn that performed a double-push on the previous move. (Or if there is unknown EP_STATUS.) This makes XBoard more generally suitable for use with variants that have non-conventional Pawn moves (with legality testing off). To guarantee this will not have any unexpected effects in normal Chess, this patch will only be active if legality testing is off. 2013-02-11 16:25:09 +0100 H.G. Muller : Unreserve tourney game on exit during engine load While waiting for the feature timeout we are not yet in TwoMachines mode, so quitting XBoard at that stage would not unreserve the upcoming game. A global flag 'startingEngine' similar to 'waitingForGame' now signals this condition. 2013-02-10 13:40:10 +0100 H.G. Muller : Better fix of feature timeout The previous fix of the 2nd engine's done=1 aborting the 1st engine's feature timeout by starting the game caused problems with v1 engines, or other engines that would never send done=1. It is now fixed by explicitly testing for a pending feature timeout after resurrecting the 1st engine, rather than having TwoMachinesEventIfReady wait for initDone to be set by reception of done=1. Also refrain from freezing the UI between match games, as in TwoMachines mode the UI is mostly disabled anyway. 2013-02-08 16:24:23 +0100 H.G. Muller : Connect Ctrl key in WinBoard The Control key is now checked during move entry, for excluding moves during analysis, or for copying pieces when editing a positions. But the WB front-end did not read it out yet! 2013-02-08 16:23:58 +0100 H.G. Muller : Fix Makefile for install of Xiangqi pieces 2013-02-08 15:35:44 +0100 H.G. Muller : Add Xiangqi piece images to project Let the images install in themes/xiangqi. 2013-02-08 15:14:43 +0100 H.G. Muller : Revive -flipBlack option The -flipBlack option in the cairo version is now implemented the same way as it was in XBoard, swapping white and black pieces in filpView mode. This requires a set black piece images that are the upside-down versions of the white ones. 2013-02-07 13:55:59 +0100 H.G. Muller : Remove empty-square SVG images from project 2013-02-06 19:00:35 +0100 H.G. Muller : Add desktop stuff for .xop MIME type. Icons and desktop file were missing, as was the automake code to package them. 2013-02-06 16:48:33 +0100 H.G. Muller : Update NEWS file 2013-02-06 14:48:27 +0100 H.G. Muller : Add boolean -autoBox option This option controls the automatic popup of the ICS Input Box on typing a printable character, which was annoing to some. The option can be set from the ICS Options dialog. 2013-02-06 10:56:20 +0100 H.G. Muller : Draw both coords in a1 The lower-left board square needed two inscriptions, but DrawOneSquare() only allowed one, so that the file ID would not be written. Now two strings can be passed, and when align > 1 to indicate the alignment of the top string, it is still checked if a bottom string is present as well, which then is drawn with alignment 1 (= bottom right). The rank coord or piece count can now also be double digit. 2013-02-05 23:03:42 -0800 Arun Persaud : updated po files for new release (make distcheck) 2013-02-05 23:02:07 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2013-02-05 22:52:42 -0800 Arun Persaud : new version number for release of 4.7.0 2013-02-05 11:56:10 +0100 H.G. Muller : Let initial setting of Twice checkbox reflect current state The Twice checkbox in the Tournament dialog of WinBoard was by default starting unticked. It is more convenient to have it preserve the current state, however, based on the -lpi or -lgi value. Like the auto-incremet checkbox already did. 2013-02-04 22:07:05 +0100 H.G. Muller : Put GTK warning in about-box 2013-02-04 21:59:05 +0100 H.G. Muller : Fix warnings of build server 2013-02-02 15:58:04 +0100 H.G. Muller : Fix GTK error auto-raising board The variable mainwindow is not set in the gtk2 version. Unfortunately it is still used to determine default board size... 2013-02-01 19:42:12 +0100 H.G. Muller : Update Dutch WB translation 2013-02-01 19:37:06 +0100 H.G. Muller : Add some new strings to WB translation template 2013-02-01 19:34:32 +0100 H.G. Muller : Assign shortcut char to WB menu item The new Save games as Book item did not have a shortcut yet. 2013-02-01 19:31:18 +0100 H.G. Muller : Let WinBoard start in its installation folder The current directory in WinBoard was not automatically the same as the installDir returned by SearchPath. Especially not if used without shortcut by file association. 2013-02-01 19:29:26 +0100 H.G. Muller : Fix warning in WinBoard 2013-01-30 14:25:57 +0100 H.G. Muller : Fix expose of to-square with grid off The code relied on drawHighlight to request an expose evet for the entire square, but when lineGap = 0, drawHighlight is a no-op. 2013-01-29 08:39:30 +0100 H.G. Muller : Fix library order On OS X dialog windows could not get focus if -lXaw appeared after -lX11 -lXt in the linker command. This was cured by moving @FRONTEND_FLAGS@ (which expands to -lXaw) first in the LDADD parameter of the automake file. 2013-01-28 17:38:26 +0100 H.G. Muller : Preserve PGN tags when loading engine Switching to EditGame mode would normally erase the tags, but when analyzing a loaded game this would be undesirable. When the engine is playing, keeping the tags is dubious, but it is not obvious what to put in a new name tag, so we leave that for now. 2013-01-28 17:23:47 +0100 H.G. Muller : Preserve mode on engine loading (sometimes) That the mode always switched to EditGame after engine loading was particularly annoying at the start of a game (where leaving BeginningOfGame mode would disablethe Time Control dialog, and the engine would not automatically reply if you start playing) and AnalyzeMode. These two modes are now preserved, BeginningOfGame by refraining from calling EditGameEvent() and sending 'force' to the new engine, and AnalyzeMode be calling AnalyzeModeEvent() after the engine is loaded and repositioned. 2013-01-28 14:14:19 +0100 H.G. Muller : Catch unknown engine in tourney games When an XBoard instance is playing on a tourney it can happen that it is using a settings file with an engine list not yet containing a certain participant, because that participant was just installed in the instance that created the tourney file, but it did not save those modifications yet. This error is now caught, and leads to an error popup and stopping of the tourney play. This error was made non-fatal to allow the user to decide if he wants to quit with or without saving the settings (which, after all, does not seem up-to-date). 2013-01-26 18:08:37 +0100 H.G. Muller : Adjudicate pawn-drop mate as loss in Shogi Mating with a Pawn drop is illegal in Shogi, but rather than burdoning the legality-testing by this complex rule, we simply invert the result for such a mate. After all, Shogi customs are such that everything illegal leads to an immediate loss. 2013-01-25 10:05:44 +0100 H.G. Muller : Adjudicate perpetual checks as loss also in Shogi The Xiangqi code for recognizing perpetual checks is now also activated for Shogi, but in this case we bail out before checking for perpetual chases. The mini-Shogi case is then recognized as a win for gote. 2013-01-25 09:55:56 +0100 H.G. Muller : Stalemate is a win in Shogi In regular Shogi this never occurs, but in the mini variants it happens often enough. 2013-01-22 20:49:34 +0100 H.G. Muller : Fix engine timeout problem in match mode Reload of a reuse=0 engine would cause a done=1 event which would be abort the feature timeout of the other engine in the first game. 2013-01-22 20:32:33 +0100 H.G. Muller : Enforce -popupMoveErrors One move error was using DisplayError(), in stead of DisplayMoveError(), and thus did not obey the -popupMoveErrors option. 2013-01-21 15:30:29 +0100 H.G. Muller : Update texi file 2013-01-21 10:26:20 +0100 H.G. Muller : Fix some warnings 2013-01-20 19:09:05 -0800 Arun Persaud : Updated German translation 2013-01-19 17:54:59 +0100 H.G. Muller : Do delayed board draw also with -stickyWindows false Only CoDrag needs to be suppressed on a configure event with -stickyWindows false, not the board redraw. 2013-01-18 11:11:48 +0100 H.G. Muller : Let tellothers command add comment to PGN in local mode 2012-12-30 15:19:57 +0100 H.G. Muller : Allow use of ~ in pieceToChar for shadow pieces in any variant The use of shadow-pieces for promoted Pawns was limited to Crazyhouse and Bughouse. But this is not necessary, and in fact undesirable, as it made it impossible to implement Crazyhouse960, which combines shadow promotions with Fischer castling (only available in variant fischerandom)s, and thus has to be played as 8x8+5_fischerandom, using the Crazyhouse -pieceToChaTable. 2012-12-30 15:06:33 +0100 H.G. Muller : Resend engine-defined options after reuse=0 reload When the engine process is re-spawned for a new game under -xreuse setting, any alteration of engine settings brought about through the Engine Settings dialogs would be lost, and revert to the engine's default. This is now fixed by re-sending all options (known from the previous load of the same engine) with the current settings immediately after "protover 2", and ignoring the engine's option features. Rather than clearing the option list, and redefining it from the option features. 2012-12-30 14:58:16 +0100 H.G. Muller : Implement aborting of games on engine request. A new game-end command is added. For bakward compatibility it is disguised as an old one, namely "1/2-1/2 {Engine Abort Request}". These resultDetails are recognized as special, and rather than ending the game in a draw (which GUIs not implementing this), the game will be completely 'expunged' from the match or tourney it is part of, leaving no trace in the saveGameFile. 2012-12-30 14:54:43 +0100 H.G. Muller : Store some more tourney params in tourney file The hash and threads settings, as well as ponder and book options are now also saved in the tourney file, so that tournaments can be played in parallel where these parameters differ, and no mess up can occur on restarting a touney after doing something else. 2012-12-23 11:26:31 +0100 H.G. Muller : Do not automatically save aborted games in tourney PGN When the game result is 'unfinished', we prompt for a filename rather then using the specified saveGameFile if a tourney is in progress. 2013-01-19 08:35:52 -0800 Arun Persaud : fix configure bug that showed up on OS X (couldn't find X11/Dialog.h) X_CFLAGS (set by AC_PATH_XTRA) was not used in Makefile.am. It was used in tests for X11/Dialog.h, etc. so configure worked, but make didn't. 2013-01-18 22:26:13 -0800 Arun Persaud : Updated Ukrainian translations 2013-01-09 07:57:43 -0800 Arun Persaud : removed trailing whitespace 2013-01-09 07:49:20 -0800 Arun Persaud : Updated copyright notice to 2013 2012-12-22 22:46:21 +0100 H.G. Muller : Do not move to forwadMostMove when unpausing AnalyzeMode 2012-12-22 22:44:50 +0100 H.G. Muller : Use Ctrl key in AnalyzeMode to exclude entered move 2012-12-22 20:40:26 +0100 H.G. Muller : Implement insufficient mating material for Knightmate KBK is draw with Royal Knight. With exo-pieces also KNK and KFK. 2012-12-22 20:25:51 +0100 H.G. Muller : Fix rep-draw detection in drop games In games like Crazyhouse every move is reversible, as captured pieces can eventually change sides again, and be dropped back on the board. So we have to search back a full 100 ply for repetitions, passing captures and Pawn moves. 2012-12-11 22:33:07 -0800 Arun Persaud : updated po/pot files 2012-12-11 22:18:05 -0800 Arun Persaud : new version number for developer release 2012-12-10 14:48:05 +0100 H.G. Muller : Prefer pause mode on pondering engine over 'easy' If the thinking engine is stopped after its move because it does not support pause, is is still better to use pause on the pondering engine than to switch of its pondering with 'easy', as the latter might not be instantaneous. Also switch off pondering in the thinking engine before it gives the move, just in case it does not respond immediately to easy / hard. 2012-12-10 13:40:47 +0100 H.G. Muller : Update WinBoard translation template 2012-12-10 13:35:41 +0100 H.G. Muller : Fix min-Shogi promotion zone In integer arithmetic N*2/3 is not the same as N - N/3, with as a result that the white promotion zone was 2 ranks deep on 5x5 boards. This only happened in LegalityTest, but because this would classify all moves to 4th rank an non-promotions, they would be printed with a faulty deferral (=) sign as promochar in SAN. 2012-12-10 13:32:49 +0100 H.G. Muller : Do not clear PGN tags on Analyze File 2012-12-10 13:28:37 +0100 H.G. Muller : Fix -fSAN in AnalyzeFile mode The exception that a PV relates to currentMove rather than forwardMostMove applies not oly in AnalyzeMode, but also in AnalyzeFile. Furthermore, PvToSan did not properly restore the pushed game tail in this case. 2012-12-08 16:02:09 +0100 H.G. Muller : Improve scaling of border bitmap (WB) The StretchBlt mode is set from dither to delete. 2012-12-05 16:34:58 +0100 H.G. Muller : Implement use of pause / resume protocol commands Engines that implement feature pause=1 will be paused during their move on a pause event; pondering engines will be controlled either through 'pause' or (if they don't support that) 'easy', which both should work instantaneously. If the thinking engine does not support 'pause', the pausing will be deferred to when it produces its move, and is implemented by not relaying the move, and switch off pondering for both. 2012-12-03 12:58:36 +0100 H.G. Muller : Fix Loop-Chess promotions Loop Chess is not a supported variant, but hould be playable as Crazyhouse with an altered pieceToCharTable, not defining the shadow promotion pieces. But with legality testing on promotion to shadow piece would take place even if the shadow piece was not defined. 2012-12-02 22:44:55 +0100 H.G. Muller : Fix move highlighting with animation off In WB the moving of SetHighlights to after the animation had broken the highlighting of engine moves, because it was also moved after DrawPosition. While it is DrawPosition that actually draws the highlights. Now it has been moved to just before DrawPosition. 2012-12-02 11:09:14 +0100 H.G. Muller : Start browsing in currently-selected folder (WB) The folder-browse dialog always started at My Computer, while file browsing started in the globally last-used folder (which might not be related at all to the file entry we are now browsing for). 2012-11-29 23:38:18 +0100 H.G. Muller : Implement book-creation functions A new menu item triggers conversion of the currently loaded PGN file to a Polyglot book, saved with the GUI-book filename. A (volatile) option -mcBookMode alters the probing algorithm to build a book from scratch by playing games (and using a form of learning). 2012-11-29 22:23:44 +0100 H.G. Muller : Use colors in Board-Options dialog also for font pieces (WB) The piece color settings now control the pieceColor or fontPieceColor settings, depending on the setting of -usePieceFont. 2012-11-29 22:14:05 +0100 H.G. Muller : Implement auto-creation of ICS logon file Under control of the new option -autoCreateLogon (which can be set from the ICS Options dialog) the first two lines in response to the ICS "login:" pompt will be saved on a newly created logon file (if logon from such an existing file failed). 2012-11-29 21:56:02 +0100 H.G. Muller : Add Themes dialog (WB) This dialog, done by the generic popup, contains controls for many settings that so far could only be controlled by options. It also introduces the concept of 'themes', sets of options stored in the multi-line option -themeNames. Add some dummy routines to suppress compile errors in functions that cannot be called yet in XBoard. 2012-11-29 21:32:03 +0100 H.G. Muller : Allow external piece bitmaps and board border (WB) The -pieceImageDirectory is now also used for WinBoard, to indicate a directory of .bmp files, used to replace the built-ins. The outline and solid bitmaps can be full-color. This allows winBoard to use the WinBoard-zeta graphics. A new option -border can indicate a bitmap file used to draw a half-square-wide border around the board. A white background has to be drawn underneath the black pieces, to avoid color-interference with the board, just like happens for the white pieces. These backgrounds now always use bright white, rather than -withePieceColor. We still have to work on the scaling of the zeta (600x600) bitmaps to the actual board size, as for some bitmaps the stratchblt is ugly. 2012-11-29 21:05:15 +0100 H.G. Muller : Add 'Continue Later' button in Tournament dialog (WB) This button makes it possible to accept the values specified in the dialog without immediately starting the tournament (as OK does), so you can re-open the dialog later, and OK it then. 2012-11-29 20:25:35 +0100 H.G. Muller : Load opponent logo based on handle in ICS play (WB) The logos for handles on FICS are sought in folder logos\freeches.org\*.bmp, etc. If no logo for the handle is found there, the logo of the ICS is displayed as usual. 2012-11-19 20:35:05 -0800 Daniel Dugovic : Fix configure script for --enable-zippy (tiny change) reported and patch by Daniel. edited by Arun Persaud: - also fixed #ifndef ZIPPY -> #if !ZIPPY - didn't change #if -> #ifdef 2012-11-10 00:12:34 -0800 Arun Persaud : don't define X_LIBS when using gtk-frontend 2012-11-07 22:16:09 -0800 Arun Persaud : updated po/pot files; added new frontend files 2012-11-07 22:14:20 -0800 Arun Persaud : fix configure script for --with-Xaw and --with-gtk made Xaw the default and included xaw or gtk sources as extras in case the other frontend is selected for make distcheck 2012-11-07 21:13:38 -0800 Arun Persaud : new version number for developer release 2012-10-31 09:55:02 +0100 H.G. Muller : Draw frames around memos and listboxes 2012-10-30 17:39:59 +0100 H.G. Muller : Adapt lineGap during sizing 2012-10-30 15:04:32 +0100 H.G. Muller : Fix clock highlighting 2012-10-30 10:59:45 +0100 H.G. Muller : Fix Chat Box The genric TypeInProc is re-instated, and replaces ICSKeyEvent as primary handler for special keys in one-liner text edits. 2012-10-29 19:46:27 +0100 H.G. Muller : Pay attention to NO_CANCEL dialog flag 2012-10-29 14:18:33 +0100 H.G. Muller : Fix clock clicking with GtkEventBox Like in WinBoard the button-3 case is now handled in the primary event handler (and communicated to it in a kludgy way). It would be better if this was absorbed in ClockClick(). 2012-10-28 22:25:22 +0100 H.G. Muller : Fix logo placement Graphs were not recognized as possible SAME_ROW elements. A Graph requesting FIXED_H (which only the logos did) is now packed into a (borderless) aspect frame. 2012-10-25 23:04:42 +0200 H.G. Muller : Add window positioning Sticky windows now sort of works, but needs unexplained fudge factors. Reopening a persistent dialog centers it on the board, and disobeys the positioning command. The WindowPlacement of the BoardWindow was again added (it was commented out during development). 2012-10-22 22:41:14 +0200 H.G. Muller : Make board sizing work through subtracting fixed height There is now no attempt to give a size to the board drawing area, so it can later be sized as small as we want. The frame width is determined by subtracting the nominal board size from the actual window size, (because the clocks will have that width, and the board will startas 1x1), while the vertical margin is determined as the difference between the bactual window height, the drawing-area height minus a fudge of 25 pixels to compesate for the erroneously allocated blank space below the board. 2012-10-22 21:09:51 +0200 H.G. Muller : Fix warnings The highTextStart/End are now declared in engineoutput.h, shared between nengineoutput.c and xengineoutput.c. Unused variables were removed. Also fix warnings in xboard.c and xoptions.c. 2012-10-22 17:40:08 +0200 H.G. Muller : Delete emptied front-end files, and move rest to gtk directory Remove #ifdeffed-out Xt code that has GTK implementation. The xgamelist and xhistory have been completely cleared off content, and were removed. 2012-10-27 00:12:42 +0200 H.G. Muller : Add copy-paste The code from gtk-xt could be used with almost no modification. 2012-10-21 09:09:01 +0200 H.G. Muller : Some experimenting with sizing Does not work as intended yet. 2012-10-21 23:04:49 +0200 H.G. Muller : Add task-bar icon Funny enough it was necessary to swap the two svg icons to make this work! 2012-10-20 10:29:37 +0200 H.G. Muller : Make some tall dialogs multi-column A dummy button was added to the last row of New Variant to make the number even. A legality-test warning as put in the New Variant dialog Fix width of tourney-file in Match dialog 2012-10-20 21:14:33 -0700 Arun Persaud : updated some icons to SVG 2012-10-20 19:57:58 +0200 H.G. Muller : Add displaying of icons A new Option type, 'Icon', was added for this as in GTK Icons and Labels need different types of widget. The icons are now svg, so we could remove the icon pixmaps. 2012-10-20 14:25:41 +0200 H.G. Muller : Fix button bar 2012-10-20 14:03:48 +0200 H.G. Muller : Add BarBegin, BarEnd options This makes the button bar display correctly. Also fix v-sizing of menu bar. 2012-10-20 10:01:35 +0200 H.G. Muller : Add listbox double-click callback This function was formerly performed by WheelProc. 2012-10-19 17:29:40 +0200 H.G. Muller : Add hiding / showing second Engine Output pane The handle of the GTK table for the second engine is stored in the EndMark handle by GenericPopUp, so it can be used later to hise/show that table. 2012-10-19 17:15:58 +0200 H.G. Muller : Use different tables for different dialog columns Making the same table wider (in steps of 3) to get multiple columns does not work, because it forces options to align vertically. This wrecks dialogs like Load Engine, where one column contains a very high option (listbox). Now differnt tables are created for each column, packed in a new itermediate hbox. In case of the Engine Output window, a vbox is used instead to cause vertical stacking. Only multi-line text-edits and listboxes are now allowed to take up vertical space changes, while only the middle colum of the table can take up horizontal size changes. Within packing boxes space is equally distributed. The labels above the particiant-selection widgets had not the same width as the textview / listbox, leading to misplacement of the second label. For Engine Settings the spontaneous breaking into columns did not involve a SAME_ROW flag, so the 'columns' were stacked vertically. In addition the columns were too tall for GTK. They are now 20 options max. 2012-10-19 13:46:37 +0200 H.G. Muller : Deselect first char in Move Type-in and ICS Input Box After popup the Move Type-In had the typed character in it, but it was selected, so that typing a second character would erase it again. Same for the ICS Input Box. A prototype for CursorAtEnd is now also added. 2012-10-19 13:33:50 +0200 H.G. Muller : Close Move Type-in on Enter The code is squeezed into the ICSKeyEvent callback. 2012-10-18 21:57:50 +0200 H.G. Muller : Add access routines to checkboxes and FocusOnWidget The handler of the filter field needs it to return focus to the listbox. 2012-10-18 21:42:49 +0200 H.G. Muller : Add game-list callbacks The callbacks for listbox and filter text are treated by the same callback, which does both key presses and button double-clicks. Giving focus back to the listbox after filtering does not yet work! 2012-10-18 16:27:57 +0200 H.G. Muller : Add optional callback to Label Options For some reason this does not work. The callback isn't called! 2012-10-18 13:40:55 +0200 H.G. Muller : Add type-in event to board for popping up box 2012-10-18 13:12:48 +0200 H.G. Muller : Add Shift detection The state of Shift and Ctrl was only probed on button clicks, so it is now read out of the button-event struct in the relevant button handlers. For backwad compatibility, they store it in a global, so the routine ShiftKeys can take them from there. 2012-10-18 12:35:20 +0200 H.G. Muller : Remove some unneeded low-level X11 code Things like tabbing between controls, mouse-wheel scolling etc. are all automatic in GTK, and thuse don't need to be ported. 2012-10-18 10:12:27 +0200 H.G. Muller : Add file browser The gtk-xt code for browsing in response to menu items rather than dialog browse buttons) was grafted. It seems desirable to merge the two browsing functions, though. Pass extra params used by Xaw to FileNamePopUpGTK. The code was altered to use DelayedLoad. 2012-10-18 09:54:41 +0200 H.G. Muller : Fix ListBox, and add some support routines The srolled-window for the listbox used a uninitialized variable for its width, causing a crash. Now it pays attention to the Option.max and .value size hints. The access routines were copied from gtk-xt. HighlightWithScroll could just a wrapper for HighlightListBoxItem, as GTK auto-scrolls. 2012-10-17 20:01:37 +0200 H.G. Muller : Connect CommentClick handler This can make use of generic memo callback, so it could be entirely backend. Therefore it was moved to dialogs.h. As it shared a global with some other back-end popup routines to remember the current move, these could now be moved out of xboard.c too. (Well, not so for the X11 front-end, so it has now been put in a header. :-( ) 2012-10-17 19:41:11 +0200 H.G. Muller : Fix animation Because FrameDelay does block the event loop, even though it releaes the CPU, expose events start to lag behind the actual drawing. By combining expose events for overlapping squares, rather than decompose them into 3 rectangles, this problem seems to go away. But only if there is an extra exposure on the squares to be drawn also non-overlapping frames will be properly drawn (?!). 2012-10-17 14:40:59 +0200 H.G. Muller : Implement highlighting in engine output by through generic method HighlightMove was made generally available for all text. It is now just a wrapper for the generic HighlightText, and could be moved to the back-end. (This requires the initialization to be widget specific, and the flag indicating it has been done is now stored in the Option.min field.) 2012-10-17 14:33:28 +0200 H.G. Muller : Let engine-output memos use new generic callback 2012-10-17 13:53:03 +0200 H.G. Muller : Add scrolling of Move History To have access to the textview, its handle is now stored in the Option.textValue field. 2012-10-17 13:11:23 +0200 H.G. Muller : Add highlighting in move list For now it is assumed the normal background will be white (for clearing the highlight). 2012-10-16 19:44:40 +0200 H.G. Muller : Make generic memo-event handler, and connect history callback Large text widgets can now define a user handler in their Option.choice field. If they do, agneric callback is added tothem, which catches mouse events. Button release and pointer motion pass their coordinate and type to the specified user routine. Button presses in addition retrieve the text from the widget, set the cursor in it to the clicked point, and convert it to a character position, also passed to the user. The user is responsible for ignoring events he is not interested in. 2012-10-16 15:58:58 +0200 H.G. Muller : Add key-handler for ICS Input Box In contrast to the X11 code, all intercepted keys are now treated by the same callback. The ICS Input Box callback triggers on Up, Down and Return key, and refers to these symbolically. 2012-10-16 15:05:45 +0200 H.G. Muller : Highlight Pause button 2012-10-16 13:52:41 +0200 H.G. Muller : Better cleansing of xboard.c from X11 types The #includes for X11 files were still in there. 2012-10-16 13:28:32 +0200 H.G. Muller : Add text insertion in engine-output memos 2012-10-16 09:34:02 +0200 H.G. Muller : Append recent engines to engine menu This is now entirely moved to the back-end, by doing it in the table from which the menus are later generated. The special callback for engine items is abandoned, and the euProc for such items is left NULL to flag that RecentEngineEvent should be invoked with the applicable engine number. To calculate the latter a global variable firstEngineItem is dynamically set to the length of the regular engine menu. 2012-10-15 22:17:50 +0200 H.G. Muller : Transfer more gtk-xt code, and add some new Add input-source handling Graft color picker ( callbeack in the text field is still missing!) Handle contents of label widgets (store handles in Option for access) Add printing of clocks Add printing of window title Pay attention to BORDER attribute of Label Options (pack in frame) Delete ReadBitmap code (also remove #including of bitmap files for icons) Fix layout of textviews (adapt to newer Option format, incl. wrap, scroll) Support vertical stacking in Break Option (no table widening when !SAME_ROW) Make default horizontal scroll policy automatic (for engine-output window) Fix disabling of unused spinners in TC dialog 2012-10-15 20:47:33 +0200 H.G. Muller : Connect dialog Browse buttons to GTK browser 2012-10-15 19:52:17 +0200 H.G. Muller : Implement menu checkmarking and enabling odes in the (later over-written) handle field specify which items are to be checkmarked, and by what style button. 2012-10-15 16:18:12 +0200 H.G. Muller : Attach expose handler and connect to mouse events The GraphExposeProc is conected to the Graph widgets. A gdk draw routine is used to copy the buffer bitmap to the display. It is also connected to button and motion-notify events. In this version the board can be fully operated with the mouse. 2012-10-14 22:00:14 +0200 H.G. Muller : Transfer most available gtk-xt code to xoptions.c GenericPopUp and PopDown are grafted from gtk-xt into gtk2. The version compiles, but segfaults before doing anything, with error messages about unexpected cases in GenericPopup for Graph and PopUp Options of the main board. The spin options need special treatment in GetWidgtText. 2012-10-15 11:41:33 +0200 H.G. Muller : Give LoadListBox two extra parameters It often occurs that we just want to swap two elements, and reloading the entire listbox would be a very inefficient way to do this in widget sets that allow access to a single element. 2012-10-14 20:36:34 +0200 H.G. Muller : Remove all X11 code by #ifdeffing it out With #ifdef TODO_GTK we disable all X11 code, in order to get a compiling X11-free version. The disabled sections can then be replaced by code for another widget set, the X11 version still showing what it was supposed to do. 2012-10-14 17:37:18 +0200 H.G. Muller : Move timer functions to new file xtimer.c The timers for the clocks, periodic analysis events and ScheduleDelayedEvent go into a separate file. 2012-10-14 15:31:56 +0200 H.G. Muller : Make xevalgraph.c backend The only front-end stuff left in xevalgraph.c was an unnecessary reading of the window size (which could be obtained from the WindowPlaceent struct), and drawing (all cairo now). The drawing was moved to draw.c, and the remaining part renamed nevalgraph.c. An attempt to list them in a less chaotic way. 2012-10-14 14:34:09 +0200 H.G. Muller : Cleanse back-end code of all references to X11 types When compiling for X11, common.h #included X11/Intrinsics.h so that X11-specific data types could still be used throughout the back-end part not shared with WinBoard. By temporarily disabling this, error messages could be generated on all such occurrences, and were then solved. This included the following: The InputSource struct is not uses in usystem.c at all, and its definition could be moved to xboard.c. InputSourceRef, which logically should heve been defined as (InputSource *), is in reality (void *), so the back-end can pass it around. Some non-platform-dependent stuff of general interest had prototypes (or external vars) in xboard.h. This is now moved to a new header xboard2.h, to allow it to be shared without bringing in X11 dependence. The EngineOutputProc was defined inconsistently, but the header was not sufficiently shared to flag this error. This has been repaired now, by moving the template to menus.h. 2012-10-14 13:39:47 +0200 H.G. Muller : Remove xedittags.c, .h from project The tiny bit of code that was left was absorbed in dialogs.c, the one prototype to menus.h. 2012-10-14 12:53:20 +0200 H.G. Muller : Remove inclusion of frontend.h from backendz.h This did not seem to serve any purpose at all. 2012-10-14 12:49:28 +0200 H.G. Muller : Split xhistory.c in front-end and middle-end part 2012-10-14 12:21:09 +0200 H.G. Muller : Move MarkMenuItem to xoptions.c This to make xoptions.c completely independent from the inclusion of frontend.h. The prototype is moved to menus.h. Loose end: DrawPosition in board.c does not see the prototype. Very suspect that it wants to see it. Why would it have to correct the flipView setting??? Better se to it that it is correct to start with! 2012-10-14 12:14:07 +0200 H.G. Muller : move testing for no options to back-end The test if an engine has options and display a note instead of the Engine Settings dialog when this is not the case is moved to outside of GenericPopUp, to make the later independent of calling other routines. 2012-10-14 11:20:16 +0200 H.G. Muller : Remove some unnecessary header includes 2012-10-14 10:47:21 +0200 H.G. Muller : Move ICS-engine analyze and AnalyzeGame code to shared back-end This code was still duplicated between WB and XB in the front-ends. Because of its incorporation in AnalyzeModeEvent the 'middle-end' function AnalyzeModeProc could be eliminated. AnalyzeModeEvent was made to return an int to flag its success, and keep the JAWS code based on it out of XBoard. The AnalyzeGame code is now incorporated in AnalyzeFileEvent(). 2012-10-26 10:28:59 +0200 H.G. Muller : Add configure switches for Xaw vs GTK. This patch is an adapted version of the one Arun made at the end of the gtk2 branch. It uses the exact same version of his configure.ac, but the Makefile.am is adapted to the situation in master at the beginning of it, after duplication of the X11 front-end files in the xaw directory for preserving them, while the versions that will be modified to GTK front-end are still in the xboard directory. 2012-10-25 11:12:41 +0200 H.G. Muller : Prepare xoptions.c for middle-end changes Some changes that can be pre-empted, such as the splitting of Label into Label and Icon Option type, and some dummy wrappers are already implemented, so they can be used when needed by GTK. 2012-10-25 09:20:03 +0200 H.G. Muller : Preserve copies of the X11 front-end in xboard directory The X11 front-end has been moved to the xaw directory, but copies are retained for modifying them to gtk versions. 2012-10-24 08:55:27 +0200 H.G. Muller : Move X11 front-end to directory xaw 2012-10-31 18:18:02 +0100 H.G. Muller : Fix initial enables in TC dialog 2012-10-30 14:47:24 +0100 H.G. Muller : Fix image extension used for browsing to .pgn 2012-10-28 21:39:19 +0100 H.G. Muller : Fix WinBoard compile error on enum PEN 2012-10-30 11:20:54 +0100 H.G. Muller : Fix crash in promotion popup There were not enough entries for Capablanca Chess with legality-testing off, where King is also presented as a choice. 2012-10-28 18:19:23 +0100 H.G. Muller : Fix message in New Variant dialog Even in -ncp mode the message was referring to the 'current engine'. 2012-10-28 18:16:20 +0100 H.G. Muller : Fix crash on animation after resizing The animate buffers were still holding pointers to a discarded cairo surface. 2012-10-21 14:49:45 +0200 H.G. Muller : Fix variant-dependent pieces The code to select the actually used piece images from the available ones (from InitDrawingSizes) is now made into a subroutine, and also called after resizing the pieces. 2012-10-26 10:18:48 +0200 H.G. Muller : Replace marble texture pixmaps by png 2012-10-26 10:13:27 +0200 H.G. Muller : Replace xiangqi board pixmaps by png images 2012-10-26 10:08:44 +0200 H.G. Muller : Remove the texture pixmaps from project These were already replaced by png textures. 2012-10-23 15:02:56 +0200 H.G. Muller : Fix re-rendering of svg on resize The previously prepared bitmaps were retained if we resized, rather then rendering the svg atthe new size. 2012-10-21 15:48:30 -0700 Arun Persaud : update po/pot files 2012-10-21 15:47:12 -0700 Arun Persaud : new version number for developer release 2012-10-21 11:10:36 -0700 Arun Persaud : we still need a few bitmaps, so the directory needs to be included in Makefile.am make distcheck complained about this 2012-10-21 15:56:43 +0200 H.G. Muller : Rename svg shogi pieces, so they become usable Only white pieces are present. For black they would have to be flipped. 2012-10-21 15:54:25 +0200 H.G. Muller : Fix bug in resizing on variant switch The fix of the garbage pixels had unfortunately broken this. 2012-10-21 15:15:01 +0200 H.G. Muller : Fix bug in fallback mechanism After failure to load a piece from a specified -pieceImageDirectory the default theme was not tried, because the cairo function to load from a pgn file returns a valid handle even if the file does not exist. 2012-10-21 14:58:42 +0200 H.G. Muller : Get svg error message 2012-10-21 14:49:45 +0200 H.G. Muller : Fix variant-dependent pieces The code to select the actually used piece images from the available ones (from InitDrawingSizes) is now made into a subroutine, and also called after resizing the pieces. 2012-10-16 12:08:25 +0200 H.G. Muller : Remove caveat on available pieces fromNew Variant dialog In the cairo version all pieces are available at all board sizes. 2012-10-21 11:41:11 +0200 H.G. Muller : Remove some unused images from png directory Currently only the three board texture files are used. But the piece images are still left, because they might be useful if we ever want to mae XBoard configurable for not using librsvg. 2012-10-21 10:40:37 +0200 H.G. Muller : Fix bug in resizing The nominal size of the window was not set in the correct Option struct. 2012-10-21 09:58:23 +0200 H.G. Muller : Prevent odd-width line shift in length direction 2012-10-21 09:48:29 +0200 H.G. Muller : Print missing-pieces error message to console The GUI might not yet be up at this point.In addition, suppress the rest of the code, because it could give segfaults. 2012-10-21 09:30:26 +0200 H.G. Muller : Fix garbage pixels on the right of the board The extra pixel that is requested in sizing the board window back to an available size because we ofte get one less pixel than we ask for can lead to a line of garbage pixels next to the board. This is combatted by limiting expose events to the true board area, remembering that in the Graph Option rather than the actual window size, and suppressing resizing when the latter only exceeds the stored width by more than 1 pixel. 2012-10-15 10:27:14 +0200 H.G. Muller : Trim board-window size The board window will sometimes be a pixel larger than requested. The ReSize routine will now reset the size values in the Graph Option to what they were supposed to be, to prevent expose events will draw nonsense in the extra space. 2012-10-13 23:26:10 +0200 H.G. Muller : Adapt docs for svg/png in stead of bitmap/pixmap 2012-10-13 09:35:31 +0200 H.G. Muller : Spontaeous changes in gettext stuff 2012-10-13 08:03:48 +0200 H.G. Muller : Move Shogi svg pieces to own directory 2012-10-13 07:57:48 +0200 H.G. Muller : Remove unnecessary Xt colors and call to MakeColors 2012-10-13 07:50:56 +0200 H.G. Muller : Code cleanup: move expose redraw to draw.c 2012-10-13 07:37:45 +0200 H.G. Muller : Suppress warning for InitDrawingHandle 2012-10-13 07:33:15 +0200 H.G. Muller : Make fallbackPieceImageDirectory hardcoded 2012-10-13 07:18:23 +0200 H.G. Muller : Increase drag delay too 200 msec On my slow laptop it can take more than 100 msec to reallocate bitmaps in the generic expose, with as a consequence that the DelayedDrag event is not processed before the timeout expires. The timeout event then triggers a redraw, which again takes so long that the timeout expires before the event to reset the timer could be processed, and this just perpetuates itself, leading to a large series of queued redraws, and a long waiting time for an image to appear after the sizing stops. 2012-10-13 07:01:05 +0200 H.G. Muller : Fix segfault on faulty command-line option 2012-10-12 14:42:26 +0200 H.G. Muller : Suppress anti-aliasing in -monoMode In the color-substitution code, always use bi-level alpha and color. 2012-10-12 13:34:04 +0200 H.G. Muller : Remove piece pixmaps from project 2012-10-12 11:47:25 +0200 H.G. Muller : Implement proper fallback cascade Try in order cached svg, cached bitmap, user png, user svg, default svg. 2012-10-12 11:06:06 +0200 H.G. Muller : Cache svg handles 2012-10-12 10:45:29 +0200 H.G. Muller : Install svg pieces in themes/default The svg pieces are installed with the XBoard data in the directory .../xboard/themes/default . A new option -fallbackPieceImageDirectory is added, and is configured in the master settings file to point to these pieces. This options, which replaces -svgDirectory, is volatile, and the menu control to set it is removed. The -pngDirectory option is renamed to -pieceImageDirectory (-pid). 2012-10-12 10:02:50 +0200 H.G. Muller : Remove bitmaps from project 2012-10-12 09:55:07 +0200 H.G. Muller : Install the wood textures as png The xboard.conf has to be edited to set these as default textures, in stead of the .xpm files. 2012-10-12 09:50:31 +0200 H.G. Muller : Add hatched board texture A png file with hatching is added, so it can be used for dark squares in a monochrome theme. It is installed in a new data directory .../xboard/themes/textures. 2012-10-11 22:21:06 -0700 Arun Persaud : added a black and white theme to replace the mono option 2012-10-11 20:56:42 -0700 Arun Persaud : added SVGs to dist files in automake 2012-10-11 19:44:22 +0200 H.G. Muller : Fix exposure of atomic captures The grid lines had to be repaired too, so damage marker 2 had to be used. 2012-10-11 19:13:24 +0200 H.G. Muller : Fix animation with textures off The blank square was not shifted to (0,0) when drawing the animation buffer. 2012-10-11 19:08:49 +0200 H.G. Muller : Fix 1-pixel offset of grid lines on some cairo implementations 2012-10-11 09:51:07 +0200 H.G. Muller : Solve odd lineGap problem Not all cairo versions seem to round the same when an odd-width line is to be drawn at integer coordinates. So now we explicitly ask it to be drawn centered on half-odd-integer coordinates. 2012-10-09 18:52:43 +0200 H.G. Muller : Add -trueColors option 2012-10-09 14:56:16 +0200 H.G. Muller : Always render svg pieces anew on size change The svg pieces are now unconditionally rendered to supply the pngPieceImage master source otherwise read from png file. This is then fed into the original png code (so that if for some reason it fails, we fall back on png pieces, and finally on built-in pixmaps). 2012-10-09 14:06:47 +0200 H.G. Muller : Fix rsvg version in configure.ac 2012-10-08 19:54:19 -0700 Arun Persaud : initial svg rendering 2012-10-08 18:34:05 -0700 Arun Persaud : added cairo and librsvg to configure process 2012-10-08 18:32:55 -0700 Arun Persaud : added SVGs converted from inkscape SVG to plain SVG before adding 2012-10-10 21:19:25 +0200 H.G. Muller : Adapt Eval Graph code to new drawing system The eval graph now triggers an expose after drawing, and gets its size from the Option fields. 2012-10-10 20:37:58 +0200 H.G. Muller : Fix expose requests seek graph 2012-10-10 20:07:53 +0200 H.G. Muller : Make draw handle for board globally available 2012-10-10 19:45:39 +0200 H.G. Muller : Let expose requests pay proper attenton to widget So far, expose requests were always assumed to be for the board widget, preventing display of the labels. 2012-10-10 18:45:59 +0200 H.G. Muller : Fix initial display of logos The logos were selected and printed during the initialization, before the main event loop was started. So the expose events during widget creation, which created the drawing surfaces, were only processed after the initial drawing of logos, so that there was nothing to draw on! 2012-10-10 17:25:25 +0200 H.G. Muller : Fix alignment of highlight expose 2012-10-10 17:19:52 +0200 H.G. Muller : remove NewSurfaces 2012-10-09 13:57:40 +0200 H.G. Muller : Make expose handler generic The Graph Option now returns two handles in hitherto unused fields of its Option struct: Option.choice is a cairo handle of a memory buffer the user must draw to, while Option.textValue is the handle to the widget. Expose events copy the memory buffer to the display for the exposed area. A routine DrawExpose() is supplied to let the user generate expose events. 2012-10-06 21:30:59 +0200 H.G. Muller : Reload piece images when pngDirectory is changed The OK function of the board options dialog now tests for a change in pngDirectory and passes a parameter to InitDrawingParams to tell it to destroy the old images. This cause a reload on scaling the pieces. 2012-10-06 20:16:54 +0200 H.G. Muller : Suppress redraw during sizing 2012-10-06 20:10:18 +0200 H.G. Muller : Fix bug in resize trigger Even if the square size does not change, the window has to be shrunk back to fit the board. 2012-10-06 19:54:50 +0200 H.G. Muller : Make Piececolor options work on png pieces The scaled, antialiased bitmaps are now colored according to the option settings. This is done by decomposing every pixel in a white, black and transparency component, which is possible because the opacity is directly give in the alpha channel, and black originally was a hard zero. So what you se in the red channel must be white (as the original white was #FFFFCC), and the rest of the opacity must be due to black. The color to be replaced (white for the white pieces, black for the black pieces) is then replaced by the original weight of this color times the color from the option. 2012-10-06 17:53:25 +0200 H.G. Muller : Plug resource leak on rezising with pixmaps 2012-10-06 16:19:41 +0200 H.G. Muller : Fall back on built-in pixmaps if png pieces unreadable 2012-10-06 14:21:11 +0200 H.G. Muller : Do coordinate text alignment with cairo 2012-10-06 13:40:12 +0200 H.G. Muller : Some cleanup 2012-10-06 12:14:16 +0200 H.G. Muller : Clean up drawing code Now all routines only draw through cairo, the destination surface can be passed to them, making it possible to do the duplicate drawing to the memory board image in a cleaner way. 2012-10-06 11:37:20 +0200 H.G. Muller : Check in draw.c, draw.h 2012-10-06 11:26:24 +0200 H.G. Muller : Remove all bitmap & pixmap drawing All Xt code for drawing the board is now removed, as are the -pixmapDirectory and -bitmapdirectory option. This version is now completely dependent on cairo for handling of all graphics anywhere. (The build-in pixmaps are still left, though, for later use as an alterative cairo source when no png files are found.) 2012-10-06 10:29:06 +0200 H.G. Muller : Separate off drawing routines from xboard.c A new source file draw.c is created to hold all code associated with board drawing. The routines for loading bitmaps and creating colors were left in xboard.c, though, as they are also used for handling icons and colors of widgets. 2012-10-05 19:53:04 +0200 H.G. Muller : Fix erasing dots in seek graph The cairo dots were just a little bit bigger than the old ones, so they were not properly erased, but left a remnant. 2012-10-05 19:25:58 +0200 H.G. Muller : Cleanup CairoOverlayPiece 2012-10-05 19:22:34 +0200 H.G. Muller : Draw arrow also on backup image 2012-10-05 19:16:30 +0200 H.G. Muller : Fix highlight clearing 2012-10-05 18:59:30 +0200 H.G. Muller : Remove acceleration trick 2012-10-05 18:54:01 +0200 H.G. Muller : Implement variant-dependent png piece symbols 2012-10-05 18:42:51 +0200 H.G. Muller : Fix clearing of markers dots with promo popup 2012-10-05 18:32:24 +0200 H.G. Muller : Also render coordinates to backup board 2012-10-05 18:30:35 +0200 H.G. Muller : Remove debug print 2012-10-05 18:29:13 +0200 H.G. Muller : Let cairo also do evenly colored squares. 2012-10-05 17:56:43 +0200 H.G. Muller : Make dragged piece for excluding moves transparent 2012-10-05 17:42:18 +0200 H.G. Muller : Fix DrawSeekText 2012-10-05 17:40:55 +0200 H.G. Muller : Redo coordinate / piece-count printing ith cairo 2012-10-05 15:40:14 +0200 H.G. Muller : Also use cairo on slave board With dual-board observing the drawing should be redirected to the slave board, so SwitchWindow should also switch the xlib-surface to one for the slave window. 2012-10-05 15:12:41 +0200 H.G. Muller : Cure flashing of piece on from-square In a drag-drop move the piece was flashed on the from square after the user dropped it on the to-square, because highlights were set before the move had updated the board. And highlighting with arrow can cause a redraw of the last board. Same with setting or clearing marker dots. 2012-10-05 14:20:12 +0200 H.G. Muller : Specify proper condition for using cairo animation 2012-10-05 14:07:53 +0200 H.G. Muller : Allow resizing of board window In full png mode the size of the board window is no longer locked. After resizing, the square size is calculated as the largest one that would fit the window, and the window is then shrunk around it. To prevent excessive redrawing during sizing, the redraw is delayed by putting it in DragProc. 2012-10-05 10:41:02 +0200 H.G. Muller : Switch to using 64x64 png images The bitmap scaling works better when the needed factors are not too large, as the svg rendering's anti-aliasing did not blur more than 1 pixel. So after shrinking too much the images are not effectively anti-aliased anymore. 2012-10-05 10:16:47 +0200 H.G. Muller : Maintain in-memory copy of the board image As reading back from the xlib-surface proves incredibly slow (cairo probably converts the entire image from Xt format to cairo format when we set it as a source, even though we only want to read a few dozen pixels), we now keep an exact copy of the board image as a cairo bitmap in memory. This restores the speed of the animation, but unfortunately leads to awful code. 2012-10-04 22:15:05 +0200 H.G. Muller : Do animation with cairo Unfortunately this is incredibly slow. 2012-10-04 18:36:08 +0200 H.G. Muller : Allow back-texture files to be PNG, (drawn with cairo) 2012-10-04 15:10:37 +0200 H.G. Muller : Add png pieces A new directory with 256x256 png piece images is added to the source tree. 2012-10-04 15:01:05 +0200 H.G. Muller : Add mode to draw PNG piece images through cairo The PNG images have to be supplied as files in a -pngDirectory (a new option) with a 256x256 bitmap. They are then scaled by cairo to the desired square size. This does not work very well for the smaller sizes. 2012-10-03 14:45:07 +0200 H.G. Muller : Redo marker dots with cairo 2012-10-03 14:27:14 +0200 H.G. Muller : Redo highlights with cairo 2012-10-03 14:07:37 +0200 H.G. Muller : Make convenience routine SetPen globally available The routine to set a pen as specified by a color string that was used in xevalgraph is moved to xboard.c, where there also is lots of demand for it. The arrow drawing now uses it for setting the highlightSquareColor. 2012-10-03 12:28:30 +0200 H.G. Muller : Redo grid with cairo 2012-10-03 12:00:07 +0200 H.G. Muller : Redo arrow highlighting with cairo 2012-10-03 11:20:12 +0200 H.G. Muller : Redo seek graph with cairo New front-end services DrawSeekOpen() and DrawSeekClose() have been added, and are called from the back-end to enclose any drawing activity. In WinBoard these had to be defined as dummies. 2012-10-02 15:31:26 +0200 H.G. Muller : Redo logos with cairo The logos must now be .png files, and are internally handled as their filenames. (So no preparation of a drawable from it at startup.) Cairo allows them to be scaled to the requested logoSize. 2012-10-02 14:02:23 +0200 H.G. Muller : Fix Eval Graph resolution problems Anti-aliasing had to be switched off to get a crisp graph. A second problem was that the dashed lines were drawn in both directions, with interfering dashes. 2012-10-02 10:54:48 +0200 H.G. Muller : Redo Eval Graph drawing with cairo 2012-10-21 10:21:33 +0200 H.G. Muller : Fix button-border-width bug in monoMode The kludge of signalling we are dealing wih a button rather than a label was wrongly implemented in case of momoMode. 2012-10-21 10:14:24 +0200 H.G. Muller : Reserve more space for button bar In some board sizes the button bar was wider than the code guessed, so the window width would be determined by the message + buttons row rather than the board. 2012-10-21 11:24:18 +0200 H.G. Muller : Fix WinBoard compile errors 2012-10-13 09:33:39 +0200 H.G. Muller : Fix non-NLS compile error for XFontStruct 2012-10-12 12:04:17 +0200 H.G. Muller : Fix browsing for path A pathname was still prefixed with the cuurent directory. 2012-10-07 21:00:10 +0200 H.G. Muller : Use Pause state in AnalyzeMode to imply move exclusion The pause state was not used in AnalyzeMode so far. Now it is used to imply all entered moves are for exclusion/inclusion. 2012-09-30 18:55:13 -0700 Arun Persaud : new version number for developer release 2012-09-30 22:16:14 +0200 H.G. Muller : Fix broken -ics and -cp options The patch to specify engines and ICS by nickame broke the use of the regular options to do this, because they could also reset them. Now this is fixed by only setting them (through |= in stead of =). 2012-09-30 22:01:52 +0200 H.G. Muller : Update texi file The description of exclude-moves, multi-game ananalysis and duo-analysis is added. 2012-09-30 10:07:58 +0200 H.G. Muller : Resolve conflict between -mps and -inc options The age-old problem that a persistent valid -inc value will cause -mps to be ignored is solved by the kludge of storing these two as a single option (-mps) in the settings file, and declaring the other (-inc) volatile. The range of negative numbers (invalid as -mps value) was available for that, and now is used to store the negated value of -inc in msec. For backward compatibility, specification of -inc causes interpretation of -mps in the old way. The forcing of -inc to -1 in the master settings file could be safely removed because of this change, so that the time increment now is a persistent option. 2012-09-29 23:13:04 +0200 H.G. Muller : Allow entry of fractional increment in WB time-control dialog The numeric edit is changed to a general text edit, and code is added to convert the text it contains to and from float, with proper error check. 2012-09-29 23:05:33 +0200 H.G. Muller : Preconfigure -icsNames in xboard.conf Although XBoard has no startup dialog with an ICS combobox, the -icsNames option is now used to select lines from with the -is option, and in interpretation of positional arguments. The most common ICS are configured together with a short nickname, so that commands like "xboard fics" will work. 2012-09-29 22:58:12 +0200 H.G. Muller : Allow ICS nickname as positional argument If an argument is encountered that is not preceded by an option name, it is now first checked if it corresponds to the nickname of an ICS in -icsNames. If so, it is assumed to be the value of an -is option, selecting -ics mode with that ICS and all the options installed with it. 2012-09-28 20:28:05 +0200 H.G. Muller : Cure some sick behavior in XBoard Engine Output right-clicks When a PV-walk is in progress, the PV is highlighted by selecting it, and this focuses the attention of the scroll bar on it, so it remains in view. But after release, that line was kept in view, rather than scrolling back to the top of the window (where the header line bust be available for clicking) 2012-09-28 13:28:17 +0200 H.G. Muller : Allow Analyze Game to auto-step through entire game file If the game index is set to auto-increment (-lgi -1), the Analyze Game function will automatically load the next game of the current game file (starting to auto-play/annotate that) when the end of the current game is reached. This flushes the annotated game if auto-saving was set, so that eventually all games in the file will be annotatd and saved. The game index is automatically set to auto-increment when we load a file while in Analyze Game mode, but switching this mode on while a game is already loaded will stop at the end of that game, as usual (if -lgi was not explicitly set). 2012-09-28 13:24:33 +0200 H.G. Muller : Let second engine move in lockstep during dual analysis When the second engine is also analysing (as indicated by its stat variable second.analyzing), we send all moves / undos / positions / in&excludes that go to the first engine also to second. 2012-09-27 19:07:58 +0200 H.G. Muller : Allow second engine to analyze too Clicking the Analysis menu when analysis is already in progress will now toggle the secon engine to analyze the same position. For now, this lasts only until the position changes (or you leave analyze mode), after which the second engine is always switched off, and the Engine Output window returns to single pane. Each pane now has its own header line; the exclude header is suppressed in the second pane. 2012-09-27 18:11:23 +0200 H.G. Muller : Add options -fe, -se, -is to load installed engines/ics from list The volatile string options -fe, -se ('first/second engine') load the first and second engine of the given nickname in the -firstChessProgramNames list, including all options that were installed with it (similar to when in WinBoard the that engine line had been selected through the Startup Dialog's combobox). The option -is is similarly used to retrieve the line for an ICS in the -icsNames list. 2012-09-27 18:02:24 +0200 H.G. Muller : Add check on validity of tourney participants Before allowing OK of the Tournament Options dialog, it is now checked whether all participants (which are given as nicknames) can be found in the list of installed engines, so that no problems will occurr with non-existing engines during the tourney (if typos crept in after hand- editing the list). 2012-09-25 16:21:42 +0200 H.G. Muller : Implement --help option The list of options is printed before exiting. Some attempt is made to do it in a nice way. 2012-09-23 20:10:58 +0200 H.G. Muller : Implement variant seirawan in -serverMoves option Write the gating moves such that the ChessLive! viewer will understand them. 2012-09-23 20:05:07 +0200 H.G. Muller : Workaround for FICS bug FICS does not properly understand SAN, and thinks bxc3 can be a Bishop move. This broke 'Upload to examine', because that uploaded in SAN. In case the SAN starts with Bx or bx, it now uses long algebraic (with = before the promo char). 2012-09-20 18:17:55 +0200 H.G. Muller : Define XOP mime type for XBoard Supply a white-knight icon for this mime type, called application/x-xboard-opt, and a sesktop file to associate it with running XBoard with this settings file. 2012-09-20 17:24:29 +0200 H.G. Muller : Pay attention to extension of 'positional' arguments An argument without preceding option name was assumed to be an -lgf argument. This patch still does that by default, but if the argument ends in .fen, .epd, .trn, .ini or .xop it is considered an -lpf, -tf or -opt argument. In addition, an implied -lpf or -lgf argument also imply the option -viewer, which inserts the -viewerOptions string into the command line, and proesses it as options. A new option -tourneyOptions is similarly inserted for an implied -tf argument. These strings should contain all options needed to start XBoard fully configured as game viewer or tourney playing agent on the mentioned file. 2012-09-20 15:29:42 +0200 H.G. Muller : Let windows stick to right display edge (WB) Auxiliary windows docked to the board window from below or to the right, which are pushed out of view when the board window resizes, will be trimmed to just touch the diplay edge (if sufficient width or height remains). When the board window shrinks, auxiliary windows touching the edge will be resized so they remain touching it. 2012-09-20 15:20:36 +0200 H.G. Muller : Round board size to one where piece images available (WB) When using built-in bitmaps, in sizes where unorthodox pieces are needed, but not available, the size is temporarily rounded to one of the sizes where they are. 2012-07-03 17:21:53 +0200 H.G. Muller : Fix bug in Edit Position Due to = in stead of == the variant was always set to S-Chess in EditPositionDone(). 2012-08-28 21:24:51 -0700 Daniel Macks : bug #37210: Mishandling of X11 -I flags (tiny change) AP: applied patch from bugtracker and added one missing 'save_cppflags="$CPPFLAGS"' 2012-06-02 14:31:18 -0700 Arun Persaud : bug #36229: changed ICS_* from define to enum 2012-05-28 13:58:00 -0700 Arun Persaud : bug #36229: changed STATE_* from define to enum enabling better compiler checks 2012-05-28 13:50:50 -0700 Arun Persaud : bug #36229: changed PEN_* from define to enum This should allow better checks by the compiler 2012-05-28 13:01:15 -0700 Arun Persaud : fix bug #36228: reserved identifier violation variables and macro names beginning with _ are renamed to XB_. More consistent naming of include guards. See link in bug report. 2012-05-28 12:36:37 -0700 Arun Persaud : Updated German translation 2012-04-30 20:06:00 -0700 Arun Persaud : new version number for developer release 2012-04-24 11:23:04 +0200 H.G. Muller : Decapitalize promoChar in move parser 2012-04-23 14:12:10 +0200 H.G. Muller : Keep track of virginity of back-rank pieces in variant seirawan The forelast rank of the Board array is now used in VariantSChess to contain flags that indicate virginity of the back-rank pieces, one bit for white, the other for black. Legality checking of gatings now makes use of this info. FENs mention all virgin pieces not implied by castling rights in the castling field, by printing the corresponding file IDs, as long as holdings are non-empty. The FEN reader now also understands this format. EditPositionDone fakes virginity for all pieces that are on their starting square. 2012-04-17 19:49:24 +0200 H.G. Muller : Suppress clear-board message after pasting FEN The message field is now always cleared when you leave EditPosition mode. 2012-04-17 19:45:33 +0200 H.G. Muller : Fix faking of castling rights after editing position with holdings The queen-side rook was always imagined at X=0, which is in the holdings when these exist, so that Q-side castling in such games was never allowed after EditPosition. 2012-04-20 10:29:36 +0200 H.G. Muller : Fix WB Engine Settings window The listbox patch has broken this window, by making it only list the first option of the engine, by switching to the next column based on a >= test rather than == test. Fixed by using 1000 as invalid value for the break point, rather than -1. 2012-04-20 00:01:08 +0200 H.G. Muller : Fix key binding of DebugProc The name used for binding was DebugProc, while the ite was named Debug. 2012-04-16 20:51:50 +0200 H.G. Muller : Fix ICS Text Menu popup The space for the option names needed to be allocated. 2012-04-16 20:37:06 +0200 H.G. Muller : Fix disabling of Load Engine menu 2012-04-15 22:53:24 +0200 H.G. Muller : Port chat boxes to XBoard A new menu item Open Chat Window is added to the View menu. It opens a window that can handle 5 chats. A row of buttons on top selects which is the foreground chat partner, to which we type, and whose incoming messages will be displayed in the memo. The leftmost 'button' is not really a button, but a text edit, and the active partner is displayed there (so it can be altered). Selecting another chat partner through a button, moves that partner to the text-edit, and reshuffles the buttons. Incoming messages in a chat that is not foreground make the corresponding button color orange. 2012-04-16 20:27:08 +0200 H.G. Muller : Allow chaining of single-line text-edits to top For the benefit of the chat window, a text-edit plus leading description can now also be chained to the top edge of a dialog. The chaining of the (degenerate) multi-line ICS Input Box and Move Type-In was entirely to the bottom, which has now been corrected. 2012-04-12 09:30:24 +0200 H.G. Muller : Add logo widgets in main board window New options -logoSize and -logoDir are added. The former enables logo display, when non-zero and not too big. The latter is used by -autoLogo. The options -firstLogo and -secondLogo also work. Problem is that the clock height is larger than the logo height, and for now a nasty trick in GenericPopUp is used to position the next element (message field) w.r.t. the clocks, rather than the last element of the row above (the logo): in case of a SAME_ROW Graph element, 'last' is kept at the previous element. 2012-04-19 10:48:41 +0200 H.G. Muller : Fix crash on time forfeit with -st option When fixed time per move was set from the command line, the time-control strings were not set. This let to a crash when an engine forfeited. The GetTimeQuota function is now made resistant to a NULL pointer here. 2012-04-19 10:39:12 +0200 H.G. Muller : Solve WinBoard name clashes, fix zippy-analyze menu graying Some of the function names used in the refactored X11 front-end collided with Windows system names from winboard.h, or with names of internal routines in WinBoard front-end files (so they could not be declared in frontend.h). These were renamed. Some prototypes in engineoutput.h contained X11 types, and they were moved to xboard.h. In addition, two menu-item names were corrected to two-part names. 2012-04-18 12:00:43 +0200 H.G. Muller : Offer primitive paging in file browser If there are more than 1000 files that would have to be displayed, the number will be limited to 999, and a 'next page' entry will appear at the bottom. Clicking that will give you the next group. This is an emergency measure only, as it interferes with sorting (grouping is based on order inside the directory, i.e. kind of arbitrary, and sorting is only done within a group.) There is no such thing for the folder list yet. There is no way to go back to a previous page, other than closing and re-opening the browser, or selecting another file type. 2012-04-18 11:16:58 +0200 H.G. Muller : Add pixmap as file type known to browser Users can browse for a pixmap to set the board texture. 2012-04-17 15:45:27 +0200 H.G. Muller : Fix warning about signedness Note: the promoChar in ExcludeMoves was explicitly defined to make sure the kludge promoChar = -1 for indicating best move works. But it should be equivalent to casting the promoChar to (signed char) just before the comparison. 2012-04-17 15:44:15 +0200 H.G. Muller : Fix warnings about character index 2012-04-17 15:37:53 +0200 H.G. Muller : Move ManProc to xboard.c It calls ManInner, which requires X11 data types, even if the values are NULL. 2012-04-17 15:27:21 +0200 H.G. Muller : Move FileNamePopUp to dialogs.c 2012-04-17 15:15:03 +0200 H.G. Muller : Fix readout of numeric combobox As currently no numeric comboboxes are used, this bug was silent. 2012-04-17 15:10:54 +0200 H.G. Muller : Shuffle prototypes to correct header, or add them there 2012-04-17 14:15:15 +0200 H.G. Muller : Fix MenuNameToItem This function could crash when called with ann argument that did not contain a period, while the idea was that it should handle this as if the item is in noMenu (for user-specified key binding to non-menu funtions). 2012-04-16 19:43:03 +0200 H.G. Muller : Fix click-click under-promotion animation save 2012-04-17 11:02:39 +0200 H.G. Muller : Define TOPLEVEL in winboard.c 2012-04-17 10:59:33 +0200 H.G. Muller : Add two new strings to WinBoard language file 2012-04-17 10:51:02 +0200 H.G. Muller : Fix second-engine variant test The test whether the second engine supports the selected variant took place before the second engine was loaded, thus always coming to the conclusion that the variant was not supported, and aborting the TwoMachines command. The test is now moved to after second-engine loading (but before its initialization, where non-supporting would become a fatal error). 2012-04-16 12:11:09 +0200 H.G. Muller : Fix clearing of ICS input box after send 2012-04-16 19:08:10 -0700 Arun Persaud : enable -Wall -Wno-parentheses for all compilers that understand them 2012-04-16 13:18:37 +0200 Byrial Jensen : Remove 5 unused variables from zippy code 2012-04-16 13:14:06 +0200 Byrial Jensen : Remove unused static function ShowTC 2012-04-16 13:10:58 +0200 Byrial Jensen : Remove unused static function MenuBarSelect 2012-04-16 13:07:01 +0200 Byrial Jensen : Remove unused variable first_entry from function find_key 2012-04-16 13:01:09 +0200 Byrial Jensen : Remove unused variable tm from function SaveGamePGN 2012-04-16 12:56:46 +0200 Byrial Jensen : Remove unused variable delayedKing from function QuickScan 2012-04-16 12:52:57 +0200 Byrial Jensen : Remove unused variable pdown from function UserMoveEvent 2012-04-15 04:25:59 +0200 Byrial Jensen : Change some double literals to floats. To avoid unnecessary implicit promotions of float variables to double. 2012-04-15 11:12:02 +0200 H.G. Muller : Remove debug printf 2012-04-14 22:43:03 +0200 Byrial Jensen : Translate "NPS" also in engine output window 2012-04-14 16:19:34 -0700 Arun Persaud : removed unused variables (-Wunused-variable) 2012-04-14 15:37:05 -0700 Arun Persaud : added m4 directory to search path for aclocal. As suggested by Michel Van den Bergh 2012-04-14 23:21:56 +0200 H.G. Muller : Fix Eval Graph scale in drop games 2012-04-14 23:16:29 +0200 H.G. Muller : Fix ArrowDamage out-of-bounds access on drop moves 2012-04-14 21:33:49 +0200 H.G. Muller : Implement automatic partner observe Starting a game, or starting to observe one, now automatically issues a 'pobserve' command if dual-board is switched on, so that the partner game will pop up in the secondary board (assuming it is bughouse). The secondary board now displays the players in the title. (This (lightly) breaks WinBoard again.) When the primary game ends, the secondary board closes automatically. Initial sizing of the board is repaired, and now uses the actual current board size, rather than the initial size of the main board. 2012-04-14 15:43:30 +0200 H.G. Muller : Fix crash due to empty PV Reception of a stat01 command before the first PV could cause a crash, as apparently the parser cannot handle this. 2012-04-14 13:27:48 +0200 H.G. Muller : Suppress testing for availability in bughouse drops Give up on testing legality of bughouse drop moves; this only causes problems, because the move list sent by the ICS is not accompanied by holdings updates. So XBoard parses it thinking the holdings are empty, making every drop move an ImpossibleMove. Bughouse can only be played on ICS, and we might as well trust the ICS that it will only pass us legal moves. A user should not be able to enter illegal drops; unavailable pieces cannot be grabbed from the holdings, and typing is diverted to the ICS directly (which would reject the illegal drop without XBoard even knowing about it). Also improve switching to bh/zh, based on drop move in initial board. 2012-04-14 09:11:22 +0200 H.G. Muller : Fix some compile errors / warnings 2012-04-13 19:06:17 +0200 H.G. Muller : Fix promotionPopDown on new move entry The promotion popup is non-modal, and old XBoard versions popped it down as soon as the user clicked the board, so he could just enter a new move to abort the promotion. This was broken in the new version, because the code to do the PopDown and abort in HandleUserMove had not been ported. 2012-04-13 18:38:51 +0200 H.G. Muller : Use in-place sweep-selection for click-click under-promotion With detour under-promotion a piece cycles through all possible choices during backwards dragging. But in a click-click move there is no dragging. This used to be solved by letting the second click start a drag event of the default promotion choice, which you could accept by immediately releasing the mouse button, or drag around to change it first. The dragging in this case seemed a little unnatural, because the to-square was already indicated by the down-click. So it has been changed now to the promo choice appearing on the down-clicked to-square, followed by EditPosition-like sweep-selection on that square when one wants to under- promote. The move is always accepted no matter where the up-click takes place, except when it takes place on the from-square (which offers a last- resort abort possibiliy). Note that click-click promotion is essential in variants where it is not obvious from the from-square alone that a promotion is imminent, but where it depends on the to-square. (Such as Shogi.) There drag-drop detour under- promotion is not possible. 2012-04-13 16:05:16 +0200 H.G. Muller : Improve arrow drawing The arrow is now erased together with the border highlights, by marking the damage it did, and then doing a selected redraw of the board to let the damaged square be re-drawn. Highlights of a previous move are now cleared on the down-click that selects a new piece, so there never is an arrow to infavorably interact with animation of dragging. 2012-04-13 14:57:15 +0200 H.G. Muller : Also do selective redraw with showTargetSquares on The XBoard DrawPosition now also keeps track of the previous marker state, and redraws squares for which thi shas changed. As a result, the routine MarkTargetSquares does no longer have to force to complete redraw. (Breaks WinBoard?) 2012-04-13 00:33:28 +0200 H.G. Muller : Fix click-click sweep promotions to empty square These did not work, because DragPieceBegin would fail on an EmptySquare. 2012-04-12 23:58:41 +0200 H.G. Muller : Move clearing of target squares to after drag end A dragged piece that would partly overshoot its destination into a square with a marker would effectively protect that marker from erasing, when the erasing was done before the piece was released, because redrawal after the move only would draw the target square. (Unlike erasing, which forces a full redraw.) 2012-04-12 23:49:27 +0200 H.G. Muller : Fix double promotion popup Only the up-click of a click-click move gives a promotion popup now. 2012-04-12 23:32:28 +0200 H.G. Muller : Fix promotion popup The new GenericPopUp did not like it if the first button had 'SAME_ROW' set. 2012-04-12 17:28:32 +0200 H.G. Muller : Allow clearing of marker dots in any mode There might already be dots when you change to a mode where there should be none, and you don't want them to stay on forever in that case... 2012-04-12 17:00:55 +0200 H.G. Muller : Fix redraw of secondary board on flipping view 2012-04-12 10:30:21 +0200 H.G. Muller : Let clocks of secondary board count down The back-end now remembers what is the active clock, and the time left on it. This is then decremented and updated together with the clocks of your own game, using the partnerUp flag to divert the clock display to the secondary. 2012-04-12 09:47:43 +0200 H.G. Muller : Fix 3 forgotten symbolic widget references 2012-04-11 19:24:36 +0200 H.G. Muller : Add sound files to browser menu 2012-04-11 13:04:24 +0200 H.G. Muller : Add New Directory button to file browser 2012-04-11 09:54:51 +0200 H.G. Muller : Detect engine exit during startup The case where engine startup failure does not result in a fatal protocol message, like "No such file", but where it simply exits, is now also covered. 2012-04-10 22:55:07 +0200 H.G. Muller : Suppress popup for fatal error after tellusererror For cooperating better with Polyglot, and allowing more to-the-point error messaging, the (awful) default message will be suppressed if the dying engine already provided an explanation for its demise to the user. 2012-04-10 20:28:45 +0200 H.G. Muller : Fix Engine Output icon heights in international versions The text in a label option could not be an empty string, or it would be 'translated' to something of enormous size. So it is set to a space now. 2012-04-10 20:21:56 +0200 H.G. Muller : Fix internationalization The internationalization was broken by moving the XtSetLanguageProc to behind 'bindtextdomain'. 2012-04-10 20:03:46 +0200 H.G. Muller : Make reference to board widgets symbolic 2012-04-10 18:39:25 +0200 H.G. Muller : Don't strip path from engine name if directory given 2012-04-10 17:54:33 +0200 H.G. Muller : Fix vertical chaining of Buttons and browser ListBoxes 2012-04-10 15:53:47 +0200 H.G. Muller : Fix auto-play The 'narrow search' modification had broken auto-play, because all selected games were marked as matching position 0, so that they would all start in thr opening position. 2012-04-10 13:30:44 +0200 H.G. Muller : updated po/pot files 2012-04-10 11:54:50 +0200 H.G. Muller : new version number for developer release 2012-04-10 13:22:40 +0200 H.G. Muller : Update POTFILES.in 2012-04-10 13:21:33 +0200 H.G. Muller : Fix Makefile EXTRA_DIST 2012-04-02 17:53:40 +0200 H.G. Muller : Use Ctrl key in EditPosition mode to copy pieces 2012-03-28 23:51:28 +0200 H.G. Muller : Fix bug in FRC castling for position search In FRC it is essential that both pieces are taken off the board before any of them is put back, lest they obliterate each other. 2012-03-28 12:25:20 +0200 H.G. Muller : Fix bug on loading engine A newly loaded engine was put at the end of the game, rather than at the current position, (which is required in EditGame mode). 2012-04-06 17:02:21 +0200 H.G. Muller : Add 'Narrow' function to position search 2012-04-06 10:52:45 +0200 H.G. Muller : Reorganize main() a bit The font stuff goes into a separate routine, and the X11 stuff is moved backwards as far as possible. 2012-04-04 21:55:50 +0200 H.G. Muller : Give the dual-board option a separate board window The second board window pops up whenever an alien board is received during your game. Moves in it are highlighted by an arrow, irrespective of the 'Highlight with Arrow' setting. The clocks are displayed, but do not count down. 2012-04-05 11:23:03 +0200 H.G. Muller : Port engine grouping to Match Options dialog 2012-04-05 15:18:25 +0200 H.G. Muller : Change default directory in Load Engine to "." 2012-04-05 10:49:56 +0200 H.G. Muller : Port grouping to XBoard Load Engine Add highlight to Load Engine grouping 2012-04-06 17:19:33 +0200 H.G. Muller : Fix default file types for browse buttons 2012-04-03 09:14:44 +0200 H.G. Muller : New browser Redo file browser with GenericPopUp This had to solve quite some problems, because it wanted to use a ComboBox option while a transient dialog could be up, was a non-engine dialog while an engine dialog is up, and XRaiseWindow does not work properly. Sorting is done alphabetically, or for digit groups by numeric value. 2012-04-02 14:43:24 +0200 H.G. Muller : Use ListBox in stead of ComboBox in Match-Options dialog 2012-04-02 14:09:15 +0200 H.G. Muller : Use ListBox in stead of ComboBox in Load Engine dialog Make Load Engine listbox sensitive to double-clicking 2012-03-26 17:06:33 +0200 H.G. Muller : Add message about enabling in New Variant dialog 2012-03-31 20:27:20 +0200 H.G. Muller : Move LoadGamePopUp to menus.c 2012-03-31 20:25:22 +0200 H.G. Muller : Move DisplayMessage to dialogs.c Use the wrapper SetWidgetLabel to make it back-end. 2012-03-31 15:23:30 +0200 H.G. Muller : Fix switching debug option during session. Switching on debug mode during the session did not create the requested debug file. 2012-03-31 15:22:57 +0200 H.G. Muller : Correct texi file for use of .Xresources 2012-04-02 19:19:30 +0200 H.G. Muller : Fix recent-engines menu A new primitive to create an item in a given menu was added to do this. 2012-03-31 10:54:22 +0200 H.G. Muller : Switch back two two-part menu names The menu code is again completely changed; a handle field is added to the MenuItem tables to store the widget for the item, and this info is used to alter sensitivity or marking. MenuToNr is replaced by MenuNameToItem, which looks up the two-level name directly in the menu tables. Put all currently unused MenuProcs in noMenu table, so they are available for key binding through the new method. 2012-03-24 18:36:44 +0100 H.G. Muller : Redo main board window with generic popup Some of the improvements in GenericPopUp (committed earlier) were added especiall for this (menu and box Option types), and the commits that used them to make a fully functional board, listed below, were collapsed into this one. This uses the new box and menu features of the Generic popup. Make option table shadow board consistent with refactor Do main menus in shadow board The board made by GenericPopUp now also has (functional) menus. The Expose callback now also uses the new format (passing coordinates). Use BoxEnd callback to decide about smallLayout The shadow board now dynamically decides whether it should use smallLayout positioning of the title-in-window widget, using a callback in the BoxEnd option for the menu bar: If no reasonable amount of space is left behind the menu bar, the title is forced under the clocks (smallLayout). Do some mouse handling on shadow board Only button 1 events for now. We have to keep track if the button is down! Connect button 3 to shadow board For now only for piece and PV manipulation: no context menus yet Symbolic reference in option formatting choice <-> textValue xboard.c Improve expose callback shadow board Implement context menus of shadow board This uses the new generic PopUp option TopLevel xboard.c Make mock-up board available through menu item Make clocks of shadow board sensitive to clicking Make button bar of shadow board operational The back-end Event functions are specified as user callbacks directly; this is not very clean, as they are parameterless, but called with an int argument. This should have no bad consequences, though. Switch to using shadow board as main board The menu marking and enabling had to b switched off for this, as it only worked on the old menus. Remove HandleUserMove. Deleting of unused shell variables, clocks to dialogs.c Move BoardPopUp to dialogs.c This required passing on fome front-end vars as parameters, and returning apointer to the option list, to make the handles available in xboard.c. Simplify InitDrawingSizes Now that all widgets of the main window are properly chained, there is no need to resize them when the board format changes: setting a new width for the shell suffices. Cleanup some unused Xt Args 2012-03-31 10:53:46 +0200 H.G. Muller : Remove unnecessary menu unmarking for Edit Tags 2012-03-29 19:09:34 +0200 H.G. Muller : Split sync-after options in Match dialog into checkbox + label Now the checkbox texts are highlighted on hovering, we don't want the explanatory text behind it to be highlighted with it. 2012-03-26 17:12:33 +0200 H.G. Muller : Make variant-unsupported-by-second error non-fatal 2012-03-23 20:06:15 +0100 H.G. Muller : Redo Eval Graph with generic popup The Graph option of the GenericPopUp is used to implement the Eval Graph. Compared to the previous implementation, which was drawing directly in the form widget, the new one has one extra widget layer, but that did not affect the code anywhere. Adapt eval title to width of eval graph. 2012-03-23 15:17:14 +0100 H.G. Muller : Redo Engine Output window with generic popup A new file nengineoutput.c holds the X-independent code. This makes use of new capablities of GenerciPopup, for having Label widgets on same row, stacking panes after a Break, and chaining Label and Text widgets. 2012-03-21 23:00:05 +0100 H.G. Muller : Redo Game List with generic popup Check in ngamelist.c Redo Game List with generic popup The X-independent code (i.e. almost all) is moved to a new file ngamelist.c. Make button in Game List to pop up Game List Options Fix scrolling game list Fix popup of existing Game List after loading file Wheel-scroll game list Symbolic reference game list TopLevel game list Put format flags with listbox options 2012-03-21 17:58:27 +0100 H.G. Muller : Redo Game List Options with generic popup 2012-04-05 21:56:52 +0200 H.G. Muller : Add -dialogColor and -buttonColor options These only override system defaults if they are non-empty strings. 2012-03-28 15:52:01 +0200 H.G. Muller : Add -topLevel option This persistent Boolean option determines if the auxiliary windows (Game List, Move List, Engine Output, Eval Graph, Tags and Comment) use top-level shells (with their own icon on the task bar, and independently closable). Other dialogs will always use transient shells. (Also he modal Error and Promotion dialogs, for which the modality presumably only serves to pop them down without special attention.) A control for this was added in the General Options dialog. 2012-03-20 15:30:00 +0100 H.G. Muller : Redo ErrorPopUp with generic dialog keeps popping down error popup.Multiple Error popups remeain tricky; add comment to describe problem with multiple ErrorPopUps. 2012-03-20 10:22:46 +0100 H.G. Muller : Redo PromotionPopUp with generic dialog The dialog is no longer modal. 2012-03-19 21:56:48 +0100 H.G. Muller : Redo AskQuestion dialog with generic popup 2012-03-19 21:55:58 +0100 H.G. Muller : Major refactoring of GenericPopUp Allow more transient dialogs in GenericPopUp Remove grab from promotion popup Fix other generic popup over transient popup To use the generic dialog generator for 'asynchronous' popups (Ask Qustion or Error popup caused by engine), the currentOptions setting has to be restored for the combo and checkbox callbacks of the transient to still work after the asynchronous dialog returns. Note that only transient dialogs can have check and combo controls. Make generic calcel button suppressible Also #define some more symbols for Option.min flags, and move them to dialogs.h. Change TypeInProc to general OK handler The move type-in now has its own option list, to distinguish it from the ICS input box, and give it its own OK handler. Rather than having the translation for on the text widget call TypeInEvent directly, we let it call GenericCallback, which calls GenericReadout, which calls the OK proc, which does the job. To be able to call GenericCallback from the TypeInProc, the recognition of OK and cancel buttons had to be changed. This because it was too difficult to arrange the calling widget had label OK or cancell. So these buttons are no longer recognized by name, but by the option number passed as client data. (This solves the problem that a user could not make buttons named 'cancel' or 'OK'.) Make Cancel button optional Fix closing multiple popups of same kind The GenericCallback figures out its own shell, so all buttons of multiple dialogs keep working. External calls to PopDown only work on the lastcreated instance of that kind, though (including those from the Delete Window button, which can do 'cross-closing'). shellUp is now a counter, and PopDowns are only prevented when it reaches 0 or the current shell does not exist. (To know this, PopDown now resets shells[n] to NULL when is shell is destroyed. Beware of double PopDowns (through OK procs); they wreck the system. Fix Delete Window button of multipe ErrorPopUps The action routine for handling the Delete Window now pays attention to the shell widget that the system passes to it, and temporarily replaces shells[n] by it to let PopDown act on the proper instance. Add ListBox dialog type to GenericPopUp Fix vert sizing of ListBox Put listbox widgets in viewport Put listbox in viewport Improved xoptions.c support for focussing and listboxes Fix OK-row button positioning Let GenericPopUp take parent and modality as arguments This makes the code a bit more explicit and less kludgy. It also becomes possible to call the same dialog (e.g. Load Options) from the main menu and from another dialog (e.g. the Game List). Support scroll function for generic popup listboxes Fix scrolling Move HighlightWithScroll to xoptions.c Change scroll algorithm Add mouse-wheel scroll to generic list boxes Implement tabbing between text edits Implement same-row text labels in generic dialog Allow labels to specify their chaining in generic popup The opt.min variable is used to specify the chaining: 0xF0 are the bits for (left, right) chaining of the left side (0xC0) and right side (0x30). The 0xC bits determine top or bottom chaining of the entire label. Without anything spcified (0), the chaining is XtRubber. TextBox options can also specify top-chaining of their top. All this was needed to allow decent implementation of the Engine Output window with the generic popup. (Although tags and comment popup ca benefit from the latter feature.) Let GenericPopUp support a Graph option The Graph option results in an area where one can draw something. It is positioned / chained similar to Label options. A handler for expose events can be specified in the textValue field of the option. Implement box widgets and menu buttons in GenericPopup To enhance the capabilities of GenericPopUp such that it could create the main window, it needs to be able tha packaging of controls into a box widget (for mennu and button bar). Menu buttons are also required elements (although they do look a lot like comboboxes?) Option types BoxBegin and BoxEnd can now be used to bracket a group of controls that will be put in a box widget. (Cannot be used recursively!) The positioning of the box is similar to that of a Label, and is specified in the BogBegin option. The code to shrink the menu buttons to fit is also incorporated, to act on any box widget: if the BoxBegin option specifies a width, the elements in it are shrunk to meet the requirement. Otherwise the box just gets the size of the sum of its children (plus spacings). Label options can now specify a font, casted into their textValue field. (This is needed to get the proper size for the clock widgets.) Implement callback in BoxEnd options BoxEnd is a pseudo-option, to trigger packing the preceeding ones in an earlier-opened box widget. In the process it calculates the size of the box widget (and trims it if a size was specified for it in the corresponding BoxBegin). The Option.target field of BoxEnd is now interpreted as a callback, which can be use to take decisions based on the determined size for the remaining options in the list, before these are processed b GenericPopUp. Refactor xoptions.c Make a subroutine to set args shared by almost all widgets. Swap meaning of '1'-bit in option.min flag of Break option, to be consistent with SAME_ROW interpretation in other option types. Make option tables consistent with refactored GenericPopUp The flag for stacking in the Break option needed to be inverted, and the BoardPopUp needed to pass the font in another field. Better use was made of the improved chaining options too. Improve Graph-option event handling The user-supplied callback now gets 3 arguments passed: the event type (0 = pointer motion, 1...5 button press, -1...-5 release, 10 = expose), and two coordinates. For ouse events these are the pointer (x,y), while for expose events they are the window size (w,h). The callback is now specified in the option.target field of the Graph option. Store engine options in malloc'ed memory The Option.name field has been re-declared as (char*), from (char[MSG_SIZ]). There are still MSG_SIZ chars allocated irrespective of actual size, because the field is also supposed to store the textValue, which can be changed by the user. But at least it means that unused options of the generous list now don't waste much space. (And the prparated Option tables in dialogs.c will shrink by a large factor as well.) Improve GenericPopUp ComboBox handling. The dialog type is now passed to the combobox callback as well, and this is used to really figure out what option it is called for. Allow numeric comboboxes When no list of strings is given in Option.choice, the target is assumed to be (int), and the number of the slected entry is stored there. Also adapts the Label options that act as fillers to the new method for making dummies (namely NULL in the Option.name field). Put comboCallback in Option struct Rather than having a general comboCallback variable for the entire current dialog, each ComboBox option can now specify its own callback in the target field of the option: the COMBO_CALLBACK bit of Option.min indicates whether the target is a variable to be set or a callback. The callback can still fetch the choice from the values array. Allow generic CreateComboPopup also to do main menus An extra parameter to CreateComboPopup determines if the menu texts should be taken from a list of strings (the old method with engine- supplied choices), or from a menu table of MenuItems. It can now also recognize "----" as a menu break, and keeps margins (for the marking). Make subroutine for determining curren combo selection Various fixes to GenericPopUp Delete one border-width setting Fix max nr of args in GenerocPopUp Fix button release events of Graph options Fix generic Graph callback pointer motion coordinates Make all format referencing in Option tables symbolic Let Option.choice define menu texts, rather than Option.textValue This is more logical than ussing textValue for it, because choice already has the correct (char**) type, while textValue was (char*), and needed casting everywhere. Note that for engine options, the fields were the same anyway, so no back-end change was required. The textValue now contains the (casted) list of actual string values, where these are needed. (But for numeric and function menus they aren't.) Add PopUp Option type An new pseudo-Option is defined, to add a popup menu to a previous Graph option. The actual popping up is done by the expose handler. The function XUngrabPointer is the key to success here. A PopUp option specifies a callback for handling the selection from the menu, which will be called with the option number, exacty as with ComboBox options. Update option explanation in dialogs.h Make Spin and CheckBox callbacks pass dialog number No longer rely on 'currentOptions' for getting the option belonging to the callback, but get it out of the dialogOptions array indexed by dialog type. This way things cannot be messed up by an asynchrounous error popup. It also means that it is now save for non-modal dialogs to use these options. Use button widget for text behind checkbox Let listboxes use general formatting hints Let GenericPopUp option always finish last pane after Break Allow LisBox to specify select callback in Option.textValue Use double-click to trigger ListBox callback Make ListBox callback re-entrant Fix multi-line Label options Separate CreateMenuItem out from CreateComboPopup Chain checkbox texts entirely left Allow a user-specified callback to Label options This is needed to implement the clocks. Let the CheckBox callback handle it. For now ther is no distinction between different mouse buttons. 2012-03-21 11:15:01 +0100 H.G. Muller : Prevent double PopDowns Some DialogOK functions ordered an early PopDown themselves. This, however, resulted in PopDown being called twice when they returned TRUE. This interfered with the new system for allowing multiple instances of the same dialog. So these functions are now fixed to suppress the standard PopDown by always returning FALSE. 2012-03-20 19:10:50 +0100 H.G. Muller : Split usounds.c and usystem.c from xboard.c X-independent code was moved to separate files. The nef file usound.c contains the sound handling, which in XBoard is trivial, because it uses an external player, but could be replaced by a complex one on platforms that have to handle the sound themselves. The usystem.c file contains all non-X Unix-like stuff, such as fork, pipe, system, getenv. I also contains some color parsing for the xterm colors. This stuff could be useful on platforms that support Unix-like system calls. 2012-03-26 19:03:19 +0200 H.G. Muller : Make routine to probe shift keys The code to probe Alt keys was taken out of MoveTypeInProc, and extended to probing Ctrl and Shift keys too. These are now returned in the 6 LSB of an int by ShiftKeys(). 2012-03-19 13:15:11 +0100 H.G. Muller : Remove one level of indirection on ICSInputBoxPopUp 2012-04-10 10:26:24 +0200 H.G. Muller : Cleanup of xboard.c Remove AskQuestionProc A bit of cleanup on xboard.c prototypes Remove dead file-browser code Delete vestigial jail code All the stuff about jailColor was deleted. Only one fishy thing remains: xpmJailSquare seems under some conditions used in BlankSquare to draw a 'neutral' square. it is set to a copy of a light square image. But in the current design 'neutral' means blacked out between board and holdings, and even with image use, it should not resemble a light square... Remove registering of CommentPopDown and TagsPopDown Merge CopyGameSelection into CopyPositionSelection 2012-03-19 11:38:17 +0100 H.G. Muller : Move some back-endish routines from xboard.c to dialogs.c Move ICS input-history handling to dialogs.c Move ICS Input Box text handling to dialogs.c Move DisplayXxxx routines to dialogs.c Move DisplayTitle to dialogs.c A wrapper SetWindowTitle remains in xboard.c. 2012-03-18 20:10:35 +0100 H.G. Muller : Split back-endish part off xoptions.c, and move to dialogs.c Some MenuProcs for dialogs were also moved to dialogs.c from menus.c. MoveTypeInProc which is an event handler for the board widget, was moved to xboard.c, where it can be static. Identify dialogs by enum type A new header dialogs.h is created, which defines an enum type DialogClass that is now used to identify the various dialogs done by GenericPopUp. The prototypes for GenericPopUp/PopDown, and other globals shared by the dialogs code and other modules can go in here as well. Remove ClearTextWidget This did the same as SetWidgetText with an empty string. Split X-code from PutText Split back-end part from MoveTypeInProc Take set-title out of comment popup Sort MenuProcs in dialogs.c with their support functions Declare globals in dialogs.c with functions where they belong Add prototypes to dialogs.h Move prototypes and globals from xoptions.c to dialogs.h Make accessor DialogExists for dialog shells Add dialogs.c to makefile: compiles and runs! Combine 3 calls into front-end to InitDrawingParams Move EditCommentProc and ICSInputBoxProc to dialogs.c Pass option list as argument to GenericUpdate and GenericReadOut Shorten argument name from currentOption to opts This to prevent confusing it with the global variable of that name. 2012-03-18 15:33:18 +0100 H.G. Muller : Declare some shared global variables in backend.h The vlobals twoBoards and partnerUp were only shared through an extern declaration in xboard.c 2012-03-18 12:34:42 +0100 H.G. Muller : Split back-endish part off drawing code and move to board.c Split DrawSquare in front-end and back-end part Back-endize DrawHighlights and DrawPosition The already existing wrapper FlashDelay is used as a kludge to do an XSync. We now pass a code for the line color GC to the highight routine. New wrappers are DrawGrid() and DrawBorder(). Back-endize atomic explosions Back-endize DrawArrow and DrawDragPiece DrawDragPiece now calls DrawOneSquare with argument EmptySquare in stead of the X-type referring BlankSquare. A new wrapper DrawPolygon fixes DrawArrowBetweenPoints. Move board-drawing logic to new file board.c All X-independent drawing logic (board, squares, arrows, highlights, some animation stuff) has been extracted from xboard.c, and moved to a new file board.c, which is back-end (but unshared with WinBoard). A new header board.h defines the cross-references (which of course required some functions to be no longer declared as static). A bit of code was moved from DragPieceBegin to BeginAnimation, which now has an extra argument to indicate which piece should appear from under a dragged piece. This makes DragPieceBegin free of XCopyArea calls, so it could be moved too. Make board.c truly back-end Get rid of all X data types. For this the AnimState struct had to be redefined: the GC and Pixmap was taken out and put in front-end arrays indexed by anim agent (game and player). For this indexing a new enum was defined. The XPoint type was also replaced by our own type of an int pair (which is nasty, because the int size could be different). Move more animation code to board.c 2012-03-18 10:08:55 +0100 H.G. Muller : Contract some awful code replication The code for making an X-color was replicated 6 times, and is now made into a subroutine. The code for creating GCs was quite repetitive as well. 2012-03-18 08:34:54 +0100 H.G. Muller : Move more back-endish menu-related stuff from xboard.c to menus.c Move menu enabling to menus.c Only the wrapper EnableMenuItem stays in xboard.c. A new wrapper EnableButtonBar was necessary, because Training mode wants to enable/disable that too. Move all back-endish MenuProcs to menus.c Many if the MenuProcs that could not be eliminated by listing the corresponding back-end MenuEvent function as handler directly, are still completely plactform indpendent. (E.g. when the MenuEvent needs a parameter.) These are all moved to menus.c now. Convert all dead MenuProcs to using MarkMenuItem The MenuProcs for the option items that no longer exist were also converted for check-marking their item in the new way, because we might revive them for key binding. Move the dead MenuProcs also to menus.c Revive dead menu procs Move GreyRevert to menus.c Move ModeToWidgetName to menus.c Move initial menu marking to menus.c A new function InitMenuMarkers was split off from main() to do this. 2012-03-18 08:17:53 +0100 H.G. Muller : Switch to use of short menu references The prefixes menuXxxx. for the item names are abolished. This made it necessary to also add a MarkMenuItem function that can handle short names for putting the xMarkPixmap on the items, as the names returned by ModeToWidgetName are used for both enabling and check-marking. Let MarkMenu use MarkMenuItem wrapper 2012-03-17 10:47:04 +0100 H.G. Muller : Refactor menu code, and move it to menu.c Supply new method for key binding It is annoying that every menu item needs its X-specific handler routine, because this handler has to be registered to X for becoming eligible as a key binding. Another disadvantage of this method is that the user wanting to make the binding has to know the name under which the menu function is registered (e.g. FlipViewProc). A new method is now made available, which uses only a single (X-specific) routine, registered with X as "MenuItem", as generic key-binding handler. The bindings can then be made by the user specifying "MenuItem(FlipView)". This requires a new list of potential bindings, which should be filled by the menu-creation routines. (Currently only contains only a predeficed example.) No longer register all MenuProcs with X The list with available menu procs is moved to the user-maintained menuItemList. Only QuitProc had to stay registered with X, because it is used in CatchDeleteWindow. (So it is in both lists now.) In the future, most of the list can be built automatically from the menu tables. Alter type of MenuProcs to void(void) By getting rid of the argument list with X-types, most menu procs can become back-end. In the cases of ManProc and QuitProc the original version had to be kept as well, because in ManProc the argument was actually used (with key binding), while QuitProc is used for delete window. Remove now unnecessary menu wrappers Now the MenuProc have an empty argument list, those that also call a single 'MenuEvent' without arguments have become completely redundant, and have been taken out of the loop by calling the corresponding MenuEvent directly. Build menuItemList from menu tables Rather than having an initialized table of name-proc associations (which used to be the X registrations) for the menu items, we now build the list during menu cration from the menu tables. The menu "ref" is now used as proc name. This means the old MenuProc names used in the predefined key bindings had to be changed to conform to this. Note that the bindings would slice up names containing spaces in several parameters, so in the translations the spaces were squeezed out of the item names. This requires a hand-written comparison routine Equal() to identify the binding. Remove prototypes of deleted MenuProcs Move prototypes of platform-independent MenuProcs to menus.h Create a new header file for the menu stuff, so that we can move the corresponding handler routines out of xboard.c to a back-end file. Extract back-end code from menu creation The menu tables and code to interpret them is moved to a new file menu.c. Only basic fuctions for creating a pop-down list and for adding an item to it remain in xboard.c. 2012-04-07 15:59:50 +0200 H.G. Muller : Remove some unused (exclude-moves) variables 2012-04-07 15:57:54 +0200 H.G. Muller : Install engine within current group 2012-04-07 15:53:29 +0200 H.G. Muller : Switch to using listboxes for engine-selection in WinBoard 2012-04-07 15:36:02 +0200 H.G. Muller : Implement Narrow button in WB Game List 2012-04-05 15:15:09 +0200 H.G. Muller : Silence unjust warning 2012-04-04 12:18:43 +0200 H.G. Muller : Fix memory corruption through InitString and second-engine loading The InitString and ComputerString options were not swapped when replacing the second engine, so that the ChessProgramStates of the first engine could point to an invalid (already freed) init string. Also make sure that appData.directory contains its value in allocated memory, even when hand-loading engines. Some of the rare options were not swapped either, and would thus always be loaded for the first engine when -singleEngineList was true. They are now also all reset to their default, before engine load, to prevent options of one engine to linger on for a next that does not specify them. The intentional exception is -firstHost. 2012-04-01 20:51:53 +0200 H.G. Muller : Fix PV sorting during fail low When an engine reports a fail low as thinking output, and then re-searches the same move with larger window, it now gets a lower score. This line would then be sorted below the earlier fail low, because it was mistaken for a multi-PV line for an inferior move. This patch suppresses PVs overtaking each other if they start with the same move. 2012-03-30 20:09:58 +0200 H.G. Muller : Extend smallLayout regime up to size Medium Because of the increase number of menus, there is not enough space for a title next to the menu bar at smaller sizes. In fact it is questionable if the title should ever go on the same line as the menu bar. 2012-03-30 10:38:27 +0200 H.G. Muller : Fix parsing crazyhouse promotions with legality testing off With legality testing off, any promotion suffixes in a move are taken 'on faith'. But in crazyhouse the piece ID for normal pieces is used as promotion suffix for promoted pieces, so this would Loop Chess rather than Crazyhouse. Now attention is payed to presence of ID-less promotion pieces (indicated by ~ in the pieceToCharTable), and if there are, these prevail ovr the specified type. 2012-03-30 10:07:04 +0200 H.G. Muller : Fix browsing for save file in WB The generic popup browse buttons used the wrong flavor of browser, which would only accept existing files. This was inconvenient when browsing for a save file. The other flavor of browser is now used by default (so that engine options also use it), and a new flag is added in the option.max field (which was already indicating file type) to request readonly browsing for a save file. 2012-04-02 10:18:37 +0200 H.G. Muller : Let clicking on header line exclude moves The exclude header in the Engine-Output window can now be clicked, to toggle the exlusion of the listed move. Clicking on 'none' resets all exclusions, clicking on 'best' excludes the first move of the latest PV. The pseudo-move 'tail' represents all non-listed moves. 2012-04-01 22:39:55 +0200 H.G. Muller : Keep list of excluded moves in Engine Output header As long as there is still space, excluded or included moves are added to a new header line in the Engine Output window (prefixed with + or - depending on whether they are currently excluded or included). Future in/exclusions of that same move then alter the prefix. 2012-03-21 23:12:20 +0100 H.G. Muller : Fix focus of Game List After focus was transferred to the filter text-edit, it was impossible to get it back on the game list (to make the arrow keys working again). A translation to left down-click is now used to assign focus, just as it would for text edits. For unknown reason this only worked if the translations were instated by Overriding, rather than Augmenting, which again required the normal translation of downclick, Set(), which selects the clicked item, to be explicitly mentioned as well. 2012-03-16 22:41:19 +0100 H.G. Muller : Fix taking effect of some option changes This fixes a bug reported at Ubuntu: when switching off move highlighting in Two Machines mode, the last move before the switch stayed highlighted. The GeneralOptionsOK() now clears any remaining highlights when highlighing is off. Similar problems with blind-fold mode and coordinates, which require a total board redraw to take effect, are now solved by also forcing such a redraw in GeneralOptionsOK() when they change. 2012-03-16 21:58:55 +0100 H.G. Muller : Add exclude and setscore to protocol specs 2012-03-16 14:47:25 +0100 H.G. Muller : Fix clock stop after dragging DelayedDrag always cancelled the previous drag timeout event, even when this was no longer pending because it had already taken place, and the event ID was resused by some other timeout (usually a clock tick). 2012-03-14 21:06:28 +0100 H.G. Muller : Implement exclude moves Dragging a piece by double-clicking it on the from-square in analysis mode will not perform the entered move, but send an exclude or include command to the engine for that move (provided the engine enabled this with feature exclude=1), depending on if the move was already excluded or not. To this end a map of excluded moves is kept, and cleared when we move to another position through moving, undo, setboard or new. The user can see whether he included or excluded the move, as exclude uses premove highlights. Commands "exclude|include all" are sent when we throw a double-clicked piece off board (vertically or horizontally, respectively), but after exclude all the most recent PV move is included again. Remaining problem is that promotions can only be excluded. 2012-03-14 15:13:18 +0100 Byrial Jensen : Mark new text "Click clock to clear board" for translation 2012-03-13 21:46:55 +0100 H.G. Muller : More thorough switch to -ncp on engine failure The ProcRef and InputSource are now also cleared, and just to be sure there are no surviving adapters, the child is killed when engine startup fails. 2012-03-13 21:25:22 +0100 H.G. Muller : Install engines as ./exefile in XBoard When a path name is split into directory and filename, the latter in Linux must be preceded by ./ in order to make it executable in the directory XBoard starts it in. 2012-03-13 14:11:18 +0100 H.G. Muller : Inform user in EditPosition mode how to clear board With -pieceMenu false the board is cleared by clicking the clock, but since this is impossible to guess, it is now printed in the message field. 2012-03-13 14:06:32 +0100 H.G. Muller : Fix fall-back on -ncp mode When the requested engine could not be started, the user still had to wait for the feature timeout to expire before the UI was re-enabled, and the now-useless loading action would continue. In stead we now cancel any scheduled continuation, thaw the UI immediately, and switch the menus and gameMode to ncp straight away. 2012-03-10 18:55:24 -0800 Arun Persaud : updated po/pot files 2012-03-10 18:54:32 -0800 Arun Persaud : new version number for developer release 2012-03-06 16:37:02 +0100 Byrial Jensen : Fix typo (seach) in string. It is already fixed in branch v4.6.x 2012-03-04 14:52:34 -0800 Arun Persaud : added some documentation about what's need to be done for a release and a bash-release script 2012-02-28 21:09:18 +0100 H.G. Muller : Fix suspected bug in Makefile 2012-02-26 18:55:10 -0800 Arun Persaud : add information about our webpage and were to report bugs into the help menu 2012-02-26 18:40:27 -0800 Arun Persaud : fixed "make install-pdf": missing target for recursive make in po directory 2012-02-26 23:06:33 +0100 H.G. Muller : Suppress recent-engines menu items in ICS mode 2012-02-26 22:45:12 +0100 H.G. Muller : Fix 50-move counter in ICS mode Marking irreversible moves in the EP_STATUS did not work in ICS mode, as ApplyMove,which did that is never executed there. Only the boards sent by ICS are displayed,especially in observing mode. Now the status is derived from the ICS mov strings (x in the SAN move, or P in the long move. 2012-02-26 17:18:39 +0100 H.G. Muller : Fix two 64-bit warnings Passing the engine number in a pointer variable to the callback needed a two-step cast. 2012-02-26 16:53:24 +0100 H.G. Muller : Fix piece symbols on switch back to variant normal Variant switches were not properly detected, meaning the variable pieces could keep a form belonging to a previous variant. (E.g. Queen remained a Lance image after switching from shogi to normal.) 2012-02-26 14:07:50 +0100 H.G. Muller : Keep XBoard windows attached on resize Windows attached to bottom or right are displaced with the size increase. Their perpendicular dimension is also scaled, to keep their edges at the same fraction of the main window, unless they stick out. In the latter case the fraction is clipped to 1, so that edge moves with the full size increase. 2012-02-25 22:40:56 +0100 H.G. Muller : Implement -stickyWindows in XBoard This makes the auxiliary windows move with the main window when they were touching, as in WinBoard. A control is added in the General Options dialog. 2012-02-25 21:14:03 +0100 H.G. Muller : Use more reliable X-call for getting window position XtGetValues on XtNx, XtNy is unreliable. XGetWindowAttributes seems to give more reliable results, and automatically accounts for the width of window dressing. The -frameX/Y options are no longer needed bcause of this, and were removed. 2012-02-25 11:55:19 +0100 H.G. Muller : Make frame width configurable in XB New persistent options -frameX, -frameY now can be used to specify the amount by which Xt lies about the window coordinates. 2012-02-23 20:01:55 +0100 H.G. Muller : Use combobox line for recent engines when available The entry made in the -recentEngineList for the startup engine was derived from the -fcp value, but this would ignore a possible nickname. In WinBoard we now use the full combobox line to derive the entry. 2012-02-23 09:29:17 +0100 H.G. Muller : Fix translation of EngineOutputTitle WB 2012-02-23 01:34:12 +0100 Byrial Jensen : Updated Danish translation 2012-02-23 00:59:36 +0100 Byrial Jensen : One missed translation of cps->which 2012-02-22 19:58:41 +0100 H.G. Muller : Undo translation of cps->which = first/second The string in cps->which should not be translated, because it goes into the debug file to label engine I/O, and many tools for processing debug files (broadcasters, PGN extractors) rely on this being "first" or "second". In all contexts where "first" and "second" need to be translated, cps->which itself is already enclosed in _(). 2012-02-22 18:27:40 +0100 H.G. Muller : Implement -serverFile option This writs an extra debug file with only engine communiation on it, for the benifit of programs like TLCS. 2012-02-22 17:46:16 +0100 H.G. Muller : Implement -autoCopyPV This option causes automatic copying of the last position of a PV walk to the clipboard. 2012-02-16 14:58:45 +0100 H.G. Muller : Delete some load-game debug printing The debug printing in Disambiguate was no longer needed. The printing of the started process in XBoard that went to stderr is now diverted to debugFP, so it ends up in the debug file. 2012-02-16 14:41:43 +0100 H.G. Muller : Move change of debug file to before game load Loading a game from -lgf is done before TwoMachinesEvent is called, but logically belongs to the game. So the code to switch to the new debug file for the game is moved to NextMatchGame now. 2012-02-16 14:09:54 +0100 H.G. Muller : Fix button grab for sweep selection The piece-menu initialization limited the grab of button events to those occurring inside the board window (presumably intended to limit them to the piece menu, but that does not pop up in sweep-selection mode). This is now suppressed when -pieceMenu is off, so that selection continues outside the the board. (Which is very convenient for pieces pu close to the edge.) 2012-02-16 13:16:13 +0100 H.G. Muller : Don't leave piece selected after piece menu PieceMenuEvent left the just introduced piece selected, which is almost never what one wants, as it makes it jump to the next square when selects. Which is especially annoying if it captures the piece you wanted to grab... 2012-02-16 12:57:47 +0100 H.G. Muller : Fix use of middle button for position setup With sweep selection the actual drop is made on releasing the button, and this event was not caught for button 2. Button-2 motion events were also not caught by the sweep-selection handler. 2012-02-16 23:53:08 +0100 Byrial Jensen : Fix one more typo in the translator comments explaning "first" and "second" 2012-02-16 23:39:32 +0100 Byrial Jensen : Fix typo in translator comments explaning "first" and "second" 2012-02-16 23:23:20 +0100 Byrial Jensen : Add args.h to POTFILES.in and change the interface to ExitArgError() so msg is c format string Having msg as a format string will ease translations because then badArg doesn't have to come last. 2012-02-16 22:51:44 +0100 Byrial Jensen : Mark the strings "first" and "sencond" for translation. ... and assign the translated strings to cps->which in function InitEngine() 2012-02-16 18:42:10 +0100 Byrial Jensen : Use ngettext() instead of gettext() for a string to allow better translation. 2012-02-16 00:19:59 -0800 Arun Persaud : translation: updated uk.po 2012-02-15 20:59:09 -0800 Arun Persaud : modified configure and makefile for handling mimedb update the default configure will install them using the xdg commands (if they exist on the system) 2012-02-13 22:29:48 -0800 Arun Persaud : add configure test for xdg-programs to install mime types; can be disabled for building of e.g. rpms in case the target system doesn't have the xdg-programs available, we test for them. Distributions often have their own macros to install these, so we add an enable option to configure 2012-02-13 22:05:26 +0100 H.G. Muller : Remove a debug printf The parsePV debug printf becomes extremely verbose with -fSAN, -sSAN, so it was deleted. 2012-02-12 22:18:24 -0800 Arun Persaud : new developer release 2012-02-12 22:19:37 -0800 Arun Persaud : updated po/pot files 2012-02-12 22:17:03 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2012-02-12 07:52:54 -0800 Arun Persaud : translation: updated uk.po 2012-02-12 11:38:30 +0100 H.G. Muller : Leave height of row that only contains buttons free All elements of the GenericPopUp are still scaled to the text height, including buttons appended behind them (browse or color buttons). But we now make an exception for a row that only contains buttons, as there is no harm in it being a little higher (and the buttons look prettier that way). 2012-02-12 00:01:24 +0100 H.G. Muller : Fix OK button of error popup The error dialog popped up as a child of the board window, even when DisplayError was called from a dialog. Now it checks if a transient dialog is up, and if so, it pops up as a child of that, grabs focus, and suppresses the system popdown of the transient dialog through a flag dialogError until it is popped down itself. 2012-02-11 20:07:39 +0100 H.G. Muller : Update texi file 2012-02-11 10:18:02 -0800 Arun Persaud : added some comments for translators 2012-02-11 10:08:46 -0800 Arun Persaud : fixed comments for translators: comments starting with TRANSLATORS: are now copied to the po file 2012-02-11 19:01:49 +0100 H.G. Muller : Also configure sweep selection To make sure this feature is tested, we set -pieceMenu false in the master settings file. 2012-02-11 18:26:34 +0100 H.G. Muller : Fix date in copyright notice about-box 2012-02-11 17:15:11 +0100 H.G. Muller : Fix switching animation masks on variant switch The masks for variant-dependent piees (E,H in Seirawan, promoted Golds in Shogi, the Gothic Chancellor) were no longer updated in InitDrawingSizes because of the patch to reduce X-server calls. 2012-02-11 16:46:58 +0100 H.G. Muller : Configure wider game list The game list was by default too small, so that there was no room for the filter field. Now a width of 500 is specified, whcih works at -size 49 as well as 72. 2012-02-11 16:29:06 +0100 H.G. Muller : Fix button chaining and combo/textbox label height Previous patches forgot to specify the height for the text labels on -combo and -text options, so they were still too high. Buttons that go on the same line as the previous element should be chained right, not rubber. 2012-02-11 15:52:52 +0100 H.G. Muller : Make -pgnNumberTag option setable from menu The Save Options dialog now containes a checkbox for this. 2012-02-11 15:48:52 +0100 H.G. Muller : Configure some new features switched on The master settings file switches -showTargetSquares, -sweepPromotions and -seekGraph on, so that they will get more testing. 2012-02-11 14:43:53 +0100 H.G. Muller : Fix heigth of multi-line labels The previous height patch overlooked that some labels are multi-line, and need more height. 2012-02-11 14:10:21 +0100 H.G. Muller : Fix popdown seekgraph on forward-event XB Only the grid was drawn when the > or >> button were operated, because a full redraw was not forced by ForwardInner. The recent patch to take the seek graph down on such events did not account for that. (BackwardInner always seems to do full redraw, however?) 2012-02-11 12:59:04 +0100 H.G. Muller : Put front-end support for -recentEngines in XBoard The engines are added to the menu. Problem is still that in XBoard startup engines are given by command, rather than selected by combobox, so the command rather than the nickname ends up in the menu. If this is then selected, it cannot be found in the list. To limit the damage, Fairy-Max is now pre-installed without nickname. -recentEngines is now configured to 4. 2012-02-11 11:53:39 +0100 H.G. Muller : Better solution to button-height problem In stead of adapting the height of text widgets to that of buttons, (as represented by the message widget), we now do the opposite, and adapt the button & label heights. This is made safe by obtaining textHeight from the fontSet's max_logical_extent, though an XExtendsFontSet() call. Turns out the default height of text widgets is not exactly that, but 4 pixels larger for borders and margin. The parameter XtNvertDistance is now used to align the checkboxes with the following text widget, and their size is derived from textHeight as well. The XtNvertDistance is set to -1 for the lower spin button, so that it its border coincides with that of the upper spin button. Their height is set to textHeight/2. This makes their combined height just 1 pixel more than that of the preceeding text widget. (Uh? 2 x tw/2 -1 > tw?), so for other buttons we use that too (i.e. textHeight = font_extent + 5). 2012-02-10 22:39:08 +0100 H.G. Muller : Fix warning Deleting debug printing had made a variable unused. 2012-02-10 22:26:39 +0100 H.G. Muller : Fix sleeping bug The text-edit-height patch introduced a bug that did not have any consquences (yet), as the extra arg erroneously included leftover from a previous SetValues call happened to be the same as one of the intended args. 2012-02-10 20:51:41 +0100 H.G. Muller : Fix unloading of first engine on tourney start Because NextTourneyGame was loading a new engine before ReserveGame was called to unload it with dummy game nr = -1), the first engine proc kept hanging. 2012-02-10 18:39:09 +0100 H.G. Muller : Remove some of the most verbose debug output 2012-02-10 17:46:35 +0100 H.G. Muller : Delete some unused WinBoard bitmaps There waere up-side-down knight icons that apparently hid by mistake in the bitmaps directory: they were not part of WinBoard 2012-02-10 17:39:48 +0100 H.G. Muller : Cosmetic: change 4.5 to 4.6 in xboard.conf comment 2012-02-10 17:35:22 +0100 H.G. Muller : Fix crash on empty combobox menu XB XBoard crashed when a combobox without items was opened, as could easily happen in the Load Engine dialogs when -firstChessProgramNames contained no items, as it would without configuring. Now the creation of the popup menu is suppressed in that case. 2012-02-10 17:13:36 +0100 H.G. Muller : Fix position of checkbox XB With the large height the widget get in internationalization, the checkboxes are position way too high above the text. To shift them down a dummy borderless label widget is drawn above them (when needed). 2012-02-10 15:07:35 +0100 H.G. Muller : Fix heights in Engine Output window XB The icons did not fit in the space above the memos anymore, so the height of this area is now left free. 2012-02-10 14:55:48 +0100 H.G. Muller : Derive height of text-edits in dialogs from message widget With internationalization the default height of buttons has inexpliquably inreased compared to that of text-edits, messing up the layout of the GenericPopUp. The message widget is now used as a emasure of how high the widgets should be. 2012-02-10 14:21:37 +0100 H.G. Muller : Configure XBoard engines and textures The new -useBoardTexture option is needed in xboard.conf, as we want to distribute with the texture on, while the compiled-in default is off. A list of 4 engines has been configured (fairymax, fruit, crafty, gnuchess), as the Load Engine and Match Options checkboxes crash XBoard when the list is empty. The -recentEngines option is set to 0 to make sure the code associated with it is never executed: the code is still experimental, and the required front-end support is only present in WinBoard anyway. 2012-02-10 13:30:58 +0100 H.G. Muller : Update Dutch WinBoard translation 2012-02-10 13:18:48 +0100 H.G. Muller : Create room in some WB dialogs for translations 2012-02-10 13:17:30 +0100 H.G. Muller : Add 5 missing strings to WinBoard translation template 2012-02-09 23:03:58 -0800 Arun Persaud : new developer release 2012-02-09 23:04:46 -0800 Arun Persaud : updated po-filies 2012-02-09 22:59:05 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2012-02-09 22:44:39 +0100 H.G. Muller : Fix non-bug in WinBoard The IDM_RecentEngines was not used in symbolic form everywhere. 2012-02-09 18:46:08 +0100 H.G. Muller : Fix MAXENGINES in WinBoard The front-end arrays for expanding the engine list measured 1000 entries, in stead of MAXENGINES, leading them to overflow. 2012-02-09 13:05:42 +0100 H.G. Muller : Implement kludge to set options through Move Type-in A leading "!!! " will cause the rest of the line to be parsed as command line. Very dangerous, as an unknown option (e.g. because of a typo) will cause a fatal error, which makes XBoard exit. 2012-02-09 13:04:44 +0100 H.G. Muller : Put move number in Eval Graph title 2012-02-09 13:00:09 +0100 H.G. Muller : Implement -pgnNumberTag option A new (persistent) boolean option controls if the sequence number is to be written in saved tourney games as a Number tag, to make it easier to correlate games with debug files. 2012-02-09 12:55:52 +0100 H.G. Muller : Create separate debug fil for each tourney game Users can now apecify a -debugfile with %d in its name, and this will be replaced by the sequence number of the game. TwoMachinesEvent then starts by opening a new file when the name has changed, so that each game will go to a different file, with recognizable name. 2012-02-09 12:51:25 +0100 H.G. Muller : Fix bug in WB combobox readout The previous patch exposed a latent bug in the readout of the generic popup. 2012-02-08 23:25:31 +0100 H.G. Muller : Allow grouping of engines in engine list Lines "# GROUPNAME" and "# end" enclose a group in -firstChessProgramNames. 2012-02-08 17:47:46 +0100 H.G. Muller : Fix TidyProgramName A trailing .exe was not removed if the engine name was quoted. 2012-02-08 17:45:42 +0100 H.G. Muller : Put recently used engines in WB menu A new option -recentEngines specifies how many engines should be listed. The list of nicknames is stored in the ettings file as -recentEngineList. The engines are appended to the Engine menu. 2012-02-04 19:37:51 +0100 H.G. Muller : Fix registering of EditTagsProg This was registered with X as EditCommentProc! 2012-02-07 23:04:49 +0100 H.G. Muller : Increase max nr of engines to 2000 Move the #define for MAXENGINES also to common.h, so that both the Load and Tourney dialog use the same maximum. 2012-01-19 23:01:20 +0100 H.G. Muller : Fix fix of switch to mono-mode The previous fix had == in stead of != for testing if mono-mode had changed. 2012-01-19 22:21:38 +0100 H.G. Muller : Make New Variant dialog visible in mono-mode All colored buttons did get a black background, and also black text... Use timer background color in stead, which is white. 2012-01-19 20:48:37 +0100 H.G. Muller : Incease size of WB array of translated items For the BoardOptions dialog 42 items are now needed 2012-01-19 17:18:25 +0100 H.G. Muller : Implement Clone Tourney button XBoard This makes use of the new GenericUpdate(). 2012-01-19 16:34:13 +0100 H.G. Muller : Implement GenericUpdate function This does the opposite from GenericReadout: it copies the current parameter values into the dialog. 2012-01-19 12:19:27 +0100 H.G. Muller : Fix arrow damage with highlightDragging XB With highlight dragging the highlights of the previous moves are cleared when lifting the piece. Logically, this should also clear the arrow, but to do that requires a board redraw, which is not done at this stage. (And even then this would only be effective after marking the arrow damage, which is not done yet either). As a temporary fix, we repair the arrow by redrawing it. This patch has moved marking of the arrow damage from DrawArrowHighlight to a separate routine, so a future better fix can also call that when the arrow should be erased. 2012-01-18 16:01:50 +0100 H.G. Muller : Prevent unnecessary loading of engines For engines that can be reused, the unloading at the end of a pairing is in some cases wasteful, as the same engine will be used in the next pairing as well. In simple gauntlets the gauntlet engine will always stay first engine, while in multi-gauntlets the oppent engine will stay the same for an entire round. In these cases unloading is now suppressed. 2012-01-17 22:22:32 +0100 H.G. Muller : Reset protocol version before loading new engine The protocol version was not reset, so if the previous engine was v1, the newly loaded engine would not be sent a protover command, so that its features would remain unknown! 2012-01-17 19:33:32 +0100 H.G. Muller : Give focus to board window after ICS login toprevent that the focus remains on any popped up chat boxes, it is explicitlly set otherwise. The board window is preferred over the ICS interaction window, because you can type from there to the ICS anyway, and it makes all accelerator keys available. 2012-01-16 14:37:05 +0100 H.G. Muller : Fix seek-graph popup and popdown Clicking outside the board area in WB (e.g.on the clocks) would also trigger seek-graph 'popup'. This is now suppressed by testing for y-coord > 0. In addition, the seek graph is automaticaly taken down when we step to another position in the current game (using buttons, arrow keys or whatever). 2012-01-15 21:29:11 +0100 H.G. Muller : Suppress empty lines when observing on VICS Capture of the engine kibitzes when observing an engine game with -autoKibitz on was still leaking a linefeed on the Variant ICS (but not FICS or ICC!?). 2012-01-15 21:24:12 +0100 H.G. Muller : Fix printing non-numeric kibitz with -autoKibitz Messages that were not considered kibitzed engine PV info for lack of numeric content, were kibitzed as coming from "your opponent", which is nonsense if you were iobserving, and masked the source. Fortunately star_match[0] is still holding the original name, at that point. 2012-01-11 17:33:29 +0100 H.G. Muller : Fix 4 warnings 2012-01-11 17:00:38 +0100 H.G. Muller : Use same translation of "vs." everywhere 2012-01-11 17:08:18 +0100 H.G. Muller : Add new translations to WB language file 2012-01-11 16:20:17 +0100 H.G. Muller : Fix re-allocation of PGN-cache memory It allocated 8 times too much! 2012-01-11 12:47:38 +0100 H.G. Muller : Fix height board dialog 2012-01-11 12:34:39 +0100 H.G. Muller : Enable WB time-control dialog even when no clock mode The dialog could be called from the tournament dialog to set a TCfor the tourney even when currently in game-viewer mode, so it'd better work. 2012-01-11 12:28:43 +0100 H.G. Muller : Exempt variant seirawan from -disguisePromoted inheritance This is not a variant where promoted Pawns have to be distingushed from primordial pieces, as captured pieces do not go into the holdings. 2012-01-09 21:23:52 +0100 H.G. Muller : Add control for overrideLineGap in WB Board dialog Make it a checkbox to choose between 0 and -1. 2012-01-09 20:56:40 +0100 H.G. Muller : Add Ctrl-D as alternative to Ctrl+Alt+F12 in WinBoard The acellerator key Ctrl+Alt+F12 seems reserved on Windows 7. 2012-01-09 20:52:05 +0100 H.G. Muller : Fix seek graph for VICS The sought command on the open-source ICS code is ICC-like (no terminating line), although the server is FICS like. So also accept prompt as seek-graph trigger on FICS. 2012-01-09 20:27:01 +0100 H.G. Muller : Open WB startup chat boxes only after logged on The init code for opening the chat boxes ismoved to DisplayIcsTitle(). 2012-01-07 20:31:34 +0100 H.G. Muller : Install mime types directly 2012-01-07 20:29:10 +0100 H.G. Muller : Install desktop files directly 2012-01-07 20:19:09 +0100 H.G. Muller : Install icons directly Rather than letting make-install copy the pixmaps to the XBoard data directory they are installed directly from the source files. The name of the TRN icon was also corrected and changed. 2012-01-05 18:41:13 +0100 H.G. Muller : Update texi file and remove duplicate control Some missing option descriptions were added. The highlight-dragging control was removed from the General Options dialog, as it did the same as Show Target Squares. -highlightDragging wa changed to a volatile option with default value true, making it effectively disappear as an XBoard option. (In WinBoard it is still persistent.) 2012-01-05 15:55:54 +0100 H.G. Muller : Remove the direct commands to the engines 2012-01-05 21:15:11 -0800 Arun Persaud : forgot to list new desktop files in EXTRA_DIST section in Makefile.am 2012-01-05 20:08:23 -0800 Arun Persaud : added some autogenerated po files to .gitignore 2012-01-05 20:05:44 -0800 Arun Persaud : added desktop and mime-type association to autoconf install process This should install and uninstall the mime assocciation and also the icons. Also renamed the desktop files to avoid possible name collisions. 2012-01-03 21:30:59 -0800 Arun Persaud : code cleanup: make function definition confirm to GNU coding style change everything in the main directory to void funcname (int a, int b) format 2012-01-03 18:43:18 -0800 Arun Persaud : Updated copyright notice to 2012 2012-01-03 21:32:04 +0100 H.G. Muller : Implement -viewerOptions A mechanism is added to allow the user to configure persistently if the game viewer that starts on clicking PGN files will use -ncp mode, or load an egine for analysis (or, in fact, do anything). This by introducing a persistent string option -viewerOptions, which will be parsed as a command line after the real command line when the option -viewer was present. 2012-01-03 11:29:00 +0100 H.G. Muller : Fix crash in auto-comment Trailing linefeeds in AppendComment were not properly stripped off, leading to a mismatch between the allocted and used memory, and thus possible buffer overruns. 2012-01-02 23:46:18 +0100 H.G. Muller : Fix crash at match end The -afterTourney option had broken old-style matches, because the ranking string that was tested for "busy" is not set there at all, and remains a NULL pointer, which strcmp doesn't like. 2012-01-01 19:56:58 +0100 H.G. Muller : Add desktop files for PGN viewer and tournament player The desktop files define startup commands for handling PGN, FEN and tourney files, calling xboard with the proper command-line options. 2012-01-01 19:53:02 +0100 H.G. Muller : Add xml file for defining mime types The file xboard.xml defines application/x-chess-pgn, aplication/x-chess-fen and application/x-xboard-trn as mime types for *.pgn, *.fen and *.trn files, so these files can be associated with XBoard in various modes. 2012-01-01 19:41:39 +0100 H.G. Muller : Add icons for PGN and tourney files Icons are provided in two sizes: 32x32 and 48x48. 2011-12-29 19:55:33 +0100 H.G. Muller : Clear square markers on new game Now that the markers can stay on after a first click, they need to be explicitly cleared when moving to another board, including a new game. 2011-12-29 15:51:18 +0100 H.G. Muller : Abandon single-letter menus in tinyLayout Now that the items on the main menu bar are clipped, it iso longer necessary to abbreviate them. 2011-12-29 15:38:46 +0100 H.G. Muller : Implement peeking previous position in WinBoard The backspace key is used to temporarily display the previous position. 2011-12-29 15:32:20 +0100 H.G. Muller : Fix parsing of faulty PGN tags A closing bracket could be missed in a malformed tag 2011-12-29 15:29:00 +0100 H.G. Muller : Fix parser for variant seirawan The new parser didnot understand gating suffixes with /, and did not allow any suffix at all on SAN castling moves. 2011-12-28 22:32:38 +0100 H.G. Muller : Try to not confuse ICS rating adustments as shouts An explicit pattern match for the rating adjustment is added before matching the shouts. 2011-12-28 22:21:54 +0100 H.G. Muller : Describe -overrideLineGap option in texi file 2011-12-28 22:03:30 +0100 H.G. Muller : Use in stead of Ctrl+. for peeking last move I commented out the explicit detection of the Ctrl key, as this is not needed when there are no 'unnatural' Ctrl keystrokes used for binding. 2011-12-28 19:37:49 +0100 H.G. Muller : Next try for menu-bar sizing This time request the width needed to just fit everything, and then start shaving off pixels from the currently largest until the entire thing fits. 2011-12-28 15:17:49 +0100 H.G. Muller : Clip texts on menu bar The width of the items on the main menu bar is restricted so the bar will never exceed board width. 2011-12-28 14:01:53 +0100 H.G. Muller : Fix format in temporary timing printf 2011-12-28 13:38:59 +0100 H.G. Muller : Don't test drops as mate evasions in variant seirawan 2011-12-28 13:36:23 +0100 H.G. Muller : Fix ICS castling rights Copying the castling rights together with CopyBoard seems to have broken handling of ICS rights, where ParseBoard12 prepares a board in a local variable, an copies it before parsing the rights. 2011-12-28 13:35:10 +0100 H.G. Muller : Fix initial holdings ICS seirawan games 2011-12-27 18:31:05 +0100 H.G. Muller : Fix sending of S-Chess gating moves to ICS Normal moves did not get the gating suffix sent. 2011-12-27 17:56:07 +0100 H.G. Muller : Fix menu grayout after illegal move TheThinkingEnables were not reset to user state after the engine rejected the entered move as illegal. 2011-12-27 13:26:36 +0100 H.G. Muller : Allow setting of holdings with edit command For the benefit of Fairy-Max' Seirawan Chess implementation, the edit command no also sends holdings contents (if the engine sent feature xedit=1), encoded as pieceType + '@' + holdingsCount (if the count is non-zero). 2011-12-24 17:54:16 +0100 H.G. Muller : Fix out-of-bounds access in check test Thepath to make the check test work with drops had broken the test after null move (both have rf<0), which led to corruption of the high word of the black clock. 2011-12-24 17:51:22 +0100 H.G. Muller : Fix legality of Spartan promotion to king In the check test promotion to King is only allowed if there are not yet 2 kings. 2011-12-21 22:17:01 +0100 H.G. Muller : Fix switching back from mono-mode XB Suppressing unnecesary X-server calls in InitDrawingSizes had broken switching back from monoMode, because the animVars have to be recreated for that, and this was only done when the variant changed. 2011-12-21 22:09:02 +0100 H.G. Muller : Fix showTargetSquares in mono-mode XB Make the marker dots black (captures) and white, and draw a circle in the opposite color around them in monoMode. 2011-12-21 22:00:26 +0100 H.G. Muller : Fix arrow highlighting in mono-mode XB Draw a line around it in darkSquare color in monoMode. 2011-12-21 17:48:33 +0100 H.G. Muller : Fix alignment of generic browse button XBoard The width ofthe browse button is now read back after creating it, and subtracted from the preceding text edit. 2011-12-21 14:41:31 +0100 H.G. Muller : Add -afterTourney option Only the instance pinting the tourney result will execute this. 2011-12-22 21:01:43 +0100 Byrial Jensen : Fix buffer possible overflow when writings tags PGNTagsStatic() could overflow its buffer and is removed. PGNTags() do the work instead of calling it. It starts by calculation the required buffer size and then allocate the buffer. PrintPGNTags() now prints directly to the file without having a buffer. 2011-12-22 15:01:31 +0100 Byrial Jensen : One more string marked for translation And it is moved inside the if statement that uses it. 2011-12-22 14:30:08 +0100 Byrial Jensen : Fix checking of return value from snprintf() snprintf() returns the needed space excluding the trailing 0 byte, so it has truncated if the returned valued is greater than or EQUAL TO the buffersize 2011-12-19 16:49:31 +0100 Byrial Jensen : Fix unportable memory initialisation Memory sat to zero by calloc() cannot safely be assumed to have the pointer value NULL 2011-12-19 13:16:58 +0100 Byrial Jensen : Add 2 strings for translation 2011-12-19 11:25:11 +0100 Byrial Jensen : Remove the last 2 compile warnings in gamelist.h 2011-12-19 11:17:48 +0100 Byrial Jensen : Add #include "moves.h" to gamelist.c for def. of CopyBoard() 2011-12-19 11:11:34 +0100 Byrial Jensen : Definition of TimeMark moved from 3 c files to backend.h 2011-12-19 01:21:46 +0100 Byrial Jensen : Transfer a pointer to the promoChar from PromotionPopUp() to PromotionCallback(). Fixes #34980 2011-12-18 17:24:07 +0100 Byrial Jensen : Duh! Initialise the argument to sscanf() inside the loop, so it always gets a known value when sscanf() fails. 2011-12-18 17:18:12 +0100 Byrial Jensen : Give numeric options the value 0 if a non-numeric text is entered (one more place). Before the value ended up undefined. 2011-12-18 17:08:46 +0100 Byrial Jensen : Give numeric options the value 0 if a non-numeric text is entered. Before the value ended up undefined. 2011-12-18 15:41:46 +0100 Byrial Jensen : Fix possible crash on 64-bit systems when copying game or position The two convertproc's for X selections caused reads out of bounds on 64-bit systems. I hope that this is the right solution. I am not experienced with X stuff, but it follows that I have seen in other programs, testing shows that copying still works, and the reading out of bounds have disappearinged with this patch. 2011-12-18 13:26:20 +0100 Byrial Jensen : Fix a possible crash in the file browser If the OK button was selected in the file browser when no file was selected there was a read out of bounds which could crash xboard 2011-12-17 22:54:34 +0100 Byrial Jensen : Fix a memory leak in Sound Options 2011-12-16 02:57:20 +0100 Byrial Jensen : Fix crash when selecting user soundfile due to free() of not malloc()'ed memory 2011-12-16 02:32:37 +0100 Byrial Jensen : Make GenericPopUp() more readable by using more named flags instead of numerals Defines the flags SAME_ROW (value 1) and NO_OK (value 2) for use with buttons and endmarks. There should no functional change. Also add a code comment where a condition depends on an uninitialised value. There is no direct harm, as both branches do the same (that is nothing) when the value is uninitialised. 2011-12-15 02:51:36 +0100 Byrial Jensen : Add NO_GETTEXT flag for combobox. Fix bug #34991 Define NO_GETTEXT flag to avoid calling gettext() for comboboxes, and define COMBO_CALLBACK flag to call comboCallback() when an item is selected in a combobox (no new code for this, just a symbolic value instead of a number). The flags are used for the min field of struct Option. NO_GETTEXT is used for the Select engine combobixes in the Match Options and Load engine windows. 2011-12-13 19:48:37 -0800 Arun Persaud : only translate entries in CreateComboPopup if strlen>0; fixes #34991 2011-12-12 19:06:26 -0800 Byrial Jensen : fix for repeating key issue, with this allissues this bug should be closed; fixes #35000 2011-12-12 18:45:05 -0800 Arun Persaud : also don't translate selection in ComboSelect; fixes #34991 2011-12-12 18:40:23 -0800 Arun Persaud : make entries in CreateComboPopup not translateable; fixes #34991 2011-12-10 16:06:47 -0800 Arun Persaud : fix translation for engine list; fixes #34991 * click on browse button should be recognized in translated versions * width of button should auto-scale 2011-12-10 11:04:17 -0800 Arun Persaud : change keybindings that don't use ctrl, make MoveTypeInProc ctrl aware; fixes #35000 two keybindings were using keys without modifiers, adjusted these to use the ctrl key. Furthermore when typing in moves we need to check if ctrl was pressed and ignore those inputs. Also added documentation for these keybindings. 2011-12-10 10:51:18 -0800 Arun Persaud : replaced unicode character for "'" in xboard.texi 2011-12-10 10:08:48 -0800 Arun Persaud : removed Iconify function. Should be handled by the window manager. 2011-12-08 20:53:13 -0800 Arun Persaud : marked an error messages for translation 2011-12-08 20:33:29 -0800 Arun Persaud : translation: updated uk.po 2011-12-03 17:52:23 -0800 Arun Persaud : fixed size of XBoard icon to 48x48 the icon gets installed in the 48x48 directory, but was >200 pixel wide. This gave a warning during rpm creation. 2011-12-03 08:07:32 -0800 Arun Persaud : updated pot file marked a lot of new strings for translation 2011-12-03 08:06:42 -0800 Arun Persaud : added new files to po/POTFILES.in 2011-12-02 22:13:36 -0800 Arun Persaud : marked more strings for translation 2011-12-02 20:08:01 -0800 Arun Persaud : translation: added danish translation 2011-12-01 18:45:55 +0100 H.G. Muller : Change encoding of seirawan ICS gating-castlings In stead of using upper/lower-case promoChar, the ICS now uses RxK notation, like WinBoard writes in SAN, for better consistency. 2011-11-30 15:38:21 +0100 H.G. Muller : Put promo-suffix on ICS move in variant seirawan castlings The distinction upper-case / lowercase determines gating at R / K 2011-11-28 11:56:18 +0100 H.G. Muller : Refrain from making unnecessary resize X request The window resizing code in InitDrawingSizes is suppressed when no change is needed. Similarly, changing piece bitmaps is suppressed when we stay in the same variant (and InitDrawingSizes is called e.g. because of chaging lineGap through the Board dialog). 2011-11-27 22:27:00 +0100 H.G. Muller : Fix parsing of O-O castling in variant janus The new parser did not realize it meant e1i1 rather than wild e1h1. 2011-11-26 22:28:23 +0100 H.G. Muller : Show 50-move counter also when observing ICS games To not cheat 50-move display was suppressed in ICS mode, but for observing a game this made no sense. 2011-11-26 22:22:07 +0100 H.G. Muller : Ignore ICS game starts when already in game The advance switching of the variant on game-start messages was disruptive for users with gin=1, which also sends such messages for other games than your own. For now fixed by only reacting on them when idle (detected by invalid game number). 2011-11-11 18:16:19 +0100 H.G. Muller : Fix WinBoard clock-click bug Clicking on the clock in WinBoard also called the LeftClick routine for handling clicks on the board. This led to the from-square being set to some inalid value, so that the next genuine board click was interpreted as a to-click, with undesired effects, especially with legality testing off or in EditPosition mode, where weird things are accepted. 2011-11-06 17:20:01 +0100 H.G. Muller : Add feature-override options A few (dangerous) options are added to allow a user to override engine features, or change their defaults, by supplying a string with feature commands (e.g. "sigint=0") which tricks XBoard into thinking the engine sent that. There is a -featureDefaults which is processed before the engine features, and -first/secondFeatures which is parsed just before engine initialization. This goes horribly wrong when the user wouldtry silly things like including 'option' or 'done' features! 2011-11-05 12:32:39 -0700 Arun Persaud : translation: updated uk.po 2011-11-04 21:58:39 +0100 H.G. Muller : Fix handling of -secondOptions option The -firstOptions and -secondOptions settigs were not swapped when -singleEngieList was true, so the second engine's options would never be set in that case, but used for the first engine. 2011-11-04 21:55:21 +0100 H.G. Muller : Accept setup command in variant fairy even with legality testing on Variant fairy does not really have a defined opening position, but lots of pieces defined, so we might want to play with legality checking on, but still rely on the engine for the opening position 2011-11-04 21:52:20 +0100 H.G. Muller : Set pieceToCharTable by setup command even when ignoring FEN When the user starts from a set-up position, the egines default openingposition has to be ignored, but the pieceToCharTable would still be relevant. 2011-11-04 21:48:24 +0100 H.G. Muller : Change default sweep-promotion choicein queenless variants The initial scanning of the sweep piece until a defined piece is found is now in the increasing direction (still starting at Queen), so that the fairy pieces are suggested before R, B and N. 2011-11-03 16:38:57 +0100 H.G. Muller : Clear board markers when moving to other position Now the markers from -showTargetSquares would stay on after a first click for the benefit of a click-click move, they would also stay on when not finishing the move, but operating the < > buttons in stead to call up other positions. ForwardInner and BackwardInner now clear the markers, like they also cleared highlights. 2011-11-01 18:30:22 -0700 Arun Persaud : updated Changelog, NEWS, etc. 2011-10-25 15:32:27 +0200 H.G. Muller : Fix two warnings 2011-10-24 20:00:28 +0200 H.G. Muller : Don't adjust clock on right-click in EditGame mode WB This was a change that was already done for the left-clicks, but somehow never made it togit for the right-clicks 2011-10-24 19:50:25 +0200 H.G. Muller : Change chase message in .lng files 2011-10-24 19:31:08 +0200 H.G. Muller : Let perpetual-chase message mention square In stead of a boolean, PerpetualChase now returns the square the chased piece ends on (encoded as an int), and on adjudication it will be printed. 2011-10-24 19:26:02 +0200 H.G. Muller : Add mechanism to translate variable messages in WinBoard A message prefixed with % in the lng file will be considered a match if it matches the start of the text to be printed, and the remaining part of the latter will remain untranslated. This was needed to allow translation of the perpetual change message, now it indicates the square of the chased piece. 2011-10-24 19:20:13 +0200 H.G. Muller : Use other interpretation of Asia rules for chase detection The detection of perpetual chases now ignores pre-existing checks. 2011-10-12 17:28:48 +0200 H.G. Muller : Fix crash on loading garbage game file The code to cache games was not resistant to moves before a valid game start, or a game filewithout any games at all. 2011-10-08 20:43:52 +0200 H.G. Muller : Incorporate variant type in book hash key This prevents booksforone variant being used for another, and allows multi-variant books. 2011-10-07 15:41:44 +0200 H.G. Muller : Update language.txt file 2011-10-07 15:34:01 +0200 H.G. Muller : Update Dutch lng file 2011-10-07 15:21:53 +0200 H.G. Muller : Fix Load Options dialog WB Defined fastkeys; reordered elements so that fastkeys focus edit they are intended for. Changed some of the more obscure texts. Corrected list of transatble dialog items, adding a few missing ones. 2011-09-13 20:01:42 +0200 H.G. Muller : Fix some warnings Prototypes were added, ormoved from backend.c to backend.h. 2011-08-26 12:44:08 +0200 H.G. Muller : Put 'Load Next' button back in WB Game List The '>' button for loading the next (filtered) game is re-instated in the WinBoard GameList. The main window has now accelerator keys Ctrl+Up and Ctrl+Down for loading the previous and next filtered game. 2011-08-26 12:31:59 +0200 H.G. Muller : Speed up position search and consider side to move The position search is made to pay attention to the side to move, which produces a speedup, because we only have to compare half the game positions when looking for an exact position match. An addition we now keep track of the total number of pieces, and abandon a game when it drops below the number of pieces in the position we seek. 2011-08-21 23:16:15 +0200 H.G. Muller : Dynamically allocate move cache A small statically declared cache good for 250k moves (~3200 games) will be expanded in steps of a factor 8 when it overflows. 2011-08-18 18:40:38 +0200 H.G. Muller : Translate search strings 2011-08-17 22:55:21 +0200 H.G. Muller : Implement flipped search 2011-08-16 15:29:03 +0200 H.G. Muller : Debug position search cache 2011-08-15 18:44:37 +0200 H.G. Muller : profile 2011-08-18 18:01:54 +0200 H.G. Muller : Translate search-mode strings 2011-08-15 16:59:39 +0200 H.G. Muller : Quickscan 2011-10-23 16:04:00 +0200 H.G. Muller : Fix duplicate loading of second engine in tourneys To decide if new engines should be loaded, it was tested if first.pr equalled NoProc, assuming that ReserveGame would have left the engine loaded if the next game would need the same engines. But a reuse=0 engine could have caused termination of the first engine process anyway, while the second would still be alive. So unconditionally starting of the second engine would cause redundant engine processes to abound. Now we only start new engine processes if both engine processes are dead. 2011-10-23 15:53:32 +0200 H.G. Muller : Fix PV walking with -fSAN The SAN options had broken the PV walking, because the shelving of the walked PV to create space for the conversion to SAN of an incoming PV would not be properly undone, but would add the walked PV to the game. 2011-10-20 12:39:10 +0200 H.G. Muller : Refine clock adjusting Adjusting the clocks by shift-clicking them is now only allowed with autoCallFlag off, and an error-popup results when you do it otherwise. Also, swtching to Edit Game mode won't reset the clocks to the stored value anymore when you have just adjusted it. 2011-10-12 17:43:33 +0200 H.G. Muller : Fix crash on adding items near book end When Edit Book would add so many entries near the end of an opening book that the end of the added info would surpass the old end of the file, the copying of the tail got stuck in an infinite loop, extending the file without limit with repeating info. 2011-10-12 17:41:18 +0200 H.G. Muller : Print message on wrong use of Clone Tourney The user is urged to first provide the name of an existing tourney file when he presses the button without one. The button is also renamed. 2011-10-12 17:38:33 +0200 H.G. Muller : Fix invalid combobox entry WB A combobox label that was not in the list (because the user typed it, rather than selecting one) would cause a crash. 2011-10-12 17:23:57 +0200 H.G. Muller : Fix crash on loading garbage game file XBoard crashed when a game file contained a PGN game result before any valid game start, because data would be written in a game-list node that did not exist yet. This would occur frequently when garage was read; basically any asterisk in the data would do it. 2011-10-11 23:31:01 +0200 H.G. Muller : Add control to set -discourageOwnBooks WB 2011-10-11 20:53:52 -0700 Arun Persaud : only require 0.17 of gettext This seems to solve many build issues with older distrubtions and doesn't seem to be a problem with newer ones. 2011-10-11 23:31:01 +0200 H.G. Muller : Add option -discourageOwnBooks This boolean option determines the default setting of the hasOwnBook option before a tourney game starts. By setting it, the hasOwnBook option is cleared, which would enable use of the GUI book, like the engine was installedwith the /firstXBook option. An explicit option on the engine install line can still overrule this, though. A control to set this option has been added in the XBoard Match dialog, and it is saved in the tourney file to force consistency. 2011-10-11 22:58:01 +0200 H.G. Muller : Reset initString and computerString on engine load These options are typically engine specific, and must thus be reset to their default value before loading a new engine. 2011-10-11 22:43:00 +0200 H.G. Muller : Add Romanian lng file 2011-10-07 16:55:45 +0200 H.G. Muller : Reactivate Falcon Chess Now the patent for this has expired, Fairy-Max plays it again. So the XBoard support for it is now switched on, and an item for it is added to the XBoard New Variant menu dialog. (WinBoard still had that.) In the array the Lance was changed for the Falcon as a wild-card piece. 2011-10-03 09:59:40 +0200 H.G. Muller : Update texi file for new features 2011-10-03 10:30:30 +0200 H.G. Muller : Update texi file for position search The new items in the Load Game Options dialog are described, as well as the command-line options used to store them in the settings file. 2011-10-03 09:28:50 +0200 H.G. Muller : Remove paragraph about .Xresources from texi file Command-line options can no longer be set through .Xresources already since version 4.5.0. 2011-10-03 09:13:05 +0200 H.G. Muller : Add Dutch WinBoard translation 2011-09-28 20:46:21 +0200 H.G. Muller : Prevent Edit Book window from stealing focus (WB) In WinBoard updating the book window would give it focus. Now the focus is given back to the main window, except when the Edit Book window is first created. 2011-09-28 20:42:00 +0200 H.G. Muller : Make book-window update part of HistorySet 2011-09-26 16:01:28 +0200 H.G. Muller : Fix position loading in tourneys In a tourney a position must be loaded when the engine is not yet started, and the old version of LoadPosition could not handle that: It would start up the engine, and send it commands unconditionally. 2011-09-26 15:58:07 +0200 H.G. Muller : Fix resetting -fSAN on engine change There were two places for loading another engine, Load (from menu) and SetPlayer (in tourneys), and the previous patch for this missed the second one. 2011-09-26 15:51:49 +0200 H.G. Muller : Make too-long game non-fatal GameEnds is now called when the maximum number of moves is exceeded, rather than DisplayFatalError. Not sure if this properly terminates the game in all situations, but DisplayFatalError (after calling GameEnds) would also wait for the user to confirm the error popup before really exiting, so that in an unattended automatically running tourney there was not much fatal, and the entire tourney would in fact be finished. 2011-09-26 15:46:58 +0200 H.G. Muller : Keep book file open Rather than opening and closing the book file on every probe, it is now only closed and opened when the name of it changed. 2011-09-26 15:44:23 +0200 H.G. Muller : Suppress playing of book moves with weight 0 Bookmoves with weight 0 could be played when the sum of the weights of all moves from the position was 0. So it was not possible to suppress the only move by giving it weight 0. This is now corrected. 2011-10-01 15:00:47 -0700 Arun Persaud : added NEWS for release of 4.5.3 2011-09-29 20:31:23 -0700 Arun Persaud : better contrast for XBoard icon on a dark background 2011-10-01 13:09:59 -0700 Arun Persaud : translationproject.org: updated Ukrainian translation 2011-09-29 20:49:42 -0700 Arun Persaud : updated pot file and send to translation project 2011-09-22 12:09:39 +0100 Thomas Adam : (tiny change) Clarify "-name" option is Xt-only There's a set of standard options with will get used by Xt, before Xboard itself will use them. "-name" is an Xt-only option which will set the name and resource of the window to the value requested. It has nothing to do with setting opponent/player names. Signed-off-by: Thomas Adam modified slightly by Arun Persaud (renamed itemx to item and fixed option name for CMAIL) 2011-09-22 17:17:16 +0200 H.G. Muller : Fix LoadGameOrPosition starting up engine When LoadGameOrPosition() is called from NextMatchGame(), the Reset() that is called in LoadPosition() when you are running from a position file would prematurely start up the engine (without waiting for features). The kludge to suppress this behavior for the explicit call to Reset() is now extended to encompass LoadGameOrPosition. 2011-09-22 17:14:34 +0200 H.G. Muller : Clear fSAN option before new engine load This to prevent the new engine will inherit it from the previous one. As the command-line options an only set it, this has to be done by explicit assignment. 2011-09-13 23:02:35 +0200 H.G. Muller : Fix some warnings (prototypes) 2011-09-13 19:55:44 +0200 H.G. Muller : Fix write failures in concurrency In WinBoard a flood of writes by differentprocesses to the same PGN can cause a "permission denied" error in fopen. This patch causes retries after a random (5-15 msec) wait, in such cases. 2011-09-13 19:52:19 +0200 H.G. Muller : Move HistorySet to back-end This existed in exact duplicates in both front-ends. 2011-09-13 19:46:36 +0200 H.G. Muller : Make DoSleep front-end wrapper for msec sleep DoSleep was #defined as a macro for Sleep/ sleep, with an argument indicating msec in WinBoard, but seconds in XBoard. Nuw it universally uses msec, by defining it as a wrapperin the respective front-ends. (For XBoard itwraps FrameDelay.) 2011-09-10 22:35:14 +0200 H.G. Muller : Fix playing sounds when -soundProgram is empty It made no sense to just send the names of the sound files to the shell. So the soundProgram isnow tested for being an empty string, and if so, PlaySound() is aborted. 2011-09-10 14:01:58 +0200 H.G. Muller : Add -afterGame option This option specifies a command line to be executed after each game of a tournament. To execute the line, the function RunCommand() was added in the front-end. For XBoard this was a simple call to system(); for WinBoard part of the StartChildProcess code was cloned (without the pipe stuff). 2011-09-10 13:52:12 +0200 H.G. Muller : Upgrade -serverMoves option The (undocumented) -serverMoves option was upgraded to conform to the ChessLive! protocol extension for sending SAN tags. A bug that allowed upper-case promoChar to leak through was also fixed, and code was added to write engine PVs to file. Flushing of the game result to the -serverMoves file was also fixed. 2011-09-10 13:50:25 +0200 H.G. Muller : Fix AppendComment The joining of two comments was not performed correctly if the second one had the braces yet to be added: the closing brace was not added in that case. 2011-08-30 19:39:59 +0200 H.G. Muller : Auto-popup ICS Input Box Typing to the board made the move type-in pop up, but in ICS mode this is of course undesirable. Like in WinBoard, the ICS Input Box should pop up in stead, and accept the typed character. This is now realized. If the box already exists and has text in it, the typed character is appended to that text, and the box is given focus. Spaces now also are considered as printable. 2011-08-30 18:27:58 +0200 H.G. Muller : Slightly decrease sensitivity of sweep actions The sweep-selection of promotion and drop pieces, or step through the PV was so sensitive that it was difficult to reliably make the intended choice. It has now been reduced by a factor 1.5-2, and the sweep selection and PV walk now also use a different value. 2011-08-27 21:16:58 +0200 H.G. Muller : Extra buttons in WB Tournament dialog A button to copy contents of the tournament fileto the dialog is added. Buttons to invoke the Common Engine and Time Control dialogs are also added. 2011-08-27 21:15:00 +0200 H.G. Muller : Fix crash on typing non-existent enginein Load Engine dialog 2011-08-24 10:30:46 +0200 H.G. Muller : Fix display state after failed analysis attempt When an engine responded to the "analyze" command with an "unknown command" message, a Reset was done without altering the display, causing a discrepancy between display and internal state, which caused confusion when it finally corrected itself. I replaced the Reset call by an EditGameEvent call, to preserve the loaded game. The Reset was presumably used to allow for the case where the engine would be so upset by the analyze command that it needed to be reset by a "new" command, but this seems overly paranoic for an engine that just recognized the command as an unknown one. 2011-08-24 09:58:35 +0200 H.G. Muller : Fix treatment of PGN score/depth info with linefeeds in them This is needed to make the PGN more Arena-proof. 2011-08-24 09:51:10 +0200 H.G. Muller : Fix quoting in Load Engine dialog A (space-contaning) engine name only needs quoting when there are parameters, because the over-all engine command will be quoted anyway. For UCI engines duplicate quoting is fatal, because when passed as the -ec argument of Polyglot, it will be quoted yet another time, also with double quotes. 2011-08-23 21:24:23 +0200 H.G. Muller : Replace Analyze File by Analyz Game function 2011-08-22 22:16:58 -0700 Arun Persaud : new developer release 2011-08-22 22:26:56 -0700 Arun Persaud : update po files 2011-08-22 22:24:23 -0700 Arun Persaud : updated Changelog, NEWS, etc. 2011-08-22 22:09:19 -0700 Arun Persaud : malloc.h is not needed 2011-08-20 22:21:40 +0200 H.G. Muller : Fix ICS move-list header mistaken for null moves 2011-08-18 18:53:09 +0200 H.G. Muller : Allow two-games-per-opening to work with book A new option -seedBase is added, and written to the tourney file. It allows all XBoard instances working on a tourney to generate the same 'random' openings in a deterministic way, based on this one-time seed and the game number. When -loadGameIndex equals -2, it uses the same seed for an odd and the following even game. 2011-08-18 18:51:56 +0200 H.G. Muller : Fix use of random In some places rand() was called explicitly, rather than through the (configured) place-holder random(). 2011-08-18 17:34:33 +0200 H.G. Muller : Translate search texts 2011-08-18 10:29:35 +0200 H.G. Muller : Add -useBoardTexture and -usePieceFont options These options suppress the use of the given texture files or piece fonts without relying on the kludge to disable them by prefixing an asterisk to the file or font name. Checkboxes have been added to the Board dialog to control them. The user can now set piece font in WB font dialog. The sample text can be used to specify the -fontPieceToCharTable, the font name itself the -renderPiecesWithFont value. 2011-08-16 23:10:59 +0200 H.G. Muller : Fix crash on start without settings file A primordial -1 in currCurrent caused a crash when WinBoard was started without ini filein game-viewer mode. 2011-08-12 12:08:18 +0200 H.G. Muller : Fix generic-popup failure after empty engine-settings dialog The error exit ofthe Engine #N Settings dialog in case of an engine without options forgot to clear currentCps, with as a result that the generic popup thought every subsequent popup was an empty one, and kept repeating the 'engine has no options' error message for every dialog. 2011-08-10 11:27:22 +0200 H.G. Muller : Allow substitution of engines during tournament Two buttons are added in the tournament options dialog, for upgrading and for replacing a tourney participant. Lots of tests on the validity of the request are done, and if all are passed, the tourney file is written with the new participants (and in case of replace) with the results of the replaced engines erased from the -results string. 2011-08-08 11:00:12 +0200 H.G. Muller : Fix up/down arrows in game list 2011-08-08 10:31:24 +0200 H.G. Muller : Add key bindings for loading next/previous game of list These bindings are set both for the game list and the board window. To make them useful, focus has to be transferred to the board widget after loading (it tends to transfer to the tags window), which now seems to work, but not always. From the game list the shellWidget seems to get focus rather than the board, which is bad as it is not sensitive to the key bindings. 2011-08-08 09:58:31 +0200 H.G. Muller : Allow deletion of last book move The book-edit function refused to delete the entiremove list, for no good reason. This limitation now has been lifted. Also the error message that the key for the current book entries is different from that of the currentposition has been suppressed if there were no entries found for the current position (so that the book is positioned at the next key), so that it is possible to add moves from scratch. 2011-08-08 00:19:53 +0200 H.G. Muller : Speed up parser Line numbers > 1, which are common, can exit already during move parsing, to save lots of matching on resultsand castlings. 2011-08-07 15:13:00 +0200 H.G. Muller : Fix missing files in file browser The file browser was throwing away the first two files, assuming they were "." and "..". Alas, this is no longer true on every Linux. Now we actuallyc compare for these names, before skipping them. 2011-08-06 11:57:59 +0200 H.G. Muller : Delay file loading to allow expose event first 2011-08-06 09:29:22 +0200 H.G. Muller : Fix paging 2011-08-05 22:39:41 +0200 H.G. Muller : Better fix of crash on empty game list An empty list is now replaced by a list containig a simple message. 2011-08-05 20:31:44 +0200 H.G. Muller : Add plain arrows as key binding for stepping forward/backward 2011-08-05 20:30:03 +0200 H.G. Muller : Debug position selection 2011-08-04 13:22:55 +0200 H.G. Muller : Print progress during load / selection of game The title bar of themain window is used to display a running count of the number of games loaded / searched. 2011-08-04 12:44:45 +0200 H.G. Muller : Parse PGN tags without allocating memory In WinBoard malloc/free did not seem to work when preparing the game list, leading to a huge memory list when ParsePGNTag was used. The added code parses the required tags in an alternative way as a work-around. 2011-08-02 22:58:34 +0200 H.G. Muller : Implement searching games in Game List for a position For this it was needed to reconstruct all positions of the games without loading them, so they could be compared to the currently displayed position. A new routine GameContainsPosition is made for that. In Disambiguate, when the global quickFlag is set, we now do the disambiguation ignoring check,and only if this leads to an ambiguous move, we repeat it taking check into account to see if that resolves the ambiguity. This causes us to miss if unambiguous moves are illegal because they put their King in check, but who cares? We now do not make game-list line when not needed. If we do not filter by text, but by position, there is no need for preparing the game-list line for games that are not selected. All for efficiency. 2011-07-28 20:47:35 +0200 H.G. Muller : Allow entry of variations in PlayFromGameFile mode Adding variations is more like editing a comment,and not really editing the game. Therefore we allow it on loaded games. As soon as we are in a variation, we temporarily switch to a (hidden) EditGame mode, restoring the original mode when we revert to the main line. We now also stay in PlayFromGameFile mode after loading a game, And opening variation (fromtheComment window) in PlayFromGameFile mode is also allowed. 2011-07-27 18:47:45 +0200 H.G. Muller : Force Move History refresh after loading/reverting variation The Move History window was not refreshed after switching to or from a variation if that variation happened to have the same length as the main line. Now a change in storedGames since the previous refresh will force a full refresh to avoid this. For this to work, storedGames did have to be decremented after ToNrEvent in PopInner, because ToNrEvent calls HistorySet before the history is restored, so we don't want it to snatch away the full refresh. A call to HistorySet had to be added after PopInner is done restoring the move history. 2011-07-27 17:45:12 +0200 H.G. Muller : Popdown Comment window on new game What is in this window cannot possibly remain valid, and can even be harmful. 2011-01-19 11:46:41 +0100 H.G. Muller : Allow null move in analysis and edit-game mode In some games it is allowed to pass your turn. The internal representation picked for such a null move is the drop of an empty square, (EmptySquare,DROP_RANK,0,0). Computer-algebraic form is "@@@@", SAN form is "--", (for compatibility with ChessBase / SCID), and the non-compliant forms "null", "pass"and "Z0" are recognized in the parser as well. ApplyMove() has to test for this special case (to not actually clear a1), and a way to enter the pass for the user had to be found (clicking the opponent clock, like in EditPosition mode). The null move is made move irreversible to prevent repetition draws spanning null moves being adjudicated. Such entry of null move is now allowed in AnalyzeMode and EditGame mode. Because Chess engines will not accept null moves, SendMoveToProgram had to be adapted to send not the move, but the position after it in case of a null move. This erases the move history in the engine, so it will not react to 'undo' for that null move, so BackwardInner had to be adapted to test for intervening null moves, and if one is found, approach the target from the other side after loading the earliest position before it not crossing another null move, and then loading the moves upto the target. XBoard clock clicks had to be fixed, to pay attention to the shift key. 2011-07-25 21:58:58 +0200 H.G. Muller : Give WinBoard Game List its own font The font fort he Game List used to be shared with the Engine Output and Move History windows, but this made it impossible to use a figurine font in the latter two (which displays piece symbols for capitals) without messing up the Game List. An option -gameListFont has been added to specify the font for the Game List(and save it in the settings file), while a control for it is added in the fonts dialog. 2011-07-21 19:02:01 +0200 H.G. Muller : Fix crash on OK after Save Changes in Tags and Comment popup. The global variables tagsText and commentText were used to pass a string obtained from a widget (and thus not malloc'ed), which caused a crash when the GenericReadout tried to use those variables for the new value. Fixed by using GenericReadout (which does malloc) to read out the text,in stead of GetWidgetText. 2011-07-16 09:31:12 -0700 Arun Persaud : Revert "fixed segfault in xengineoutput", fixed in the backend now (from HGM) This reverts commit 33a0e73843115ff6d4eacaf963a38f2e8b20b295. 2011-07-16 14:53:14 +0200 H.G. Muller : Suppress some XBoard warnings 2011-07-15 11:21:29 -0700 Arun Persaud : fixed segfault in xengineoutput 2011-07-11 20:04:57 +0200 H.G. Muller : Disable -showTargetSquares in ICS mode Help like this is considered cheating on FICS, so it is disabled for all 'classical' ICS variants. (For variants eyont Shogi we don't care.) 2011-07-10 21:20:49 +0200 H.G. Muller : Put grab on sweep-selecting in Edit Position A right down-click starting a sweep-selection event did not grab the mouse events, so that an up-click outside the window would go unnoticed, and the pointer motion stayed coupled to selecting the piece until the next click. By returning 2 from the RightClick back-end routine we request the grab. 2011-07-09 13:50:58 +0200 H.G. Muller : Write more labels on score axis of eval graph The labels for +/-1 and +/-3 are now also written, provided there is enough space. 2011-07-09 13:28:08 +0200 H.G. Muller : Improve Eval Graph with -evalZoom and -evalThreshold The score range between -1 and +1 can now be blown up by a factor specified through -evalZoom. The threshold below which histogram bars are no longer printed (wich used to e hard-coded 25 centi-Pawn) can now be set through the -evalThreshold option. 2011-07-09 13:18:07 +0200 H.G. Muller : Print reversible plies done in stead of plies to go Printing the number of plies left to the draw-adjudication point was confusing when the N-move rule was set to a non-standard value. In stead we now print the number of plies since the last irreversible move, so the user can compare it to both the engine claim point (100) and the adjudication point he set (which might be beyond 100). 2011-07-09 13:13:49 +0200 H.G. Muller : Let WB eval graph react ot single left-click Unlike in XBoard, the WinBoard eval graph awatys had required double- clicking to go the the corresponding move, while there really is no reason for this, as it is no text edit, and single-clicks have no function (like select). 2011-07-07 19:37:12 +0200 H.G. Muller : Add -scoreWhite option This is similar to -absoluteAnalysisScores, except that it works in all modes, and flips the score given by the engines in the engine-output window when black is to move. 2011-07-07 19:28:04 +0200 H.G. Muller : Print 50-move counter in Engine-Output title 2011-07-07 18:50:56 +0200 H.G. Muller : Display score/depth in Eval Graph title No longer print it in the comment window. 2011-07-04 11:06:12 +0200 H.G. Muller : Let -sweepPromotions also work for click-click moves A click-click promotion no longer causes auto-queening, but the down-click on the to-square causes a Queen to stick to the mouse pointer, and then allows the user to change it through dragging backwards before releasing it with an up-click. In WinBoard this required a slight change in DragPieceBegin, because the dragged piece there only was made visible when the mouse pointer actually started moving (and dragInfo.pos was set), presumably under the assumption that before mouse move the piece was already on the clicked square. Which in the case of a to-square was of course not true. (Because a piece jumps to the mouse pointer when the click is not centered on a square, this gives less jittery static clicks.) So DragPieceBegin has been given an extra argument now, to indicate whether it should attach the piece to the mouse pointer immediately. To make the click-click sweepPromotions work in Shogi (for which the drag-drop sweepPromotions could never work, because it is not clear the piece has a posibility to promote when you pick it up), translation of the sweep-selected piece to a Shogi promoChar had to e added. 2011-07-04 10:45:04 +0200 H.G. Muller : Improve -showTargetSquares on click-click moves The markers on move targets are now kept when a first click merely selects a piece, rather than dragging it elsewhere. The second click (by definition on the to-square) then clears the markers. 2011-07-04 11:23:05 +0200 H.G. Muller : Let PGN parser accept lower-case piece in drop moves The @ sign prevents amiguity with other notations anyway. 2011-07-04 12:42:12 +0200 H.G. Muller : Fix parser.c line endings 2011-06-29 20:29:12 +0200 H.G. Muller : Fix writing searchTime in tourneyFile This had to be derived from the variable searchTime, which gives it in seconds, as appData.searchTime (a string in minutes) is not reliable, as it contains the command-line value, which might have been altered through the time-control dialog. 2011-06-29 20:25:00 +0200 H.G. Muller : Fix resetting searchTime if other TC mode is chosen (XB) This fixes a bug in the new time-control dialog. 2011-06-29 14:32:43 +0200 H.G. Muller : Fix coords display on large boards The file indicators can now run upto 'w'. Only the lowest digit of the rank number is printed, from a table that is valid to 22. 2011-06-29 13:53:00 +0200 H.G. Muller : Fix crash on making too-long FEN The buffer for in PositionToFEN was only 128 bytes, which was not enough for large boards such as 19x19 Go. It is enlarged to MSG_SIZ(512) now. There also is some approximate overflow checking added (but it is not fool proof in case there are holdings...) 2011-06-29 13:36:26 +0200 H.G. Muller : Fix drop moves on boards with more than 10 ranks The internal encoding for rank 16 is '@', and thus ambiguous with drop moves. They were always printed as 16, breaking drop games on large boards. The ambiguity is now solved (for boards with more than 16 ranks) by checking if the preceeding letter is upper case, in which case it cannot be a fileindicator, but must be a piece, and thus a drop. 2011-06-29 13:29:38 +0200 H.G. Muller : Don't one-click move when legality testing is off 2011-06-23 21:18:11 +0200 H.G. Muller : Reorder controls in Engine Setings dialog WB To get tabbing through the controls in left-to-right order, they are now added to the template structure in that order. Also add a tabstop to Label options, so that JAWS will read those. 2011-06-23 14:02:50 +0200 H.G. Muller : Add tab stops in WB generic popup The WinBoard generic popup did not put tab stops on push buttons, including the OK and cancel button, with as a consequence that these were skipped when tabbing through the dialog controls. In addition the tabbing could not begin before the user selected one of the controls with the mouse. Now all buttons have tab stops, and the cancel button is given focus when the dialog pops up. 2011-03-10 20:06:39 +0100 H.G. Muller : Implement Grand Chess Grand Chess requires a lot of exceptional handling similar to Superchess and Great Shatran, because it also allows only promotion to a captured piece. In addition it shares the enlarged promotion zone with Makruk and Shogi, as well as the fact that promotion can be deferred. The 10-rank board furthermore required a better generalization of double-pushes and e.p. captures. On such a board double puhes are now allowed from 2nd and 3rd rank, e.p. capture from 5th and 4th. 2011-01-28 19:20:38 +0100 H.G. Muller : Allow promotion to Pawn with legality testing off In stead of ImpossibleMove promotionto Pawn now merely is an IllegalMove, so it can be played with legality testing off. 2011-01-24 15:06:17 +0100 H.G. Muller : Create some space in WB New Variant dialog 2011-06-20 23:53:49 +0200 H.G. Muller : Allow double-digit rank numbers The parser already understood double-digit numbers on input, and CoordsToAlgebraic produced them on otput. This patch also fixes sending of the moves to the computer, for which the moveList was used. The latter stored 10 as ':', etc,to always get a 4-char move, the characters of which were frequently being converted to fromY or toY by adding/subtracting ONE. To not break that the one-character encoding of rank number is kept in moveList, but in SendMoveToProgram, characters > '9' are converted to double digits. 2011-06-23 11:26:48 +0200 H.G. Muller : Add Absolute Analysis Scores in Genral Options dialog XB 2011-06-23 11:16:34 +0200 H.G. Muller : Fix texi file, and update it further 2011-06-20 12:15:14 +0200 H.G. Muller : Modified po 2011-06-22 17:51:51 +0200 H.G. Muller : Update texi file 2011-06-22 11:02:45 +0200 H.G. Muller : Restore echo after ^C in ICS password 2011-06-22 10:45:27 +0200 H.G. Muller : Fix some warnings 2011-06-19 20:30:09 +0200 H.G. Muller : Increase efficiency of SAN generation / disambiguation **************** Risky patch! ********************** The algorithm used for disambiguating and generating SAN was extremely inefficient, because it generated all pseudo-legal moves from the relevant position, and then for each of those did a check test (involving generation of all moves of the opponent), before determining if the move matched the (proposed or given) SAN move. While it is pointless to generate moves with a piece that does not match (let alone checking them for legality). And for a piece that matches, it is pointless to test legality of moves that do not match the to-square. To speed up the process GenLegal and GenPseudoLegal have been equiped with an argument that can indicate the piece type of the required move, so they can skip generating moves with other pieces. TestLegality, Disambiguate and CoordsToAlgebraic make use of this facility, and set also (through global variables rFilter and fFilter) a to-square filter to be applied in the GenLegalCallback before it tests the move for legality. This patch is especially tricky for Crazyhouse, where the piece indicated in the move might not be the piece actually on the board, because the latter is a promoted Pawn, and has to be demoted toits base type before the comparison. 2011-06-19 16:18:15 +0200 H.G. Muller : Fix compile errors WinBoard The patch to make non-existing options non-fatal broke WinBoard. All calls to ExitArgError from it now supply a third argument TRUE to fix it. 2011-06-19 14:28:09 +0200 H.G. Muller : Add -fSAN / -sSAN options These options force the PV of the applicable engine to be converted to SAN. They make use of the existing ParsePV routine, after shelfing a possible PV (from user PV walking) to free the space after the last move. Could be costly in terms of CPU usage. 2011-06-19 10:56:25 +0200 H.G. Muller : Cure flicker in Move History window, fix highlighting The highlighting of the current move in the Move List window by selecting it did not always work, because some other windows were clearing their text widgets by selecting the contents and killing it, thus snatching the selection away. This has been changed to setting XtNstring to an empty string as a method for clearing without side effects on the selection. As a bonus the Engine Output window now also no longer has the black flicker on clearing it. In addition, triggering a scroll by setting the insertion point to the end of the text caused excessive flicker in the Move List window, apparently clearing it and redrawing from scratch, (even if there was no scroll motion), to the point where on my slow laptop the move history stayed entirely blank during a rapid succession of moves. This has been combatted by using the end-of-line action procedure (which does not seem to suffer from this) to put the insertion point at the end, when we need to scroll to close to the end. 2011-06-18 23:48:13 +0200 H.G. Muller : Fix crash on clearing new Move List window When a new game started and a previous game had filled the Move List window, a crash occurred because an attempt was made to undo the highlighting of a no-longer-existing move, and then scrolling to it. 2011-06-18 20:46:57 +0200 H.G. Muller : Use sound for ICS tells also with engine telluser popups The telluser and tellusererror commands now can be assigned a sound. 2011-06-18 20:45:12 +0200 H.G. Muller : Add Score in Move List option to general options dialog XB Now that we have a WinBoard-style Move History window, this option is no longer a no-op in XBoard. 2011-06-18 12:42:41 -0700 Arun Persaud : new developer release 2011-06-18 12:38:32 -0700 Arun Persaud : updated Changelog, NEWS, etc. 2011-06-18 12:51:10 +0200 H.G. Muller : Update window itle after last game of match The result printed behind player names during a match would still be the one without the game, differing from what the popup would show, which looked sloppy enough for people to complain about it. . 2011-06-18 10:26:31 +0200 H.G. Muller : Make WB generic popup translatable When used for internal settings (as in the Load Engine and Tournament Options dialogs), the option names are now subectto translation. 2011-06-17 21:05:00 +0200 H.G. Muller : Redo Move History with generic popup in WinBoard style The use of color and boldness to make the move list more readable unfortunately cannot work in Xaw; reverse video by selection is used as an alternative to highlight the current move. 2011-06-17 21:19:41 +0200 H.G. Muller : Remove stray else Due to an erroneous else, the window parameters of Move History were not retreived (and thus incorrectly saved) when the Engine Output was up. 2011-06-14 18:47:30 +0200 H.G. Muller : Make non-existing opton in settings file non-fatal It is rather difficult to recover from a situaton where the settings file contains an unknown option (e.g. because you downgraded to a previous version that had fewer options), especially in WinBoard, where the user settings file is in a hidden folder, and people might not be able to find it, let alone edit it. By just skipping the line with the offending option, rather than generating a fatal error, when reading from a settings file, such options will be automatically purged from the file as soon as you save settings. Small problem is that the user cannot be warned, as the initialization has not progressed far enough at this point to generate error popups. In XBoard we can at least print to the console, but in WinBoard there is no warning at all. But the worst thing that can happen is that new options in a settings file of a more advanced version will revert to their defaults. 2011-06-14 18:20:37 +0200 H.G. Muller : Change long form of -tf option to -tourneyFile This is a more logical name, and in the WinBoard docs it was already described as such. Also remove the -processes option, which in the current design of the tourney manager is no longer used. 2011-06-14 18:17:08 +0200 H.G. Muller : Fix default of -remoteUser This has to be an empty string, rather than NULL, to prevent XBoard from segfaulting when the -gateway option is used. 2011-06-14 13:32:38 +0200 H.G. Muller : Add -at and -opt options as alternative for @ Windows XP and Vista shortcuts do not display command lines with @ in them correctly, and these optionsprovide a work-around for that. 2011-06-14 12:46:36 +0200 H.G. Muller : Fix empty-string option values in XBoard 2011-06-14 12:40:11 +0200 H.G. Muller : Fix crash on switching sound in Vista When choosing a new sound the wave form of the old one was free'ed, but because built-in sounds are not really malloc'ed, this led to a crash. 2011-06-14 12:36:16 +0200 H.G. Muller : Update WB docs for tourney manager 2011-06-14 12:35:01 +0200 H.G. Muller : Add icon to WB for tournament files 2011-06-10 16:52:01 +0200 H.G. Muller : Redo Time Control dialog with generic popup As poor-man's disabling of the unneeded input fields, we print the word "Unused" in them. 2011-06-10 14:14:45 +0200 H.G. Muller : Some refactoring in xoptions.c to separate out front-end 2011-06-10 12:38:08 +0200 H.G. Muller : Redo New Shuffle Game dialog with generic popup The buttons are slightly renamed, and in stead of having an 'off' button to clear it, shuffleOpenings now has its own checkbox, which is ticked when a fixed or dynamic random is chosen with the buttons. 2011-06-10 11:58:17 +0200 H.G. Muller : Fix type of shuffleOpenings This was a Boolean option, and thus accessed by the args.h code as such, while it was declared as an int (and used in backend.c as such). This could have led to problems with different endianness. 2011-06-09 23:57:43 -0700 Tim Mann : Internationalize the file browser. The file browser was missed in the previous round of internationalization and had gotten broken by setting international = True in its widgets. I got nothing but segfaults trying to set international to False in the file browser widget subtree when it was True in the main window, so I gave up and did the internationalization. It turned out to be pretty easy. As a tiny bonus fix, I removed some ../'s from includes, and you can now configure and build xboard in a subdirectory again. This was useful for building both --enable-nls and --disable-nls from the same sources to compare functionality and make sure both still work. 2011-06-08 20:26:28 +0200 H.G. Muller : Fix crash at end of Swiss tourney 2011-06-08 17:33:34 +0200 H.G. Muller : Fix display of logos The logo files are now sought relative to the WinBoard install directory. Non-existing logos cause clearing of the logo, rather than letting the logo of the prevous engine hang. Logo change is requested explicitly from the back-end (when an engine is initialized for a new game), rather than using the kludge in StartChileProcess. This required a dummy UpdateLogos routine in the XBoard front-end. 2011-06-08 18:02:31 +0200 H.G. Muller : Fix parameter handling in adapter command A backslash was not considered the end of an option name, which was fatal for UCCI2WB, which needs %fd\\%fcp in its command line. 2011-06-08 17:16:54 +0200 H.G. Muller : Clear Engine-Output pane when initializing engine This to prevent output from the previous game hanging there during the next game, when the engine that is really playing is in book and doesn't produce thinking output there. 2011-06-08 17:20:01 +0200 H.G. Muller : Fix display of last move of last match game When a game was adjudicated (e.g. because XBoard detected mate) GameEnds would trigger an exit if it was the last game of the match, and thus never returned, while the ShowMove was called only after return from Adjudicate. An extra ToNrEvent is now used in GameEnd in this case to cause ShowMove to be called before exiting. (Ugly kludge...) 2011-06-08 17:38:43 +0200 H.G. Muller : Fix concurrency in Swiss tourneys The pairing engine was consulted for the next round before all games of the previous round were finished, if other XBoard instances were still playing games. This caused the instances finishing early to stall indefinitely. This is fixed by moving the Swiss pairing code to after the syncInterval code. The normal pairing code (the call to Pairing) must stay before it, because it determines the syncInterval. So ther is a bit of tourneyType dependence cluttering up the code here. :-( 2011-06-08 17:27:01 +0200 H.G. Muller : Give error popup when pairing engine fails An invalid pairing now produces an error popup to inform the user, so he knows why the tourney stagnates. 2011-06-08 17:24:41 +0200 H.G. Muller : Fix clock mode in tourney starting from -ncp mode When a tourney started from -ncp mode, which was allowed in MatchEvent, because the tourney loads its own engines anyway, the menu enablings and clockmode where not restored to their 'GNUMode' state. 2011-06-08 17:11:31 +0200 H.G. Muller : Fix round-robin schedule The first round was played twice, and the formulas used to derive the pairing were not even-odd resistant anyway. Both even and odd number of participants should work now. 2011-06-08 17:08:55 +0200 H.G. Muller : Fix interrupting tournament Stopping a tourney by using the Machine Match menu item did not wor properly. 2011-06-08 16:57:09 +0200 H.G. Muller : Improve quoting of engine name on install Rather than always using double quotes for the engine command, the engine filename is now double-quoted if it contains spaces (and no double-quotes), and the comand is single-quoted if it contains double-quotes (and double-quoted otherwise). 2011-06-08 16:49:18 +0200 H.G. Muller : Print sensible window title during tourneys Rather than the "(W-L-D)" in the title we now print game number and total games, plus indication of the tourney type (rr, gt or sw). 2011-06-08 16:44:16 +0200 H.G. Muller : Let XBoard propose name of tourney file Add an option -defaultTourneyName to configure the name that will be proposed in the Tournament Options dialog's tournament-file field. The option can contain %y, %M, %d, %h, %m, %s for year, month, day, hour, mintes, seconds of the curret time in %02d format, or %Y for the year in %04d format. Any tournament -file name is ignored when no participants are given. Participants without a tourney file remains an error. 2011-06-08 16:30:34 +0200 H.G. Muller : Improve Tournament dialog layout WB 2011-06-08 17:05:02 +0200 H.G. Muller : Fix -matchGames option The new MatchEvent code had broken the -mg option, and used always -defaultMatchGames in stead. 2011-05-30 19:55:13 -0700 Tim Mann : Fixed small bugs in several .po files, enabling these translations to be used. They all probably need more work from the translation team. I don't speak any of these languages, but I did some spot checks either from my own knowledge or using Google Translate, and they generally look sane. - Several files were in utf8 but needed to be marked as such (that is, "CHARSET" changed to "UTF-8"). Affected es.po, it.po, ru.po, vi.po, zh_CN.po, zh_TW.po. - it.po was missing a \n at the end of one translation. - ru.po had unescaped double-quote marks in one translation. - vi.po needed to be normalized to Unicode normalization form C. With this fix, more characters display correctly, though at least one is still missing in the X core fonts that xboard is able to use. See http://vietunicode.sourceforge.net/ for more about Vietnamese. - zh_HK.po was written in big5 and then utf8-encoded on top of that, making it unusable. I stripped off the spurious utf8 encoding and then used recode to convert the file to Unicode properly encoded as utf8. Unfortunately, I wasn't able to test any of the Chinese translations, as I haven't been able to get XCreateFontSet to work in Chinese locales with any of the fonts I have installed, even after adding the Ubuntu language support packages for both simplified and traditional Chinese. I did spot check a bunch of the translations using Google Translate. I've checked in a couple of tiny Perl scripts that I used to do part of the fixups on vi.po and zh_HK.po in case we need them again. 2011-05-30 14:12:53 -0700 Tim Mann : The empty string can't be translated and it causes the gettext utilities to complain, so change _("") to "". 2011-05-30 13:21:06 -0700 Tim Mann : Add a final wildcard default for fonts. This gives XCreateFontSet more freedom and lets it find fonts for some obscure charsets where fixed-bold or fixed-medium etc. may not have one. 2011-05-29 20:14:37 -0700 Tim Mann : Added "misc-fixed" as a fallback font to handle locales where adobe-helvetica does not have all the required characters. The fixed font is ugly but does have a rather complete set of characters, while the helvetica font is missing Cyrillic characters (at least on my distro). I haven't found a way to get a nicer font that includes Cyrillic to work with XCreateFontSet, but I don't fully understand why. I'll try to improve things further in the future if I figure out what's all going wrong. In the process I had to rewrite the code to insert the pixel size into a font name (replacing a "*" in that field). The new code is much more general. 2011-05-28 23:55:42 -0700 Arun Persaud : translation: activated Ukrainian translation 2011-05-28 23:41:24 -0700 Arun Persaud : translation: added new Ukrainian PO file from the TP 2011-05-28 21:07:08 -0700 Tim Mann : Fix display of international characters outside the ASCII range. 1) Set Xaw resources required for internationalization -- *international and *fontSet. 2) Untangle the new XFontSet-aware code from the old FindFont code. It doesn't make any sense to apply the old (and obsolete) size searching code from FindFont to a font set, which contains fonts that are all the requested size. 3) With these changes, the -font option doesn't work at all when given on the command line. The -font option actually is parsed by the Xt library, used to set the *font resource, and removed from argv before xboard can see it, so the option didn't really work properly with the new WinBoard-style option framework anyway. Now that -font is even more broken, I changed the documented name of the option to -messageFont and changed args.h so the option is saved in ~/.xboard as -messageFont. 2011-05-28 21:05:00 -0700 Tim Mann : Move "hide thinking" option into alphabetical order. 2011-05-28 21:01:25 -0700 Tim Mann : Fix a size mismatch in scanf. Untested, but the code could not have worked properly without this fix -- scanf would have written 32-bit values to 16-bit fields, thus smashing adjacent memory. 2011-05-23 19:05:36 +0200 H.G. Muller : Fix layout tournament Load Engine dialog WB 2011-05-23 19:03:56 +0200 H.G. Muller : Fix ArgTwo warnings 2011-05-23 19:00:00 +0200 H.G. Muller : Add Swiss tourneys through pairing engine An external program can be designated pairing engine through the new persistent option -pairingEngine. Defining the option will allow tourneytype -1 to be chosen for Swiss. In this case the pairing engine will be queried for a pairing before every new match game, by sending it the -results string, plus the command 'pairing' + game number. 2011-05-23 17:37:43 +0200 H.G. Muller : Allow generic dialog to ignore OK The EndMark callback can now suppress popdown of the dialog on OK, when it somehow does not like the values entered by the user. In XBoard this required all the callbacks to return a value. Caveat: A refused OK would still have set all new values given in the dialog! 2011-05-23 17:22:58 +0200 H.G. Muller : Fix CR in multi-line WinBoard text-edits The generic popup did not add CR when strings containing '\n' were printed in a multi-line text-edit, thus joining the lines. It was also not possible to type a CR in a multi-line text-edit. 2011-05-23 14:16:17 +0200 H.G. Muller : Let mentioning completed tourney file add one cycle Secifying a tourney file of a fully completed tourney will now resume that tourney with another cycle added. When there are still uncomleted games in the tourney, the usual error message will appear. There are also error popups added for when the user fails to specify a tourney file, or gives too few participants. 2011-05-16 11:02:08 +0200 H.G. Muller : Make engine startup failure non-fatal in WinBoard Unlike XBoard, which forks first, the parent process WinBoard has direct knowledge of a failure to execute the engine command, and used it to trigger a fatal error. The code doing this has now been disabled. Only in case of a first engine we switch back to -ncp mode in stead, but no action is taken to 'bury' the deceased engine process. Like in XBoard, errors in writing or reading the pipes will trigger this. 2011-05-14 17:03:44 +0200 H.G. Muller : Add secondry adapter command for UCCI or USI The option -uxiAdapter can define a second adapterCommand, which will be invoked on encountering the options -fUCCI, -sUCCI and -fUSI, sUCI. 2011-05-14 10:05:11 +0200 H.G. Muller : Obey san feature when sending book moves Book moves were always sent in long algebraic, even when the engine had said it wanted to receive SAN. 2011-05-14 10:03:20 +0200 H.G. Muller : Fix initialization of engine state Some of the initialization relied on variables being zero at startup, which meant value from the previouly loaded engine hng on after loading a new one. 2011-05-11 23:06:20 +0200 H.G. Muller : Take account of holdings in book key The board is numbered by rank, for comptibility with Polyglot format, starting at a1. We then continue counting in the holdings 'files', in up-rank direction, each holding spanning the full board height (even if it is not fully used). Firstthe left (black) holdings, then the right, Even in Shogi this limits the square number to < 99, which is below the absolute limit of 128 (where we would run out of hash keys). 2011-05-11 22:48:34 +0200 H.G. Muller : Alow promotions and drops in book-editing 2011-05-11 20:15:58 +0200 H.G. Muller : Include learn info in book edit 2011-05-09 21:55:10 +0200 H.G. Muller : Adapt default directory of lng2po The path is prefixed with "../" to make it runable from the po directory. 2011-05-09 21:20:35 +0200 H.G. Muller : Recode some po files po files were generated with the aid of lng2po for Russian, Vietnamese, Chinese(simp) and Chinese(trad), using encodings CP1251, CP1258, GB2312 and BIG5, respectively. 2011-05-09 20:11:32 +0200 H.G. Muller : Implement Edit Book in XBoard 2011-05-09 09:52:54 +0200 H.G. Muller : Improve WB Load Engine dialog texts 2011-05-09 09:48:27 +0200 H.G. Muller : Make 'add to list' default in Load Engine dialog 2011-05-09 09:33:39 +0200 H.G. Muller : Add -userFileDirectory option This volatile option is initialized from 'installDir'. It is primarily intended for configuration of WinBoard through its master settings file, and specifies an alternative place to create saveGameFile or look for other user files, in stead of looking in the installDir. 2011-05-09 09:10:47 +0200 H.G. Muller : Add option -absoluteAnalysisScores This persistent option flips scores in the when black is thinking in analysis mode, just before they are printed in the engine-output window. 2011-05-08 17:47:40 +0200 H.G. Muller : Automatically play moves of clicked PV in analyze mode The Shift key now no longer needs to be pressed to play moves from the PV in analyze mode (so it could be given back its original meaning of starting a variation with the entered moves). In analyze mode the PV walk begins after the first move, so a static right-click plays the first PV move. To just peek the PV you have to walk to the start of it before releasing the mouse button. In other modes the PV walk stillstarts at the very end. 2011-05-08 17:07:18 +0200 H.G. Muller : Let ParsePV always generate SAN move 2011-05-08 13:53:09 +0200 H.G. Muller : Fix vscrolling in XBoard Engine-Output window After clicking the memos they scrolled to the bottom, because SetFocus put the insertion point at the very end of the text. This behavior is now reserved for text-edits containing less than 100 characters. 2011-05-08 13:22:33 +0200 H.G. Muller : Fix button sizing in generic popup 2011-05-08 13:02:52 +0200 H.G. Muller : Allow changing MultiPV setting from Engine-Output window In analyze mode a header line is printed in the first engine-output pane, which can be right-clicked to increase or decrease the number of PVs. (Only with engines that support the MultiPV option.) 2011-05-08 11:28:44 +0200 H.G. Muller : No clearing of Engine-Output memos on stat01 2011-05-07 23:27:50 -0700 Arun Persaud : updated xboard.pot with released version 2011-05-07 22:56:53 -0700 Arun Persaud : new developer release 2011-05-07 22:54:29 -0700 Arun Persaud : updated ChangeLog, NEWS, etc. 2011-05-07 23:07:46 -0700 Arun Persaud : deactivated new languages for the moment... po files need some cleanup, probably better to wait until the translation-project looked at them 2011-05-07 18:44:24 -0700 Arun Persaud : added translations generated via lng2po from all winboard languages 2011-05-07 18:40:23 -0700 Arun Persaud : lng2po.sh: added command line options, GPL header also use a temporary file generated with mktemp instead of a hard coded one 2011-05-07 17:53:10 -0700 Arun Persaud : fixed access rights to winboard language files (644 instead of 655) 2011-05-07 14:55:55 +0200 H.G. Muller : Import WinBoard language files into git 2011-05-06 23:14:02 +0200 H.G. Muller : Let Shift+RightClick on PV actually play the PV moves 2011-05-06 18:06:48 +0200 H.G. Muller : Make book-edit function WB The tags dialog is used to display the GUI book moves from the current position, and will be updated when you step or move to another one. The edited move list (with weights) can be written back to the book. 2011-05-07 16:21:25 +0200 H.G. Muller : Fix resetting engine options Not all options were reset, and -needsNonCompliantFEN was 'reset' to a completely wrong value, so that bad FENs would be sent. 2011-05-06 18:51:20 +0200 H.G. Muller : Add -first/secondPgnName option This option replaces the tidy name of the engine in the PGN player tags of engine-engine games. In WinBoard engines can be installed with this option through a checkbox in the Load Engine dialog. 2011-05-06 23:31:36 +0200 H.G. Muller : Let XB generic popup define default file extensions 2011-05-06 18:25:38 +0200 H.G. Muller : Save time-control settings in tourney file Because parsing the options and storing them in appData is not enough, the time-control code setting the internally used parameters from the appData info in InitBackend was made into a subroutine, and also caled after parsing the tourney file. 2011-05-06 20:40:34 +0200 H.G. Muller : Put saveGameFile in tournament dialog 2011-05-06 19:17:56 +0200 H.G. Muller : Plug memory leak, filenames relative to installDir String options are consistently freed now, before assigning a new value to them through strdup. The init code now even does use strdup when setting defaults. This is important for optionslike -lgf, which are not saved in the settings file, and thus are usually left with their default. When a dialog to set them then uses free, this causes a crash. When setting the defaults uses strdup, ParseArgs can already free them. This plugs an important memory leak, as ParseArgs in now called to parse the tourney file before every tourney game (twice!), and the lists of participants and results in it can be quite long. Macros are defined in common.h to make the code look simpler. Filenames entered through the generic popup are now interpreted relative to the WinBoard installation folder, just as the saveGameFile already was. The code handling the atter was made into a subroutine for this. 2011-05-06 22:02:53 +0200 H.G. Muller : Add WB new popup prototypes 2011-05-06 18:58:08 +0200 H.G. Muller : Add partcipants at bottom in tourney dialog (WB) 2011-05-06 18:56:53 +0200 H.G. Muller : Fix range of tourneyType spin WB 2011-05-06 18:15:23 +0200 H.G. Muller : Fix exit popup in tourney mode Only the instance finishing the last tourney game will cause a popup with final standings. As long as there are still busy games, it exits or switches back to idle mode silently. 2011-05-06 18:11:47 +0200 H.G. Muller : Fix stopping of match in tourney mode 2011-05-06 18:59:26 +0200 H.G. Muller : Add default extension in file browser 2011-05-06 22:37:14 +0200 H.G. Muller : Improve sizing of comment and tags dialogs There seems to be a bug in Xaw for the sizing of buttons; they get unpredicatble and weird sizes when the size is not explicitly set, possibly stretching the initial width of a dialog to rediculous values. Sizing back to a remembered value from the settings file then makes buttons overlapand text edits shrink to almost nothing. To prevent that we now define exlicit sizes for the buttons in tags and comment popups. 2011-05-06 21:00:25 +0200 H.G. Muller : Fix generic combobox bug The patch placing gettext markers was done wrong, setting the translated menu text outside the loop, so all entries became the same. 2011-05-07 14:23:12 +0200 H.G. Muller : Fix PV walking in analysis mode ParsePV assumed that the PV would always have been produced by an engin thinking about the final position of the game (or the one before it). In analysismode, however, the engine can be analysing positions internal to the game, and the PV would be considered invalid. This is fixed by cutting of the tail off the game (shelving it in variation fashion) before starting the PV walk, and reverting afterwards. For this the PushTail and PopTail routines had to be split into an 'inner' part, doing the pushing and popping, and an outer part, handling menu graying and popdowns (which is undesirable in in this application). 2011-05-03 00:24:10 +0200 H.G. Muller : Lift length-limit on text-edits in WB generic popup 2011-05-04 13:53:05 +0200 H.G. Muller : Lift limitation of text length in generic dialog XB All string options should now point to allocated memory, as strdup / free is consistently used on them. This is OK for values received from ParseArgs, but for non-arg intermediate variables that must receive strg values, such as in the comment and tags popups, strdup has to be used to initialize those. 2011-05-04 14:53:02 +0200 H.G. Muller : Implement Tournament Options dialog WinBoard The file browser now can select on extension WB generic dialogs, with a default based on the option.max value of the option for which it browses. A textBox can be forced to be multiline by putting the number of extra lines in option.min. 2011-05-04 15:30:00 +0200 H.G. Muller : Make option to draw second engine from first list 2011-05-03 00:17:47 +0200 H.G. Muller : Fix error message on engine load 2011-05-04 15:09:33 +0200 H.G. Muller : Implement Load Engine dialog in WinBoard The Load Engine dialog is implemented for WinBoard, and is invoked by the menu item Engine->Load, which formerly was Install 2nd. Install 1st is renamed 'Edit Engine List'. Unlike in XBoard, the dialog has separate fields for the engine executale and its parameters. The dialog is implemented by converting the Engine Settings popup into a generic dialog generator. 2011-05-04 13:43:06 +0200 H.G. Muller : Load new logo on engine change WinBoard Picking the logo for the first engine is made into a subroutine. The code for picking the logo of the first engine was made into a subrroutne for this. We use the kludge to recognize the engine by its command line when starting a new engine process. 2011-05-04 13:36:27 +0200 H.G. Muller : Allow switching off match mode through menu The Machine Match menu item is now checkmarked, and no longer grayed during a match, and clicking it while a match is running will terminate the match after the current game. To not be left with hanging checkmarks, the checkmark is already removed duringthe last match game (which is logically equivalent to ordinary Two Machines mode anyway). 2011-05-03 00:14:22 +0200 H.G. Muller : Calculate and display tourney result 2011-05-04 18:42:13 +0200 H.G. Muller : Implement Tournament Manager New command-line options are added to specify the tourney: -tourneyType (-tt), -tourneyCycles (-cy), -participants, -syncAfterRound, -syncAfterCycle, -results, to be saved on a -tourneyFile (-tf), but otherwise volatile. When a tourneyFile is specified during a match, a new routine NextTourneyGame is called from NextMatchGame before every game, to decide the pairing, and unload and redefine the engines, when needed. The XBoard Match Options dialog can be used to set the options and create the tournament file. Actual loading of new engines is done by TwoMachinesEvent, which is now modified to also wait for the feature timeout of the first engine. Waiting for the matchPause is now also implemented there, after waiting for the engines (so they can be started during the pause). Pairings and color assignment is now all done in an absolute (non-incremental) way, based on a new global game-number variable nextGame, which takes over the function of matchGame in a tourney. The latter is now used to count games between the same players, so it can be still used to derive the load-file indexes (again in absolute fashion). The next game to play is already picked in GameEnd, so it can be decided if there is a game to be scheduled, or if we can terminate. 2011-05-04 15:42:26 +0200 H.G. Muller : Display note in stead of empty engine-settings dialog XB 2011-04-24 18:02:20 +0200 H.G. Muller : Fix crash on empty Engine Settings dialog The generic popup was not foolproof against this. 2011-04-22 12:47:24 +0200 H.G. Muller : Refactor code for loading games and positions in match The code in NextMatchGame and MatchEvent was nearly the same, (MatchEvent did a little more error checking, but that is never harmful), and could be combined. In stead of determining the load index incrementally, it is now calculated in an absolute way from the game number, so it can be used more easily in tournament mode. 2011-04-21 22:37:56 +0200 H.G. Muller : Add callback possibility to combobox selection 2011-04-24 17:15:23 +0200 H.G. Muller : Lock game an position file during writing The use of flock() on the file desctiptor of the opened stream should guarantee multiple XBoard instances, saving on the same file, will not interleave their PGN games or FEN positions. 2011-04-27 17:05:06 +0200 H.G. Muller : Remove building rule for parser.c from WB makefiles 2011-04-29 16:58:49 +0200 H.G. Muller : Fix Engine Settings buttons in WinBoard This was broken by a leftover statement from debugging the -file/-path patch. 2011-05-02 13:38:14 +0200 H.G. Muller : Implement flock in WinBoard This system function seems unknown in a MinGW compile, so it is implemented with the aid of file byte-range locking, using a lock on the first 1024 bytes of the file as a semaphore. 2011-04-29 23:06:43 +0200 H.G. Muller : Fix grayout XB Match Options in ICS mode 2011-05-03 00:22:40 +0200 H.G. Muller : Delay loading of second engine until it is used 2011-05-02 15:00:03 +0200 H.G. Muller : Fix zippy bughouse partner bug The patchs to subject Zippy messages to coloriation was faulty, because there were messages recognized by zippy that were not colorized, and such messages would then not be 'read away' after zippy recognition (except for the first character). As a result the messages were processed over and over again. 2011-05-04 10:59:43 +0200 H.G. Muller : Silence more rpm warnings 2011-05-01 20:33:50 +0200 H.G. Muller : Fix warnings XBoard file browser All the prototypes have been moved to selfile.h, to force uniformity. The order of the #include files xstat.h and selfile.h had to be swapped, to make sure 'struct stat' is a nown type atthe time of prototype declaration. The event handler SFmotionList is considered wrong type because of its third argument (XMotionEvent in stead of XEvent), and had to be casted to (XtEventHandler) when passed to XtAddEventHandler. 2011-05-04 10:56:05 +0200 H.G. Muller : Fix some warnings and header-file improvement Ther were lot of 'extern' declarations in the x-files, so called 'imports from xboard.c', (sometimes backend.c) which logically belonged in xboard.h (backend.h) to ensure their uniform definition. These have now been moved there. Some prototypes have been added in xboard.h as well, for functions that needed calling from xoptions.c. 2011-05-04 10:50:12 +0200 H.G. Muller : Create conversion tools for language files A shell script "lng2po.sh" is provided, to apply the translation given in a WinBoard .lng file to "xboard.pot", in order to generate a "language.po" file containing translations for all strings for which the .lng file had a translation. It makes use of a file "metascript", which is the ed script used to turn the .lng file in an ed script to turn the .pot into .po. For example, the command "./lng2po.sh espa?ol.lng" will create a file "language.po", which can be renamed to "es.po". ****************************** WARNING ******************************** Note that the lng2po script does a "recode" that assumes the given .lng file is encoded in latin-1. This means it canot be used without modification for the Vietnamese and Chinese translation; you would have to replace latin-1 by the applicable encoding first (CP1258 / BG2312 / BIG5). 2011-04-27 22:04:38 +0200 H.G. Muller : Put gettext markers in generic dialog creator This is done by adding extra XtNstring argumentsto the widget gcreaton, so the displayed name can be different fromthe widget name. 2011-05-01 19:56:38 -0700 Tim Mann : Use getaddrinfo instead of gethostbyname. Hopefully this makes us compatible with IPv6 and with hosts that have more than one IP address. However, I don't know of any chess servers that have either of those properties, so I couldn't test that. I did test that xboard still works with freechess.org and chessclub.com and that it gives an error message for invalid host names. 2011-04-24 11:18:28 -0700 Arun Persaud : updated German translation 2011-04-24 11:17:43 -0700 Arun Persaud : replaced hardcoded email address with generic PACKAGE_BUGREPORT 2011-04-23 10:51:57 -0700 Arun Persaud : updated po-files; updated german translation 2011-04-23 10:51:02 -0700 Arun Persaud : updated list of files that include translation strings; updated pot-file 2011-04-22 21:50:58 -0700 Arun Persaud : marked more strings for gettext that were only marked with N_() they need to be marked again with _() when they are used to get the translated string 2011-04-22 21:39:22 -0700 Arun Persaud : updated translation files 2011-04-22 21:37:22 -0700 Arun Persaud : added/fixed i18n support via gettext to xboard this was already added a long time ago, but now it's added again to autoconf. Also fixed some compile errors that showed up. 2011-04-20 10:27:20 +0200 H.G. Muller : Make engine startup error non-fatal When engine startup fails, do not generate a fatal error, but swicth back to -ncp mode. Write on broken pipe errors had to be suppressed for this. 2011-04-20 14:35:50 +0200 H.G. Muller : Make engine loadable during session A "Load Engine ..." menu item is added to the Engine menu, which pops up a dialog where one can replace the first or second engine by a new one, without destroying the game state. Switching from -ncp to engine mode needed activation of some menu items in SetGNUMode, and re-enabling clockMode. It was also important that noChessProgram is cleared before re-initializing the ChessProgramState. The Load-Engine dialog can select from the list of installed engines, and also add a newly specified engine to this list. In this case it saves the directory, hasBook, and isUCI info with the engine, and optionally the current variant. When loading an engine with a specified variant, it resets the game and switches to the new variant. 2011-04-18 15:56:47 +0200 H.G. Muller : Generalize WaitForSecond to WaitForEngine 2011-04-18 15:46:12 +0200 H.G. Muller : Add UnloadEngine routine 2011-04-20 13:45:51 +0200 H.G. Muller : Put engine initialization code in per-engine function Initializing of the ChessProgramStates first and second from the option settings in appData is now done by separate calls to the same routine. Clearing of options is added to the initialization. This is needed when reloading an engine. This is done in a separate routine, which could also be called on -reset options. 2011-04-18 13:21:44 +0200 H.G. Muller : Bring structure in appData engine options All options in appData that came in pairs for both engines are replaced by arrays of ENGINES (=2, for now) elements. The use of the named appData field that are replaced in the source is replaced by use of the corresponding array element, by #define directives in common.h, awaiting their replacement. 2011-04-19 15:15:48 +0200 H.G. Muller : Fix gettext macros in option dialogs The strings in the tables were using _() in stead of N_(). 2011-04-18 20:58:01 +0200 H.G. Muller : Fix crash on using Engine #1 Settings in ICS non-zippy mode If XBoard is compiled with zippy the Engine #1 Settings menu was not grayed out even when you don't run in zippy mode, and using it would then crash XBoard. 2011-04-19 15:07:31 +0200 H.G. Muller : Fix shogipixmaps Some pixmaps forptomoted pieces had wrong background color, others had a wrong name (so the one with the correct name was missing). 2011-04-17 19:12:00 +0200 H.G. Muller : Change texture-install directory to pixmaps/textures 2011-04-17 17:36:32 +0200 H.G. Muller : Limit install of sound files to those in menu The sounds directory is set to .../xboard/sounds, and only ten sounds are kept (all non-spoken). 2011-04-17 17:27:57 +0200 H.G. Muller : Remove some bitmaps from install Some files in the bitmaps source directory need not be installed, because they are there only to be linked to the binary in a build without LIBXPM, are README files or conversion programs. I left only the stuff that is in a Debian binary package in .../xboard/bitmaps.xchess. 2011-04-17 16:34:03 +0200 H.G. Muller : Configure some default sounds The move sound is set to Wood Thunk; the sounds for tell and challenge events to Phone and Gong, respectively. 2011-04-17 16:17:30 +0200 H.G. Muller : Change default sounds in Xboard menu All spoken sounds are removed now. Thud, Click and Ching are replaced by Wood Thunk, Slap and Cymbal; Car Horn and Pop are added. 2011-04-17 12:46:47 +0200 H.G. Muller : Make user wav file available for try-out in sound dialog The GenericReadout was adapted to be able to read a single selected value, so that the callback to the 'play' button in the sounds dialog could get the name of the 'user WAV file' without accepting all settings for the other sounds (which should only happen on 'OK', and might still be cancelled in stead). 2011-04-16 10:36:31 -0700 Arun Persaud : configure: enable silent rules by default 2011-04-16 10:28:16 -0700 Arun Persaud : configure: added install directory for bitmaps files: .../games/xboard/bitmaps/default/ 2011-04-16 10:25:33 -0700 Arun Persaud : configure: added install of sounds in .../games/xboard/sounds/default 2011-04-16 09:54:26 -0700 Arun Persaud : configure: renamed bitmapdir to pixmapsdir, since it installed only pixmaps. also changed name of default dir pixmaps will now be installed under .../games/xboard/pixmaps/default/ 2011-04-16 13:40:16 +0200 H.G. Muller : Fix gamelist highlight Reopening the gamelist should highlight the current game. 2011-04-16 10:25:53 +0200 H.G. Muller : Fix size limit on 'save as diagram' In stead of a fixed-size buffer the diagram-save code now uses an allocated buffer with size calculated from the bitmap parameters to retreive the bitmap data, so it should work for all sizes. 2011-04-15 22:04:03 +0200 H.G. Muller : Fix chaining of bottom-row dialog buttons The OK & cancel buttons are chained to the bottom. This patch makes sure that other buttons appearing in the same row (as in the tags and comment dialogs) will be chained that way too, so that they will behave the same on vertical sizing. The bottom of a full-width text-edit above it will be chained to bottom too. To make this work in the tags dialog, the (optional) cmail-message field had to be put above the tags memo. 2011-04-15 19:18:46 +0200 H.G. Muller : Fix switching between pixmap and bitmap pieces There were still several flags that had to be reset when redoing the graphics initialization. The Debian patch to use a default bitmap directory when none is given but monoMode is selected or forced, is moved to a more sensible place, so that it does not disturb matters when compiled without LIBXPM (when we do have built-in bitmaps). 2011-04-15 15:47:09 +0200 H.G. Muller : Remove outline-pieces option from board-options dialog This option does not exist in XBoard (yet). 2011-04-15 15:41:38 +0200 H.G. Muller : Fix running of clock during hash allocation engine In TwoMachinesEvent we now wait for the second engine to acknowledge the 'ping' after 'new', to make sure it is done allocating hash in reaction to the preceding 'memory' command, before the clock for the game is started. 2011-04-14 21:42:50 +0200 H.G. Muller : Describe move type-in in texi file 2011-04-14 20:34:42 +0200 H.G. Muller : Describe Copy Game List menu item in texi file 2011-04-14 20:30:16 +0200 H.G. Muller : Describe -sweepPromotions in texi file The new method for selection promotion piece, and the -sweepPromotions option are described in the texi file. 2011-04-14 20:14:44 +0200 H.G. Muller : Describe -pieceMenu option in texi file The sweep method for selecting a piece in Edit-Position mode is explained, as well as the -pieceMenu option. 2011-04-14 15:59:57 +0200 H.G. Muller : Update texi file Descriptions of the new XBoard menu dialogs are included in the docs. 2011-04-14 21:06:49 +0200 H.G. Muller : Reorganize texi description 2011-04-14 12:31:15 +0200 H.G. Muller : Fix sweep-promotions patch Setting of the from square was moved to before OKtoStartUserMove in the LeftClick handler, to make sure we could test the promotion possiblity when OnlyMove() would have altered (x,y) to be no longer the from square. But this setting of fromX, fromY hung on also if the move was not OK, so you could effectively select opponent pieces and empty squares. The from-square is now set back to undefined when it is not OK to move the piece you clicked. 2011-04-14 11:56:59 +0200 H.G. Muller : Alter treatment of moves with empty squares In Edit Position mode one can move empty squares, and use them to 'capture' pieces as a means to clear their square. But this often leads to unintended disappearence of pieces one wants to grab for dragging, if a previous click had inadvertantly left an empty square selected: the click on the piece is then seen as the to-click of a click-click move. This patch treats to-clicks of moves with an empty-square differently from other to-clicks: Rather than performing the move (in this case clearing of the to-square) on the down-click, it defers that to the up-click, and only does it if that up-click is in the same square. This allows the user to grab the piece on the down-click, and drag it to another square, if that is what he wanted to do, without being disturbed by sudden implosion of the piece he tried to grab. If the to-square is in the holdings, grabbing the piece is the only action, as moves of empty squares into the holdings are forbidden anyway. 2011-04-13 13:14:00 +0200 H.G. Muller : Block selection of a directory when file is needed When we are not browsing merely to obtain a name to put in a text edit, but really must return an open file pointer, selection of a directory (ending in '/') can no longer be OK'ed in the file browser. (XBoard tends to segfault when offered garbage for game or position file...) 2011-04-13 12:23:00 +0200 H.G. Muller : Let double-click select file in file browser A second click on the already selected entry now has the same effect as pressing the OK button. 2011-04-12 17:06:28 +0200 H.G. Muller : Couple mouse wheel to v-scrolls in file browser A newly added mouse-wheel event handler was made to call the v-scroll callback routines with parameters to step one entry. The button-press handler for the lists themselves was also made to intercept the wheel events (buttons 4 and 5), to prevent they would select an entry, and make them scroll in stead as well. 2011-04-13 11:41:54 +0200 H.G. Muller : Fix crash copying game list when there is none 2011-04-13 11:15:14 +0200 H.G. Muller : Fix changing of float setting by generic popup Changing a float setting (so far the only one is in the Load Options dalog) did not always work, because the old value was clipped to (int), so that changing it back to an integer value might erroneously conclude there was no change. 2011-04-13 16:15:22 +0200 H.G. Muller : Fix crash on closing dialogs in wrong order When a menu dialog was closed when it still had an open file-browse daughter, which could be done through the system menu X on the title bar, later closing of the file browser caused a crash. This is solved by keeping track of the fact that there is such a daughter through a global flag, and ignoring the pop-down command if there is one. 2011-04-13 16:33:16 +0200 H.G. Muller : Fix startup focus of board window When there were open auxiliary windows, these would have focus on starting up XBoard. The XtSetKeyboardFocus call added in XBoard main() was ineffective in curing that. It has now been replaced by a call to XSetInputFocus, which does do the job. By giving input focus to the form widget, rather than the board widget, XBoard will be immediately sensitive to all key bindings. 2011-04-13 15:48:35 +0200 H.G. Muller : Fix game-list highight error when filtered (WB) When the gamelist was filtered, the game that was highlingted was the n-th game in the list rather than the n-th game in the file, when the latter was loaded (and n did not exceed the number of filtered games). This is fixed now by searching for the line in the listbox that starts with the game number n, rather than taking the n-th line. 2011-04-12 19:20:46 +0200 H.G. Muller : Refactor move type-in code Common code between XBoard and WinBoard was moved to the back-end creating TypeInEvent() and TypeInDoneEvent() routines. 2011-04-12 10:13:40 +0200 H.G. Muller : Fix saving of XBoard fonts with spaces in name SaveFontArg now prints quotes around the saved font string, so that the general option-argument parser doesnot stop at the first space it sees. 2011-04-11 20:48:24 +0200 H.G. Muller : Implement move type-in for XBoard By adding an event handler to the main window for key presses, users can now type moves when the board has focus, like in WinBoard. The typed character appears as first character in the type-in box that willpop up. Enter and Escape close the box; finishing the typing of the move enters it. Like in WinBoard it is also possible to type a move number (to go there) or (in Edit Position mode) a FEN. 2011-04-11 20:59:44 -0700 Arun Persaud : new developer release tried to keep the v4.5.x branch developed already separated in the NEWS file, as well as DIFFSTAT and SHORTLOG. The Changelog is just the one from master. 2011-04-10 22:47:59 -0700 Arun Persaud : updated Changelog, NEWS, etc. 2011-04-10 20:32:57 +0200 H.G. Muller : Fix use of game/position file in first match game When a match was started from the menu, it was not paying attention to game and position files. (Later games were.) The code that handled this in the initialization when a match is started through the command line was made into a routine MatchEvent, which can be called from the menu proc too. 2011-04-09 20:55:47 +0200 H.G. Muller : Fix crash on opening ICS Text Menu The patch for the color defaults had broken the ICS Text Menu. 2011-04-09 19:22:00 +0200 H.G. Muller : Implement Copy Game List menu item for XBoard Some WinBoard code was cloned for this. 2011-04-09 11:42:21 +0200 H.G. Muller : Third method of sweep selection This method sweeps through the possible promotion choices for the piece that is being dragged, as long as you drag a 7th-rank Pawn backwards. On draggin such a Pawn forwards, it immediately shows it as the piece you are going to promote to. 2011-04-08 23:39:10 +0200 H.G. Muller : Alternative sweep promotions The sweep takes place on the from-square here. 2011-04-07 23:21:02 +0200 H.G. Muller : Make sweep-select promotions work in WinBoard The mouse-move handler had to be connected to the PromoScroll back-end routine. 2011-04-07 23:19:10 +0200 H.G. Muller : Fix path browsing in WinBoard The routine BrowseForFolder was still declared as static in woptions.c, while it was used from wsettings.c. 2011-04-07 11:14:45 +0200 H.G. Muller : Fixes to sweep selection 2011-04-06 23:47:58 +0200 H.G. Muller : Implement sweep selection of promotion piece When the option -sweepPromotions is true, a click-click promotion move will first display the default choice (usually Queen) on the promotion square. While you have the mouse button still down, you can change the piece by moving the mouse vertically. 2011-04-06 21:20:30 +0200 H.G. Muller : Implement sweep selection as alternative for the piece menu When the option -pieceMenu is off, the piece menu will no longer appear on right-clicks in Edit Position mode. In stead a Pawn of the chosen color will appear immediately in the clicked square, and vertical movement of the mouse with the right button down will cycle through all other pieces defined in the pieceToCharTable of the current variant. Setting the side to move is acheived by clicking the correspondig clock. Clear board can be effected by clicking the clock of the side that already has the move. 2011-03-30 18:17:58 +0200 H.G. Muller : Remember Tags and Comment dialog coordinates The save-settings code now uses the shell and shellUp arrays from the GenericPopUp to read out the window coordinates for Tags and Comment window. Pointers used by GenericPopUp are set topoint to the corresponding WindowPlacement structs. 2011-03-10 19:21:59 +0100 H.G. Muller : Redo Tags dialog The generic popup is used for generating the Tags / EditTags popups. The tags popup use a 'label' field to display the cmail message 2011-04-01 13:43:52 +0200 H.G. Muller : Implement Edit-Comment window through generic popup The Edit Comment and Comment popups are combined into one, that can always be edited (similar to WinBoard). It uses shell number 1. (Number 0 is for all transient dialogs.) A save-changes button is added. The positioning is not implemented yet. 2011-04-06 10:56:57 +0200 H.G. Muller : Refinements to generic popup and color picker *) The text part of a checkbox can now be clicked to toggle the option. *) Typing in single-line text edits is ignored *) Using a spin button now sets focus to the affected text edit, with the insert position at the end. *) Using the sample field or an RGB button sets focus to the corresponding text edit, with the insert position at the end. *) The adjust buttons now work in reverse, with a D button for "darker". *) Editing a color field causes the sample field to update to the new color when you type . *) The color pickers now define a default color, which can be instated by clicking on the sample field. *) Fix some 64-bit pointer warnings 2011-04-05 17:05:39 +0200 H.G. Muller : Let file browser filter on extension A new text field is added in the file-browse dialog, to hold (space- separated) extensions, on which the filenames are then filtered. This field is initialized by the caller, depending on what we need the file for, but can be changed by the user. (Directories are always displayed!) Changes in the extension field become effective after typing a return in it. Escape typed in the extension field gives focus to the filename field, and restores the contents. Escape in the filename field cancels the dialog, return ther OKs it. The extension filter of the browser is initialized to the extension (if any) of the file currently in the text edit you are browsing for. When re-opening the file browser from the XBoard File menu, and there is no suggested filename, it will now start with the last succesfully opened name as suggestion. Calling the browser with a NULL argument for the suggested filename requests that (unlike calling with an empty string, which will start it in the current directory). To make this work smoothly, the filebrowser saves the last used name on entry, so it can be restored on cancel, so that a cancelled browse session really erases all memory of it. 2011-04-04 19:26:53 +0200 H.G. Muller : Fix animation masks on changing piece pixmaps The animation masks were not remade when new pieces were loaded interactively through the board-options dialog. 2011-04-04 19:09:21 +0200 H.G. Muller : Fix linegap option in board dialog The lineGC was not recalculated, so the grid lines stayed the same thickness. In addition, setting the line-gap override to -1 now retrieves the original line gap that belongs to the current board size. 2011-03-05 23:27:48 +0100 H.G. Muller : Make a kind of ICS text menu in XBoard as a dialog The dialog with buttons can be opened from the View menu. It is configured by the option -icsMenu; a default setting for this is included in the master settings file. The commands specified by the -icsMenu can now contain $name and $input keywords, which will be replaced by the current primary selection, or text the user types, respectively. Commands that contain $name will not be sent when the current selection is empty. Commands that do not contain $input will be sent to the ICS immediately; otherwise they will be placed in the ICS Input Box, with the cursor at the point of the $input, and input focus given to the Input Box, so the user can start typing. When a command is prefixed by "$add " it will be appended to the existing ICS Input Box contents, rather than replace it. The items now have to be separated by ";\n", and button text from command by ';' (with optional linefeed). This allows configuring of multi-line commands, as a single linefeed no longer has special sigificance. 2011-03-31 13:36:05 +0200 H.G. Muller : Redo ICS input box with generic popup This box is just a single text edit, but the complexity is in the added callbacks. These callbacks remain in xboard.c, and were altered to access the edit through the option.handle field. 2011-04-03 12:54:51 +0200 H.G. Muller : Activate -path and -file options In XBoard the generic popup was prepared for this. In WinBoard, for -path options the BrowseFolder routine is used, and had to be made global (prototype in winboard.h). 2011-04-02 18:40:33 +0200 H.G. Muller : Let generic popup generate Engine Settings dialog 2011-04-02 18:36:09 +0200 H.G. Muller : Merge SettingsPopUp into GenericPopUp Based on currentCps the values read from the dialog are sent to the engine, or stored into the option.target in the callback, and fetched from the option.target in the PopUp. The currentCps is cleared in the generic popdown of a transient dialog. 2011-03-06 10:11:06 +0100 H.G. Muller : Make generic dialog popup reentrant To allow persistent dialogs to be implemented through the generic popup, it must be possible to have several dialogs open at the same time, and thus make sure the popdowns under the cacel or close-window button know which one to pop down. To this end an array shells[] is created that takes over the function of settingsShell, and GenericPopUp gets an extra parameter telling it which element to use for storing the dialog shell. This number is then also passed to the callbacks that trigger popdown. This was a bit nasty for the CatchDeleteWindow stuff, which passes user data to the callback as text strings. Keep a separate up/down indicator, so that shell widgets can be kept for persistent dialogs. Also keep a currentOption per dialog type. The coordinates and size of the window is read out and stored in a WindowPlacement structure, (if one is specified for that dialog), when the dialog is popped down. When initialized the structure is also used to set the window parameters when the dialog is created. (The idea being that the structure was saved in the settings file.) The routine MarkMenu checkmarks a given menu item, and logs it for the given dialog type, so that a later popdown automatically unchecks is. 2011-02-25 12:14:25 +0100 H.G. Muller : Implement Machine Match menu item and options dialog An item to start a match from the menu is added, similar to what WinBoard has. (The code is duplicated, so I guess it should be moved to the back-end now, as MachineMatchEvent(), but it was tiny.) A dialog in the Options menu was added with the aid of the generic popup, and allows the user to set the load Game / Position File and Index. 2011-04-01 14:54:26 +0200 H.G. Muller : Create General-Options dialog The generic popup is used to implement a General-Options dialog, which contains all Boolaen options that used to be set directly from the main Options menu, plus a spin option for the flash count and flash rate. The corresponing options are removed from the main Options menu, but the whole thing is made conditional on a compiler switch OPTIONSDIALOG. The dialog needs an OK callback for sending an altered ponder-state to the engine. (Why isn't this option disabled in -ncp mode, btw?) A spin control is added to adjust -animateSpeed between 5 and 100. Add dropMenu and showTargetSquares item as well. 2011-04-01 18:16:47 +0200 H.G. Muller : Redo new-variant dialog with generic popup Some special code was added in GenericPopUp() to force buttons of the type needed in the New Variant dialog (wide, colored, greyed-out on variant type). The dialog was implemented with these, and callbacks for the buttons directly exit the dialog, without the need for OK. New spin controls are added to the dialog for adjusting the board format. 2011-04-01 14:48:48 +0200 H.G. Muller : Redo common-engine dialog with generic popup The ponder option was removed, as it is already in the main Options menu, and would require nastiness in the OK callback. Added book options in common-engine dialog. 2011-02-24 13:32:01 +0100 H.G. Muller : Redo adjudications dialog through generic popup We dropped the periodic-updates option, as it is already in the main Option menu. 2011-04-01 21:56:07 +0200 H.G. Muller : Make sounds dialog for XBoard This uses the combo boxes. A 'play' button isimplemented for a test sound. A sound directory is introduced, and can be set through the dialog. A default setting for -soundDirectory is added to xboard.conf. 2011-04-01 23:11:29 +0200 H.G. Muller : Add ICS options dialog 2011-04-01 21:52:48 +0200 H.G. Muller : Add board dialog XBoard The GenericPopUp() is used to implement a dialog for board options. The board dialog needs to trigger redraw and redefinition of the colors, through an OK callback. Color-pickers are used for the 6 basic color settings. To allow changing board settings during the session (i.e. from a menu dialog), the routines to allocate resources have to free the resources for the previous settings first. This patch take care of XtCreateGCs(), preventing re-creation of resources that are unchangeable (such as the grid color), and calling XtReleastGC() on GCs that can be changed. To prevent resource leaks the old pixmaps are deleted before making new ones on second or later calls of CreateXPMPieces(). 2011-04-03 11:39:26 +0200 H.G. Muller : Add browse button to generic popup Options of type FileName and PathName cause a browse button to be added behind the text field. The SpinCallback is used to handle the button presses, and invokes the file browser dialog to obtain a filename, which is then copied to the text field. 2011-04-01 21:49:26 +0200 H.G. Muller : Make generic XBoard popup, and implement 2 dialogs The Engine-Settings dialog of XBoard was cloned to work on predefined lists of (XBoard) options, rather than engine options. An extra field was added to the Option struct, to hold a pointer to the XBoard variable that should hold the option setting, so on OK'ing the dialog the altered values can be copied there. Not usable for options which should trigger an action (like redraw, or sending something to the engine). A Load Game, Save Game and ICS Options dialog were then defined by tables fed to GenericPopUp(). Options set from these dialogs were removed from the main Option menu, which removes a lot of code from xboard.c (for checkmarking, disabling the menu items). A button defined in the GenericPopUp can attain the color indicated by a previous text field, and add a callback to change the color in a spin-like manner (but using R G B W in stead of + - butons). The EndMark option can specify a callback, to be used on OK. A non-zero max field in the Option descriptor will be used to set the width of ComboBox, TextBox and Button optons. The elements are chained such that extra space goes fully into the input fields. A label type is added for clarifying texts that would not fit in the option names. A break-type (pseudo-)option is added. Make OK and cancel button suppressable in generic popup (by 2 bit of the option.min field). 2011-04-03 11:34:21 +0200 H.G. Muller : Add file-browser option to just return name By passing mode "f" the file browser dialog will not open the selected file at all, so it can be used to retreive the name for the benefit of a file-browser button to a -file option. A mode "p" will limit the selection to directories only, to browse for a path. 2011-04-03 13:15:17 +0200 H.G. Muller : Put insertion point at end of text on SetFocus 2011-04-05 23:47:34 -0700 Arun Persaud : fixed 64 bit warnings by casting integers to intptr_t before casting to int 2011-04-05 23:24:24 -0700 Arun Persaud : removed check and #includes for malloc.h, since it's not needed hopefully this doesn't break things on non-linux systems. OS X seems to be ok, not sure about others ;) 2011-04-03 20:23:49 -0700 Arun Persaud : check if malloc.h is present before including it OS X 10.6 doesn't have malloc.h, so it complained. 2011-04-03 20:01:36 -0700 Arun Persaud : Fix bug introduced in commit 89b4744: removed a "/" and forgot to add it in the config file removed a "/" to make OS X happy, but forgot to add the "/" again in the xboard.conf.in file 2011-03-12 14:08:50 +0100 H.G. Muller : Fix display of promotion piece in ICS superchess In Great Shatranj and Superchess promoted Pawns were displayed as shadow piece because these variants had holdings, while captured pieces should go back into the holdings unchanged, rather than reverted to Pawns. 2011-03-13 14:09:14 +0100 H.G. Muller : Fix o-o castling in new parser The non-compliant notation of castling with lower-case 'o' should be preferred over the non-compliant interpretation of moving a Pawn along the o-file. Not doing so breaks ICS play, as ICS use o-o and o-o-o for castling! So an exception is now made for the o-file in the 'fxg' case. 2011-03-10 19:27:41 +0100 H.G. Muller : Implement yynewstr entry point in new parser This entry point, used for parsing an ICS move list, was forgotten, and was still an empty routine. This made XBoard crash when observing an ICS game. 2011-03-07 23:11:00 -0800 Arun Persaud : fixed wrong default for polyglotDir mentioned in docs. Thanks to Hans Aberg for reporting it. 2011-03-05 12:39:01 -0800 Arun Persaud : Fix "make install" on Os X10.6.6 (removed a "/") seems like an extra "/" made "make install" unhappy 2011-03-03 21:19:05 -0800 Arun Persaud : removed parser.l from build process, also removed flex dependency from configure 2011-03-02 22:14:57 +0100 H.G. Muller : New parser, written in C A new parser was written to replace the flex-generated one. Immediate improvements are that it understand double-digit rank numbers, and Shogi coordinates. No changes were made in the Makefile yet to reflect the new, flexless building procedure. 2011-03-02 22:23:21 +0100 H.G. Muller : Fix bugs in FRC castling rights When parsing a castling move in FRC when no rights existed, the parser returned 0 (= EndOfFile) rather than ImpossibleMove. The recognition of the absence of rights was not adapted to the new encoding NoRights in stead of -1. 2011-03-01 23:42:34 +0100 H.G. Muller : Fix parsing bug of FRC castling The code that was supposed to intercept castling when no rights existed in FRC was not adapted to the new encoding for this by NoRights, rather than -1, and furthermore returned 0 (= EndOfFile) rather than ImpossibleMove. Not sure if the former would manifest itself in any way, but the latter seems bad. 2011-03-01 23:32:25 +0100 H.G. Muller : Fix two bugs in reading position diagram When reading a game without FEN tag, a position diagram is used to set the initial position. This calls CharToPiece() with a '.' as argument, because that is the position-diagram way to indicate empty squares. altered CharToPiece() over time this would be recognized as the first undefined piece or, more recently, the first piece without nickName, which is a white Pawn. Now it returns EmptySquare again in that case. A second problem was that for position diagrams in braces the brace was not in the list of ignored characters, and would cause the reading to get out of phase, so that the side to move was not recognized. 2011-02-26 21:12:08 +0100 H.G. Muller : Fix flipBlack option XBoard with board texture In XBoard -flipBlack is implemented by swapping white and black pieces, because the Shogi bitmaps from XShogi are made that way. But the mask used to cut out the whole in the board texture to fit the piece was not swapped, both when drawing static pieces, as well as during animation. 2011-02-25 14:38:21 +0100 H.G. Muller : Improve repairing damage of arrow highlight XBoard With line gap the highlight arrow necessitated redrawing of the entire board, to repair damage on the grid. This interfered with flashing of pieces, which was only done on selective redraws. In stead of forcing a total repaint we now just redraw the grid lines. 2011-02-23 16:41:36 +0100 H.G. Muller : Fix unintended translation in debug file The words "first" and "second" (cps->which) were sometimes used in context that should definitely not be translated. (e.g. the indicator for which engine printed/got the line in the debug file.) So translation is now deferred to all uses in popups. 2011-02-23 16:29:12 +0100 H.G. Muller : Fix nps bug The nps settingwas tested for being > 0 in stead of >=0, so that the case of CPU time was not properly handled. 2011-02-24 19:06:27 +0100 Kamil Blank : Added missing fclose() (tiny change) Signed-off-by: Arun Persaud 2011-02-20 16:12:19 -0800 Arun Persaud : release of version 4.5.1 2011-02-20 16:10:16 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2011-02-20 20:36:28 +0100 H.G. Muller : Fix two typos in option names in texi file Polyglot was capitalyzed 2011-02-20 00:03:19 +0100 H.G. Muller : Fix some resource leaks Some files were opened not closed in XBoard, when loading XIM images (which I doubt anyone ever does) but also when copying the clipboard (which has the potential of being done very often). There was also some code that would not work if conditional code which is permanently disabled would be enabled. 2011-02-17 20:17:04 -0800 Arun Persaud : new developer release 2011-02-17 20:14:38 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2011-02-17 15:40:02 +0100 H.G. Muller : Fix MSVC snprintf problem In MSVC snprintf has to be redefined as _snprintf, and this happens conditionally in config.c. But the latter was not #included in help.c. 2011-02-16 19:41:27 -0800 Arun Persaud : updated configure.ac to check for Xaw header files check for Xaw header files when --without-Xaw3d was given. Before the test was only done when Xaw3d was specified, but could not be found. If Xaw3d or Xaw can't be found, print a hopefully useful error message and exit the configure script. 2011-02-16 12:03:22 +0100 H.G. Muller : Fix ICS channel 0 Channel 0 messages were not displayed in the console, because the test for channel number considered every non-numeric or non-existent handle in a chatbox to be zero. So the messages were diverted to a non-exsting chatbox. Now it test first for the handle to start with a digit. 2011-02-15 19:13:33 +0100 H.G. Muller : Make language choice from menu persistent Set appData.language to the chosen language file, or empty if English is chosen, so that the choice is saved with the settings. Increase the number of possible language choices from 5 to 20. (After all, we already have 7 now!) 2011-02-14 11:09:24 +0100 H.G. Muller : Fix showing of user move after adjudication The correction of the fishy patch (removing ShowMove() from Adjudicate()) had broken the adjudication of user moves (that actually did work before the fishy patch, because there the gobal fromX/Y and toX/Y do contain the correct values for the move to be shown). An entered move that led to adjudication (like a checkmate) now was not displayed at all. Adding an extra ShowMove() after (successful) return of Adudicate() solves it. 2011-02-13 23:49:44 +0100 H.G. Muller : Fix Xiangqi King facing The Spartan patch had broken the CheckTest for Xiangqi, because cl.check was cleared after the King-facing test, rather than before it. 2011-02-13 22:30:59 +0100 H.G. Muller : Fix variant janus size prefix The default board size of Janus Chess was not consistently taken to be 10x8, which resulted the name to be sent as 10x8+0_janus to the engine. 2011-02-13 12:18:52 +0100 H.G. Muller : Fix Alfil bug The test for Alfil (suppressing single steps on the Elephant) contained a wrong logical operator, so that it could never be active. It also failed to include Xiangqi as variant with traditional Alfil. This led to one-step moves of the Elephant in these variants, and false check or unreliable mate detections. Fix move of Xiangqi Elephant 2011-02-09 23:19:09 -0800 Arun Persaud : fixed configure script to correctly detect Xaw3d library 2011-02-06 22:07:17 +0100 H.G. Muller : Fix unmarked translation The file-browser wndowtitle in WB was not marked for translation. 2011-02-04 10:27:49 +0100 H.G. Muller : Put warning in HTML help A warning is added that the help file is not yet updated for the new menu organzation. 2011-02-04 10:22:29 +0100 H.G. Muller : Fix 64-bit Windows compilability The API interface for Set/GetWindowLong has been changed for 64-bit Windows, both in the name of the call as in the arguments. 2011-02-04 10:21:06 +0100 H.G. Muller : Fix MSVC compilability Both the makefile and the project file had to be adapted for the new source file history.c, and the new location of parser.c. 2011-02-05 10:11:58 -0800 Arun Persaud : added missing #includes and missing prototypes to filebrowser thanks to Max Funk for reporting. Now using HAVE_DIRENT_H. Also cleaned up missing prototypes and some casts. 2011-02-05 09:21:48 -0800 Arun Persaud : added missing header file for sprintf 2011-02-03 08:50:50 -0800 Arun Persaud : added history.c to the tar-ball. Needed for Winboard 2011-01-31 23:03:05 +0100 H.G. Muller : Fix deselection of greyed-out variant button (WB) In Windows a disabled radiobutton refuses to deselect when you select another (enabled) button from the group. There are then 2 buttons checked, and the code to readout the buttons took the first one. Now it is changed to take the first enabled one. 2011-02-03 08:28:15 -0800 Arun Persaud : Revert "Implement -reset option feature in WinBoard" This reverts commit efecf86cd9b54072c6a2f38d62f1d775e69c545b. picked the wrong commit from HGM's git tree. 2011-02-01 22:01:12 -0800 Arun Persaud : add DIFFSTAT and SHORTLOG to tar-ball was only in the v4.4.x branch and not in master 2011-01-30 09:52:15 -0800 Arun Persaud : release of version 4.5.0 2011-02-01 07:41:04 -0800 Arun Persaud : changed size of borders around squares from 0 to 1 as a default this way highlights show up again. 2011-01-29 20:11:30 +0100 H.G. Muller : Implement -reset option feature in WinBoard 2011-01-30 10:12:08 -0800 Arun Persaud : updated Changelog, NEWS, etc. 2011-01-30 09:56:39 -0800 Arun Persaud : updated parser.c form parser.l 2011-01-29 19:59:11 +0100 H.G. Muller : Clean up fishy patch None of the ShowMove() calls in Adjudicate() was working, because when this code was taken out of HandleMachineMove() it was taken outside the scope of the local fromX, fromY etc. there, so that it started using the global variables from the mouse driver. As these usually contain -1, this suppressed move animation and highlighting. All these calls have now been removed, and ShowMove() is called after a positive return (from HandleMachineMove(), so within the correct scope). This improves the previous fix, which led to some flicker, because the erroneous ShowMove() calls did draw the new board (instantly), wich in the fishy patch was then immediately overwritten by the old position, to start animation. This drawing of the old position is now no longer needed either. 2011-01-29 13:36:30 +0100 H.G. Muller : Update RTF file The RTF file is adapted to the new menu organization. 2011-01-29 13:31:48 +0100 H.G. Muller : Update texi file The highlight-with-arrow and one-click-move menu items are described. The highlightMoveWithArrow and variations option are described. Load Next /Previous Position descriptions are moved to File menu. The description for entering variations is updated (using Shift key). The remark that editing holdings is impossible is removed. Spartan Chess is added to the list of supported variants. 2011-01-28 18:35:48 -0800 Arun Persaud : Updated copyright notice to 2011 2011-01-24 15:01:25 +0100 H.G. Muller : Greyout unavailable variants in New Variant dialog The WB radio-button code is refactored to be driven from a list (which must be kept in phase with the variant definitions in common.h!). It now also checks if the first engine supports the variant, and greys out the item if it isn't. XB now also makes this check. Slight re-ordering of 10x8 variants there, to have the more common on top. If no radio button is selected, keep old variant even on OK. 2011-01-19 11:10:59 +0100 H.G. Muller : Move clock-click code to back-end Some duplicated (or should-be-duplicated) code for handling clicks on the clocks from the XBoard and WinBoard front-ends was merged and relocated to the back-end, so it can be shared. Noticeable was that XBoard allowed turn change in ICS examine mode by clock clicking, while WinBoard did not. WB, on the other hand, allowed clock adjustment. 2011-01-16 23:15:17 +0100 H.G. Muller : Fix legality testing of drop moves Drops of noexistent pieces (i.e. with a piece indicator letter that is not corresponding to any defined piece) are now parsed as ImpossibleMove, rather than IllegalMove, so they are also rejected with legality testing off. 2011-01-17 00:28:32 +0100 H.G. Muller : Fix WB Sound Options greyout and remove some grossness The sound and ICS Options menu items in WB were accessed 'by position', with fixed defined positions (always messing up any reorganization of the menus when you forgot to redefine the position constants in winboard.h). And not only that, but for completely mysterious reasons, the greying of the sound item greyed out the game-list options (above it) in stead when it was defined as 9, and the ICS options (below it) when it was 10 !!!. Now they are addressed 'by command' (and the position definitions are removed), which fixes things. 2011-01-25 21:35:10 +0100 H.G. Muller : Re-instate load next/prev position menu items As positions do not use something similar to the game list, these are still useful. For some reason I could not get Alt+Shift+PgUp/Dn to work, so I settled for Shift+PgUp/Dn. 2011-01-16 21:56:14 +0100 H.G. Muller : Remove superfluous copying of machine move There was explicit code in HandleMachineMove() and FinishMove() to put the move in the moveList, while MakeMove() already does this later in a more reliable way by calling CoordsToComputerAlgebraic(). This superfluous code is removed now. 2011-01-16 21:44:26 +0100 H.G. Muller : Fix spurious mate test in Edit Game mode When entering a game, it was terminated by the mate test even when legality checking was switched off (so that mates might not be reliably recognized). The mate test is now made dependent on legality testing. 2011-01-16 21:37:16 +0100 H.G. Muller : Fix type-in of drop moves Drop moves entered through the move type-in already come in the (piece, DROP_RANK, x, y) format, rather than having a holdings from square. This caused UserMoveEvent to consider them illegal when testing if the piecewas of the side to move, and when this was fixed, to recognize Knight drops as coming from between board and holdings (and thus illegal). 2011-01-16 21:31:42 +0100 H.G. Muller : Fix move type-in truncating game Starting a new variation by keeping Shift pressed did not work when OK'ing the move type-in, because there was some code ther that truncated the game. While this could be safely left to UserMoveEvent, which it calls, as the situation is not different from entering moves through the mouse. 2011-01-11 16:12:02 +0100 H.G. Muller : Fix legality testing for promotions Turns out WB has never tested for the legality of the chosen promotion piece, and would allow promotion to King innorml chess even with legality testing on (when entered through the keyboard)! Now strict testing is done, outlawing Pawns and Kings (or Unicorns in Knightmate). Only in suicide / giveaway Kings are stillallowed, and in spartan a black King if you do not have two yet.(And promotion toLnce,representing Hoplite Pawn,is forbidden there.) 2011-01-11 11:34:07 +0100 H.G. Muller : Reset 50-move counter on all pawn-like Lance moves Now the Lance represents a Pawn-like piece not only in variant fairy, but anywhere outside Shogi / Superchess, its moves should also reset the 50-move counter in those cases. Especially important for Spartan Chess, where the Lance actually participates. 2011-01-11 11:18:15 +0100 H.G. Muller : Fix logo repainting The logos were not repainted when the main window was moved out of the display area, and then back into view. The reason for this is unknown, as the PaintProc calls HDCDrawPosition, which was calling DrawLogoOnDC. But the logos were not drawn, (or on an expose event sometimes half drawn!) despite the fact that the rest of the board was. The drawing of logos now has been decoupled from drawing the board, and has been moved to a separate routine DisplayLogos() (in analogy to DisplayBothClocks()). This is cleaner anyway, as the logos usually do not change when the board does. So apart from in PaintProc, it has only to be called when the mode changes (ModeHighlight()) or on swap clocks. This seems to fix the problem. 2011-01-10 20:36:48 +0100 H.G. Muller : Fix time in PGN info Saving of the thinking time in the PGN was broken by the patch that removed the race condition in the clock switching, because that moved the incrementing of forwardMostMove to behind the code that used fmm to index pvInfoList. As a result the time was stored in the slot for the opponent's previous move. The value is corrected now. 2011-01-09 00:24:17 +0100 H.G. Muller : Fishy fix The move that delivers checkmate in two-machines mode is not animated when adjudication is on. There then also is no highlighting of this move Redrawing the board and calling ShowMove fixes it. Which is rather strange, because ShowMove was already called in Adjudicate (when it adjudicates), before GameEnds. For reasons that are not understood this call to ShowMove() (which calls AnimateMove()) is not effective. 2011-01-09 00:21:41 +0100 H.G. Muller : Reset machine colors after match The colors each engine playse are set to the originals after the last match game, so that a new match or two-machines game will not have swapped colors. 2011-01-09 00:15:18 +0100 H.G. Muller : Reset win/loss counters before match The win/loss counters were not reset, because the code counted on them being initialized to zero. But with matches startable from the menu, this is no longer true after the first match. 2011-01-09 00:08:52 +0100 H.G. Muller : Show move that causes false illegal-move claim Without claim testing XBoard takes back moves that an engine objects to. But when the engine is forfeited for a false claim, the move should of course stay. So the claim test is moved to before the take-back. 2011-01-09 00:05:38 +0100 H.G. Muller : Fix Spartan promotion to King Promotions toKing were refused when in check, because XBoard thought they would not resolve the check. Now the promotion is actually performed before doing the check test. 2011-01-05 17:31:37 +0100 H.G. Muller : Fix WB font-based piece rendering on variant switch The piece bitmaps were only created from the font characters when the number of ranks or files changed, because it was done in InitDrawingSizes(). This caused missing pieces when changing to a variant on the same board that used other pieces. Now InitDrawingSizes() is called for any variant switch. 2011-01-05 17:25:11 +0100 H.G. Muller : Fix right-alignment pproblem in WB ICS window Use of Ctrl-R to summon the context menu still trickled through to the default text-edit window routine, and caused right-alignment. This was because the text-edit reacts on keyDown rather than the character event. KeyDown of R with Ctrl pressed is now also intercepted and ignored. 2011-01-03 13:04:56 +0100 H.G. Muller : Fix chat window title The title was using the engine name, rather than the ICS handle, which did not work outside zippy mode. Now it only uses the engine name when no ICS handle is known. The titleis now also subjected to translation. 2011-01-03 12:50:54 +0100 H.G. Muller : Fix spurious reading of old game title by JAWS Because focus was switched to the board window before loading the selected game from the game list, the titlebar still contained the name of the previously loaded game, which would spontaneously be read by JAWS. Now the focus switch is done after loading the new game (which updates the window title.) 2011-01-03 12:37:17 +0100 H.G. Muller : Add variant Spartan Chess In the WB menu it takes the place of the defunct Twilight Chess item. The setup routine needed patching for setting up Lances in stead of Pawns for black, the check test had to be adapted to handle duple check, Alfil and Dragon moves were fine tuned in this variant to make the exact moves, and the promotion popup was adapted to show King and interpret Rook and Bishop as Dragon and Alfil for black. The Alfil now always moves as Modern Elephant except in Shatranj and Courier. 2011-01-03 12:23:39 +0100 H.G. Muller : Fix mate test Due to a bug in logical operators drops were tried for mate evasions even in non-drop games, which broke it in Superchess and Great Shatranj, and wasted CPU time in other variants. 2011-01-05 17:19:35 +0100 H.G. Muller : Fix promotion suffixon disambiguated piece moves The promotion suffixon piecemoves that needed disambiguation was not passedon to the back-end in most variants. Now it is passed on in any variant. 2011-01-03 12:08:19 +0100 H.G. Muller : Fix promotion of Pawn-like Lance In variants where the Lance is used to represent an unorthodox Pawn, it must promote when it reaches last rank. With legality testing on, however, the promoChar was ignored in ApplyMove in this case. The promotion suffix also was not appended in SAN moves. 2011-01-03 11:57:23 +0100 H.G. Muller : Fix WB promotion popup The promotion popup did not work properly in variants where black did not use the pieces that white wanted to promote to. Now the character for the selected piece is taken from the piece encodings of the side to move. In addition, selection of undefined pieces is ignored. 2011-01-02 14:17:32 +0100 H.G. Muller : Fix bug in parsing variations The moves parsed from a variation were stored in the moveList without appended linefeed. This caused errors if the variation extended to beyond the end of the main line,into a hitherto unused part of the move list, as the linefeed was then not there from the overwritten move. As a result moves sent to the engine were concatenated, triggering illegal-move messages and bringing the engine out of phase. 2011-01-02 14:11:45 +0100 H.G. Muller : Define Ctrl-R as right-click in WB Comment dialog To allow JAWS users to load a variation through the keyboard, Ctrl-R is equated to a right click at the position of the caret or selection. 2011-01-02 14:10:02 +0100 H.G. Muller : Allow starting a variation from keyboard entry in WB-JAWS The status of the shift key is remembered when space is pressed to select a board square. 2011-01-02 14:06:14 +0100 H.G. Muller : Disable some accelerators in JAWS version Single-key accelerators that could result in irreversible data loss are undesirable, because the risk of accidentally pushing them is too large. So the non-Alt duplicates of next/previous game/position are disabled, as are Home and End for Revert and Truncate Game. JAWS users will have to rely on the menus for those functions. 2011-01-02 13:59:01 +0100 H.G. Muller : Group engine-output memos with engine names The engine names are now defined just before the text edits, so that JAWS 11 will read the engine name when the memo for the output of that engine is selected. (JAWS 10 will still read the NPS, as it reads in geometrical order.) 2011-01-02 13:55:19 +0100 H.G. Muller : Put nr CPU earlier in tab cycle of WB Common Engine dialog By defining the max CPU control after hash size, the tabbing steps through the controls in geometrical (and logical) order, rather than having the max CPU in between the book controls. 2010-12-29 23:47:14 +0100 H.G. Muller : Update WB language template file 2010-12-29 23:41:27 +0100 H.G. Muller : Subject JAWS menu and spoken strings to translation 2010-12-29 23:37:39 +0100 H.G. Muller : Let JAWS SayString buffer full sentence The meaning of the flag parameter of SayString was changed to indicate buffering of flushing. On flushing a message of a single space is used as a kludge to indicate interruptability. Calls to force flushing where added everywhere. 2010-12-29 23:32:54 +0100 H.G. Muller : Adapt JAWS menu to new menu organization The menus did not correspondto the texts after translation of the main menu bar. 2010-12-29 23:18:30 +0100 H.G. Muller : Translate menus after creation of JAWS menu 2010-12-29 23:07:05 +0100 H.G. Muller : Fix ICS context menu for JAWS The Ctrl+R key did select text at the mouse pointer in stead of at the curser, now that up and down-click were combined. 2010-12-29 23:04:08 +0100 H.G. Muller : Reorganize order of WB New Variant dialog controls The definitions are re-ordered so that at least JAWS 11 will speak the board-size elements properly. 2010-12-29 22:57:55 +0100 H.G. Muller : Fix order of elements in WB time-control dialog Someleading texts were defined after the text edit they referred to,so that JAWS 11 associated them to the wrong one. A tab stop was added to the time-odds label, to make JAWS speak it. 2010-12-29 22:51:17 +0100 H.G. Muller : Change tabbing order in WB sounds dialog The 'Play' button now gets focus immediately after the controls for selecting the sound, rather than at the end of the dialog (after OK). 2010-12-29 22:47:26 +0100 H.G. Muller : Remove tab stops on first radio button of WB dialogs The New Variant and Board dialogs had a tab stop on the first radio button,so that tabbing toit would automatically select variant normal or size tiny. Now it tabs straight to the current size, without changing anything. (Important for JAWS users.) 2010-12-29 22:45:23 +0100 H.G. Muller : Put OK/Cancel last in tab cycle of some WB dialogs 2010-12-29 22:29:37 +0100 H.G. Muller : Fix duplicate menu character for Edit Comment Edit Comment did have the same shortcut character as Copy Game. Changed to m now. 2010-12-11 11:18:56 -0800 Arun Persaud : fixed automake process: xboard.conf couldn't be generated if $srcdir was not the current directory 2010-12-11 09:50:48 -0800 Arun Persaud : new developer release 2010-12-05 18:01:21 +0100 H.G. Muller : Subject WB context menus to translation The innerloopof the menu translation has been made into a separate routine. This now uses GetMenuItemInfo() in stead of ModifyMenu() to better preserve menu breaks. Menu #10 is used for context menus (from the routine that pops them up), and for this number the orignal texts are not saved in menuText. (This is not needed, because the menu is created everytime anew from the resource data.) 2010-12-05 15:00:28 +0100 H.G. Muller : Update translation template Add the new menu items; add some notes. 2010-12-05 14:04:46 +0100 H.G. Muller : Resize buttons in WB engine-settings dialog The OK and cancel buttons were to narrow for most translations, and were a non-standard order as well. 2010-12-05 13:56:52 +0100 H.G. Muller : Add one-click move control to WB general-options dialog This is a duplicate of the one in the ICS options dialog, but the latter is inaccessible in non-ICS modes, and one-click move is now alsoavailable in engine mode. 2010-12-05 13:51:20 +0100 H.G. Muller : Create space in dialogs for translation The translated texts often did not fit, because controls were defined needlessly small (when there was empty space between them). In these cases they have been enlarged to consume all available space. Some dialogs are made wider. 2010-12-05 13:47:26 +0100 H.G. Muller : Add handle for translator acknowledgement An empty string is printed in the about box, which can be 'translated' to a message acknowledging the translator. 2010-12-05 13:43:26 +0100 H.G. Muller : Use default logo for user When no logo with the name of the current user is found, use dummy.bmp. 2010-12-05 15:46:34 -0800 Arun Persaud : added rlwrap tip to FAQ 2010-12-03 23:24:06 -0800 Arun Persaud : replace hard coded paths with path from configure script use $datadir and subdirectories to store some data files. Also make files in xboard.conf use correct path. 2010-12-03 23:02:09 -0800 Arun Persaud : fixed a typo in the configure script output 2010-12-03 21:46:00 -0800 Arun Persaud : added a desktop file taken from the openSUSE project 2010-12-03 22:44:02 +0100 H.G. Muller : Fix Edit Game/Position checkmarking in WinBoard Because the entries in Edit and Mode menu were pure duplicats, the entries in the wrong menu (Edit) were checkmarked while active. By defining different IDs for those in the Edit menu, those in the Mode menu are checkmarked again. 2010-12-03 10:07:34 +0100 H.G. Muller : Add XBoard menu items for arrow highlight and one-click move These items are put in the options menu; the 'Old Save Style' item is removed. 2010-12-03 09:27:58 +0100 H.G. Muller : Provide menus for editing WinBoard engine and server lists The Edit Tags dialog in the WB front-end is adapted to act as a general edit for string variables, by giving it an extra parameter to indicate where to store the edited result. Menu items are added to invoke this dialog for editing the /first, /secondChessProgramNames and /icsNames options. This solves the problem that people would have to edit an ini file that they can no longer locate (because the %APPDATA% folder has different names and locations in the various Windows versions, and is often a hidden folder on top of that). There is a slight memory leak here, as the memory for the previous value of the altered string option is not freed. 2010-12-02 16:18:53 +0100 H.G. Muller : Configure arrow highlighting as default in XBoard Set -highlightMoveWithArrow true in the xboard.conf file, and specify a lineGap of 0 to make that efficient (and the wood theme even nicer). 2010-12-02 15:56:46 +0100 H.G. Muller : Port highlighting with arrow to XBoard Unfortuntely this duplicates a fair amount of code in the front end. Removing the arrow is done by a total repaint if there is a non-zero lineGap, because the clever algorithm for selective redrawing (based on damage) that XBoard uses does not repair damage to the grid lines. For lineGap=0, however, (for which the arrow is mainly intended) the damage mechanism is used, and the damaged squares are determined by tracing out the arrow in 64 steps, and marking all squares in the neighborhood as damaged. 2010-12-02 15:55:25 +0100 H.G. Muller : Strip CR from xboard.c 2010-12-02 14:21:24 +0100 H.G. Muller : Let user decide if he wants highlights in blindfold mode Remove the automaticsuppression ofhighlighting. 2010-12-02 00:24:43 +0100 H.G. Muller : Fix fag-fell marker with logos on The flag-fell marker "(!)" that is displayed in the clock in WinBoard in two-machines mode was printed twice when the clock was split over two lines (as with logos on). 2010-12-01 18:57:57 +0100 H.G. Muller : Also exempt variant seirawan from eval-scale doubling It is not really a drop game, so a scale from -7 to 7 in the eval graph is good enough (like variants great and super). 2010-12-01 10:33:13 +0100 H.G. Muller : Configure EGTB cache size in adapterCommand The hash size, nr of CPUs and EGTB path are transferred through the WB protocol interface commands memory, cores and egtpath. But there is no WB command for detailing the EGTB cache size. So the value of the command-line option -defaultCacheSizeEGTB has to be sent to Polyglot through its startup command to make it known to UCI engines. 2010-11-30 22:46:16 +0100 H.G. Muller : Move Hint and Book items to Engine menu in XBoard 2010-11-30 22:17:24 +0100 H.G. Muller : Correct the key bindings fo view menu in texi file The mentioned bindings for Game List and Eval Graph were wrong. 2010-11-30 21:25:07 +0100 H.G. Muller : Fix sub-variation display with negative score The test if the displayed score was the pvInfo score failed for negative scores, because floats are truncated towards zero. So the previous fix of spurious score/depth info was not working when the score was negative. 2010-11-30 18:27:52 +0100 H.G. Muller : Peel PV out of comment Arena stores engine PVs not in variation format, but within both braces and parentheses, before the score/depth info. This caused XBoard to overlook the score/depth info, (frustrating, e.g., the eval graph), while the PV would not be accessible for walking it as a variation. The routine that extracts the score/depth from a comment now has been made more clever, to recognize a leadin PV in the comment, and then place it in front of the comment as variation (by moving the opening brace to behind it). For some reason it does not work if the PV and score/depth were separated by a newline, but this happens quite rarely. 2010-11-30 18:23:12 +0100 H.G. Muller : Allow line-straddling result comments Some GUIs (in particular Arena) do not have the decency to keep the result comment on a single line. In this case the parser rules would not recognize it, and treat it as a normal comment, plus an undetailed PGN result. The rules are now fixed to allow linefeeds in the comment, and between comment and PGN result. To correctly process the comment further (e.g. in game-list lines) the linefeeds are replaced by spaces in the back-end routines that do use the result comment. 2010-11-30 12:22:32 +0100 H.G. Muller : Write key bindings in XBoard menus Unfortunately tabs are not understood in menu texts, so fine-tuning through spaces is necessary to get some sort of ragged alignment. 2010-11-29 18:01:38 +0100 H.G. Muller : Configure XBoard to use wood board texture by default The texture pixmaps are sought in /usr/share/games/xboard, with names wood_l.pm and wood_d.xpm. I guess the " make install" should be adapted to put them there. XBoard is resitent to non-existence of the files, btw. It simply ignores the arguments in that case. 2010-11-29 17:48:48 +0100 H.G. Muller : Configure -inc as volatile option in XBoard XBoard users are not used to options being persistent, and thus have many scripts assuming the timeIncrement is -1 when they don't specify it on the command line, and want to specify -mps. But a persistent -inc of 0 fom a preious session would then force their -mps to zero, causing big-time confusion. 2010-11-29 17:36:33 +0100 H.G. Muller : Make WinBoard clocks translation-proof With logos on, the splitting of the clock over two lines assumed the lengths of the words "white" and "black" would always be 5. Used strlen. 2010-11-29 14:57:00 +0100 H.G. Muller : Improve drawing of highlight arrow A diagonal arrow sometimes had a notch in the shaft because of independent rounding of the starting and ending point coordinates. Furthermore the width of the shaft was unnecessary variable(as a function of direction) because half the width was rounded and then used twice. Now rounding of end-points is always done towards a fixed grid of square centers, which keeps diagonals purely diagonal, and one side of the shaft is drawn relative to the other side, after the position of the latter has been rounded, so any rounding error affects the shaft width only once. 2010-11-29 10:25:50 +0100 H.G. Muller : Alter descriptionof Analyze File menu item This menu item has been given a new function, so a new description was needed. 2010-11-29 10:15:39 +0100 H.G. Muller : Add description of Game List Options in texi file 2010-11-29 09:58:00 +0100 H.G. Muller : Update texi file for new menu organization The descriptions are shuffled around and organized into sections corresponding to the new main menus. Where necessary the name of the items was changed to their new names. The items removed from the File menu (the next/previous/same stuff) are nowmoved to the section "other shortcut keys", as the key bindings for some of them are still active. 2010-11-29 09:06:14 +0100 H.G. Muller : Update info on key bindings in texi file The texi file was still listing the old XBoard key bindings. Where necessary this is now changed to the new (WinBoard) bindings, and all the new bindings were added. 2010-11-29 09:04:53 +0100 H.G. Muller : Add XBoard key bindings for Revert and Truncate Use Home key as accelerator for Revert, End for Truncate, as in WinBoard. 2010-11-28 23:12:14 +0100 H.G. Muller : Divorce the Edit and Show Tags/Comment menu items In WinBoard the items in the Edit and View menu for Tags and Comment now have different IDs, so they can be independently controlled. Only the items in the View menu are check-marked. The items still do the same. 2010-11-28 23:08:26 +0100 H.G. Muller : Alter WinBoard menu text The texts are slightly adapted, mostly by choosing more convenient tabbing characters for the new menu organization. The translation template is updated accordingly. 2010-11-28 20:24:46 +0100 H.G. Muller : Let move-history window scroll to bottom after adding move By activating the scrollbar of the viewport through XtCallActionProc the move-history window is scrolled to the bottom. 2010-11-27 14:38:14 +0100 H.G. Muller : Fix Shogi promotion popup The texts were adapted to shogi by printing new text items over the Queen and Knight buttons, but these did not alwys cover it. Now the text on the buttons is changed as it should be. Also the window title is adapted. 2010-11-26 11:22:06 +0100 H.G. Muller : Apply gettext macros to menu texts Now texts and references are separated, the texts in the tables can be decorated with the N_() macro, so that the _() macro no longer has to be applied when they are used. (This makes the texts appear in the .po files.) 2010-11-26 11:12:58 +0100 H.G. Muller : Adapt some XBoard menu texts The "Show" prefix is removed from the "View" menu items, as this seems implied. An ellipsis is added to the Engine #N Settings items, which could not be there before, because periods in a menu name would break any reference to it. For some other names the ellipsis was deleted. (These were not refered to, but who knows what we will do in the future.) 2010-11-26 11:03:35 +0100 H.G. Muller : Separate menu text from menu name in XBoard The text string in the menu-definition tables was used both for the menu text, as well as for referencing the items from the code (for enabing or checkmarking). Now these can be defined separately, so that altering the menu texts is possible without breaing any references to the item. (Moving them to another menu would still break XBoard, though!) Currently the texts and names are still the same. 2010-11-26 10:48:54 +0100 H.G. Muller : Bugfix XBoard menu translation The gettext macro N_() was applied to the menu definition tables, but this would break any translation, as these items are both used as menu texts as well as reference for enabling and checkmarking. The routines that create the menus already apply _() dynamically to these items when they are used as menu texts. 2010-11-26 10:10:55 +0100 H.G. Muller : Restrict drops in variant seirawan to back rank Drops aren't really llowed at all in Seirawan Ches, but there exists an engine that supports a variant where drops on the back-rank are allowed. 2010-11-25 19:44:37 +0100 H.G. Muller : Let Analyze File annotate the loaded game By not suppressing the auto-play loop in AnalyzeFle mode, we step through the game while the engine is analyzing, and store the PV info that the engine produces, as well as the full PV (as variation comment) with each move. 2010-11-25 19:41:05 +0100 H.G. Muller : Revive Analyze File menu item in WB We will keep this menu after all, becase it can be given a new meaning. 2010-11-25 19:31:52 +0100 H.G. Muller : Fix spurious scores in comments The comment popup is also used to display engine PV info, but when the contents of the window is written back when we select a variation, it was treated as a real comment. This is fixed now by checing in ReplaceComment() if the comment starts with the PV info, and if so, ignore the latter. This solves the problem, but I guess the real bug is that selecting a variation tries to write the comment even if it did not change. 2010-11-25 19:26:34 +0100 H.G. Muller : Display error for wrong use of Machine Match 2010-11-24 13:30:08 +0100 H.G. Muller : Reorganize XBoard menus 2010-11-24 11:02:19 +0100 H.G. Muller : Reorganize WinBoard menus New main menus Edit, View and Engine are added; the step menu disappears. The menu items are redistributed over the new menus. Sometimes duplicates are created. No adaptation of short-cut characters as made yet (as this affects translation). 2010-11-20 20:20:27 -0800 Arun Persaud : removed trailing whitespaces from NEWS 2010-11-20 20:19:30 -0800 Arun Persaud : merged readme_HGM.txt into the NEWS file seems like a better place for the release notes, although those releases where not officially part of GNU, but the NEWS file already covers similar releases, so it might as well cover all of them. 2010-11-20 18:24:19 -0800 Arun Persaud : typo in date of developer release but will leave the tagged version as it is, since it's still a unique version number 2010-11-20 18:11:01 -0800 Arun Persaud : new developer release 2010-11-20 18:12:41 -0800 Arun Persaud : added latest version of parser.c 2010-11-20 18:05:56 -0800 Arun Persaud : updated Changelog, etc for developer release 2010-11-20 16:22:00 -0800 Arun Persaud : Revert "adding gnu-readline support" This reverts commit c95ef32a700132a134f335f857ca6f1b6f3c169f. Conflicts: backend.c better to use the (relatively) new ICS input box then add readline support. 2010-11-20 16:19:32 -0800 Arun Persaud : Revert "bugfix: fixed readline support with icslogon option" This reverts commit b9cdd7422ad1037d7376bce4f8f2db2669396e83. Conflicts: backend.c better to use the (relatively) new ICS input box then add readline support. 2010-11-19 23:10:35 +0100 H.G. Muller : Make Hoplite moves irreversible in Spartan Chess Consider Lance moves in variant Fairy (where the Lance represents the Spartan Hoplite Pawn) as Pawn moves, so they reset the 50-move counter. 2010-11-19 21:09:24 +0100 H.G. Muller : Give Lance moves of Amazon in variant super Now that Lance is no longer a wild-card piece the moves of Amazon must be programmed explicitly, to keep the possibbilty to play Superchess with legality testing on. 2010-11-19 18:32:16 +0100 H.G. Muller : Change representation of Bede in variant fairy initial position This used to be Lance, but the promoted Bishop (Dragon Horse) is more applicable. Especially now that Lance is supposed to move like a Berolina Pawn. 2010-11-19 18:28:19 +0100 H.G. Muller : Make yyskipmoves also suppress examining of drop moves Not sure if this does any good, but it seemed illogical that this would happen in all other moves, but not drops. 2010-11-19 18:23:05 +0100 H.G. Muller : Define moves for Dragon Horse outside Shogi Let it move like Bishop + Wazir + Dababba. 2010-11-17 13:40:20 +0100 H.G. Muller : Fix safety crash when appending comments The length limit imposed on safeStrCpy was one too short when copying an existing comment to the space allocated for the longer (concatenated) one. It allowed no space for the terminating '\0'. 2010-11-17 13:38:00 +0100 H.G. Muller : Fix safeStrCpy The test for when to terminate a non-fiting string was one off, and the debug message was written stdoutin stead of debugFP. 2010-11-16 12:40:31 +0100 H.G. Muller : Fix default holdings size for variant seirawan The holdings for 7 pieces werealways considered an overrule, so that the variant name was prefixed with "8x8+7_". 2010-11-15 11:36:21 +0100 H.G. Muller : Fix home-dir crash When confronted with a path name starting with ~ and not containing a / XBoard would segfault. 2010-11-14 21:45:55 +0100 H.G. Muller : Fix one-click moving on up-click (First) up-clicks were not always ignored: in Edit-Game mode with one-click moving enabled this could lead to a capture being made on the down-click, and the recapture on the correspoding up-click. This has now been corrected, and only the down-click of a first click can lead to selecting a piece or a one-click move. 2010-11-15 18:15:40 -0800 Arun Persaud : fixed buffer size for snprintf 2010-11-13 23:04:14 +0100 H.G. Muller : Accept Seirawan-style gating suffixes The parser rules were extended to accept / as an equivalent of = in promotion-suffix notation (e.g. Nf3/H in stead of Nf3=H). 2010-11-13 22:55:32 +0100 H.G. Muller : Use Falcon and Alfil as built-ins for Seirawan chess Where available (size 49 and 72) we use Falcon for Archbishop and Alfil for Chancelor, to better conform to the Seirawan names Hawk and Elephant. 2010-11-13 20:02:31 +0100 H.G. Muller : Implement entering gating moves with mouse A move with a back-rank piece that starts when a piece in the holdings is selected will be interpreted as a gating move in variant seirawan. The front-end uses a 'gatingPiece' selected this way todisplay it on the from square during animate dragging. 2010-11-13 18:56:15 +0100 H.G. Muller : Implement variant seirawan Set upthe position, including Hawk and Elephant in holdings, in InitPostion(). Suppress putting captured pieces in holding. Let promoChar indicate gating in ApplyMove(). Remove gated pieces from the holdings there. Let GenLegal() generate RxK-type castlings to act as base for gating on Rook square. Gatings are tested for legality based on the holdings content and whether they occur on the back rank. Disambiguate() also tests this. Make sure the gated pieces are printed as move suffixes in CoordsToAlgebraic(). 2010-11-13 18:42:27 +0100 H.G. Muller : Add -variant seirawan to menu 2010-11-13 22:52:09 +0100 H.G. Muller : Fix acceptance of null-move with legality testing off A second click on the same piece was interpreted as a to-square rather than deselection of the piece. 2010-11-13 22:49:43 +0100 H.G. Muller : Fix one-click bug Disambiguate was imagining captures, so an only capture by double clicking your own piece did not always work. 2010-11-13 20:08:32 +0100 H.G. Muller : Fix mouse-driver buglet The highlights were not cleared on moves that went vertically off board. 2010-11-12 17:17:41 +0100 H.G. Muller : List some undocumented commands as compliant The engine->GUI commands setboard and setup are now always printed in the debug file as well. 2010-11-12 17:05:22 +0100 H.G. Muller : List Hint with compliant commands This command was omitted, so that in some -engineDebugOutput modes it would not appear in the debug file. 2010-11-12 17:02:53 +0100 H.G. Muller : Restrict use of escape expansion Only expand escape sequences like \n and \t in telluser(error) comamnds that ask for it by preficing the messages by double backslash. Otherwise backward copatiblity is too severely broken for messages that display DOS-style filenames. 2010-11-12 13:56:33 +0100 H.G. Muller : Make safeStrCpy safe SafeStrCpy was causing a lot of out-of-bound write accesses, as it was always writing the character at the length limit of the destination. Now no memory is accessed that is is not needed to hold the copy. 2010-11-07 21:37:10 +0100 H.G. Muller : Allow clicked name internal to the icsMenu command string A command in the /icsMenu that was specified to contain the selected text or clicked word always appended this word at the end. Now the user can also configure it to appear in the middle, by putting a %s in the command string where he wants it to appear. 2010-11-07 21:33:19 +0100 H.G. Muller : Let Engine #2 Settings start second engine If the second engine is not yet running, it would be impossible to use the settings dialog for it, as the features have not been received and the dialog will be empty. So the user could not adjust the engine parameters before starting a match. Using this menu now automatically starts the engine, and delays the appearence of the popup untill the features are received, using a similar mechanism as in TwoMachinesEventIfReady(). 2010-11-01 19:40:26 +0100 H.G. Muller : Newly lexed parser.c 2010-11-06 19:55:31 +0100 H.G. Muller : Fix bug in parsing illegal Pawn captures When a pawn move of type exf5 was illegal, the parser made an attempt to interpret it as e.p. capture of f5. This, however, messed up the move, so that it was now permanently mistaken for e5xf6. Even in cases with legality testing off, where you would want the original move to be accepted despite the fact that it was illegal. 2010-11-06 19:49:45 +0100 H.G. Muller : Keep last PV while clearing engine-output display When ponder is on, the display is cleared immediately when the last line of thinking output appears by the appearing ponder output. So you would never get the chance to see it. This line is now re-written after clearing, so it appears at the bottom of the output for the next search. 2010-11-06 19:45:18 +0100 H.G. Muller : Give Lance moves of Berolina Pawn In stead of using it as a wildcard piece, the Lance gets the moves of the Berolina Pawn (straight capture, diagonal move). The initial double osh can be a ump, though. (So it is really a Hoplite Pawn from Spartan Chess.) 2010-11-06 19:42:16 +0100 H.G. Muller : Use SAN even on illegal moves If there is only one piece of type T, moves like Ta1 or Txa1 are never ambiguous, so adding the from square is just cumbersome. 2010-11-06 19:34:53 +0100 H.G. Muller : Use normal SAN for wildcard pieces SAN often can also be used with pieces we don't know the moves of, e.g. if there is only one of that type. We just always get rank or file disambiguators if there are more (even when they might be unnecessary). 2010-11-06 14:52:12 +0100 H.G. Muller : Fix some warnings Unused variables were removed from parser.l 2010-11-06 14:43:54 +0100 H.G. Muller : Allow arbitrary nesting of sub-variations in PGN input The parsing of subvariations is moved out of the state-machine parsing, to allow arbitrary nesting. In stead of the entire sub-variation being parsed by lex as Comment, it now returns Open and Close for the corresponding parentheses, which are then handled in a wrapper routine for yylex(): Myylex(). Problem was that yy_text is supposed to return the entire parsed text of the returned symbol, which thus has to be collected. To make this possible, yylex has to return everything that it parses, (even white space!), and a symbol "Nothing" was added to return in parsing rules that before just ate away irrelevant text without returning anything. 2010-11-06 21:48:47 +0100 H.G. Muller : Implement setup (engine-GUI) command This allows the frst engine (when legality testing is off) to overrule the default opening position, in reply to the variant command. Syntax is "setup (PIECE_TO_CHAR_TABLE) FEN_STRING" where the FEN string is interpreted in the context of the given pieceToCharTable (which is optional, and only delimeted by parethesis if it is present). Sendng the position to the second engine is delayed until the first engine has responded to the ping after the new-game sequence, to make sure it gets the chance to alter the position before it is sent to the second engine. This feature is useful for playing variants that WinBoard does not even know the opening positon for, and can be used even if they are shuffle variants. 2010-11-06 14:19:56 +0100 H.G. Muller : Restrict use of a2a3 kludge The kudge to send "a2a3" in stead of "black" to get black to move is fatally flawed in varants that have no Pawn on a2. So in that case we revert to use of the deprecated "black" command. 2010-11-02 13:06:58 +0100 H.G. Muller : Remember values set by -firstOptions, -secondOptions When an engine announces its option features, and the option name matches that of a setting given in -first/secondOptions, the engine is sent hte specified value, but this value was not remembered as current value (but the latter was left at the engine-announced default), leading to inconsistent behavior in the Engine #N Settings dialog. 2010-11-01 19:26:19 +0100 H.G. Muller : Make test for valid promotion piece color-dependent This is needed to make it work in variants where white and black have different armies; quite likely white will promote to pieces that do not exist in the black army, so we really have to make sure we test if the white (upper-case) piece exists in this case. 2010-11-01 19:23:43 +0100 H.G. Muller : Remove validity test on promochar from parser The backend routines Disambiguate() and LegalityTest() will catch invalid promotions, so no need to do it here. 2010-10-31 23:37:06 +0100 H.G. Muller : Add the actual size-33 Shogi bitmaps These were forgotten in the original commit that fixed the .rc file. 2010-10-31 13:20:08 +0100 H.G. Muller : Delete some stale promotion code The correction of the promotion piece to Ferz in Shatran-like variants in ApplyMove() was no longer needed, as the new promotion code already does this in the move parser. 2010-10-31 13:08:52 +0100 H.G. Muller : Augment moves of some fairy pieces To get better disambiguation in variants that have to be played with legality testing off, the Elephant is given also one-step moves (making it a so-called Modern Elephant) in -variant fairy and great. The Dragon King (Crowned Rook), which had no moves defined for it outside Shogi at all, has been given Rook moves plus an orthogonal 2-jump, so that it can get SAN moves when used as Dababba or Short Rook. (Illegal moves currently aways force long algebraic notation...) 2010-11-08 22:57:56 +0100 H.G. Muller : Bugfix safeStrCpy patch, WinBoard The use of sizeof on pointers was detected through the same method as the previous patches, this time while compiling WinBoard. A typo in jaws.c was fixed as well. 2010-11-08 23:03:13 +0100 H.G. Muller : Bugfix for safeStrCpy patch for XBoard By a trick (temporarily redefining safeStrCpy in common.h as ((char*) (a=1/(4-3rdArgument))) ) a compile-time warning (division by 0) could be generated for every occurrence where the size argument was equal to 4, i.e. where the 1st argument was likely a pointer rather than an array. These cases are now fixed. The file xoptions.c, which is the only ne that does not #include common.h had to be fixed by making the #define in the file itself. 2010-10-31 13:16:01 +0100 H.G. Muller : Fix spurious promotions with legality testing off The recent promotion patch had broken playing without legality testing completely: without legality testing one always gets the piece that was asked for, but a NULLCHAR should not be taken as a request for a piece! But it was, and this resulted in any moved piece turning into a white Pawn! For true promotions the piece was always black, which was also not very useful. Also revert to the use of '+' as internal Shogi promoChar, because pre-processing turns out not to be possible when reading a game file. In stead parse any trailing '+' on moves as promoChar. Downside: '++' can no longer be recognized as checkmate symbol. 2010-10-29 22:54:18 +0200 H.G. Muller : Make deferral default in Shogi promotions Because '+' is intercepted by the parser as check indicator, Shogi moves are pre-processed to change a trailing '+' into an internally used alternative '^'. The testing if a promotion character is OK is now done in LegalityTest() and Disambiguate(), which return ImpossibleMove when the character does not correspond to any piece, and IllegalMove when in Shogi anything other than '^' or '=' is used. (Except for the ICS notations.) On output, in CoordsToComputerAlgebraic() and CoordsToAlgebraic(), the '^' is translated back to '+'. 2010-10-28 17:51:34 +0200 H.G. Muller : Animate piece explosions in drag-drop moves and in XB This required some code restructuring: the decision if an explosion is needed is now taken in a new routine Explode() in the backend. This then calls the front-end driver, and it returns the info if there was an explosion or not, so the caller (AnimateMove() or the mouse driver) can take action to repair the damage to the board caused by the blast wave. A front-end driver for XBoard is provided as well, so that both click-click (and replay, which is the same) and drag-drop atomic captures are animated in XB as well as WB. Explosions on rejected moves are suppressed. 2010-10-28 13:53:51 +0200 H.G. Muller : Suppress promotion popup if piece will explode In atomic, a Pawn capture to last rank is not really a promotion. Fix choice to Queen. 2010-10-28 18:42:25 +0200 H.G. Muller : Make Knight hop first straight, then diagonal It used to be the other way around, which looked pretty illogical in Xiangqi: to see Horses, which are blockable pieces there, move over an occupied square. 2010-10-27 20:04:01 +0200 H.G. Muller : Let -oneClickMove also work in EditGame mode There is really no reason why people that lke one-clcik moves enough to switch them on would not want to use them too when editing a game. This solves a nast inconsistency, as before it used to work in -ncp mode on the _first_ move, as the mode is then BeginningOfGame, and not yet EditGame, and we do want it to work for BeginningOfGame, as this is also the game mode when you start playing as white. 2010-10-27 19:40:22 +0200 H.G. Muller : Make -flipBlack and -allWhite option volatile As these options are very Shogi specific, and the variant is volatile, it seems logical to make them also volatile. Not completely sure about -allWhite, though. It cold be useful if you want, for example, to play wth dark-brown pieces for black, as any color but black looks much better with outline pieces than with solid pieces. 2010-10-27 19:33:44 +0200 H.G. Muller : Provide some sample board-texture pixmaps Wood and marble themes are provided as textures for light and dark squares, plus two complete Xiangqi boards (wood and evenly colored). These should probably not goint the distro tar ball. 2010-10-27 19:25:56 +0200 H.G. Muller : The -overrideLineGap option is made to work in XBoard Although XBoard already allowed this in the -boardSize specification, it is still seful to globally disable grid lines, e.g. for an oriental Xiangqi board. And it converges XB and WB. 2010-10-27 19:18:41 +0200 H.G. Muller : Implement board textures in XBoard The -darkBackTextureFile and -liteBackTextureFile options now wrk in XBoard too, for loading a pixmap that will be used to cut out the dark and light square backgrounds. The cutting algorithm is such that the pixmap image is completely restored if the size was that of the total board (e.g. a drawing of a Xiangqi board). 2010-10-27 12:11:02 +0200 H.G. Muller : Complete WB (western) bitmaps for Shogi at size 33 The Lance was not replacing Queen in some sizes where the bitmaps were already available, and new bitmaps for the promotion Golds were added. 2010-10-22 20:30:06 +0200 H.G. Muller : Make starting new variation dependent on shift key The shift key is read during mouse events, and posted in a global variable, which can then be used by the back-end. The decision to start a new variation (pushing the game tail rather than clipping it off) when entring a move in Edit Game or Analyze mode is made dependent on this. The move-typein also records the shift-key state. 2010-10-22 20:25:06 +0200 H.G. Muller : Fix merging bug A %g format was used to print an int in sending the level command, because decimal points were dropped when merging patches. Also an unused variable was removed to suppress a warning. 2010-10-18 19:50:09 +0200 H.G. Muller : Add set of shogi pixmaps for XBoard The -size 64 pieces from gShogi (and originally XShogi) are made suitable for loading by XBoard, through redefining the transparent background color as either light or dark square color. These bitmaps are not included in the XBoard build, and perhaps should not even be included in the source distribution, but made available in a separate distribution? 2010-10-18 19:46:33 +0200 H.G. Muller : Implement -flipBlack in XBoard When -flipBlack is true, the white and back piece pixmaps are swapped in flipView. The idea is that the black pieces are upside-down versions of the white (Shogi) pieces, so that swapping white and black in effect turns all pieces upside down, which is what should happen in flipView. 2010-10-11 21:06:41 +0200 H.G. Muller : Disable some very verbose debug printing The internationalization seems debugged enough to do without them. 2010-10-11 20:52:10 +0200 H.G. Muller : Add option -variations to control variation-tree walking Just so that users can switch it off if the find it annoying. 2010-10-11 21:01:00 +0200 H.G. Muller : Allow full promotion suffixes on SAN piece moves This facilitates the parsing of (non-standard) Shogi moves in ICS protocol. It can also be useful for Seirawan Chess, where a future implementation of it can use promotion suffixes to indicate gating. 2010-10-11 14:07:02 +0200 H.G. Muller : Allow lower-case piece indicator in drop-move notation As it seems that XBoard also sends such moves in zippy play, it seems more fair to recognize them from the engine as well. 2010-10-10 21:26:11 +0200 H.G. Muller : Fix bug in ICS variant switch for Shogi Because a test for 8x8 variants was done by <= VariantShogi, rather than <, spurious move-list fetching occurred in Shogi. 2010-10-10 21:23:09 +0200 H.G. Muller : Fix WinBoard Lance bug The choice between Lance and Queen was made on appData.variant, in stead of gameInfo.variant. Because of this it was not always up-to-date in ICS games. 2010-10-10 21:15:06 +0200 H.G. Muller : Adapt WinBoard to Shogi implementation on Variant ICS The Variant ICS does not use the '+P' notation for promoted pieces, neither in the board, nor in SAN, but simply indicates any Gold by 'G', and uses 'H' and 'D' for +B and +R. The Shogi promotion code in LegalityTest() and Disambiguate(), which are used in move Parsing, are adapted to handle this. Deferred promotions sent to the ICS now use an == suffix. 2010-10-10 21:07:18 +0200 H.G. Muller : Inherit promoted-info that ICS does not give from previous board The ICS does not tell us in Crazyhouse (or Shogi) if a piece is primordial or a promoted pawn (or a promoted other piece). We now derive this info from the previous board. The option -disguisePromotedPieces controls this feature. 2010-10-10 21:03:29 +0200 H.G. Muller : Limit multi-session clock handling to non-ICS games In ICS games a time forfeit crashed XBoard, apparently because the fullTimeControl string is not properly set when we try to use it to see if a sudden-death session is indeed the last session. 2010-10-08 11:47:34 +0200 H.G. Muller : Change evalgraph scale in drop games Score swings tend to be much larger in Crazyhouse and Shogi, so the vertical rangee in those games is doubled to (-14, 14). 2010-10-13 23:05:05 -0700 Arun Persaud : bugfix: fixed readline support with icslogon option The icslogon option sends the login and password, so we don't need to handle special cases for the readline buffer. 2010-10-07 20:35:26 -0700 Arun Persaud : fixed some typos that were introduced during the sprintf->snprintf changes 2010-10-07 11:59:33 +0200 H.G. Muller : Fix uninitialized variable in book code The variable ' power' was used uninitialized in case -bookVariation was set to 0, which can be an error even if it was only multiplied by zero. 2010-10-06 14:20:03 +0200 H.G. Muller : Fix menu translation bug The menuText array was declared too small, so that the last entry of the File menu got out of bounds and was overwritten by the first of the Mode menu. 2010-10-05 21:14:08 +0200 H.G. Muller : Allow -timeIncrement to be a float The increment can now be fractional seconds. The printing in ParseTimeControl() and SendTimeControl() is done with %g format, so that for integer increment there is backward compatibility with the old level command. 2010-03-30 20:24:49 -0700 Arun Persaud : adding gnu-readline support should make the user interface for xboard a bit nicer. In the end we want to have a separate input window, but this probably will have to wait until the GTK version. 2010-09-24 21:17:50 -0700 Arun Persaud : added warning if icsLogon file couldn't be opened 2010-09-24 21:10:28 -0700 Arun Persaud : security fix: replaced some strcat with strncat there is still more to do 2010-09-19 20:55:01 -0700 Arun Persaud : add option for silent builds this can be enabled for automake versions >1.11 by calling ./configure --enable-silent-rules. It should still work for older automake versions too 2010-09-19 13:16:40 -0700 Arun Persaud : bugfix: missing array index 2010-09-19 12:19:44 -0700 Arun Persaud : added new case for (Chessmove) 0 in common.h this cleans up a few more -Wall messages 2010-09-17 21:47:22 -0700 Arun Persaud : cleaned up -Wall warnings (apart from settings some parentheses) removed unsused variables, etc mostly everything from -Wall -Wno-parenthesis 2010-09-17 20:36:54 -0700 Arun Persaud : sizedefaults has 9 members, the last line of the array (NULL) only set 7. 2010-09-12 20:04:03 -0700 Arun Persaud : security fix: replaced sprintf with snprintf replaced most sprintf with snprintf. There are still some left where for example a pointer is used and is allocated in the line before, which should be fine... and some others. 2010-09-10 23:36:23 -0700 Arun Persaud : security fix: replaced strcpy with safeStrCpy from backend.c see comment in backend.c on how to use safeStrCpy. This was already added by AS, but only used in 3 places. 2010-10-04 11:50:38 +0200 H.G. Muller : Enhance multi-session TC clock handling Some new TC types are introduced: Bronstein and free sessions. The former is implemented by letting an exclamation point '!' in front of an increment (in the -tc string) indicate that the increment is limited to the time actually used on the previous move. The latter is an interval of given duraton in which you can do any number of moves (even zero), before the next session starts. This is needed for implementing Shogi byoyomi-type TC, as a first session, followed by a session of fixed-time per move. The latter can now be specified with the -tc argument as a degenerate case of Bronstein, where the time on the clock is <= the increment (so that it is never possible to think longer than the increment). A TC of 5 min + 10 sec byoyomi can then be indicated as 300:10+!10. The sessions are now separated by ':' in stead of '+', and all times in the TC string are converted to seconds first (in ParseTimeControl), so the fullTCstring can now be directly used in a PGN tag. Note that this patch only addresses clock handling; the engine will not be informed yet if the TC type or parameters change at the start of new session! 2010-10-04 09:32:18 +0200 H.G. Muller : Remove promotion-piece encoding from ChessMove type The shizophrenic way to indcate promotion pieces in the XBoard code (sometimes using a promoChar, at other times relying on moveType) was cured by combining all promotion move types (such as WhitePromotionRook) into a single one (WhitePromotion), and relying on promoChar to specify the piece. This solves the problem of promoting to new piece types in variants, which formerly also required addition of new move types. In Shogi the '+' character is now consistently used to indicate promotions (and recognized in ApplyMove), rather than 'q' or PieeToChar(BlackQueen), as the latter did not work in minivariants where the Queen (representng the Lance) did not partcipate. 2010-10-03 20:50:01 +0200 H.G. Muller : Pass promoChar to SendMoveToICS SendMoveToICS was the only place where the promotion piece was derived from moveType, rather than an explicity passed promoChar. 2010-10-04 09:41:11 +0200 H.G. Muller : Suppress spurious use of SAN castling in mini variants King moves from a central file to the king-side-castled position (1 square away from the right corner) were intercepted and printed as O-O in CoordsToAlgebraic. But on a 5x5 board (mini-Shogi!) this caught the normal King move Kc1-d1 as well. The castling notation is now reserved for King moves larger than one step. 2010-10-04 08:21:19 +0200 H.G. Muller : Make Shogi promotion zone board-size dependent In stead of using a fixed size of 3 ranks, we use BOARD_HEIGHT/3, which would translate to 1 rank for mini-Shogi (5x5) and 2 ranks for Judgkin's Shogi (6x6), which are indeed what these variants need. 2010-10-03 19:58:00 +0200 H.G. Muller : Make board-size overrule options volatile The options -boardWidth, -boardHeight and -holdingSize were legacies from the day choosing a variant would not automatically set a board size. As a result they are seldomly used anymore. The first real application is mini-Shogi (on 5x5 board), and it turned out very annoying if the 5x5 settings persisted to the next session, where you almost certainly want to play another variant. 2010-10-04 09:16:47 +0200 H.G. Muller : Strip DOS line endings from parser.l 2010-09-16 18:58:37 +0200 H.G. Muller : Extend mate test to drop games MateTest() in case of no legal moves now also looks if there are legal drops that can resolve the check. This provides reliable mate testing in Crazyhouse and Shogi, so these are now made subject to adjudications too. 2010-09-16 18:48:29 +0200 H.G. Muller : Extend legality testing to drop moves LegalityTest() can nowbe called with (internal-format) drop moves, and delegates their testing to a new routine LegalDrop(). This routine performs the 'no-pawn-on-back-rank' test that used to be in UserMoveTest (which now calls LegalityTest also for drop moves). The more complex Shogi case is also handled (except for Pawn mate drops) in LegalDrop(). 2010-09-16 18:25:21 +0200 H.G. Muller : Revert splitting of UserMoveEvent This splitting into UserMoveTest and FinishMove was no longer needed, now that the new mouse driver no longer calls UserMoveTest to figure out if a move is a promotion, and XBoard and WinBoard are unified in this respect. It was counter-productive, because UserMoveTest was not able to change the fromX, fromY (call-by-value) parameters for passing them to FinishMove, so it had to defer the conversion of drop moves to internal format to the latter, while it did not belong there. (Because DropMenuEvent already delivers the moves in internal format.) This whole kludgy construction was therefore abandoned, by going back to the original 4.2.7 calling scheme, where UserMoveEvent completely pre-processes the move, and when it is valid, calls FinishMove directly. 2010-09-16 18:02:40 +0200 H.G. Muller : Fix silent bug in drop moves In ApplyMove() the piece on the from square was accessed and used before we tested for drop moves. As drop moves have off-board from-squares this led to out-of-bound array access, which apparently was usually harmless. 2010-09-16 17:43:59 +0200 H.G. Muller : Allow parsing of upper-case machine moves Dubious patch, as it caters to non-compliancy. Some variant engines are very non-compliant, though. 2010-09-16 17:38:35 +0200 H.G. Muller : Prevent transmission of spurious promo char to other engine The parser now strps off spurious promotion characters. New move types "White/BlackNonPromotion" had to be introduced for this, to indicate NormalMoves that could have been a promotion, to make sure the '=' suffix of Shogi deferred promotions survives. 2010-09-16 20:44:37 -0700 Arun Persaud : fixed internationalization for winboard in the original commit some files were forgotten. This should fix it. 2010-08-29 21:07:12 +0200 H.G. Muller : Fix JAWS bug saying side to move in ICS play This was done the wrong way around. 2010-08-27 14:08:39 +0200 H.G. Muller : Make WB run-time language switch possible from menu This is a rather involved patch that might not be worth it. It is difficult, because translation of things that live forever is not easy to invert (menus, the auxiliary windows). We hae to remember all original, English texts there to be able to put them back,or re-translate. Still does not fully work, although the menus and temporary dialogs now are all OK. 2010-08-27 14:35:46 +0200 H.G. Muller : Update WB translation template The language.txt file now also contains all translatable strings from the C source files, rather than jsut the resource. 2010-08-27 14:14:51 +0200 H.G. Muller : Update docs Add descriptions for machine-match menu support and enhanced book control, nick-name options and language. 2010-08-27 13:59:09 +0200 H.G. Muller : Add some forgotten translation hooks The general-options, file-browse dialogs and the about box did not call Translate() yet. Also translate contents of combo boxes. Some small bug fixes. 2010-08-27 13:28:33 +0200 H.G. Muller : Do not translate game-end messages in PGN The messages themselves are not subjected to _(), but in stead their displaying in DisplayMove is subjected to T_(). 2010-08-23 13:23:22 +0200 H.G. Muller : Internationalization for WinBoard A function Translate() was added, which uses a list of item dialogs, reads their value, and replaces it by a translation (if available). It also reads the window title and sets a translation. Calls to this routine are added in the initialization code of every dialog callback. In addition all translatable strings in the WnBoard front end are marked by the gettext macro _(). Because WB is not gettexted yet, a hard re-definition of this macro is added in each file using it, to the string-translation routine T_() supplied in winboard.c. Code to read the translation file, and translate the menu texts is added in winboard.c. In backend.c the meaning of the gettet macros is redefined for the WIN32 case. 2010-08-23 13:07:40 +0200 H.G. Muller : Make the ID of all WB dialog items unique Mnany static dialog texts did share the ID -1 (IDC_STATIC). But to replace tet at run-time for translation purposes, they need to be addressed individually. So they were given new IDs, with symbols defined for those. 2010-08-23 12:48:07 +0200 H.G. Muller : Mark XBoard result messages for internationalization The GNU gettext macro _() is used with the game-end messages. This might be controversial, as they will appear in the PGN as well. But only as a comment. We can always decide not to supply a translation. 2010-08-23 12:43:27 +0200 H.G. Muller : Do not exit after match when match started from menu The codelooks weird, but matchMode == 2 in this case. We then use DisplayNote() to report the match result. 2010-08-23 12:39:07 +0200 H.G. Muller : Trivial-draws recognition improved in Xiangqi Now based on a routine "SufficientDefence". If both have it, it is draw. 2010-08-20 17:46:45 +0200 H.G. Muller : Update .dev files The relocation of parser.c and the addition of history.c was not yet incorporated in the devcpp proect files. 2010-08-19 13:45:04 +0200 H.G. Muller : Fix some MSVC compile errors Some statements has moved up stream of declaratons, which is an error that gcc is forgiving about, but where MSVC is strict. 2010-08-14 14:01:44 +0200 H.G. Muller : Improved patch for expansion of WB settings-file name The expansion of environment variables now allows multiple environment variables in the path name. Tested on %HOMEDRIVE%%HOMEPATH%\winboard.ini and %APPDATA%\winboard.ini. 2010-08-07 16:53:50 +0200 H.G. Muller : Add -colorNickNames option This option allows non-standard designation of side to move in FENs. (Useful for Xiangqi, where white is indicated often as r(ed), and Shogi, where white is s(ente) or b(lack), and black is g(ote) or w(hite).) Can also be used for FENs in a local language. A match of theinput character with the nick name translates it to the standard; this means the standard will continue to be recognized, unless it was defined as a nick name. 2010-08-07 16:39:16 +0200 H.G. Muller : Tricked by the grossnes Some WB menu items were referenced by a hard number. As items had been added over the years, the wrong menu items were grayed. In particular the Options -> Adjudication menu was grayed out, in -ncp mode, where this was intended for the Sounds dialog. This accidentally proved useful, until we started to apply adjudictions also to the Human moves. Then it was suddenly undesirable, and a small mystery why it happened at all, when I tried to change it. The numbers are now corrected to the new locatons of the items in the menus. 2010-08-07 16:35:23 +0200 H.G. Muller : Allow match to be started from WB menu A menu item Machine Match was added in the Mode menu to switch to matchMode. A persistent option /defaultMatchGames determines the number of games. A control was added to the Options -> Common Engine dialog to set this option. 2010-08-07 16:26:35 +0200 H.G. Muller : Add some book-control options Options /bookDepth and /bookVariation have been added to control the use of the GUI book. In WinBoard the Optons -> Common Engine dialog now contains fields to set them. 2010-08-07 00:15:57 -0700 Arun Persaud : new developer release 2010-08-06 11:18:34 +0200 H.G. Muller : Repair exit-popup deadlock patch Relocating the exit popup call had made it lose access to the message it should print, because it was declared only in an inner code block, by the same name: buf[]. Deleting the inner declaration fixes it. 2010-08-04 11:00:28 +0200 H.G. Muller : Fix erors when compiling with --disable-zippy The file args.h contained a codeblock in #ifdef ZIPPY, in stead of fields. 2010-08-01 13:27:23 +0200 H.G. Muller : Fix zippy handling of draw offers from ICS The patch by DM to fix the problem introduced by the coloration of zippy-matched commands (namely that the coloration code beat the zippy draw recognition to it, and ate the draw offer away) was only targeting ICC. The new fix should work on any ICS (by using the same pattern in zippy as in the colorization code). 2010-08-01 13:15:27 +0200 H.G. Muller : Fix regression in colorization of zippy-matched commands The patch by Daniel Mehrman from 4.2.pre8 was not properly merged, so that in XBoard no coloration would take place of ICS commands that were matched by zippy. (It was using &i as input pointer, rather than &backup. The XBoard-specific code now has been deleted completely, to remove a seemingly needless dependence on _WIN32_ of the back-end. Both WB and XB now use the XBoard method, to only match zippy commands when logged in. 2010-07-31 22:48:45 +0200 H.G. Muller : Suggest default file name in browser dialog The argument 'def' to FileNamePopUp() was not passed through to the new file-browser routine, which got NULL in stead, and thus started with an empty input field. 2010-07-30 23:28:57 +0200 H.G. Muller : Define /firstUCI and /secondUCI as synonyms for /fUCI, /sUCI Because the %s expansion of WB options in the /fcp and /scp lines only works for options that contain 'first' or 'second', and /fUCI thus did not work, PSWBTM had to rely on the cumbersome /firstIsUCI=true to install UCI engines. (The latter option should be deprecated really; the UCI-ness of the engines is a volatile option, so it makes no sense to supply a way to set them both to false or true. One only needs to be able to set it to the non-default state.) 2010-07-30 23:21:50 +0200 H.G. Muller : Add string option /pieceNickNames This (volatile) option allows definition of alternate letters for the pieces, which will be recognized next to the standard symbols as given in the /pieceToCharTable on input. (Output always uses the standard.) This can be useful for reading PGN from another language, or non-compliant FENs (e.g. using B and N for E and H in Xiangqi). The format of the argument is the same as for /pieceToCharTable. Because the nickNames are consulted before the standard table, it is possible to redefine a standard name as a nick for another piece. 2010-07-30 23:10:42 +0200 H.G. Muller : Fix deadlock in match-result display At the end of a match, GameEnds() was recursively calling itself, through DisplayFatalError() and ExitEvent(), and the latter was then delaying until the calling GameEnds() terminated. (Which it would of course never do before ExitEvent returned; fortunately there was a tim limit to this delay, but in XBoard it was 10 sec in stead of 10 msec.) Now the calling of DisplayFatalError() (to show the result popup) is delayed until after GameEnds completes (and resets the anti-recursion flag 'endingGame'), so that it is simply executed a second time, unaware of the earlier call. But this second time it does not do anything, because the gameMode ws set to EndOfGame the first time, and the writing of the PGN is blocked by the checksum being still the same. 2010-07-12 11:10:17 +0200 H.G. Muller : Fix WinBoard game-list title Number of displayed games and WDL stats were always appended to the existing title, leading to an ever-growing title in the game-list window. Now the old actual title is ignored, and the starts is appended to the original title "Game List". (In the future we could use the filename here?) In addition, the title was not updated when re-opening the game-list window, while the stats could change if filtering was active when the window was closed. (In that case the filter is cleared on re-opening, so the number of displayed games changes.) Now a title-update (after recalculating the stats) is done every time the game-list window is opened. 2010-07-11 11:06:27 +0200 H.G. Muller : Refactoring of material-draws adjudication code Insufficient mating material is now determined per side individually, by testing for MatingPotential of each side. If both lack mating potential the game is adjudicated as draw (if the -materialDraws option is set). This way MatingPotential() can later also be used to correct losses by forfeit to draws (which currently is only done when the opponent has a bare King). The accuracy of this type of adjudication in Xiangqi has been highly improved. 2010-07-11 10:54:59 +0200 H.G. Muller : Fix bug in sending cores command to engine The cores command was alwas sent to the engine(s) when the user changed it through the menu, even when the engine had sent feature smp=0 (which is default anyway). NewSettingEvent() was patched to send the new setting conditionally, based on the engine properties as recorded in ChessProgramStates first, second; In this particular case it now consults cps->maxCores. (Note the code for testing the second engine contains some dirty pointer arithmetic.) 2010-07-11 10:42:00 +0200 H.G. Muller : Fix oneClickMove bug When checking for unique captures, no attention was payed to the option setting, so the capture was also made when the option was off. 2010-07-11 10:39:28 +0200 H.G. Muller : Remove duplicate testing for cores feature The testing for this BooleanFeature occurred twice. 2010-07-11 10:35:13 +0200 H.G. Muller : Remove misspelled prototype NewSettingEvent occurred, next to the correct one, in misspelled form. 2010-07-05 10:00:01 +0200 H.G. Muller : Fix parsing of SAN shogi promotions A missing promotion character defaults to promotion in the move type, but the promotion character was not set when this happened in variant shogi. And it is especially important there, as the promotion character '+' will always be missing, as the parser will take it to be a 'check' symbol, and strip it from the move. 2010-07-05 09:55:14 +0200 H.G. Muller : Fix variant switch on PGN loading When the PGN specified an essentially different variant, the piece bitmaps were not properly adapted, because the switch was done by calling InitPosition(), rather than Reset(). (The latter would destroy the PGN tags info.) We now added an explicit call to ResetFrontEnd(), (which is normally done from Reset()). 2010-07-05 09:51:53 +0200 H.G. Muller : Adjudicate Xiangqi material draws with Advisor-less Cannons Used the Queen counter for counting Cannons. Note that material draws with stale Pawns (i.e. on the back rank) are not yet adjudicated. 2010-07-05 09:34:21 +0200 H.G. Muller : Remove font settings from master settings file xboard.conf should not contain general font settings (not specific to one board size) with specified point size. In fact it should not even specify sizable fonts, as the new system would make specification of a general font overrule the size-specific settings in the .xboardrc file, so the persistence of fonts would be completely broken. 2010-06-30 10:52:27 +0200 H.G. Muller : Cut board squares out of texture bitmap more cleverly When the bitmap is larger than the entire board, the squares are now cut out of the center of the virtual squares from subdividing the bitmap, so that they stay centered on the grid of a Xiangqi board bitmap. If the board size exceeds that of the bitmap, the old algorithm is still used, as the centering would make the edge squares exceed the bitmap, and cause a black rim around the board. 2010-06-30 10:49:12 +0200 H.G. Muller : Allow -flipBlack to work with font-based piece rendering In addition the font-based pieces will also be flipped vertically in flipView for variant shogi when -flipBlack is off. 2010-06-30 10:46:43 +0200 H.G. Muller : Allow font-based piece rendering in board sizes below petite At least for variants that use unorthodox pieces, so that switching back to using bitmaps is not really an option anyway. 2010-06-30 10:41:25 +0200 H.G. Muller : Ignore checks in 50-move count for Xiangqi Both checks and evasions are discounted; this is only done after the naive counting exceeds the maximum, so during most of the game it causes no CPU load. 2010-06-05 14:38:47 -0700 Arun Persaud : removed some garbage from configure.ac that got added a while ago 2010-05-25 21:20:27 -0400 Clint Adams : Remove unnecessary double equals from configure.ac. 2010-05-28 11:07:06 +0200 H.G. Muller : Fix e.p. bug in xiangqi with -serverMoves option Sideway Pawn moves were written as e.p. captures in the file with moves, which led to disappearence of pieces in the viewer. 2010-05-28 11:05:00 +0200 H.G. Muller : Repair score printing with -serverMoves option A previous patch had moved MakeMove to before the update of pvInfoList, so that the score/depth info would not appear in the file with moves. 2010-05-28 11:02:54 +0200 H.G. Muller : Repair animate dragging The previous patch had left a stray semicolon in the mouse handler. 2010-05-10 10:32:19 +0200 H.G. Muller : Fix game end during dragging The stale-first-click fix interfered with proper handling of a piece being dragged when a game suddenly ended (because of opponent resign, or caling the flag), because up-clicks when the from-square was reset were completely ignored. Now such an 'unmatched' upclick calls DragPieceEnd() and redraws the board. 2010-05-10 10:09:36 +0200 H.G. Muller : Pop down old tags on loadng new game in WinBoard ResetFrontEnd(), called from Reset(), did not do this in WinBoard (unlike XBoard), so that the tags from the previous game were left on display when -autoDisplayTags was off. 2010-05-09 22:15:27 +0200 H.G. Muller : Reverse mousewheel action Apparently WinBoard was stepping in the opposite direction through the game in reaction to the mousewheel as every other GUI in existence. 2010-05-09 22:07:30 +0200 H.G. Muller : Fix bug in sending "usermove" when forcing book moves The keyword "usermove" was copied to the buffer, but not sent before it was overwritten by the actual book move. 2010-05-06 17:23:24 +0200 H.G. Muller : Fix engine stall on perpetual-check evasion The adjudication code had already put the engine in force mode after postponing the actual adjudication to the next move. Now first determine if we want to adjudicate now, and with which result, before stopping the engine and ending the game. 2010-05-06 16:37:04 +0200 H.G. Muller : Let move parser return ImpossibleMove for off-board moves It used to return 0, which interfered with buiding a game list. This broke reading of multi-game PGN files containing games in a variant with a board size larger than that of the currenty active variant. 2010-04-06 15:05:10 +0200 H.G. Muller : Alter XBoard key bindings to mimic WinBoard A lot of new bindings were added, and four menuProcs had to be registered to be able to add bindings to them. The use of the control key as temporary take-back for the last move conflicted with the use of Ctrl keystrokes, and this function was migrated to '.'. The iconify function had no shortcut in WinBoard, but to get rid of letter bindings it was migrated to '-'. 2010-04-05 20:45:45 +0200 H.G. Muller : Update README file 2010-04-03 14:00:40 +0200 H.G. Muller : Fix typos in html help file 2010-04-01 15:22:41 +0200 H.G. Muller : Fix JAWS piece drop cursor, and streamline some sentences The cursor square was reset to a1 after every use of the piece menu, which was very inconvenient. Some of the spoken sentences have been improved; the square is read before the piece now, when using the arrow keys on the board. 2010-03-31 22:31:44 +0200 H.G. Muller : Allow escape sequences in telluser(error) messages The routine EscapeExpand was moved to backend.c, and applied to the message received from the engine. 2010-03-31 21:29:39 +0200 H.G. Muller : Allow lower-case promochar in moves of type h8=Q Updated the parser rules. Other move formats already allowed this. 2010-03-31 21:36:14 +0200 H.G. Muller : Fix Alt+M JAWS command in Two-Machines mode The command refused to read the ast move because it contained thinking output of the other engine. Let it pay attention to evenIfDuplicate. 2010-03-29 09:57:48 +0200 H.G. Muller : Fix rep-draw recognition The refactoring had broken the rep-draw recognition, by adding and extra condition in a conditional with side effects. The testing of this extra condition is now moved to after the side effect. 2010-03-28 12:32:07 +0200 H.G. Muller : Allow any %ENVIRONMENTVAR% in WB settings file name rather than ~ Only a single variable at the beginning of the file name is recognized, and the matching is not fool proof (it matches across backslashes). 2010-03-28 11:24:44 +0200 H.G. Muller : Fix info lines being used as normal thinking output The new standard of using thinking output with time = nodes = score = 0 as info messages for printing in the Engine-Output window was not understood everywhere, and led to such info lines being used for autoKibitzing and PGN annotation. The programStats are now only updated from thinking output received from an engine when it is not an info line. 2010-03-27 11:54:41 -0700 Arun Persaud : new developer release 2010-03-26 21:16:52 +0100 H.G. Muller : Suppress background observe for boards with own game number This is really a work-around for an ICS bug. The Variant-ICS sent the initial board of a game in a move list with relation = 0, which means 'observed'. So XBoard was thinking it was observing its own game, and switched to dual board. It seems harmless to suppress such a switch for all boards of your own game, however, which is now done. 2010-03-26 21:12:19 +0100 H.G. Muller : Fix crash on switching to ICS xiangqi game The oldBoard was a local variable, and only squares of the old board were initialized. This led to a crash if the copied board was enlarged, and then displayed. The variable is now declared static, so the uninitialized squares contain harmless zeros. 2010-03-26 18:32:36 +0100 H.G. Muller : Let Chat Boxes pop up above console, rather than on top of it Use EnsureOnScreen() to have them overlap if there was no room. 2010-03-26 18:26:04 +0100 H.G. Muller : Fix disabling of Chat Box navigation buttons The buttons for non-open boxes were enabed, rather than disabled. 2010-03-26 18:17:44 +0100 H.G. Muller : Prevent closing chat box Let it in stead switch focus back to the console window. 2010-03-26 15:28:54 +0100 H.G. Muller : Let WinBoard recognize ~ in settings file name as HOMEPATH Fetch the appropriate environment variable to build the mathname in MySearchPath() whenever the file name starts with "~\". 2010-03-26 13:59:28 +0100 H.G. Muller : Change name of Global Settings menu item to Common Engine Settings The old name confused ICS users, as this is an engine-only dialog. 2010-03-26 13:58:46 +0100 H.G. Muller : Update WinBoard RTF docs 2010-03-26 13:57:59 +0100 H.G. Muller : Update WinBoard html help 2010-03-24 18:00:08 +0100 H.G. Muller : Allow adjustment of clocks in any mode with shift+click In practice changing to edit-game mode during a game was very cumbersome. In WinBoard shift+click is now offered as an alternative. Make sure a right-click in the clock area is not also counted for other purposes. 2010-03-24 17:21:47 +0100 H.G. Muller : Allow loading of PGN variations in XBoard Right-clicking variation comments in the comment-window was implemented through a translation. The right button is now bound to routines that set both the end and start of the selection, as setting a new start does not seem to work if the previous select-start was not completed by a select-end or extend-end. Finally the main handler uses the selection cursors to know what was clicked. 2010-03-24 17:16:59 +0100 H.G. Muller : Update XBoard docs Added a descripton of the new ICS options (seek graph, back-ground observe) and menus (Upload) to the texi file. Also added a description of the variation (Annotate menu item and PGN variation comments) and PV walking (clicking engine-output). Describe the -shuffleOpenings option. 2010-03-24 13:30:59 +0100 H.G. Muller : Paint highlights on dual board (WB) The highlight info is hidden in the partner board to pass it to the front-end. 2010-03-24 13:14:54 +0100 H.G. Muller : Fix handling username change during game The title bar and gameInfo (going into the PGN) were not adapted when the username was changed through the menu, so that the change became only effective on the next game. Requires SetGameInfo to be called from the front-end, and thus a prototype for it in backend.c. 2010-03-24 11:04:00 +0100 H.G. Muller : Fix window-position upset on failing engine start in WinBoard The main window was only positoned according to the settings-file data after the engine was started up from InitBackend2(), so that if the latter gave a fatal error, and Save Settings on Exit was on, a wrong position for the main window would be saved. The call to InitBackend2() is now moved until after setting the main-window position. 2010-03-23 23:22:46 +0100 H.G. Muller : Display PV from Engine-Output window (XBoard) Translations are added to bind button 3 to the PV walk for the memo widgets, and the corresponding handlers are ported from wengineoutput.c. 2010-03-10 18:54:28 +0100 H.G. Muller : Set keyboard focus at startup to board window This makes XBoard sensitive to the keybindings also when the cursor is outside the board window. This focus seems to persist indefinitely: each time the board window gets selected, the key bindings become activem wherever the mouse pointer is. Downside: the mouse pointer is no longer an arrow outside the board window, but becomes a text-insert tool there. 2010-02-27 20:49:21 -0800 Arun Persaud : added logo files for xboard logos are installed in the hicolor theme [1] using $datadir as the basedir. Added both png and svg logo. [1] http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html 2010-02-27 17:36:10 +0100 H.G. Muller : Remake programVersion string after receiving engine features The engine could have sent a more accurate version of its own name than the one derived from the exe filename in a myname feature, and we better use that in the programVersion string, which will be sent as interface name to the ICS. 2010-02-25 19:22:00 -0800 Arun Persaud : Revert "Repair settings-file name" This reverts commit a02042ef83ce1f3632f0cf3e0a2a4ce9a3ac5d85. 2010-02-25 20:32:23 +0100 H.G. Muller : Add -autokibitz checkbox to UCI-options menu dialog 2010-02-25 20:29:45 +0100 H.G. Muller : Also capture (numeric) whispers of players for -autoKibitz 2010-02-25 20:25:32 +0100 H.G. Muller : Add kibitzes and c-shouts Chat Box A box dedicated to c-shouts will snatch any c-shout before it is diverted to a normal shouts box. The kibitzes box can capture the left-overs of -autoKibitz, if the latter is active. 2010-02-25 15:45:16 +0100 H.G. Muller : Mark non-compliant lines of engine in debug file The option -engineDebugOutput is extended to accept value 3 for printing a cear indication of non-compliancy in the debug file. 2010-02-25 12:02:58 +0100 H.G. Muller : Redraw second board on expose events The -dualBoard option now does refresh the second board after another window uncovers it. To acheive this, some data structures remembering what is displayed had to be duplicated. (lastBoard and damage for XB, lastReq, lastDrawn, lastReqValid and lastDrawnValid for WB.) WinBoard now uses clipping also for second board. This required the clips for the destination to be translated horizontally! 2010-02-25 15:13:00 +0100 H.G. Muller : Print seconds with 2 digits in backgroundObserve status line 2010-02-24 17:01:23 +0100 H.G. Muller : Do not recognize non-ICS variants from PGN event tag These variants were introduced after supporting the variant tag, so if the variant tag is missing, their recognition from the event tag will be a false match. (Mainly to prevent events with 'super' in the name being recognized as Superchess.) 2010-02-23 13:52:51 +0100 H.G. Muller : Fix display of uninitialized boards in background observe A variable partnerBoardValid is cleared on starting our own game, and set when a board from the background game comes in during it. At the end of our own game, a valid partner board now is put in the display. 2010-02-23 13:46:25 +0100 H.G. Muller : Add option Display Logo in WB general-options menu Changing the option requires InitDrawingSizes to be called for re-formatting the board window. Switching it off requires clearing of the cps->programLogo fields to take effect immediately. Switching it on only takes effect the next session, as we will need some refactoring to redo the figuring out what logos to display. 2010-02-22 12:02:59 +0100 H.G. Muller : Group Chat Boxes with console in stead of board window They now open and close with the console, which seems more natural, and prevents the console from covering them. 2010-02-22 11:50:59 +0100 H.G. Muller : Put new options in WB ICS-options dialog The Seek-Graph, background-observe and Chat-Box options are added to the ICS options dialog. They only control the appData settings, there are no special actions yet on switching the settings. 2010-02-22 11:46:33 +0100 H.G. Muller : Create space in WinBoard ICS-options dialog 2010-02-20 12:42:09 +0100 H.G. Muller : Use side-by-side boards to display background game A game observed in the background (i.e. if -backgroundObserve true) will be displayed right of the normal board in the same window if the new (persistent) Boolean option -dualBoard is also set. Very flakey hack, especially in XBoard, where clocks and messsage field all get the wrong width (and resist adjustment in the strangest ways). The clocks of the partner game are not yet displayed, and disaster happens when the background and foreground games do not have the same board format. 2010-02-23 14:57:01 +0100 H.G. Muller : Repair background-observe patch Apparently a commit was lost that I collapsed with 3018a6 while the latter was already pushed to savannah. Here I recreated this commit from a diff between the respective commits in the savannah & nubati gits. 2010-01-31 11:07:33 +0100 H.G. Muller : Repair settings-file name The default name is put back to /etc/xboard/xboard.conf, so that XBoard can again find its settings file. "make install" will still install it in the wrong place. 2010-02-21 18:43:59 -0800 Arun Persaud : new developer release 2010-02-21 19:45:58 -0800 Arun Persaud : fixed compiler warning for file-browser code missing "void"s in the function declaration and missing returns showed up when trying to build on the opensuse build server. fixed now. 2010-02-21 23:09:24 +0100 H.G. Muller : Put newly opened Chat Box on top Dialogs always pop up in front, so set the onTop variable that prevents highighting the button to navigate to it from other Chat Boxes to reflect that a newly opened Chat Box is in view. 2010-02-21 18:55:03 +0100 H.G. Muller : Fix copying of kibitzed info in Engine-Output window Make sure all lines end with "\r\n" to not lose line breaks on copy-paste from the memo. (XBoard would strip those again.) 2010-02-21 18:25:45 +0100 H.G. Muller : Allow walking a kibitzed PV If no tabs are found in te 'thinking output' we assume it is a captured kibitz message, and look for "PV=" to locate the start of a PV in it. Also try to include any continuation lines below the selected line. 2010-02-21 17:45:37 +0100 H.G. Muller : Insert autoKibitz continuation lines at end of line In the engine-output window lines that start with the ICS continuation sequence "\ " are inserted behind the line they belong to, in stead of at the top. This required keeping thrack of the length of the currently active line in OutputKibitz(). 2010-02-20 15:39:29 +0100 H.G. Muller : Don't disturb background observe when receiving new piece When new holdings are sent when the background game is displayed, we now ignore this, as presumably we are peeking at our partners game, and thus should be well aware of what is captured there. 2010-02-19 21:52:06 +0100 H.G. Muller : Newly lexed parser in XBoard directory 2010-02-19 11:18:21 +0100 H.G. Muller : Let yy_text determine progress of PV parsing The parsed unit yy_text was not available after ParseOneMove(), because the buffer switch in yylexstr() apparently destroys it. To solve that, yylexstr() now is equiped with an extra buffer argument, where it copies yy_text before the switch, so the caller, ParsePV(), can see what was parsed in yy_textstr. This is used to update the PV pointer, but also to save any parsed comments (when ParsePV is used for parsing a PGN variation). 2010-02-18 17:42:48 +0100 H.G. Muller : Support playing through PGN variation comments Right-clicking a variation line in the comment dialog will shelve the current variation, and parse the comment to replace it. This uses ParsePV() in an alternative way, for which the latter had to be enhanced: it was made resistent to move numbers and comments inside the PV. It now has an argument to indicate if such comments should be stored with the moves. The Comment Popup is closed on revert, to make sure no comments to moves that are destroyed, containing variations on a non-valid line, can keep hanging around. 2010-02-18 16:05:35 +0100 H.G. Muller : Add Annotate item in Step menu This does the same as Revert, except that it adds the destroyed variation as comment to the original movem in PGN variation format. RevertEvent now has an argument to indicate if it should add the comment, or not. Comments in the abandoned variation are included in the varriation command to the main line. (The exact layout of the variation comment that results leaves still to be desired.) 2010-02-15 19:07:12 +0100 H.G. Muller : Add option -shuffleOpenings This volatile option is added just to make the existing variable available from the command line, not only from the menus. 2010-02-19 11:48:49 +0100 H.G. Muller : Let the sounds sound on receiving a message in a Chat Box Use Colorize() to the applicable color to trigger the sound, and then restore the original color as 'continuation', to do it silently. 2010-02-10 10:55:51 +0100 H.G. Muller : Allow WB Chat Box to be dedicated to shouts and 'it' By putting 'shouts' in the handle field, a chat window will capture all shouts and c-shouts, and send messages typed into it as shouts. The bracketing of the shouter name now indicates the type of shout. The handle for WHISPER Chat Boxes has been changed to 'whispers', to make it easier to pop them up by clicking the console. 2010-02-16 22:34:23 +0100 H.G. Muller : Add -chatBoxes option to open Chat Boxes at startup This string option contains a semicolon-separated list of handles for which Chat Boxes should be opened at startup. The value saved in the ini file is the value that was read, not the actual chat boxes that were open at the time of saving. 2010-02-16 19:44:46 +0100 H.G. Muller : Make Chat Windows pseudo-tabbed By adding buttons in every Chat Box to navigate directly to every other Chat Box, a stacked set of Chat Windows behaves like a single tabbed window, but can still be unstacked. The buttons turn grey to warn that new text appeared in hidden boxes (i.e. not the one last brought to top). 2010-02-19 21:46:05 +0100 H.G. Muller : Allow arrow keys in WB Chat Box to access command history The history is shared between al boxes and the ICS console. 2010-02-12 22:35:11 +0100 H.G. Muller : Make WB Chat Boxes wrap and handle URLs Cloned the code for the console text field to hande URL. (Initialization to recogize the link, and notifiction to open it when clicked.) Removed the ES_AUTOHSCROLL style from the RichEdit in the resource. 2010-02-10 10:58:29 +0100 H.G. Muller : Fix copying of WB Chat Window contents All line breks were lost on copy-pasting the contents of a chat window. Adding CR to each outputted line in the front-end (wchat.c) solves this. (Tell messages sent to a handle (which are not echoed by the ICS, and thus have to copied to the chat box directly) also need CR!) 2010-02-19 22:34:30 +0100 H.G. Muller : Add upload of game to ICS for examining New item "Upload to Examin" in Action menu, calls UploadGameEvent(). Use SAN moves to upload game to ICS, rather than long algebraic (The ICS did not understand long-algebraic promotion moves) Use bsetup within examine to set position onFICS, and also variant. Castling rights do not work yet for FRC. Totally different set of commands are needed on FICS and ICC. FICS does not understand w23 or wild/23, but needs 'crazyhouse' in the besetup command that specifies the variant. XBoard variant names are used, except for fischerandom, which is 'fr'. Things like nocastle will probably still not work. 2010-02-18 17:41:10 +0100 H.G. Muller : Handle display of PV that starts with other move than played Insert the retraction of the played move, without premove highlighting. 2010-02-16 19:36:18 +0100 H.G. Muller : Bugfix smart capture Disambiguate was changed to make sure that for ambiguous moves, a capture would always prevail in the closure, rather than the last move that happened to be generated. Before, double-clicking a piece would sometimes plsy a non-capture. 2010-02-13 15:34:04 +0100 H.G. Muller : Fix XB crash on giving keyboard focus to non-text widget In the Engine-Settings dialog SetFocus() could be called for non-text widgets, and this made XawTextSetInsertionPoint() croak. Setting the insertion point to the end in SetFocus() was a bad ide anyway, as it interfered with copying from the engine-output window, which would uncontrollably scroll on getting focus. It is solved now by setting the insertion point already on creation of the text widgets. 2010-02-19 22:32:35 +0100 H.G. Muller : Seek-Graph bugfix: disappearing output in ICS console Suppression of output to the cosole was handled fundamentally wrong: it was not enough to set next_out to after the unit that should be suppressed, as there can be a backlog in printing of previous units that came in the same packet. So this has to be flushed first, or it will be lost. -autoKibitz probably got away with that, because it comes in a separate packet. But seek ads are often suffixed to other output, and then that output disappeared! Now we flush everywhere before suppressing. We now totally rely on the prompt to restart the printing, so that acknowledgements following the echo of the sent message are also suppressed. Also suppress LF before diverted chat messages. Also fixed is the 'mamer bug' in Chat Boxes, due to false parsing of a "* (*): " pattern in tell messages, because of a missing continue. 2010-02-12 18:08:29 +0100 H.G. Muller : Pop up ICS text menu with default item under mouse pointer The menu popup is migrated to the down-click (was up-click), so the up-click can select the item. Some trickery is needed to fool the menu into thinking that the mouse moved, so that a moveless up-down click in the ICS text field selects the default item (the upper-right one). Also allow dummy item in ICS text menu: The command "none" in the ICS text menu will now be treated as a grayed-out (disabled) entry, so it can be defined in the position underthe mouse pointer to prevent the up-click from doing anything, while keeping the menu open. Recommended for use with an entry of spaces. 2010-02-10 14:42:49 +0100 H.G. Muller : Allow ICS context menu to pop up a Chat Box on clicking handle A command "chat" defined in the WinBoard icsMenu string will cause ChatPopUp() to be called when it is clicked, with the clicked handle (name) in the ChatPartner field, and focus on the input field. ChatPopUp() had to get a parameter (the handle) to make this possible. If that parameter is NULL (as when it is called from the Mode menu), focus will still start on the (empty) ChatPartner field of the box. 2010-02-10 10:50:11 +0100 H.G. Muller : Fix right-edge spillover of Seek-Graph dots in WinBoard Rescale the X-axis to allow margin for dot size and color offset. 2010-01-30 11:05:52 +0100 H.G. Muller : Interface XBoard to GhostView file-browser dialog Note: The Ghostview dialog was using some deprecated variables for error printing, and conditionally used getwd() on some systems that presumably do not have getcwd(), but it did not assess the latter properly. 2010-02-09 14:38:09 +0100 H.G. Muller : Allow recalling history in ICS input box with arrow keys By adding translations for the Up and Down keys, and stealing some code from winboard.c. Still needs some refactoring to move the duplicate code to the back-end. 2010-02-09 14:34:33 +0100 H.G. Muller : Start insertion point at end of text edits in XB dialogs The function SetFocus now uses XawTextSetInsertionPoint to position the end of the string it aready contains, rather than at the beginning. 2010-02-08 17:55:44 +0100 H.G. Muller : Capture holdings of background observed game 2010-02-08 11:57:57 +0100 H.G. Muller : Match handles with multiple titles for channel Chat Boxes Only handles with at most one suffixed 'title', such as (U), (C), (IM) or (TD), followed by the parenthesized channel number, were recognized, so tells by people with more titles always went to the ICS console window. Patterns are added to recognize handles with upto three such qualifiers. 2010-02-08 11:54:55 +0100 H.G. Muller : Do not pop down Seek Graph on on-dot click Leave the graph up, and let the incoming board of a started game cause the pop-down. This in case the clicked ad is no longer vailable, or manuay refused, and fails to start a game. 2010-02-07 21:26:39 +0100 H.G. Muller : Observe a game in the background while playing A new (persistent) option -backgroundObserve true|false is added. When set, observed boards received while playing a game will not trigger a game switch, but will be ignored except for storing in a dedicated board buffer. Pressing the right mouse button will cause the board to be displayed, until we release it. Time, strength and stm are always displayed in the message window. 2010-02-07 16:43:36 +0100 H.G. Muller : Remove race condition in clock switching The move number is now incremented inside SwitchClock, when no timer interrupt is scheduled, so the interrupt cannot occur at the wrong side of the increment, and decrement the wrong clock. 2010-02-07 11:53:03 +0100 H.G. Muller : Let second click on piece make only capture, with -oneClickMove Normally this would clear the highlighting of that piece. Required new field in DisambiguateClosure to count nr of captures. 2010-02-07 11:18:56 +0100 H.G. Muller : Bugfix stale first-click When the opponent resigned after the user had cicked a from-square, clicking the from-square for the first move in the next game would produce an "illegal move" message, because it was considered a to-click! We now set fromX and fromY to invalid in GameEnds(). Should we also reset them on mode changes? 2010-02-07 11:08:05 +0100 H.G. Muller : Add promotions and e.p. to oneClickMove For e.p. the to-Square of the Pawn has to be clicked. Promotions are always to Queen when you click the to-square, but use the promotion pop-up when you click the from-square. 2010-02-07 10:38:38 +0100 H.G. Muller : Fix error that compiler does not notice Boolean GLT_GetFromList did not return a value. But no error on Ubuntu! 2010-02-06 18:55:38 -0800 Arun Persaud : new developer release 2010-02-06 18:30:42 -0800 Arun Persaud : updated year in copyright info 2010-02-05 22:27:51 +0100 H.G. Muller : One-click moves Playing on ICS or against engine, clicking a square from or to which only a single move can be made causes the move to be done, when the new option -oneClickMove is set to true. 2010-02-04 16:09:25 +0100 H.G. Muller : Use squares for computer seek ads Shape indication passed in sign bit of color (char) variable. 2010-02-04 22:46:41 +0100 H.G. Muller : Use right mouse button to view seek ads Right down-click does the same as left down-click, right up-click simulates a left up-click off board (so it misses all dots). Use right-click miss to refresh Seek Graph The 'moving' parameter had to be made into an int for this, to indicate right clicks with code 2. Right press now already pushes the clicked ad to the back, so that the up-click will display an underlying one. Bugfix pushing back seek ads on right-click On a right button press the previous in stead of currently hit ad was receiving the penalty. Indicate seek-ad multiplicity If more than one seek ad is inside the capture range of the mouse pointer, an exclamation point is printed before the seek-ad text. Some fixes to make seek-ad suppression work in WinBoard In WinBoard the z-depth was immediately erased by redrawing the graph; the clearing of zlist had to be moved from PlotSeekAd() to AddAd() (where it really belongs). Also aging of z-depth is now suppressed on mere pointer motion. 2010-02-04 22:45:01 +0100 H.G. Muller : Dynamic Seek Graph The new option -autoRefresh sets FICS and ICC to report removal of seek ads, and then removes those from the Seek Graph. New seek ads are added to the graph, as soon as the ICS reports them. 2010-02-04 22:42:15 +0100 H.G. Muller : Implement SeekGraph in XBoard For now only controlled by left mouse clicks on board. New options -seekGraph true|false and -sg to switch this feature on. Facilitate selection of coinciding seek ads Seek-ads that are viewed but not answered get a distance penalty on the up-click that makes their selection more difficult next time, so that the ad they covered gets a (better) change. The penalty ages away in the course of 5 clicks. Slightly offset Seek-Graph dots of different color Dots of different color are now displaced horizontally be 3 pixels, to prevent them from completely covering each other. (Required the axis labels to be moved a little too, to not be covered by the 1-min ads.) Auto-show seek-ad texts in WinBoard Hovering the mouse above a Seek-Graph dot will make the text belonging to it appear in the message field without the need to press a button. Required SeekGraphClick() to be called from the WB mouse event handler, with an extra argument 'moving' to make the distinction with a real click. Show seek-ad text on mouse hovering (XBoard) The Eventproc is also set to trigger on PointerMotion, and this event then calls SeekGraphClick with motion=true to handle it. Put poetic name of wilds in seek-ad text Use XBoard variant names, except for 'loadable' and 'fischerandom' (becomes 'setup' and 'chess960'), but leave number (to distinguish wilds that transate to same XBoard variant). 2010-02-05 20:36:50 +0100 H.G. Muller : Fix highlighting bug in XBoard The from-square was drawn before the to-square was erased, which led to a missing highlight line if they shared an edge or corner. 2010-02-05 15:49:59 +0100 H.G. Muller : Shorten autoKibitz confirmation on FICS Strip off the "players)", but leave the separatng space. 2010-02-05 14:39:55 +0100 H.G. Muller : Repair damage to -autoKibitz done by FICS atomic zippy claim The sending of -autoKibitz info was also moved back in that patch, but unfortunately to after clearing of the programStats info. Now the clearing has been moved also, to remain after it. 2010-02-04 23:33:50 +0100 H.G. Muller : Send continuation lines to chat box they belong to The variable savingComment is used as a kludge to remember where the comment should go (i.e. which chatbox, or elsewhere), so that when a continuation line is matched, chatPartner (which was reset at EOL) can be restored to its original value. Also put space after handle of talker in channel Chat Windows 2010-02-02 19:08:42 +0100 H.G. Muller : Fix u64 format for cygwin With a -mno-cygwin compile %llu and %lld are definitely not understood by scanf and printf, although they are by the compiler. In stead, %I64u seems to work. Put it in under control of a switch USE_I64, which is defined only in the gcc makefile when MINGW is used. 2010-02-02 19:02:28 +0100 H.G. Muller : Remove stray dot from WinBoard makefiles There was a period suffixed to config.h in the wgamelist.o dependency. 2010-02-01 14:50:01 +0100 H.G. Muller : Fix bug in display of logos The logo continued to be drawn after a boardSize change to a tinyLayout size, although there was no space reserved for it. Fixed by explicitly resetting logoHeight when no logo space is reserved in InitDrawingSizes(). 2010-01-19 20:15:49 +0100 H.G. Muller : Right-click refactoring: step III Let WinBoard call RightClick in back-end, and delete the duplicate code it had for this, after rescuing the front-end bits, and let the letter act depending on the result returned by RightClick. 2010-01-19 19:07:15 +0100 H.G. Muller : Right-click refactoring: step II Migrate the Right-click routine to the back-end. Let it communicate back square coordinates through pointer arguments, to accomodate their different naming in XBoard and WinBoard. Template added in frontend.h. 2010-01-19 17:55:05 +0100 H.G. Muller : Right-click refactoring, step I Divorce front-end part from back-end part of PieceMenuPopup in XBoard front-end, and forge the back-end part into a new routine RightClick. The right up-click in XBoard, which called unLoadPV() directly, now calls RightClick through PieceMenuPopUp(). 2010-02-04 23:09:47 +0100 H.G. Muller : Merge gamelistopt sources into gamelist source files The files xgamelistopt.c and gamelistopt.c are merged with xgamelist.c and gamelist.c, respectively. The WB front-end for the dialog already resided in winboard.c, so there was little need to move it to wgameist.c file. Makefiles adapted accordingly. Unsuitable key bindings were removed. The low-level front-end prototypes are now defined in in frontend.h. 2010-01-29 21:47:47 +0100 H.G. Muller : Game-List options dialog for XBoard A dialog similar to that of WinBoard was cloned from the game-list window. The XBoard front-end is in a separate file xgamelistopt.c, which in fact implements most of the low-level front-end as back-end. 2010-01-29 12:48:50 +0100 H.G. Muller : Refactoring of game-list-options dialog The back-end part is separated off, and moved to a file gamelistopt.c. Front-end for now stays in winboard.c. No prototypes in frontend.h yet. 2010-01-26 19:28:43 +0100 H.G. Muller : Fix of ancient WB bug: test integer option values for validity Only a string of digits preceded by an optional sign is accepted now. Before, any string was accepted, and leaving out a value could lead to the next option being ignored (if it did not need a value) because it was considered the value for the previous one! 2010-01-26 19:00:54 +0100 H.G. Muller : Fix bug in edit-position of holdings The holdings were effectivelly taken one too large, so that a promoted shogi Pawn moved to, or created in the holdings was not demoted to Pawn, but put in the dark (which you could see by the holding count if you did it twice). The overflow tests in these two cases now have been corrected. 2010-01-25 13:54:40 +0100 H.G. Muller : Save fonts in XBoard settings file per boardSize Each -boardSize now can have its own font specified in the settings file (and thus by a command-line option, although it would in general not be very useful to specify a font for a size other than the selected). E.g. a prefix "size33:" to the font name will apply it only to -size 33. An unspecified-size font option (not normally in the settings file) will always prevail over a font option specific for the current size. A font of some size must have been used or specified in order to be saved. 2010-01-25 08:56:35 +0100 H.G. Muller : Fix width of filter field in XBoard GameList An empirical dependence of the width of this text edit on the square size now makes for an acceptable layout at any board size. 2010-01-24 19:09:45 +0100 H.G. Muller : Use FICS atomic draw claim for sending move in zippy mode For this the relaying of the move had to be moved until after the adjudication, which again has to be done after MakeMove(), which is a bit dubious, as MakeMove might take significant time when animating. 2010-01-24 18:51:38 +0100 H.G. Muller : Send FICS atomic claim to ICS if move creates draw after offer The FICS format "draw MOVE" is used to send the move to the ICS when the user enters a move that adjudicates as a claimable draw, and he offered a draw before the move. For the benefit of ICS that do not understand this format, the plain move is sent afterwards. 2010-01-24 18:16:14 +0100 H.G. Muller : Also allow user to claim by offering draw before his move Use the existing userOfferedDraw variable to test for such offers in Adjudicate(). 2010-01-24 17:29:42 +0100 H.G. Muller : Also adjudicate after user move Call Adjudicate() in FinishMove(). 2010-01-24 15:56:56 +0100 H.G. Muller : Refactoring of adjudication code Put all the rule-based (as opposed to score-based) adjudications in a separate routine, so they can also be called on user moves. This requires sending the drawing move to the opponent engine to be made conditional on existence of the latter. Execution of the code is no longer dependent on the condition TwoMachinesPlay, but actual game terminations are now all restricted by an alternative condition (no ICS mode). 2010-01-24 11:46:30 +0100 H.G. Muller : Use -keepAlive option to determine connection health When there has been no ICS response since the previous 'ping', assume we are disconnected and do a fatal-error exit. Also auto-start the ping process in InitBackend3(). 2010-01-23 23:00:10 +0100 H.G. Muller : Use arrow keys in XBoard GameList for entry selection Add translations for arrows and home/end, to call LoadSelectedProc with argument to indicate the step, and let the latter perform the action. 2010-01-23 22:24:20 +0100 H.G. Muller : Allow to apply filter in XB GameList filter edit Apply a translation to intercept the key. Set focus back to the list display afterwards. 2010-01-23 21:44:36 +0100 H.G. Muller : Accept for changing chat partner A kludge stolen from Alessandro's GameList filter allowed to let the typing of while updating the chat-partner field of the WinBoard chat windows to act as pressing the Change button. Gives focus to the input field of the window afterwards. 2010-01-23 21:42:38 +0100 H.G. Muller : Move duplicat gamelist code to backend The filtering routines are moved from xgamelist.c and wgamelist.c to gamelist.c, and a prototype for them is placed in backend.h. 2010-01-23 19:29:18 +0100 H.G. Muller : Port game-list filtering to XBoard Added a text edit and apply button to the XBoard game-list dialog, and only have it print those lines that match the filter. Translate index in list to index of game in file when a game is selected, and index in file to index in list when a line is highlighted. Duplicates some code between xgamelist.c and wgamelist.c, which should be moved to back-end. 2010-01-21 19:24:49 +0100 H.G. Muller : Convert to DOS line endings For easier understanding of upcoming diffs of winboard.c 2010-01-21 14:32:46 +0100 H.G. Muller : Refactoring of move-history code The WinBoard code in whistory.c was split in a front-end part (remaining in whistory.c) and a back-end part (now in history.c in the xboard directory). This to allow easy porting to other platforms. 2010-01-20 12:48:30 +0100 H.G. Muller : Add fixed-time/move button in XBoard time-control dialog Put the TC-type buttons in a radio-group, and highlight the selected mode. 2010-01-19 18:27:14 +0100 H.G. Muller : Fix bug in XBoard PV display The PV was unloaded on anything but a button release, in stead of the other way around. 2010-01-23 11:04:11 -0800 Arun Persaud : fixed hardcoded location of config file for xboard the location should now follow sysconfdir during the configuration process. Also added some more output to the configure script. 2010-01-18 12:18:32 -0800 Arun Persaud : new developer release 2010-01-18 12:15:06 -0800 Arun Persaud : fixed Makefile.am to handle config file correctly 2010-01-15 21:55:29 +0100 H.G. Muller : Change opening array -variant fairy We now use the position of "Chess with Different Armies", FIDE army vs. a fantasy army (inspired on the Color-bound Clobberers) as opening position. 2010-01-13 19:08:45 +0100 H.G. Muller : Add variant Makruk Thai Chess, played by 2 million world-wide. Required pawn promotion to happen in a zone, and the Alfil to move as Shogi Silver, a new opening array, and unusual Pawn placement. Because of the latter, I consider it a setup position, so a FEN will always be sent to the engine. 2010-01-17 14:17:10 +0100 H.G. Muller : Fix parsing of O-O and O-O-O after FEN pasting in FRC Because the initial rights were not set in the FEN reader, the initial rights of the previous game remained in force, so that the parser did not understand OO-castling (although it would allow KxR castling). 2010-01-15 14:40:43 +0100 H.G. Muller : Fix reading FEN castling rights for knightmate and twokings Scanning the back-rank for a King did not work in these variants, because either the Unicorn castles, or there might be two Kings. 2010-01-13 11:42:52 +0100 H.G. Muller : Fix omission in castling refactoring for ICS received boards A default of -1 was still used, in stead of NoRights, when no Rook was found. In theory this could have had effect in a setup board 0 in FRC, when there were no Rooks on the back rank. 2010-01-13 11:35:34 +0100 H.G. Muller : Fix TwoKings ICS castling-rights bug Scanning the rank (as is done because of FRC) assigned castling rights to the rightmost King. Even scanning the opposite direction would not work, as it is not always the eftmost King that can castle. So we now explicitly test for a King on e1/e8 in TwoKings and assign it rights, relying on the Rook rights received from the ICS to control castling. 2009-11-18 19:12:25 -0800 H.G. Muller : fix double start of zippy engine after switch to gothic In ICS mode we now switch to the proper variant as soon as we receive the generic game-start message, to prevent a mismatch when the first board is received (which would trigger fetching of a move list). 2010-01-11 16:44:40 +0100 H.G. Muller : Extensive bugfix of -autoKibitz Suppression of printing of diverted kibitz messages failed when they extended over more than one read. This could even lead to such messages being erroneously saved as comments, which then lead to crashes. The suppression mechanism now waits for a prompt, in stead of the end of buffer. This required the printing of any leftover in the buffer to be deferred until the next read completes it. The number of people kibitzed to is now printed. 2010-01-11 16:30:59 +0100 H.G. Muller : Fix piece-to-char table -variant fairy The letters for Lance and Snake where swapped. 2010-01-09 11:54:20 +0100 H.G. Muller : Make WinBoard makefiles use parser.c in XBoard directory 2010-01-08 18:23:39 +0100 H.G. Muller : Docs update for new features 2010-01-08 15:18:37 +0100 H.G. Muller : Fix new args parsing of -lowTimeWarningColor This did not occur in the XBoard color translation table yet. 2010-01-08 14:16:59 +0100 H.G. Muller : Allow editing of holdings in EditPosition mode Dragging pieces to and from the holdings now consistently keep track of the home square of pieces and the piece counts, as does creation of pieces in the holdings through the piece menu. 2010-01-08 13:59:57 +0100 H.G. Muller : Indicate squares a lifted piece can legally move to Under control of the new option -showTargetSquares when -highlightDragging and -testLegality are on, the squares a piece can move to are marked by fat dots in the highlightColor (non-captures) and premoveHighlightColor (captures), as soon as you grab it for dragging. In variants with mandatory capture, the capture target of other pieces is marked with the highlightColor (as non-captures are then not allowed). 2010-01-08 12:35:10 +0100 H.G. Muller : Fix bug for incommensurate time odds After normalization (-timeOddsMode 1) the time odds factors can be non-integer, and thus must be stored as float. 2010-01-08 11:41:26 +0100 H.G. Muller : Display PV right-clicked from EngineOutput window The clicked PV is selected and the memo gets focus, so that it is highlighted. This selection is restored in the proper place after insetrtion of a new line in the memo. 2010-01-08 10:19:32 +0100 H.G. Muller : Display PV on right-clicking board 2010-01-08 09:21:04 +0100 H.G. Muller : Bugfix legality null move in parsing with -testLegality off The pointers were compared, in stead of the values. Furthermore, instead of null moves, it rejected moves on the main diagonal when legality checking was off. Also exclude moves with empty squares and enemy pieces. 2010-01-07 19:10:39 +0100 H.G. Muller : Newly lexed winboard/parser.c 2010-01-07 19:05:17 +0100 H.G. Muller : Harmonize declarations of XBoard and WinBoard The engine-exit and settings patches make some stuff common to WinBoard and XBoard, which needed to be harmonized, and is moved to frontend.h. 2010-01-07 13:07:57 +0100 H.G. Muller : Allow Ctrl-C copying from EngineOutput window text to clipboard 2010-01-07 12:52:17 +0100 H.G. Muller : Allow popup-less (fatal) exit of engine after tellusererror 2010-01-07 12:40:12 +0100 H.G. Muller : Improve layout of Engine #N Settings dialog An attempt is made to align the input fields of spins and text-edits 2010-01-07 00:31:11 +0100 H.G. Muller : Let XBoard print version with argument --version or -v 2010-01-07 00:25:57 +0100 H.G. Muller : Fix castling rule assignment in shuffle games The conversion to in-board storage for rights copied directly to boards[0] in steadof initialPosition, and was then overwritten when the latter was copied with uninitialized rights to boards[0]. This affected FRC and CRC, where rights are non-standard. 2010-01-07 00:17:25 +0100 H.G. Muller : Implement castling in -variant caparandom CRC should be treated as FRC, but until now it never was. We now test for FRC_TYPE_CASTLING. 2010-01-07 00:09:18 +0100 H.G. Muller : Fix default castling rights on reading incomplete FEN This was overlooked in the conversion to the in-board storage of rights. 2010-01-07 00:03:09 +0100 H.G. Muller : Fix NoncompliantFEN defaults. This must be NULL to get compliant FENs, not "", which would suppress castling and e.p. fields. 2010-01-06 23:54:49 +0100 H.G. Muller : Change format of -adapterCommand. first or f at the start of an option name are now automatically changed into second or s, rather than needing %% to be recognized. The values of -ec and -ed in the default -adapterCommand are now quoted (now XBoard understands quoting in the engine command line). 2010-01-06 23:51:16 +0100 H.G. Muller : Make WinBoard defaults for -fd and -sd equal to "." rather than empty strings. 2010-01-06 23:28:47 +0100 H.G. Muller : Delete old indirection settings-file code 2010-01-06 21:45:14 +0100 H.G. Muller : Correct XBoard default debug file name 2010-01-06 21:34:48 +0100 H.G. Muller : Suppress saving font settings. The fonts are size dependent, and might thus not be reusable in the next session. For now we therefore suppress the saving of them in the settings file, until we diversify the fonts per boardSize. 2009-12-12 23:38:20 -0800 Arun Persaud : added missing sounds files to be able to compile on windows 2009-12-09 17:29:37 -0700 Eric Mullins : Changes needed to compile master branch. 2009-12-06 12:11:46 -0800 H.G. Muller : implements the eval-graph window for XBoard 2009-12-06 11:58:34 -0800 H.G. Muller : improves the XBoard handling of the engine command line it now understands limited forms of quoting, so engine binaries with spaces in their file name can be handled. 2009-12-06 11:56:40 -0800 H.G. Muller : A better and more flexible way of invoking Polyglot rewrote uci.c. No more use of temporary files, all data passed through the engine command line. Adds a new command-line option -adapterCommand for this. 2009-12-06 11:34:50 -0800 H.G. Muller : remove trailing \r in xboard output there is an annoying carriage return (displayed as ^M) at the end of the PV in the engine-output window, not only with Fairy-Max, but also with UCI engine running under Polyglot. This patch replaces the trailing CR that Linux programs send after the PV line y a space. 2009-11-29 11:56:32 -0800 H.G. Muller : double buffer size to prevent overflow This patch doubles the size of the ICS input buffer to 16KB, to prevent the suspected overflow with -keepLineBreaksICS false when using "inchannel 1" on FICS and over 500 people are tuned in. 2009-11-28 13:33:52 -0800 H.G. Muller : fix problem with empty string in -firstNeedsNoncompliantFEN This fixes a bug in the use of the -firstNeedsNoncompliantFEN option with an empty string as argument. (Which led to truncation of the FEN.) 2009-11-28 13:32:12 -0800 H.G. Muller : updates makefiles to include dependency on config.h adds the dependency of wbres.o on config.c introduced by having the VersionInfo in the resource 2009-11-28 13:28:00 -0800 H.G. Muller : correctly apply some check boxes from the option menu Usng the check-boxes in the Option->Adjudications menu to indicate the engine reports absolute scores is now copied directly to the ChessProgramState, from where it is used, in stead of only to appData. This makes the change take effect immediately, in stead of after restarting. 2009-11-28 13:27:43 -0800 H.G. Muller : score sign in analysis mode this does not alter any of the current behavior with compliant engines, but does extend the correction for non-compliant score reporting under control of the -first(second)ScoreIsAbs option to cases where the engine is analyzing or playing on an ICS. 2009-11-24 21:09:30 -0800 Arun Persaud : fix for bug #28077: xboard needs to link against x11 hopefully fixed automake to take care of this 2009-11-23 20:37:20 -0800 H.G. Muller : Fix castling rights when copying FEN to clipboard (again) missed a spot last time 2009-11-23 20:22:58 -0800 H.G. Muller : restoring windows (EngineOutput and MoveHistory) on startup restoring the open / closed status of the auxiliary windows (EngineOutput and MoveHistory) on startup in XBoard like they do in WinBoard, which makes sense now that we aso remember their coordinates between sessions. 2009-11-23 20:21:14 -0800 H.G. Muller : fixed some outstanding pixmaps fixed transparency issues 2009-11-23 20:17:25 -0800 H.G. Muller : use linux style options for config file and add a system config file for XBoard This patch makes XBoard write the options to its conf file in Linux style, "-option value" rather than Windows style "/option=value". The WinBoard option parsing code has always understood both formats (including any hybrids), but the format it preferred for writing might look quite strange to Linux users. I also attached a file to be installed as /etc/xboard/xboard.conf on "make install". 2009-11-23 19:58:55 -0800 H.G. Muller : fix window positioning This patch adds stuff in the header files that allow the various front-end files to share information on which windows exist, are up, and how they are positioned. The EngineOutput, MoveHistory and GameList windows now all remember their position and size, even when they are closed when XBoard exits. 2009-11-23 19:51:19 -0800 H.G. Muller : same argDescriptor parsing for Xboard and Winbaord This patch makes XBoard and WinBoard use the same argDescriptor list of options, and (largely) use the same code for parsing and saving them. This is acheived by moving this code to a new file args.h, and #including this in both winboard.c and xboard.c (so that tiny differences, e.g. in default values in the table, are decided by the context). XBoard has new menu items "Save Settings Now" and "Save Settings on Exit" in the "Option" menu. XBoard uses /etc/xboard/xboard.conf as default settings file. A new option, -saveSettingsFile, can specify where settings should be saved, without parsing the file. (So that it also works if the file does not yet exist.) 2009-11-22 13:00:31 -0800 Arun Persaud : new developer release changed release name to - 2009-11-22 12:34:13 -0800 H.G. Muller : fix the irritating wandering off of the MoveHistory window in XBoard on opening/closing. 2009-11-22 12:29:47 -0800 H.G. Muller : use xtell for talking to handles, but tell for talking into a channel. by changing the chatboxes to use xtell in stead of tell, we broke the possibility to use the chat-box for chatting into a channel (which is apparently not possible with xtell). 2009-11-22 12:15:15 -0800 H.G. Muller : fix bug in bughouse drop menu This patch fixes the bughouse drop menu, which was broken by the new mouse driver, and could no longer drop white Pawns. 2009-11-18 19:29:57 -0800 H.G. Muller : 2nd step for moving option parsing from winboard to the backend This is the next step in option-setting refactoring: All options that are defined in XBoard are now included in the WinBoard ArgDescriptor list. The handling of sound option has been harmonized: the sound names now all initially go to the appData array, (as in XB) in stead of directly to the WB-specific variables, and LoadAllSounds now takes care of the copying. A new routine ExportSounds copies them back before saving settings (which, in XBoard, could be a no-op). The definition of defaults for the XB-only options has been moved to common.h. 2009-11-18 19:24:35 -0800 H.G. Muller : 1st step for moving option parsing from winboard to the backend This is a preparatory step in moving option parsing of WinBoard to the back-end. The table of command-line options now contains a fifth field, holding the compiled-in default. This obviates most of the front-end routine InitAppData, which now is replaced by a table-driven initialization routine SetDefaultsFromList(), which could be back-end. 2009-11-18 12:33:39 -0800 H.G. Muller : refactoring evalgraph code This is the refactored EvalGraph code: the back-end part is separated off, and put in a file evalgraph.c, which in the future can also be used with XBoard. Only the WinBoard front-end code is left in the file wevalgraph.c. A new header file defines the variables and routines they share. 2009-11-18 12:29:06 -0800 Arun Persaud : clean-up some file permissions where set up wrong (e.g. execute permissions for text files) 2009-11-18 11:34:22 -0800 H.G. Muller : refactoring of engineoutput This refactoring patch separates the back-end part out of xengineoutput.c, and puts it in a separate file engineoutput.c. A new header engineoutput.h included by both defines the routines for cross calling. Similarly wengineo.c will be stripped from its back-end code, (and renamed to wengineoutput.c), so WinBoard and XBoard now both use engineoutput.c rather than maintaining duplicate code in their front-end part. I also let the back-end now call EngineOutputUpdate directly, rather then through a relay in the front-end, by renaming it to SetProgramStats (the former name of the relay in winboard.c / xboard.c). Moved some templates of functions in engineoutput.c from winboard.h to frontend.h 2009-11-14 22:13:10 -0800 Arun Persaud : fixed build on openbsd added missing header file 2009-11-14 22:06:58 -0800 H.G. Muller : improve thinking-output for mulit-variant Improve multi-variant support by sorting the Thinking-Output lines of the most recent depth by score in the Engine-Output window. 2009-11-14 22:05:12 -0800 H.G. Muller : fix castling rights when copying FEN to clipboard This patch forces leaving of Edit-Position mode before copying a FEN to the clipboard, to make sure castling rights are faked in a consistent way. Before you could get FENs that had castling rights for non-existent Rooks. 2009-11-14 22:03:47 -0800 H.G. Muller : This patch gives a better handling of comments in PGN files, and adds the variation as comment to the main line on using Revert in local mode. 2009-11-06 18:53:19 -0800 Arun Persaud : fixed prototype for AppendComment 2009-11-06 09:06:44 -0800 H.G. Muller : cleaned up some debug messages and typos 2009-11-06 09:05:09 -0800 H.G. Muller : variation-support patch It allows you to Revert to the main line (or previous variation) when playing variations on an existing game in EditGame or Analyze mode. 2009-11-06 08:48:09 -0800 H.G. Muller : fix for new way of saving castling and e.p. information I forgot to make some conversions to the new-style encoding of castling there (using the enum constant NoRights instead of -1 to indicate the absence of rights, which was the price of storing the rights in the board, which is an unsigned enum type.) I also was a bit worried about portability, because I casted the enum type ChessSquare to (int) before comparing it with (possibly negative) constants EP_NONE etc. Now on my system enum types are (unsigned int), and this works, but I could imagine there are systems where this would be an unsigned char. (Not sure if there are rules for this). So to be safe I cast ChessSquare to (signed char), which should always work to make small negative ints assigned to it read back as themselves. 2009-11-06 08:44:59 -0800 Arun Persaud : removed files that should only be in the windboard directory 2009-11-05 19:32:35 -0800 Arun Persaud : add Winboard source files into tar-ball forgot to add them when rewriting the Makefile.am 2009-11-05 19:23:44 -0800 H.G. Muller : Integrate castling and e.p. rights into board array; bugfix for EditPosition A large-scale operation that I have been postponing since the very first 4.4.0: The castling and e.p. rights are now integrated into the board array, as boards[moveNr][CASTLING][i] replacing castlingRights[moveNr][i] and boards[moveNr][EP_STATUS] replacing epStatus[moveNr] These quantities are now automatically copied with the position by CopyBoards (allowing the removal of lots of dedicated copying code), and passed as function arguments with the position (so that the moves.c functions like TestLegality, MateTest, CoordsToAlgebraic, Disambiguate, GenLegal no longer need explicit e.p. and castling parameters. Also fixed a bug introduced by a recent previous fix: by adding fake castling rights to a position set up through the EditPosition menu, I destroyed the castling rights of a pasted FEN. Faking castling rights is now made conditional in EditPositionDone(), depending on the caller. (I had not realized it was also called after FEN pasting, to send the position to the engine.) 2009-11-05 19:03:17 -0800 Arun Persaud : added missing library for build on OS X Xmu seems to be missing 2009-11-04 22:57:30 -0800 H.G. Muller : Some code refactoring and cleanup; one small bug fix Some code refactoring, mainly to bring definitions of routines and variables shared between winboard.c and one of the auxiliary-windows files whistory.c, wevalgraph.c, wgamelist.c, wengineo.c somewere in a header file (winboard.h). Unfortunately this made winboard.h dependent on data types defined in frontend.h, so that the #include order had to be changed in many other .c files. The operation revealed one potentially bad bug: engineOutputDialogUp was written as int in engineo.c, but declared as char in winboard.c. I also changed the storage mechanism of the the comment and tags window positions to use WindowPlacement structs rather than simple variables, so that in the future they can be docked, like the others. I also removed some remnants of the Analysis window. The wgamelist.h and wedittags.h header files contained only 3 lines, and I absorbed them in winboard.h, rather than creating other such nearly empty headers engineo.h, whistory.h and wevalgraph.h. This affects the make files. 2009-11-03 18:26:06 -0800 H.G. Muller : let the clocks run in -searchTime mode 2009-11-02 17:41:12 -0800 H.G. Muller : add fixed time per move to the WinBoard time-control menu dialog 2009-10-31 10:42:50 -0700 Arun Persaud : updated version number to unstable 2009-10-31 10:25:37 -0700 Arun Persaud : release of version 4.4.1 2009-10-30 19:59:23 -0700 H.G. Muller : cleaned up ChangeLog and NEWS 2009-10-30 20:02:40 -0700 H.G. Muller : use xtell instead of tell in wchat 2009-10-28 20:35:06 -0700 H.G. Muller : prevent buffer overflow This is a buffer-size adjustments to prevent the JAWS version from crashing when it has to read out loud very long comments. 2009-10-28 02:17:16 -0700 Tim Mann : Further copy/paste fixes We needed to implement the XA_TARGETS target in order for more sophisticated apps to really believe we put anything on the clipboard they can use. 2009-10-27 23:57:25 -0700 Tim Mann : Make copy/paste position and game use clipboard, bug #27810 Copy actually sets both the clipboard and the selection for convenience and compatibility with the old way of doing things. Paste pastes from the clipboard by default, but the new -pasteSelection option lets you get back the old behavior of pasting from the selection. 2009-10-27 15:44:28 -0700 H.G. Muller : switch focus to the board after loading a game 2009-10-27 15:32:07 -0700 H.G. Muller : fix for bug #27826: fixed autoDisplayComment apparently the -autoDisplayComment option was not working, not even in WinBoard. This patch should fix it,both for WB and XB. (Unfortunately xboard.c and winboard.c were using a different name for the same front-end variable I needed, so I had to change one of them.) 2009-10-27 12:24:56 -0700 H.G. Muller : fix for bug #27826: ported two options to xboard also updated the documentation 2009-10-27 12:22:36 -0700 H.G. Muller : fixed jaws version turns out the new mouse handler broke the JAWS patch, as I discarded the function IsPromotion. I adapted it to call HasPromotionChoice instead. Also fixed two arnings by removing a no-longer needed debug print. 2009-10-27 12:03:02 -0700 Arun Persaud : reformated html to be correctly validated 2009-10-27 10:33:42 -0700 H.G. Muller : quick fix for "White Mates" in parser.l 2009-10-27 10:32:24 -0700 Arun Persaud : fixed a regression 2009-10-26 20:45:15 -0700 H.G. Muller : changed stderr to debug output, since stderr is closed in winboard 2009-10-26 20:42:24 -0700 H.G. Muller : removing empty lines from ICS play this patch causes removal of spurious prompts during ICS play also if the prompt is preceeded by a number of empty lines (as the board for the opponent move is on FICS). 2009-10-26 20:40:00 -0700 H.G. Muller : another bug in VariantSwitch: an unitialized board was printed. Must have been there a long time, but this time it crashed WinBoard. 2009-10-26 20:38:37 -0700 H.G. Muller : more work on variant switch the previous solution to the cosmetic problem of displaying a wrong shuffle in an ICS game that was observed from the very start unfortunately turned out to cause a real error in diplaying a stored game through the smoves command, for variants not using the FIDE setup as standard. This patch displays the position from before setting up the start position of the new variant, but does setup boards[0] to the initial position of that variant. (If this is a wrong shuffle, it is thus ot displayed, and a new board will immediately be sent from the ICS to correct the shuffle.) 2009-10-26 20:34:04 -0700 H.G. Muller : force full redraw in winboard Full redraw is now always forced when highlightMovesWithArrow is on, rather than only when highlight info is available. (As in drop moves the latter is invalid, but we must still erase the arrow from the previous move.) 2009-10-26 20:25:55 -0700 H.G. Muller : fix for bug #27790 and #277772. Suppressing the display of a wrong shuffle when observing shuffle games from the first move (#27790 bis), and the sounding of the FICS bell on crazyhouse captures (#27772 bis). 2009-10-26 20:22:13 -0700 H.G. Muller : fixed bug related to unsigned char in convert.c I also fixed the unsigned-char bug in the convert.c for bitmaps that caused the 129x129 XBoard bitmaps to be defective, and a bug that required fixup with sed afterwards (so I could use it to create a new m33s.bm) 2009-10-25 23:37:48 -0700 Arun Persaud : unguarded debug printf. added the appropiate if statement 2009-10-25 23:31:13 -0700 H.G. Muller : fix for two compiler warnings 2009-10-25 23:29:43 -0700 H.G. Muller : fix for bug #27799: fix for nested-nested-nested variations 2009-10-25 23:21:07 -0700 H.G. Muller : The book-probe code forgot to close the book file after opening it. fixed by adding an fclose at two points. 2009-10-25 23:18:18 -0700 H.G. Muller : removed unused v54?.bm bitmaps from resource file it seems the v54?.bmp bitmaps were actually included in the WinBoard build (in the resource file), although they were never actually used. So I have removed their inclusion in the resource file now. 2009-10-25 23:05:30 -0700 H.G. Muller : replaced defective bitmaps with copies from 4.2.7 2009-10-25 23:02:08 -0700 H.G. Muller : removed bitmaps files that are not needed any more 2009-10-25 22:58:34 -0700 H.G. Muller : fixed some bitmaps 2009-10-24 09:41:39 -0700 Tim Mann : Drop an obsolete script that was only used to update my personal web site 2009-10-24 01:23:29 -0700 Tim Mann : Silence warnings when compiling 64-bit xboard Some harmless warnings were caused by 64-bit mode having 32-bit int but 64-bit long and pointer. Add casts (etc.) to silence them. This might require adding a definition of intptr_t (a signed int type that is the same width as a pointer) on old systems that don't have it. 2009-10-24 00:56:37 -0700 Tim Mann : Fix up man page some more Sigh, the project history was still partly in reverse chronological order and partly in forward order. Swapped the order of some sentences to help straighten it out. I don't really care about this, so other project members should feel free to do what they like here, but the messed-up order was bugging me. 2009-10-24 00:46:20 -0700 Tim Mann : Fix some issues in the XBoard man page Correct places where the XBoard man page was calling XBoard "WinBoard". Change references to "WinBoard engines" and "WinBoard protocol" to "XBoard/WinBoard ...". Update bug reporting guidelines. Reorganize project history to something more like chronological order -- it had gotten pretty randomly ordered. 2009-10-22 21:45:32 -0700 Arun Persaud : new pre-release version; updated version numbers 2009-10-22 21:33:07 -0700 H.G. Muller : This patch adds to the characters that cause an automatic switch to the ICS console when typed to the board window. 2009-10-22 21:31:16 -0700 H.G. Muller : fix to the minor graphics issue contained some typos, as was remarked in the bugs reports 2009-10-22 21:30:08 -0700 H.G. Muller : improved mouse handler The improved mouse handler still needed an extra call to DrawPosition to work in XBoard. 2009-10-22 21:28:38 -0700 H.G. Muller : NPS plays and pondering Clock updating did not work correctly in node-based time controls when the engine was pondering. (It was not really meant for use with pondering. Oh well...) This patch checks if the engine reporting the node count is indeed thinking (as opposed to pondering). 2009-10-22 21:25:36 -0700 H.G. Muller : holdings update and regression fix The holdings-update patch was not yet satisfactory, because FICS seems to send holdings both before and after the board! And those received before did overwrite the holdings received after the previous board. I know tried to fix that in a kludgey way, by hiding a flag in the board that tells if the holdings have already been written by the ICS or not, and ignore new holdings when they are. (Except in bughouse, where holdings updates cannot be tied to a particular board and multiple updates between boards are normal. (I hope?).) I also undid a regression in my previous fix for the minor graphics problem, and solved it in a slightly different way to prevent flicker. 2009-10-22 21:23:39 -0700 H.G. Muller : improved mouse handler I improved the mouse handler in a way which will preclude disappearence of pieces on off-board or ambiguous (in-between squares) drag & drop moves. (As was reported in the "premove bug?" thread. Also the command-line premove problem reported there is now fixed, by removing the prefixing. 2009-10-22 21:18:05 -0700 H.G. Muller : fix for bug #8847: moving backward while examining on FICS not reported to engine I moved Daniel's code that backs up the engine when a bord with a lower number is received to a place where it is always done in zippy mode, rather than only when the engine is analyzing. Apart from taking back moves, there was also the case where the user moves forward by more than one move (usually immediately to end-of-game). In this case a new movelist is fetched from the ICS to recover the moves that were skipped. But this assumes that the engine is at the start of the game and feeds all these moves to the engine. So the engine had to be reset in this case to stay in sync. 2009-10-22 21:16:56 -0700 H.G. Muller : better init for random number generator 2009-10-21 23:01:09 -0700 H.G. Muller : fix for bug #27772: holdings not updated holdings lines from the ICS nor update the holdings of boards[forwardMostMove] in stead of boards[currentMove]. 2009-10-21 21:32:14 -0700 H.G. Muller : allowe parsing / disambiguation of SAN moves like Xe4 in certain situations This patch allows parsing / disambiguation of SAN moves like Xe4, if there is only one wild-card piece X on the board. Moves with wild-card pieces are now considered illegal if they leave the King in check by a piece of known gait. 2009-10-20 19:09:46 -0700 H.G. Muller : fixed bug when switching to variantsuper 2009-10-20 19:06:43 -0700 H.G. Muller : fix for bug #27715: 2 (minor) graphic issues I forced a total redraw when Reset is called from the ICS code in case a new game is encountered, in the hope it will make the reported (irreproducible) problem go away. As game switches are not frequent, I guess there is hardly any downside to this. 2009-10-20 18:57:17 -0700 H.G. Muller : fix for bug #27667: PV line missing in analysis window, part 3 "3. Wish for Engine state string (right to the icon): Can you add the actual search depth in analyzing mode? A change like " I also added the requested display of depth of the analysis move in the EngineOutput window. I guess a similar change could be made to wengineo.c (as this is in the code they share in common), but no one ever requested that in the 5 years since Alessandro wrote it. So for now I leave it alone. 2009-10-20 18:52:14 -0700 H.G. Muller : fix for bug #27760: debug printf in backend.c and additional check for variant 2009-10-19 23:17:46 -0700 Arun Persaud : fix for bug #10990: cmail does not seem to support .cmailgames or .cmailaliases this is correct, deleted the text out of the documentation that claims we support it 2009-10-19 18:40:40 -0700 Arun Persaud : new alpha version; first one with new naming scheme 2009-10-19 18:07:21 -0700 H.G. Muller : smarter analysis of the boards that XBoard receives from an ICS I added smarter analysis of the boards that XBoard receves from an ICS, based on board size and piece types in the position, to recognize cases where the board does not match the current variant, and switch to an appropriate variant. 2009-10-19 18:04:08 -0700 H.G. Muller : fix for bug #27667: window should be reference to toplevel The remaining objections of #27667 should be fixed by bringing the EngineOutput window under control of the TOPLEVEL compile-time switch. 2009-10-19 18:02:42 -0700 H.G. Muller : partly fix for bug #27715: scaling of menu bar the menu bar to the left edge of the window. 2009-10-19 17:59:43 -0700 H.G. Muller : fixed bug reported in WB forum: second game of a match would not start when using the GUI book 2009-10-19 17:57:14 -0700 H.G. Muller : fix for bug #27751: negative holding counts displayed I put code in the back-end to prevent holdings counts from becoming negative when a drop move is made from empty holdings. (This can happen when re-loading ICS bughouse games, as the smoves command fails to fill the holdings.) 2009-10-18 20:54:53 -0600 Eric Mullins : Updated compiling instructions. 2009-10-18 11:32:55 -0600 Eric Mullins : Changes to allow fonts with any charset (such as terminal) Affects winboard only. 2009-10-16 23:02:41 -0600 Eric Mullins : Moved SIGWINCH signal so it can be used... I goofed putting this in StartChildProcess() originally. 2009-10-16 22:54:12 -0600 Eric Mullins : Added internal wrapping ability. New options: -wrapContinuationSequence "foo" (default: "\\ " -useInternalWrap (Winboard default: false, XBoard default: true) Note: -keepLineBreaksICS if set, prevents wrapping, usurping the useInternalWrap setting. The idea is if you want to keep ICS line breaks, then you don't want internal wrapping. Because of this, the new default for keepLineBreaksICS is now false for XBoard. 2009-10-16 19:14:34 -0700 H.G. Muller : fixed segfaul in convert.c used to convert pixmaps 2009-10-15 19:46:07 -0700 H.G. Muller : new mousehandler to correct for premove and promotion popup this is the new mouse handler for XBoard, which should fully implement premove, including promotion popup, and yet suppress the promotion popup on illegal moves that are not premoves. It is almost completely moved to the back-end now, so that WinBoard will be able to use it as well. I just must hook it up to winboard.c, in particular harmonize the call-backs of the mouse driver into the front-end for grabbing and releasing pieces for dragging, to make sure they have the same names and arguments. 2009-10-15 19:32:55 -0700 H.G. Muller : updated black fairy pieces here is a set of black fairy pieces with opaque white details, so they have the same style as the orthodox XBoard pieces. 2009-10-15 16:54:51 -0600 Eric Mullins : Adjustment to joining to work around server not always including space. This patch implements commit 98aa02bda540f17f1f50be00e494efafe439b004 into the updated joining routine. This issue seems not to be server variance, but instead the server electing to omit the space between words when it occurs at exactly your width setting (-1 actually). This patch makes the joiner add back the space just like the referenced commit. Note: this is just a workaround to a server issue-- the joiner actually joins correctly before this patch. 2009-10-15 07:18:42 -0600 Eric Mullins : Fixed joiner detection, allowing it to work with timeseal When timeseal's buffer fills in the middle of the continuation sequence, detection fails, and the lines aren't joined. As a result of this fix, measures intended to bypass joining are no longer needed, so I removed them. These utilize server vars when available to prevent splitting. 2009-10-14 14:42:37 -0700 H.G. Muller : fixed engingeoutput routine removed outdated code regarding analysis window 2009-10-14 14:39:06 -0700 H.G. Muller : moved bitmap to correct location was misplaced in a previous commit 2009-10-14 14:26:09 -0700 H.G. Muller : fixed wrong number of arguments for EngineOutputPopUp 2009-10-13 21:00:27 -0700 H.G. Muller : new bitmap converter (including fill option) and new pixmaps 2009-10-13 20:52:40 -0700 Arun Persaud : forgot to add these two lines to the last commit 2009-10-13 20:51:17 -0700 Arun Persaud : removed AnalysisPopUp. Use EngineOutputPopUp instead this was already in Winboard, copied it to xboard and removed unused code. 2009-10-13 20:32:32 -0700 H.G. Muller : Proper board and holdings size when switching to variants gothic, capablanca, great and super within an ICS game. 2009-10-13 20:25:13 -0700 Arun Persaud : cleaned up an old #ifdef in zippy 2009-10-12 19:25:17 -0600 Eric Mullins : neglected this for the auto-width updating in xboard 2009-10-12 19:19:59 -0600 Eric Mullins : Added server width adjustment based on client width changes 2009-10-12 19:14:53 -0600 Eric Mullins : silence some compiler warnings 2009-10-11 18:39:24 -0600 Eric Mullins : Maintainence to support all compilers. 2009-10-11 17:07:27 -0600 Eric Mullins : Adjusted alternative joining method to obey keepLineBreaksICS 2009-10-11 14:48:55 -0700 H.G. Muller : fix for bug #27668: e.p. field still not passed to engine PositionToFEN now takes the e.p. rights from epStatus[moveNr], rather than calculating it on the spot from moveList[moveNr-1] (which failed on the first move). 2009-10-11 14:46:14 -0700 H.G. Muller : fix for bug #27666: naming of variants Variant names "misc/xxx" are recognized as "normal", rather than "xxx" to not get confused by the board "misc shogi" run by FICS. 2009-10-11 10:14:09 -0700 H.G. Muller : changed enable menus Put the "Open Chat Window", "Machine Both", and "Engine #N Settings" menu items in the appropriate enable lists for graying them out wen not applicable. 2009-10-11 10:13:14 -0700 H.G. Muller : Added a command-line option -keepLineBreaksICS true/false to control line joining. 2009-10-10 19:30:23 -0600 Eric Mullins : Added code to prevent unnecessary width updates. 2009-10-10 18:34:37 -0600 Eric Mullins : Turned off wrap when possible on ICS servers. Turning off line wrap prevents splitting lines up using the continuation sequence "\\ ". This is desirable when using timeseal because timeseal's buffer is sometimes too small, causing it to break lines itself. These lines can't be joined. 2009-10-10 16:30:56 -0600 Eric Mullins : vsnprintf() must be _vsnprintf() for MSVC 2009-10-10 16:16:45 -0600 Eric Mullins : added code to handle initial width update 2009-10-10 14:21:12 -0600 Eric Mullins : Added width updates to ICS client on font and window size changes What still needs to be done is placing an update call after login to initialize with the correct width. I didn't see where to put that. 2009-10-10 14:19:30 -0600 Eric Mullins : added ics_printf() and ics_update_width() and utility functions 2009-10-10 11:15:50 -0600 Eric Mullins : Cleaned up ConsoleWndProc (not complete, see below) Using static variables this way is not appropriate. I only addressed hInput and hText in this commit though. But imagine the WndProc being used by multiple windows instead of just one, and you can see why using static variables in this way is wrong. 2009-10-10 11:12:10 -0600 Eric Mullins : Restructured URL code so it fits better with how winboard is set up. 2009-10-10 08:57:39 -0700 Arun Persaud : cleanup: removed "#if 1" statements 2009-10-10 08:55:21 -0700 Arun Persaud : cleanup: removed "#if 0" from source a bit of cleanup of the source code 2009-10-10 08:34:10 -0700 H.G. Muller : fix joining of lines split by ICS This patch fixes the joining of lines that were split by an ICS, so that adding a space at the break point is done only when there was not a space already. (Some ICS leave a space at the end of the broken line, others do not.) An extra space would interefere with board12 in Gothic Chess, which is so long that the ICS breaks it, and the WB parser could not handle a double space within the board. 2009-10-10 08:27:55 -0700 H.G. Muller : fix for bug #27642: Clock jumps strangely in engine mode This moves SwitchClocks() back to after incrementing forwardMostMove, so that it knows again who has the move (which was broken by the "bare" patch), and will take the appropriate tick length. 2009-10-10 08:26:13 -0700 H.G. Muller : removed test for premove this was added while looking for the premove bug, but is not needed 2009-10-10 02:03:45 -0600 Eric Mullins : added URL detection and provided hotlinks in the ICS client 2009-10-10 02:00:52 -0600 Eric Mullins : reverted winboard.c beofre URL commit to correct whitespace conversion 2009-10-09 02:14:22 -0600 Eric Mullins : Added URL detection into the console text window for ICS. 2009-10-08 23:51:06 -0700 Arun Persaud : added some comments and formated code 2009-10-08 23:46:52 -0700 Chris Rorvick <>: fix printing out help message (list of command line options) (tiny change) The postfix increment always resulted in an attempt to print out an option on the right side regardless of one actually existing. Use prefix increment to prevent a crash when printing an odd number of options. 2009-10-09 00:04:51 -0600 Eric Mullins : Updated navigation accelerators, fixing ICS problems. Recent changes to the navigation accelerators were in the wrong accelerator table. Since the goal was to correct non-JAWS versions back to 4.2.7 behavior, I updated it to how 4.2.7 did it, but still retained the #ifdef JAWS conditional compilation. On an ICS, the navigation keys took control away from the ics client to navigate the game. The update requires the ALT key to be pressed, but it works identical to 4.2.7, not causing an unexpected focus back to the board window when you're just editing text. 2009-10-08 20:33:39 -0700 H.G. Muller : fixed premove recapture problem;promotion popup appearing on obviously illegal moves; promotions in Superchess and Great Shatranj 1) the premove recapture problem 2) the promotion popup appearing on obviously illegal moves (the 1. e2a8 problem) 3) promotions in Superchess and Great Shatranj, where the piece can now be selected from the holdings 2009-10-08 20:28:50 -0700 H.G. Muller : added forceIllegalMove to xboard 2009-10-05 21:01:32 -0700 Arun Persaud : bugfix: segfault when invalid option argument was given (bug #27427) when given a wrong argument to an option (e.g. -tc 0) xboard aborts before setting up the window, but tried to write a message to the messageWidget which doesn't exist at that point. 2009-10-05 20:05:00 -0700 H.G. Muller : small improvement for JAWS version This is a patch to make JAWS read out any comments when /autoDiplaycomment=true. As focus does not stay on the Comment window, the comment was not spoken otherwise. 2009-10-05 20:02:50 -0700 H.G. Muller : updated to winboard internationalization scripts Also a slight improvement of the internationalization scripting, to prevent it from crashing on messages containing a slash. 2009-10-05 20:01:53 -0700 H.G. Muller : new forceIllegalMoves option The -forceIllegalMoves option uses setboard or edit to force a position when an engine refuses the move leading to it by an "Illegal Move" message. Especially for engines using the edit command this was a bit tricky, because of the a2a3 kludge to avoid using the white and black commands. 2009-10-05 01:01:54 -0600 Eric Mullins : removed _winmajor if not defined so that VC 2008 can compile the project The oldDialog variable should just be set to 0 in all cases now, and as such, legacy code supporting the old dialog ought to be removed. The test for _winmajor is against < 4, which is always false at present, causing oldDialog to be 0 in every conceviable circumstance. 2009-10-04 09:58:29 -0700 Arun Persaud : getting ready for 4.4.1 release 2009-10-02 20:47:01 -0600 Eric Mullins : Simplified future version changes. Added a numeric version to config.h that is now used in winboard.rc instead of being hard-coded there. Just be sure to preserve the proper format (4 comma-separated 16 bit integers) or else it won't compile. 2009-10-02 16:56:01 -0700 Arun Persaud : updated version number to 4.4.1.pre should have done this straight after the last release, but forgot... 2009-10-02 16:48:03 -0700 H.G. Muller : worked on premove bug I made an attempt to make premove unsensitive to a race condition, just in case the premove problem was caused by that (which seems unlikely, but in any case I added some debug printout to test this). 2009-10-02 16:41:12 -0700 H.G. Muller : fixed loading of saved games via command line the variables forwardMostMove and backwardMostMove where set to zero at the wrong place. 2009-10-02 16:39:20 -0700 H.G. Muller : small fixes for the JAWS version * I moved saying 'check' by the JAWS version to where castling also benefits from it. * I made sure the check symbols are also recognized on promotion moves * In the non-JAWS version, define the plain arrows as shortcut keys for the button bar 2009-10-01 16:50:28 -0600 Eric Mullins : Fixed bug dereferencing garbage, causing crash. Commit fa8be4a3fc5d81e9ec1f6c218fcf55c95d34fd10 included code to free the resultDetails of the gameInfo structure. That exact code exists a few lines above where it was added. None of these free() calls finish by setting the member to NULL afterword, therefore repeated attempts to test/free() the members result in an attempt to free() memory winboard no longer owns, and an eventual crash. link to problematic commit: http://git.savannah.gnu.org/cgit/xboard.git/commit/?id=fa8be4a3fc5d81e9ec1f6c218fcf55c95d34fd10 2009-10-01 16:49:57 -0600 Eric Mullins : Added wchat.c to the project files we maintain. 2009-10-01 15:52:50 -0600 Eric Mullins : Previous fix for VC++/strcasecmp() was wrong-- use StrCaseCmp(). 2009-10-01 14:49:58 -0600 Eric Mullins : Add resource ID for new Mute menu item. I know this was probably done by HG, and simply left out of his commit. Anyway, the project can be built now after this change. 2009-10-01 14:49:09 -0600 Eric Mullins : Use of strcasecmp() broke Visual C++. 2009-09-30 20:47:00 -0700 Arun Persaud : wrong default value for engineDebugOutput the new default is now 1 2009-09-29 22:55:41 -0700 Arun Persaud : updated cmail.in to adapt the CVS->git change don't reference $Revision:$ anymore. Instead use reference xboard-version via autoconf. 2009-09-29 22:04:25 -0700 H.G. Muller : bugfix for protocol extensions: egtbpath -> egtpath A new and very bad bug was discovered in the implementation of the protocol extensions: XBoard sends a command "egtbpath" to the engine in stead of "egtpath" from the protocol specs. After discussion on WB forum it was decided that egtpath was better than the egtbpath I originally had proposed, and I changed it accordingly, but I had not realized that this string occurred TWICE in backend.c, depending on if matched the -defaultPathEGTB of -egtFormats option. I only changed the first occurence. 2009-09-27 12:27:44 -0700 H.G. Muller : fix for edit-position "moves" being sent by XBoard to the engine 2009-09-27 12:25:25 -0700 H.G. Muller : Engine did not start playing when out of GUI book on second move with white 2009-09-27 12:24:30 -0700 H.G. Muller : Opening Engine #1 Settings crashed XBoard when there were no text-edit options in the dialog (to which to set keyboard focus) 2009-09-27 12:18:35 -0700 H.G. Muller : added a "Mute All Sounds" item in the WinBoard Options menu, on Eric's request 2009-09-27 12:15:20 -0700 H.G. Muller : Updated the RTF docs for the chat windows, engine-settings dialog, /keepAlive option and new game-list tag 2009-09-27 12:14:25 -0700 H.G. Muller : Made the beep sounds for JAWS board navigation configurable through command-line options 2009-09-27 12:11:49 -0700 H.G. Muller : Prepared a system to internationalize the WinBoard menus 2009-09-27 12:10:38 -0700 H.G. Muller : added the result comment to the game-list tags when the game list is exported to the clipboard 2009-09-27 12:05:32 -0700 H.G. Muller : rewrote wevalgraph for better frontend/backend separation I have finished re-writing the eval-graph code to have some front-end / backe-end separation, something I had already started on my holiday in Norway (when I had no internet :-) ). The new code now appears to work exactly like the old code, and I guess it could be ported to gtk comparatively easily. 2009-09-27 12:00:51 -0700 H.G. Muller : fix for keepalive and chat window I made a fix to the keepAlive option so it does not send the date command to the ICS after every move. This required changing ScheduleDelayedEvent() so that it does not execute the event if a new identical one gets scheduled. I also added the option to XBoard. Affects xboard.c (DOS!) and winboard.c (This also cures the regression of the winboard.c copyright patch) I extended the chatbox patch to also listen to channel tells, and divert them to a chatbox for that channel number. Affects backend.c and wchat.c That should make those patches fully operational. No docs for either of them yet, though. 2009-09-27 10:36:23 -0700 H.G. Muller : fixed parse bug for pgn files fixed the existing bug that the time-control tag was displayed as "?" in the game list; turns out it was never parsed on reading PGN files 2009-09-27 10:35:58 -0700 H.G. Muller : allow the result comment as a display item in the game list 2009-09-27 10:35:13 -0700 H.G. Muller : fixed the HAVE_LIBXPM-dependent compile errors 2009-09-27 10:24:47 -0700 H.G. Muller : added a chat window to keep track of multiple conversations The chat-window patch affects: winboard.c, backend.c, winboard.rc, resource.h, backend.h, and adds the file winboard/wchat.c, which also affects makefile.gcc and makefile.ms. In addition I added a new option -keepAlive, which affects common.h (in addition to winboard.c and backend.c). As I had to modify backend.h, I also defined the -reset option type there, which we are going to add later. This required some changes to suppress warnings in wsettings.c. 2009-09-27 10:22:16 -0700 Arun Persaud : more files for git to ignore most of these are generated by make distcheck 2009-09-08 09:33:53 -0700 Arun Persaud : another bug fix found by Stanislav Brabec returned -1 in some case although the variable was a char... changed to signed char 2009-09-20 23:13:13 -0600 Eric Mullins : Swapped 'tell' and 'message' parsing order for colorization. Sometimes messages are relayed as tells and should be colorized as tells. 2009-09-08 09:10:34 -0700 Arun Persaud : added some more files to be distributed via make dist as suggested by Stanislav Brabec 2009-09-08 09:01:07 -0700 Arun Persaud : fixed some implicit declarations reported by Stanislav Brabec 2009-09-07 22:04:39 -0700 Arun Persaud : fixed a few more small bugs reported by Stanislav Brabec - A function uses a 'return;' statement, but has actually a value to return, like an integer ('return 42;') or similar: xboard voidreturn xengineoutput.c:766, 782 - Program returns random data in a function at xengineoutput.c:602 - With a new toolchain, AM_LDFLAGS cannot contain libraries. Linker ignores them. Fix is attached. - ToDo: Convenient name in most projects is TODO (autotools package it automatically). 2009-09-06 19:11:22 -0700 Arun Persaud : reverted .texi file and fixed Makefile.am the problem was actually not in the texi-file, but the Makefile.am. Reverted changes in the .texi and fixed it (hopefully) correctly now. 2009-09-06 18:23:01 -0700 Arun Persaud : get "make distcheck" to work needed to add all *.h files to Makefile.am and also the bitmaps that are needed and some other files. Also had modified copyright.texi. 2009-09-05 09:54:37 -0700 Arun Persaud : changed to version 4.4.0 2009-09-05 09:44:21 -0700 Arun Persaud : updated AUTHORS, README and ChangeLog files for release 2009-09-05 08:52:09 -0700 H.G. Muller : fixed some typos 2009-09-04 22:39:45 -0700 H.G. Muller : set castling rights after setting up a position I was going through old WB forum posts, and I encountered a bug report for a bug that I never fixed: The castling rights should be properly set (actually: cleared) after setting up a position in Edit Position mode (as opposed to pasting a FEN). 2009-09-03 23:11:18 -0700 Arun Persaud : removed install files from master they now live in their own branch 2009-09-03 22:30:18 -0700 H.G. Muller : updated polyglot protocol I added a new option type "-reset" to the protocol for the new option feature. 4.4.0 does not implement it yet, but Michel wants it for future Polyglots, and I think it is best to update the protocol in one big swoop. So I want to already include it in the specs now. (engine-intf.html) I made xboard's response to an unknown option type compliant with the new protocol specs. 2009-09-03 22:28:50 -0700 H.G. Muller : fixed some typos 2009-09-03 20:47:13 -0600 Eric Mullins : Updated project files for DevCpp and Visual Studio to add wsettings.c 2009-09-03 20:46:33 -0600 Eric Mullins : Added newline at end of file to silence warning. 2009-08-31 20:29:49 -0700 H.G. Muller : workaround for error message for missing pieces used in variants and initstring bugfix: error messages showed for non-existing pieces showed up for old user supplied pixmaps. Loading a pixmap of the king for the missing pieces now. Another bad bug surfaced: the -initString argument does not work in any XBoard version! (Including 4.2.7b) The escape sequences for linefeed in the string are not understood: -initString "new\nrandom\n" actually sends the \ and n to the engine (which then does not recognize the line as a valid command)! So I also added a patch to expand escape sequences in the InitString and ComputerString command-line options. 2009-08-31 20:27:24 -0700 H.G. Muller : updated installe script I re-organized the doc files in the install, so they now all go in the WinBoard\doc folder (and none in the root). I so included the COPYING and COPYRIGHT files there. This required some updates of the links in some html files, and of the menu link to README.html in the install script. I also fixed an error with the current directory in the menu short-cuts of some engines (which started in the fonts folder, and could not find the opening book there...). 2009-08-31 20:25:17 -0700 H.G. Muller : updated documentation 2009-08-31 20:20:55 -0700 H.G. Muller : updated installer script 2009-08-31 19:51:48 -0700 H.G. Muller : new help files for windows 2009-08-25 20:41:29 -0700 H.G. Muller : updated installer 2009-08-25 20:36:53 -0700 H.G. Muller : undid some previous changes some files got mixed up 2009-08-25 20:32:22 -0700 H.G. Muller : fixed small bug in wsetting 2009-08-25 20:29:06 -0700 H.G. Muller : trigger a focus switch to ICS input field when typing old behavior was that "." or "," triggered this, now every printable character except 1-9 will trigger the focus switch 2009-08-25 20:26:20 -0700 H.G. Muller : bug in backend.c when receiving lines from ICS A space was appended to every character received from an ICS in stead of just at line breaks. 2009-08-24 23:47:48 -0700 H.G. Muller : fixed warning messages from compiler 2009-08-23 14:24:38 -0700 Arun Persaud : fixed build on OS X this seems to fix it. Bug reported by Louis Zulli who also did the testing. 2009-08-23 11:54:28 -0700 H.G. Muller : OK, this is the beefed up version of the Polyglot info-string kludge, for WB and XB. 2009-08-23 10:22:48 -0700 Arun Persaud : added missing X_LIBS references to Makefile.am 2009-08-22 23:33:44 -0700 Arun Persaud : made the install script and executable 2009-08-22 23:19:07 -0700 Arun Persaud : changed beta1 to beta2 2009-08-22 23:14:11 -0700 Arun Persaud : fixed enable zippy in configure script and added some checks for OS X make tried to compile zippy even when --disable-zippy was given. Also fixed a bug in xboard.c where #ifdef instead of #if was used to test for ZIPPY (it's either 0 or 1, so we need #if). Also added some special checks for OS X, not sure if these will do it, but it's a start;) 2009-08-22 19:09:54 -0700 Arun Persaud : added configure summary to configure output, also cleaned up configure.ac a bit used AS_HELP_STRING where possible 2009-08-22 18:10:57 -0700 Arun Persaud : added check for malloc.h this should fix a build error on OS X 2009-08-22 17:47:44 -0700 H.G. Muller : A small cosmetic change in the size of buttons inside a groupbox of the Engine-Setup dialog. 2009-08-22 17:32:14 -0700 H.G. Muller : make xboard usable with UCI engines I made a small patch in xoptions.c (where the corresponding Engine Settings dialog was for XBoard), to make it at least usable for UCI engines: I now divide the options over upto 4 columns, if there are too many to fit into a single column. This seems to work. Still looks very ugly, but it is functional. 2009-08-22 17:30:05 -0700 H.G. Muller : fix premove for winboard This might fix the illusive premove problem. In 4.2.7 the code was not properly indented, and this led to an unbalanced braces error that I then fixed the wrong way. Click-click premoves did only work after clicking the toSquare twice. It might be that they actually did work after clicking it once, but that the highlights were not displayed (although set) for lack of a display refresh. 2009-08-22 17:28:11 -0700 H.G. Muller : fixed bug for double saved games This patch should solve the problem with doubly saved games when XBoard is closed. I calculate a cecksum of each saved game now (including move comments), and suppress saving if the checksum is not changed. 2009-08-22 17:25:58 -0700 H.G. Muller : fixed xengineoutput.c, to keep the duplicated code identical to that of wengineo.c. 2009-08-22 17:24:08 -0700 H.G. Muller : updated xboard.texi: added warning that pixmaps are not build for all variants 2009-08-22 17:19:11 -0700 H.G. Muller : added a dialog for engine-specific option settings 2009-08-22 17:09:58 -0700 H.G. Muller : updated some documentation 2009-08-22 17:07:10 -0700 H.G. Muller : fixed several bugs in the backend and added some more polyglot support * I added recognition for the new UCI3 option types that are recognized in the WB option features, to make sure this version is compatible with future Polyglots. Also fixed a bug that failed to strip an asterisk prefix from the first combo-box item. * I fixed the ICS-time-in-PGN bug. * I fixed a bug which caused a space to be missing when long lines broken up by an ICS were joined. 2009-08-22 17:02:58 -0700 H.G. Muller : better polyglot support for engine ouput I fixed the algorithm for clearing the Engine Output window to work better with the latest Polyglot, whight outputs UCI "info strings" amongst the thinking output. 2009-08-22 16:23:32 -0600 Eric Mullins : Beginnings of installer for 4.4.0. HGM asked me to forward the nsi file, but it seemed best to just add the installer tree to git even though it's not finished. You must install NSIS then FontName-0.7.exe (included in installer folder) then run build.bat in the same directory. 2009-08-05 22:18:29 -0700 H.G. Muller : patch backend.c to make the -noGUI option also work in ICS mode. 2009-08-01 13:09:49 -0700 H.G. Muller : temporary fix for pre-select As a temporary kludge I replaced looking into the holdings for the piece type by figuring out which piece would belong on the clicked holdings square. This is a non-trivial process, as it depends on which pieces participate in a certain variant. 2009-07-30 00:19:37 -0700 H.G. Muller : changed click-click moves I got complaints about the way XBoard 4.4.0 handles click-click moves, in particular changing the selected piece after selecting King (for which I suppressed interference with FRC castling in a rather brutal way). People tell me it is very annoying that clicks sometimes don't work to select a piece. WinBoard uses refined logic in the back-end to handle this, but the XBoard front-end is not interfaced with that yet. (This would require a major rewrite of the mouse handler.) This temporary patch suppresses this behavior in all variants that do not support Fischer castling, and even there only exhibit it for Rook-after-King selection (which will be interpreted as an attempt to enter a castling move as K x own R). 2009-07-26 08:43:35 -0700 H.G. Muller : option -adjudicateDrawMoves is not included in the XBoard list. added it to the option list 2009-07-21 20:23:23 -0700 Arun Persaud : converted files from dos to unix format run dos2unix over a bunch of files 2009-07-16 07:43:38 -0600 Eric Mullins : Stripped out unused VersionInfo 2009-07-15 23:16:19 -0700 Arun Persaud : changed version to 4.4.0.beta1 2009-07-15 23:12:37 -0700 Arun Persaud : updated INSTALL file to add ./autogen.sh 2009-07-15 22:44:05 -0700 H.G. Muller : higher number of engine options possible now I upped the number of options per engine from 50 to 100, and the average number of characters per option from 10 to 20. 2009-07-15 12:30:37 -0600 H.G. Muller : Fix of bad bug 2009-07-14 23:41:36 -0600 Eric Mullins : Added version information to resources. 2009-07-14 23:40:50 -0600 Eric Mullins : Added Jaws targets to IDE projects. 2009-07-14 23:39:12 -0600 Eric Mullins : Final makefile adjustments and compiling instructions. 2009-07-13 22:35:17 -0600 Eric Mullins : Cleaned up garbage left behind from my makefile update. 2009-07-13 22:26:56 -0600 Eric Mullins : Updated cmdline makefiles to be able to produce JAWS binaries. This breaks support for MSVC 4.x. It may still be possible to use that compiler if you obtain the latest SDK from Microsoft. MSVC 6.0 still works, but I had to change the target windows version to 0x500 which causes warnings about building beta applications. This is all due to the use of MENUBARINFO data type in the jaws binary. You can reduce the WINVER to 0x0400 safely if you are not building a JAWS binary, and MSVC 4.x will work fine. 2009-07-13 22:26:10 -0600 Eric Mullins : Removed dependency on jfwapi.h Allows anyone to compile a jaws compatible binary. 2009-07-13 22:23:31 -0600 Eric Mullins : Fixed duplicate resource in winboard.rc PLEASE remember to pull before commiting. This is the 2nd time I've fixed this. It's a waste of time to keep fixing the same problems. 2009-07-13 19:36:58 -0700 Arun Persaud : resolved conflict between Xt and Xaw libraries seems like we don't need to link against Xt. 2009-07-13 19:33:57 -0700 H.G. Muller : help-menu was not un-grayed in the JAWS version, when it played with engines 2009-07-13 19:29:53 -0700 H.G. Muller : integrated jaws into winboard I integrated the JAWS patch now into WinBoard in such a way that the JAWS and standard version can use the same resource file. This new winboard.c contains the improved dialog layot of the JAWS version, but none of the menus and JAWS-specific acclerator keys. The latter are now generated at run time by code in jaw.s. As a result jaws.h could be cancelled, as there the JAWS-specific defines are no longer needed outside jaws.c (now the .rc does not use them), and is incorporated in it. 2009-07-12 15:37:26 -0700 Arun Persaud : fixed problem in autoconf using Xaw3d rewrote the section for Xaw3d in the autoconf file 2009-07-12 15:29:28 -0600 Eric Mullins : Added Jaws support to GCC makefile 2009-07-12 15:28:20 -0600 Eric Mullins : added help support: MSVC IDE and DevCpp IDE project files 2009-07-12 15:26:49 -0600 Eric Mullins : Removed obsolete makefiles and support files. 2009-07-12 12:33:26 -0700 Arun Persaud : updated AUTHORS with the help of git. use git log --pretty=oneline --name-only --author=AUTHORNAME v4.2.7..HEAD |sort |uniq a bit of hand editing and a quick emacs macro later and you have a nice comma seperated list of all files changes by one author between two commits. 2009-07-12 12:31:47 -0700 Arun Persaud : updated Changelog using git log --no-merges --pretty="* %ai: %s%n %b" HEAD v4.2.7 2009-07-12 11:34:28 -0700 Arun Persaud : cleaned up some more copyright notices 2009-07-12 11:22:30 -0700 Arun Persaud : updated copyright to reflect A. Scotte as copyright holder need to mention him, since the paperwork won't be finished before the next release 2009-07-12 10:56:29 -0700 Arun Persaud : updated patchlevel to "k" 2009-07-12 10:53:50 -0700 Arun Persaud : fixed autoconf problem with VERSION/PATCHLEVEL variables xboard used it's own version of PRODUCT, VERSION and PATCHLEVEL variables. Switched to PACKAGE_STRING provided by autoconf 2009-07-12 10:29:46 -0700 Arun Persaud : cleaned up old CVS left overs removed $Id tags from all files 2009-07-12 10:10:17 -0700 Arun Persaud : converted xhistory via dos2unix 2009-07-12 10:09:24 -0700 H.G. Muller : fixed crash in history window someone discovered that opening the move-history window in XBoard leads to an immediate crash. Turns out that renaming the menu item broke it! (The name of the item was apprently used elsewhere in the code to access it, for putting a check mark there.) 2009-07-12 10:04:30 -0700 H.G. Muller : fix for Animation of castling moves in Chess960 Animation of castling moves in Chess960 turned out to sometimes make the king disappear from the display. For the time being I patched this in xboard.c to suppress animation of FRC castling moves altogether. As FRC castlings internally are represented as KxR, the to-square does not make sense anyway, which made the animation look very weird even when it led not to a king disappearance act. And the Rook move of a castling is never animated. 2009-07-11 22:44:53 -0600 Eric Mullins : Update GCC makefile to remove .obj targets. Dunno how they got in there, but they should be .o 2009-07-11 22:42:41 -0600 Eric Mullins : Update makefile dependencies on help.c and help.h. 2009-07-11 22:36:59 -0600 Eric Mullins : Allow compiling with MSVC6.0 and 4.1 Move prototypes into help.h, after making sure that DWORD_PTR is defined. Include help.h from winboard.c and help.c so both files benefit from the definition. 2009-07-11 18:26:16 -0700 H.G. Muller : lists these accelerator keys in the menus for JAWS 2009-07-11 18:24:19 -0700 H.G. Muller : added shortcuts This patch allows the use of Ctrl+C and Ctrl+V for Copy Game and Paste even in I C S mode when the board has focus. 2009-07-11 18:22:17 -0700 H.G. Muller : better handling of pasting a game without PGN tags patch in wclipbrd.h to make it smarter to decide between pasting a game or a position so it can handle games without PGN tags. If it doesn't parse as a FEN it is assumed to be a game. 2009-07-11 18:20:56 -0700 H.G. Muller : fixed parser error for knight move The parser had a strange quirk: it recognized bd2 as a valid Knight move (Nb1-d2) while this SAN format should be reserved for Pawn moves only. 2009-07-11 18:19:30 -0700 H.G. Muller : fixed a few warnings in connection with the help patch (now warning free) 2009-07-11 18:13:50 -0700 H.G. Muller : some major re-assignment of accelerator keys in the JAWS 2009-07-11 16:54:53 -0600 Eric Mullins : several small fixes uptracked winboard.ini * Cleanup: moved "Some definitions required..." from winboard.c to config.h, and combined some definitions from borland w/ MS. * Changed internal HtmlHelp return type and 4th argument to facilitate various compilers. These changes, while not strictly adhering to HtmlHelp() conventions, won't impact anything since the function modified is internal only. * Modified HtmlHelp return values to integer to silence warnings. * Added help.c to the project in makefile.gcc & makefile.ms. * Fixed duplicate resource in winboard.rc. 2009-07-09 22:08:15 -0700 H.G. Muller : added JAWS support; help files for Vista; bugfixes for winboard.c * JAWS support * help files should now work under Vista (the user has to have either a program to view old windows help files or to view html-files installed) * I fixed the tabbing between all windows that were added according to Tim's sugestions. * I added typing in of a move number in the move type-in dialog as a shortcut to going to that position by use of the < and > buttons. Mainly intended to ease life for the blind, but I think it can be generally useful. (Although the move-history dialog provides that functionality too, this is quicker if you don't happen to have it open.) * I added typing of a FEN in the move type-in dialog in Edit Position mode. (Which could not be used without mouse at all, and is defective in crazyhouse even with mouse, as there was no way to populate holdings.) 2009-07-09 22:03:00 -0700 H.G. Muller : some bugfixes: ICS error handling * play a different sound for takebacks in ICS mode * pop up error messages for illegal moves for typed-in moves 2009-07-09 21:50:41 -0700 H.G. Muller : removed no longer needed debug message 2009-07-09 21:48:23 -0700 H.G. Muller : fixed compile error from a previous change 2009-07-09 21:44:54 -0700 H.G. Muller : user selectable font in game list This makes the game list use the same (user selectable) font as the the move-history window. 2009-06-30 21:27:34 -0700 H.G. Muller : fixed typos in xboard.texi documentation. 2009-06-30 21:16:59 -0700 H.G. Muller : updated the FAQ 2009-06-27 17:06:26 -0700 H.G. Muller : changed font in engine output window The engine-output window now uses the same font as the move-history window (which was selectable in the "Options -> Fonts..." menu, while the other wasn't). 2009-06-27 17:03:19 -0700 H.G. Muller : fixed some characters in xboard.texi It seems that copying manual sections from the RTF to th texi file did somehow mess up the double-quote characters, and changed them into some strange (unicode?) symbols. 2009-06-27 16:56:36 -0700 H.G. Muller : two shogi related bugfixes I discovered a bug in the move generator for the Shogi Dragon King. I guess it went unnoticed so far because this is a promoted version of the Rook, which hardly occurs in games. (moves.c) There was also a problem with the piecesfix I sent you before; Shogi chosen as initial variant did use wrong piece symbols. (I had tested this on gothic, but there it happened to work for a different reason, unique to gothic.) This affects xboard.c. 2009-06-27 16:54:04 -0700 Arun Persaud : small cleanup 2009-06-27 16:51:02 -0700 H.G. Muller : adds bitmaps for shogi promotions, and selects the bitmaps or pixmaps for the more rarely used piece types on a per-variant basis. 2009-06-27 16:44:36 -0700 H.G. Muller : adds new piece types in the promotion dialog and edit-position piece menu 2009-06-27 16:13:15 -0700 H.G. Muller : updated bitmaps files: files for fairy pieces where missing, others had names that didn't work with autoloading. 2009-06-27 16:06:35 -0700 H.G. Muller : fixed a bug concerning bitmaps 2009-06-27 15:53:45 -0700 Arun Persaud : give a default directory for bitmaps files (tiny change) this is also one of the debian patches, should be rewritten to use the correct install directory. No Author was given. 2009-06-27 15:47:52 -0700 Brian May <>: verbose_error_message_about_recognized_options (tiny change from Debian patches) 2009-06-27 15:45:14 -0700 Matt Zimmerman <>: add a visual low time warning (tiny change from Debian patches) 2009-06-24 23:31:52 -0700 Arun Persaud : dos 2 unix conversion of backend.c 2009-06-24 23:30:07 -0700 Arun Persaud : exchanged some sprintf with snprintf found in a patch for the debian system, extended it a bit to other sprintf's original patch included only 11 lines by Florian Ernst 2009-06-24 23:07:23 -0700 Mark Ioli : enabled a patch for default settings in winboard 2009-06-24 22:53:11 -0700 H.G. Muller : updated copyright notice 2009-06-24 22:52:20 -0700 H.G. Muller : patches a bug in chosing the initial board size on a virgin startup I introduced recently 2009-06-24 22:49:33 -0700 H.G. Muller : I put in testing for the winning condition in 3checks on a check it just goes through the entire game to subject every position on a check test, to see if there were two more. 2009-06-24 22:47:01 -0700 H.G. Muller : updated copyright notice in docs 2009-06-24 22:41:40 -0700 Florian Ernst : added small patch from debian (tiny change) according to the debian patch tracker, this patch is by Florian Ernst . It fixes whitespace issues in filename called from cmail. 2009-06-24 22:33:13 -0700 Arun Persaud : converted dos2unix format for xboard.texi 2009-06-24 22:31:57 -0700 Arun Persaud : deleted two more files that don't need to be in git these files can be generated by autogen.sh 2009-06-21 12:10:31 -0700 H.G. Muller : major overhaul of the -stickyWindows feature I did a major overhaul of the -stickyWindows feature. The game-list and ICS-interaction windows are now also sticky. I also added a form of stickiness when the main window is resized; edges of auxiliary windows sticking to the right or bottom side of the main window stay attached when the window resizes (due to nr of board squares or their size). The way the window coordinates are saved in the .ini file is now relative to the main window, and some dummy options are added to be able to recognize right- and bottom-edge sticking, and reconstruct that when WB starts up with another board size. Also added are volatile options to ensure there will be space for auxiliary windows above and left of the main window. 2009-06-21 12:07:01 -0700 H.G. Muller : fixed long-algebraic form of drops The WB parser turned out not to understand the long-algebraic form of drops send by an ICS. (like B/@@-e4), so even with legality testing off I now use the SAN move for drops. 2009-06-18 18:35:31 -0700 H.G. Muller : Refined stalemate adjudication in Suicide, some cleanup Refined stalemate adjudication in Suicide, which seems to be not always won for the stalemated side, but for the side with the smallest number of pieces. Cleaned up the adjudication code in the process. (backend.c moves.c, moves.h) Also includes a tiny change in the -autoKibitz format, as requested on Talkchess. 2009-06-18 18:32:57 -0700 H.G. Muller : Enhancement of the way -autoLogo decides which logos to display 2009-06-16 00:06:59 -0700 H.G. Muller : bugfix and enhancement in autoKibitz mode changed the format of the autoKibitz: score/depth in stead of depth/score, as in PGN. I also supress the ICS time for the move now in the PGN if extended info is available. When enhancing the functionality of the autoKibitz command (using the opponent engine kibitz for the saved PGN) I discovered that the xengineoutput.c in our tree was obsolete, and contained a routine of which the arguments were no longer compatble with the call from backend.c, and caused segfaulting. I copied in the corresponding routine in wengineo.c, which was compatible. That the compiler did not flag this is a sign of badly organized code, I suppose... The enhancement itself affected backend.c. 2009-06-16 00:04:13 -0700 H.G. Muller : modified clock layout I altered the display of the clocks in the presence of engine logos; I used to stack them, but some inquiry on Talkchess sowed that people disliked the stacking. So now I display them next to each other again, but as 2-line-high fields to make room for te logos. 2009-06-15 23:59:32 -0700 H.G. Muller : new zippy option zippyShortGame On request of Mike Adams I added a new zippy option, -zippyShortGame, to make life more difficult for abusers of abort and disconnect for cheating. 2009-06-15 23:56:40 -0700 H.G. Muller : fixed some bugs in the animation of atomic captures 2009-06-13 15:27:26 -0700 H.G. Muller : some small bugfixes I had overlooked one place from which the FEN writer (of whicf I changed the argument types), which made WB crash if you copied a FEN (or PGN that cotained FEN) to the clipboard. I must have overlooked a warning during compile, or some depedency is not correct in the makefile. Anyway, wclipboard.c had to be changed. I also moved adjudication of some losing conditions to before tetsing for stalemate, (e.g. in atomic, if your king get destroyd you lose, even if you have no moves after that because it was your only piece.). this affects backend.c. I had used the same bits in the rule-modifier flags for indicating mandatory capture as was already used for indicating FRC-style castling. This led to frequent illegal move calls in FRC... (moves.h) 2009-06-13 10:45:17 -0700 Arun Persaud : cleaned up HTML in FAQ.html -- still need to work on content 2009-06-13 09:36:26 -0700 H.G. Muller : added option for work-around for some FRC engines in regards to FRCFENs It suddenly occurred to me that I had promised on CCC to include an option to provide a work-around for the problem that some FRC engines do not understand FRC FENs (and thus do not play at all under WinBoard, as FRC always has to begin with sending the initial position). So I added the options -firstNeedsNoncompliantFEN, -secondNeedsNoncompliantFEN. This affects winboard.c and xboard.c, (for defining the option), common.h, backend.h, backend.c, (for implementing it), xboard.texi and winboard.rtf (decribing it). This option provides users with a means to always force the FEN castling field to KQkq (but can be used for many other work-arounds as well). 2009-06-13 09:30:31 -0700 H.G. Muller : fixed bug with random calls There also seemed to be a bug with the shuffling of opening positions; I had changed the declaration of the position number from long long int to u64 to comply with MSVC, but this suppressed shuffling completely. I now changed it to int. I recently noted a problem with true randomizing anyway: this was based on srand(time()), but time() apparently did not change fast enough, so that starting several games in rapid succession (because the book line contained a 3-fold repetition) produced identical games. So I now seed the random once and for all during startup, based on the msec of the time mark, and removed the other calls to srand(). 2009-06-13 09:26:14 -0700 H.G. Muller : changed name for fairymax program in xboard.h 2009-06-13 09:25:07 -0700 H.G. Muller : removed my name from copyright message in help->about menu 2009-06-13 09:22:02 -0700 H.G. Muller : fixed -stickyWindows option I figured out why -stickyWindows was not working in XP and Vista (while it always worked under Win2K), and I think I found a fix for it that works under all Windows versions. (I tried XP and Win2K.) 2009-06-13 09:20:38 -0700 H.G. Muller : Updated docs for Engine-Settings menu 2009-06-13 09:19:05 -0700 H.G. Muller : Awareness of winning conditions for atomic and giveaway variants; two bugfixes fixed bug in claim verification Bugfix on initial position of Great Shatranj 2009-06-13 09:16:47 -0700 H.G. Muller : Legality testing (mandatory capture) in giveaway variants 2009-06-13 09:16:17 -0700 Arun Persaud : don't ignore winboard/parser.c 2009-06-13 09:12:15 -0700 H.G. Muller : Added new variant Twilight Chess 2009-06-13 09:08:57 -0700 H.G. Muller : some renaming and restructuring of WB menu items, to conform more to XBoard 2009-06-13 09:07:07 -0700 H.G. Muller : Fixed bug in atomic patch that interfered with non-atomic variants 2009-06-10 21:46:11 -0700 H.G. Muller : fixed different use of engine option compared to Polyglot it turns out the new Polyglot uses a sightly different version of the GUI->engine option command than the one I proposed (and implemented in XBoard; Michel sneaked in an '=' sign between the NAME and VALUE of the option, to allow for more unambiguous parsing. I guess in principle this is a good idea, so I adapted XBoard to Polyglot rather than the other way around. The result is that there are canges in xboard.c, and the documentation. I noticed that I unjustly had internationalized the option strings to be send to the engine in xoptions.c; this was of course nonsense, as this was WB protocol. So I undid that too. 2009-06-10 21:37:47 -0700 H.G. Muller : add the already supported variants 3check and great (=Great Shatranj) to the New Variant... menu. 2009-06-10 21:32:22 -0700 H.G. Muller : animate explosions in variant atomic (if animate moves is on). 2009-06-10 21:30:19 -0700 H.G. Muller : fixed castling bug in variant twokings. 2009-06-10 21:22:36 -0700 H.G. Muller : fixed forteitary wins for special game variations feature that corrects forfeitary wins (e.g. on time) of a bare King to draws of course breaks proper operation in losers, suicide and giveaway 2009-06-09 21:02:51 -0700 H.G. Muller : automatically test ini file extension for files from commandline option @filename The winboard.c is a patch that automatically tries indirection files on the command line (@filename type arguments) also with an extension .ini if the name itself did not match any existing file and contained no period. This saves the user typing the .ini all the time (which I started to find pretty annoying while working on the installer package). 2009-06-08 15:23:58 -0700 H.G. Muller : added gamelisttag option to xboard also updated documentation. 2009-06-08 15:20:00 -0700 H.G. Muller : updated RTF file for winboard 2009-06-06 09:12:48 -0700 Arun Persaud : fixed syntax error in texi file 2009-06-06 08:57:52 -0700 Arun Persaud : updated to patchlevel "j" 2009-06-06 09:00:25 -0700 H.G. Muller : fixed adjudicating probelm in Shantranj Refrain from adjudicating a draw based on insufficient mating material (except bare King vs bare King) in Shatranj (where in this case you can still win by baring the opponent's King). 2009-06-06 08:55:17 -0700 H.G. Muller : updated documentation and FAQ 2009-06-04 22:52:31 -0700 H.G. Muller : source clean up. Fix compiler warning, removed unused variables, etc. 2009-06-04 20:43:29 -0700 Eric Mullins : adding support for different windows compiler Eric kindly provided us with some makefiles for different windows compiler and also fixed some issues that came up while using those compilers. 2009-06-04 18:27:26 -0700 Arun Persaud : cleanup: got rid of a lot of files that are not needed for a new release lots of documentation was available in several places, old unused source files and not used graphics file were floating around in the tree. This should clean up most of it. No need to keep these files around, especially since we are using version control. 2009-05-29 18:56:06 -0700 H.G. Muller : Added the Action-menu items that allow the user to adjudicate ongoing games in Two-Machines mode. This was an already existing backend function from Winboard_x; I only had to create a menu item for it to be called. Due to an oversight I had forgotten to do that so far. (Logically, I should have done it in the 4.3.5 release, where I updated the XBoard menus to conform to the WinBoard menus.) I tested them, and they seem to work. (As expected.) 2009-05-28 22:23:00 -0700 Arun Persaud : updated patchlevel to "i" 2009-05-28 22:19:08 -0700 H.G. Muller : small change to mousewheel support; two changes in window behaviour * Visible effects during resizing suppressed, bug in chosing new size fixed. * No longer reserves left and top margins next to main window on first popup. * built in some hysteresis into mousewheel support, ignorng the first event in any new direction to suppress effects from accidential mouse movement. 2009-05-28 22:11:11 -0700 H.G. Muller : corrected 'animate dragging' I finally figured out how the 'animate dragging' works in XBoard, so that I could add code to do the unstacking of multiple pieces in the holdings, rather than always leaving an empty square while you drag them. (And then suddenly re-growing the remaining pieces as you make the drop.) It does not look as fancy as in WinBoard yet, because the counts still only decrease when you release the piece, rather than when you lift it. But this is not nearly as disturbing as leaving empty holdings (if only temporarily) when you still have pieces there. 2009-05-28 22:06:15 -0700 H.G. Muller : Added comand-line options -debugFile (as synonym for -nameOfDebugFile, as WinBoard also has these synonyms), and -engineDebugOutput (wich already existed in the backend). 2009-05-28 21:57:53 -0700 H.G. Muller : updated documentation for new release 2009-05-28 21:55:51 -0700 H.G. Muller : added Xiangqi perpetual-chase detection 2009-05-28 00:06:53 -0700 Arun Persaud : Updated all files to GPL version 3. 2009-05-28 00:03:32 -0700 Arun Persaud : converted two files from dos to unix format 2009-05-27 23:12:24 -0700 Arun Persaud : updated INSTALL, NEWS and other files for new release cleaned up a bit and updated some information in the text files. 2009-05-07 21:48:23 -0700 Arun Persaud : winboard/config.h shouldn't be in .gitignore, only ./config.h 2009-05-07 21:47:37 -0700 H.G. Muller : bumped patchlevel to 0g 2009-05-07 21:46:02 -0700 H.G. Muller : corrected path in makefile 2009-05-07 21:45:48 -0700 H.G. Muller : updated rtf 2009-05-07 21:45:25 -0700 H.G. Muller : added firstOptions, secondOptions, noGUI, firstXBook, secondXBook 2009-05-07 21:44:03 -0700 H.G. Muller : handle promotion case for Shogi 2009-05-07 21:43:34 -0700 H.G. Muller : add note about RESULT command for GUI programmers 2009-05-07 21:42:37 -0700 H.G. Muller : small changes to book.c added code for different board sizes added some debuginfo handle promotion of pieces 2009-05-05 23:07:18 -0700 Arun Persaud : added a .gitignore file 2009-05-03 12:41:06 -0700 Arun Persaud : wrong line ending for Unix... ran dos2unix on both files 2009-05-02 13:51:50 -0700 Arun Persaud : fixed texinfo files, added windows help file, removed config.h from git texinfo.in is not needed anymore, since it only provided a version string, but this can be created automatically using autotools deleted config.h from version control, since it is automatically created. added winboard.hlp file (not sure if needed) 2009-04-26 23:34:34 -0700 Arun Persaud : updated autoconf init file * renamed autoconf init file from configure.in to configure.ac * added bug-report email address to ac_init * replaced ac_output(...) with ac_config_files, ac_config_commands and ac_output 2009-04-26 14:49:03 -0700 Arun Persaud : parser.c is generated by lex, so it shouldn't be tracked and also parcer.c shouldn't be in Makefile.am 2009-04-26 14:44:51 -0700 Arun Persaud : added book.c to Makefile.am 2009-04-26 13:49:15 -0700 Arun Persaud : use autoheader to create config.h.in no need to track this in git anymore 2009-04-26 11:13:26 -0700 Arun Persaud : fixed autoheader warings, remove depreciated acconfig.h 2009-04-26 10:30:23 -0700 Arun Persaud : added a autogen.sh 2009-05-02 10:55:39 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.16 2009-05-02 10:50:10 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.15 2009-05-02 10:38:39 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.14 2009-05-02 10:13:41 -0700 H.G. Muller : HGM fixed cygwin compile for winboard 2009-04-24 16:11:57 -0700 Arun Persaud : cross compilier working 2009-04-19 10:00:52 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.13 2009-04-19 09:52:47 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.12 2009-04-19 09:48:59 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.8 2009-04-19 09:44:15 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.7 2009-04-19 09:39:19 -0700 H.G. Muller : changes by H.G. Muller; version 4.3.4 2009-04-19 09:34:31 -0700 H.G. Muller : changes from H.G. Muller; version 4.3.2 2009-04-19 10:26:24 -0700 H.G. Muller : changes from H.G. Muller 2009-04-16 23:06:13 -0700 Arun Persaud : cleaned up the directory a bit. Removed winboard-dm-beta, merged the two Changelogs together 2009-04-16 14:12:48 -0700 A. Scotti : changes from Alessandro Scotti from 20060129 2009-04-16 14:09:33 -0700 A. Scotti : changes from Alessandro Scotti from 20060112 2009-04-16 14:04:02 -0700 A. Scotti : changes from Alessandro Scotti from 20051231 2009-04-16 13:59:12 -0700 A. Scotti : changes from Alessandro Scotti from 20051129 2009-04-16 13:53:41 -0700 A. Scotti : changes from Alessandro Scotti from 20050322 2009-04-10 04:18:59 +0000 Arun Persaud : translated a handfull of strings and set the codeset to UTF-8 for the translations. 2009-03-18 03:20:50 +0000 Arun Persaud : Translation: added German po file (roughly 50% translated) 2009-03-01 04:23:54 +0000 Arun Persaud : fixed bug #22853: changed all .Xdefaults to .Xresources in xboard.texi 2009-03-01 02:43:43 +0000 Arun Persaud : fixed bug #25672, patch #6182 by adding DESTDIR support to Makefile.in 2009-03-01 02:33:26 +0000 Arun Persaud : fixed a warning message in the configure script 2009-02-28 22:58:57 +0000 Arun Persaud : fixed parser.l. Should fix bug #22812 2009-02-28 22:58:14 +0000 Arun Persaud : fixed parser.l. Should fix bug #22812 2009-02-28 22:55:30 +0000 Arun Persaud : added myself to the AUTHOR file 2007-06-15 04:26:57 +0000 Mark Loli : Initial check-in of NSIS Winboard installer files. * 06/12/2005: bugfix some more possible buffer overflows. * 06/27/2004: added simple icsEngineAnalyze for xboard * 06/26/2004: added icsEngineAnalyze for winboard: Analyze observe games with a chessprogram on a Internet Chess Server (ICS) * 02/12/2004: Bugfix ICS interaction console crashed while chess engine starting and user type in some stuff. We wait now to finish the engine boot. * 02/11/2004: Winboard: Added color lines for the ics interaction console if zippy used * 02/09/2004: Added mousewheel support for winboard. Play moves backward and forward with the mousewheel. xboard/WinBoard 4.2.7 -- Fri Nov 28 13:36:00 PST 2003 -- Tim Mann * 11/26/2003: In WinBoard, setting the -debug flag now logs ICS output to WinBoard.debug too. (This isn't needed in xboard because ICS output already goes to stdout, so it's easy to capture along with the debug output on stderr.) This was issue #280 in the ToDo file. * 11/23/2003: Cleaned up some minor problems in cygwin.mak. Thanks to Hans Werner Strube for the problem report. * 11/23/2003: Updated the default list of chess servers in winboard/defaults.h. Deleted two that appear to be dead and added a new one that is active. * 11/19/2003: Swapped icon_white.bm and icon_black.bm in XBoard. Hopefully this will get them the right way around by default on more X window managers. I wish I understood this better. * 11/18/2003: Implemented a simple 32-bit random number generator for WinBoard, replacing the Windows rand(), which ranges only up to 0x7fff. Formerly on Windows, only zippy.lines sayings that started in the first 32767 bytes of the file could ever be used. This was issue #505 from the ToDo file. * 11/16/2003: The xboard man page and info files are now built from a common set of texinfo source files, and the xboard man page now covers cmail as well. Formerly, ever since the texinfo file was first contributed to the project, it was separate from the man page and the two files had to be updated in parallel, making for a maintenance nightmare. To make combining the files possible, I took the Perl script "texi2man" from the GNU Units project and added support for a larger subset of the texinfo markup language. I then carefully compared the old man page and old texinfo file to make sure the latest and clearest words survived into the new combined texinfo file. It would be great to merge in WinBoard's help file too, but that's a larger project. It would have to be heavily conditionalized to deal with differences in features between XBoard and WinBoard. * 11/15/2003: Cleaned up and applied a small patch from Daniel Mehrmann, to stop overly long PVs in thinking output from causing a buffer overflow crash in backend.c. * 11/5/2003: When a chess engine sends a "telluser" command (including the cases where "tellall" or "tellopponent" acts like telluser), the information now goes into a nonmodel popup that is automatically dismissed when the user clicks anywhere on the board. This fix is more significant on WinBoard, where formerly you got a fully modal dialog that had to be dismissed by clicking on OK before anything else could happen. The bug was issue #406 in the ToDo file. * 11/1/2003: Removed email addresses from this file to reduce spam load, as it gets linked to from the Web. * 11/1/2003: Updated READ_ME and winboard/READ_ME.txt. * Modified xboard and winboard makefiles to be able to build the project in the new combined directory structure. * Applied a small security fix to pxboard, from Martin Maeok. * Fixed a bug in the game list dialog. The change in 4.2.6 to opening games in text mode (meant to avoid getting extra \r's into comments) caused a new bug in determining seek offsets when parsing a game file to form the game list. Also, the change was incomplete; on some code paths games were still being opened in binary mode. Thanks to Lenik Terenin for reporting the offset bug. I've now gone back to always using binary mode when reading game files, and I've fixed the comment bug by adding code to remove \r's from parsed comments explicitly. I still use text mode for writing game files so that games written by WinBoard will have Windows-style line endings. * Fix for minor bug in WinBoard installer. If you chose a non-default destination directory, the default directory was still used for a couple of unimportant things, namely setting the App Paths registry keys (unused by WinBoard) and trying to copy the existing WinBoard.ini file to WinBoard.old. I inherited this bug from the InstallShield 5 sample template. Thanks to "l.d." for noticing the incorrect keys. * Patch from Chris Priest: when two engines are being run through rsh, avoid reusing the same stderr port for both. I'm not sure why this should be needed, but it's harmless, at least. * Bugfix: The kludge to deal with old engines that give an error message because they don't know the "st" command was too sloppy; it could hit on an "st" substring anywhere in an error message. GNU Chess 4 is the only engine I know of where the kludge was needed, so I changed the kludge to match a longer, more GNU-specific string. * Changed the WinBoard self-extracting installer to choose a unique temporary subdirectory name within the Windows temp directory instead of always putting wb-setup directly in temp. Besides being better practice, this avoids the need to deltree wb-setup first, which occasionally alarms someone who thinks that deltree is only used by trojans to delete all your files. (Yes, I'm serious.) * Fixed a bug where FICS-style "wild/0" strings were not parsed as the proper wild type. The "/" was not being skipped. * Fixed a WinBoard bug where temporary files created by game copy/paste were being created in the root directory of the current drive instead of the TMP directory and were not always deleted on exit. * Fixed a small bug in winboard.c's ErrorDialog() function. Thanks to "Ron" (no last name given). The bug might have caused a problem when pressing OK or Cancel in an error dialog when more than one error dialog was being displayed, but I'm not really sure. * Removed a hack that worked around a bug in very old versions of Crafty, where it would sometimes reply "illegal move" to a "." command. The hack kept us from recognizing real illegal move messages in analyze mode from engines that don't respond to the "." command. Thanks to Fabien Letouzey for the report. * Fixed a bug in the xboard version of GetDelayedEvent. It would return the most recently scheduled event even if it had already fired. This caused at least one visible error: in -ics -xreuse mode, starting the engine again and seeing another "feature done=1" would re-run the initialization code in InitBackEnd3, including the code that opens the connection to ICS. The WinBoard version didn't have this bug. Thanks to Bob Hyatt for the bug report. * The promotion popup for ICC wild 26 (giveaway) now includes King. Thanks to Fredrik Josefsson for the bug report. * The first game in a file (or being pasted from the clipboard) can now start with a bare move -- no PGN tags, no move number "1", etc. Suggested by Shane Harrelson. One could imagine taking this farther and accepting something like "e4 e5 1/2-1/2 d4 d5" as two games, but I haven't done that. * Bug fix: xboard didn't really accept a paste of multiple games, contrary to what I wrote when adding the feature to WinBoard in 4.2.4. Now it works in both. * Fixed generic start/end of game messages to work on chess.net, where they put ratings in parens after the player names. * Updated config.sub and config.guess to newer versions from automake-1.4p5-2. This makes configure work with MacOS X + X11. * Bugfix: when examining a game fragment on FICS where black plays first, don't show two "(0:00.000)" times on the initial "none" move. * If TestLegality is on and one of the engines makes an illegal move in TwoMachines mode, it forfeits immediately. Formerly the game would get stuck at that point and the engine that made the illegal move would eventually lose on time. xboard/WinBoard 4.2.6 -- Fri Feb 1 22:26:31 PST 2002 Tim Mann Another small bugfix release. * Put in a small change from Alexander Mai to allow xboard to build in an OS/2 EMX environment. * Fix WinBoard-only bug where editing a PGN file with comments would insert more \r characters before the \n after every Load/Save cycle. For some unknown reason we were reading the files in "rb" mode but writing them in "a" mode, so we kept the \r characters on reading and added an extra one on writing. Fix: change the "rb" to "r". Thanks to Joel (last name not given) for the bug report. * Put the arguments to rsh/remsh in the right order for better portability. Thanks to Michael Kalisz. * FreezeUI is now implemented in WinBoard; it was previously only implemented in xboard. This function prevents the user from entering moves or other commands while we are waiting for an engine to initialize itself. Implementing it fixes a bug where the user could start a game (etc.) during feature negotiation. One of the symptoms of this bug was that we could send "new" one or move moves *after* the first game started! * Fixed some handle leaks (WinBoard only), including a nasty one that leaked one handle per command sent to ICS. Thanks to several folks who helped characterize the bug and tried to look for leaks. * We now install and look for the info file in ${prefix}/share/info instead of ${prefix}/info. The latter is still the default in autoconf, but the former is currently used in Red Hat Linux and probably elsewhere. xboard/WinBoard 4.2.5 -- Sat Dec 15 11:42:51 PST 2001 Tim Mann * Changed the bundled GNU Chess 5.02 in the WinBoard package to include a much smaller book and to use much less hash table space by default (8 MB transposition table, 0.5 MB pawn evaluation table). The large book included with 4.2.4 made the WinBoard download too big for some people, and the default hash tables were larger than the available physical memory on some people's computers. I built the small book by running Crafty's "small.zip" book line collection through a Perl script that makes it look enough like real PGN games that the GNU Chess book builder will accept it. The script and some minor patches to GNU Chess 5 are available in the WinBoard source distribution and at http://www.tim-mann.org/gnuchess.html. * Fixed a bug in the code that deals with engines that complain that "time" and "otim" are illegal moves. This was a new bug in 4.2.4. * Revamped the implementation of ToStart in analysis mode. Formerly there was some ill-conceived code that would try to get back to the start of the game by doing a "new" command (and all the followup commands that requires) while remaining in analysis mode. This is problematic for engine authors to support, though it works with Crafty. This code was trying to solve the problem of ToStart being slow because the engine would try to start an analysis after every "undo" command all the way back to the start. But ToEnd already had a much better solution to this problem, and now ToStart does the same thing: we exit from analysis mode and enter force mode instead, make/unmake moves to get to the end/start of the game, and then reenter analysis mode. * Formerly, Zippy could try to start playing a game before the engine was initialized; that is, during the initial timeout for protover 1 engines, or before "feature done=1" for protover 2 engines. We now wait until the engine is initialized before connecting to ICS, which fixes this in the common case. If you turn off engine reuse for multiple games (that is, if you give the -xreuse option), there could still be problems; see item 503 in the ToDo file. Thanks to Dieter Buerssner for the bug report. * Bugfix: All WinBoard versions since the merge with WinBoard Plus (but not xboard) have had a bug in changing the PeriodicUpdates, PonderNextMove, and ShowThinking options from the menu. The bug mostly just caused changing these options during a game to not take effect until after the next reset. For TwoMachines games, though, changing PonderNextMove just before the game would take effect immediately for the second engine but not until the next game for the first engine. Thanks to Koundinya Veluri for the bug report. * Bugfix: In 4.2.4, we sometimes got confused when trying to leave and reenter analyze mode. One symptom was that Analyze File did not work. Thanks to Igor Syry for the bug report. xboard/WinBoard 4.2.4 -- Sun Dec 9 14:56:30 PST 2001 Tim Mann * WinBoard now includes GNU Chess 5.02 in place of GNU Chess 5.00. * WinBoard's PasteGameFromClipboard will now handle a paste with multiple games in it, popping up the game list dialog. xboard already did this. Suggested by Robert Gerstman. * We now use the "clearboard" command on ICC where appropriate. * Bugfix: don't generate a bogus "variant normal" command to an engine for the loadable ICC wild types that we internally flag as VariantLoadable. Also clarified the message that Zippy sends when declining such wild games -- it can't deal with the possibility of loading an arbitrary position into the game. Thanks to Dieter Buerssner for reporting the problem. It would be nice to be able to actually play these wild types some day; presumably there would have to be an option to either send "loadgame" with a specified position, or to deal with an opponent sending it. * If we get a holdings message from ICS when we thought we were playing normal chess, we now try asking for a move list so that we can find out from the header what's really happening. Formerly we guessed bughouse in this case. Response to a comment from Gian-Carlo Pascutto. * Fixed two longstanding bugs in the clock code. These affected only play between a user and a local engine, or between two local engines, not ICS play. (1) The last fractional second used by a player before moving and virtually pushing his clock was being charged to his opponent instead of to him. (2) The time and otim commands were being sent to an engine before the (buggy) fractional second update was done. The second bug was pretty harmless in itself, but the first one was serious. Many thanks to Peter Rosendahl for carefully diagnosing and reporting these bugs! * Changed WinBoard timestamp key. Nothing is changed other than the key and a recompilation. ICC may phase out the old key soon; if they do, you'll need to use the timestamp.exe from WinBoard 4.2.4 or later to connect to chessclub.com. * Fixed an xboard-only bug where most dialogs would not take keyboard input unless the mouse was actually over the dialog, even if the dialog window had focus. Thanks to Jason Varsoke for the bug report. * Bugfix; Remember to send time and otim commands to engine before sending playother. Thanks to Bob Hyatt for the bug report. Also fixed a bug where time and otim were sometimes sent even with feature time=0. * Added small patches from Wilkin Ng that are meant to fix a crash in CopyGameToClipboard and a "can't unlock clipboard memory" error in PasteTextFromClipboard, under Windows 2000. * Changed cygwin.mak to not use -mno-cygwin. In other words, it now uses cygwin1.dll instead of the mingw libraries. This works around bugs in fileno() and stat() that I encountered in mingw. (fileno seems to always return 0. stat fails because the library routine uses a different definition of struct stat than the header files provide.) Thanks to Robert Gerstman for reporting the symptoms these bugs caused when WinBoard was compiled with Cygwin. * Added -showButtonBar option. This lets you delete the << < P > >> buttons and thus widen the message widget a bit. * Added code to address a very obscure bug. If an engine dies and needs to be restarted while in one of the analyze modes, it was not getting put back into analyze mode. This bug should not really ever have gotten tickled unless reuse was turned off and the engine sends game end commands (such as 1-0) when a game ends by rule while in analyze mode. The next version of the protocol spec will say that engines should not do that, but version 2 and earlier didn't address the issue. * We now use the FICS "iset ms 1" feature to get times in ms instead of seconds. Thanks to DAV for email telling me about this feature. * Changed clock display to show tenths of seconds for 9.9 seconds and less, instead of 0.9 seconds and less as before. * It has been discovered that Zippy can play simuls on ICC (but not on FICS). If you arrange for Zippy to send the ICC command "simulize" in the -zippyGameStart string, it will accept additional games while playing. Zippy will use the same engine for every game, so whenever it switches opponents, the engine's state will be reset with the "new" command. This will of course weaken its play, so don't enable simuls if you want your engine to have the highest possible rating. Zippy was never designed to work with simuls; it just works by accident, and it hasn't been tested much. So please report any bugs you notice, but don't expect them to be fixed rapidly. Thanks to Paul McGuire for noticing that this works. * Bugfix: Suppress the direct command to engine popup if there is no engine. In WinBoard this case used to cause a crash. Thanks to "Dargon" for the bug report. * Bugfix: formerly we did part of the engine initialization for the very first game too soon, before feature negotiation. One result of this is that engines would never get the "ics" command for the first game. * Lengthened timeout to detect protocol version 1 chess engines to 10 seconds. This should reduce problems with protocol version 2 engines that are slow to initialize missing the timeout and not getting a chance to send their feature commands before the first game starts. * Klaus Friedel says that adding a short sleep to WinBoard after starting a new chess engine solves a problem that occurs under Windows 2000, in which engines sometimes don't see the initial command(s) from WinBoard and hang. I don't understand how that can happen, but the sleep is harmless, so I've put it in. Others have also reported what may be the same problem, so hopefully this will fix it for them too. * Bugfix: editing the Result field in EditTags will no longer cause a later crash. Thanks to DAV for a clear bug report that let me reproduce the problem. * ICC wild 28 is now recognized as shatranj, but it is not supported. You might be able to play it by turning off Test Legality. * Formerly we would always turn off "feature time" if the engine printed an error message with the string "time" or "otim" in it; now we do that only if the message comes before the engine makes its first move. This change is useful because some engines spew a lot of bogus error messages about commands they don't fully parse, so something like "result 0-1 {White lost on time}" could generate such a message. Engines shouldn't do that, but if they do, mysteriously turning off "feature time" is not a good way to react. * Fixed an infrequently occurring Zippy bug: formerly, resuming from adjournment by position (that is, with GetMoveList turned off) or starting/resuming a wild game (nonstandard starting position) would try to set up the position without putting the engine into force mode first. That was probably tolerated by most engines, but if the position was black-to-play and the engine hadn't set feature setboard=1, then the fake "a2a3" move (which we use as a kludge to get black to be on move before sending the edit command) would appear to be a real move, and the engine might reply to it! This bug could also be seen when trying to use Zippy to play a simul -- something that Zippy was never designed to support, but which seems to mostly work anyway. Thanks to Paul McGuire for sending a WinBoard.debug file that showed the bug occurring. Some other cases of resuming adjournments or starting games from nonstandard positions may have been broken too; I think I've straightened out the problems. * Agreeing to a draw in the human vs. local engine case formerly did not work if the human offered first; now it does. A human's unsolicited offer is considered valid until he makes another move. Thanks to Bruce Moreland for the bug report. * Bugfix: We used to look for just "fr" in Event tags or strings from ICSes to recognize Fischer Random games. This caused a lot of false matches. Now we look for "wild/fr" instead, which is what FICS uses. * Bugfix: Clicking on a move in the MoveList window only updated the displayed position; if a chess engine was active, its state was not updated. Thanks to Alejandro Dubrovsky for the bug report. * Bugfix: The "resign" command from engine to xboard formerly did not work in ICS (Zippy) mode. * Bugfix: Formerly we would register a garbage premove if the user clicked on a piece, then clicked on an edge or outside the board. Now such an errant click is ignored. * Bugfix: GameEnds would send "exit" to an engine in analyze mode even if we did not actually want to leave analyze mode. * Bugfix: "feature pause" was being rejected. We don't currently use it, but that is no reason to reject it. Thanks to Gian-Carlo Pascutto for the bug report. * Bugfix: when "partner" needed to be sent both to ICS and the engine, Zippy was erroneously sending the ICS prefix character to the engine too. Thanks to Gian-Carlo Pascutto for the bug report. * Zippy now declines challenges when the engine is not yet ready to play again, instead of ignoring them. This is needed so that the server will let the opponent repeat the challenge. It might be better to remember such challenges and accept them when the engine is ready, but that would be a bit more complicated to implement. * Bugfix: Zippy's emotes didn't work on FICS because there, "i" is a built-in alias for "it", not a real command. So sending "$i foo" gave an error message instead of doing "it foo". We now leave out the alias-suppressing prefix for emotes. xboard/WinBoard 4.2.3 -- Mon Feb 19 19:55:05 PST 2001 Tim Mann * Bugfix: The error message "Variant X not supported by gnuchessx" formerly could pop up even in -ncp mode. * Fixed an xboard bug in premove highlighting. If you had HighlightLastMove turned on, premoves got highlighted in highlightSquareColor (yellow) instead of premoveHighlightColor (red). * Modified premove again. Now we are back to displaying the move locally immediately after sending it to the server, as in versions prior to 4.2.1. This is good because it lets you register your next premove sooner. As a better fix to the problem that the change in 4.2.1 had been trying to address, we now suppress animating the opponent's move if you have a premove reply pending. However, it's probably still a good idea for you to turn off AnimateMoves entirely if you are trying to play extremely fast games. * Removed an erroneous patch that left zombie chess engines around when both sigterm and reuse were turned off. (Bug was in xboard only, not winboard.) * Bugfix: loading a game with autostepping did not work for games with PGN result "*" (unfinished). This bug was introduced in 4.1.0, caused by some outdated code that was supposed to leave you in EditGame mode after loading an unfinished game. I fixed this, and also changed it to leave you in EditGame mode after loading *any* game, but without changing the tags to say it's an edited game. It's not really clear whether that is the best thing is to do here -- ideally, perhaps, the tags should change to say "edited game" if you actually make any changes, but that is harder to make work. xboard/WinBoard 4.2.2 -- Tue Feb 6 20:00:00 PST 2001 Tim Mann * Fixed a problem introduced in 4.2.1. In -zippyPlay mode, 4.2.1 started sending the initString immediately after the old game ended, but then when the next game started, it would still send "force" and another initString. Another problem was that the first initString put the engine out of sync with the displayed board position, though that might not usually have been noticeable. This is now changed to do a full Reset at the end of the previous game, and avoid doing a Reset at the start of a new game if we are still in BeginningOfGame mode. * Fixed some limitations in -zippyPlay mode. The engine was not being fed the moves or history of games that were displayed but not being played, so it would get confused if you tried to do something like examine a game, then enter EditGame mode from somewhere in the middle of the game. * Made a small change so that cygwin can compile xboard for Windows (an X server is required to run it). Thanks to Volker Zell. Most people would probably prefer to run WinBoard on Windows, however; note that cygwin could already compile WinBoard. * Added some missing documentation to engine-intf.html: It is okay to send "feature done=0" even before you receive the xboard and protover commands, if this is needed to give your engine enough time to initialize. See engine-intf.html for more discussion. * Bugfix: "feature done=0" did not work for the second engine; now it does. xboard/WinBoard 4.2.1 -- Sat Feb 3 19:52:26 PST 2001 Tim Mann * Bugfix: in Zippy mode with feature san=1, the elapsed time was being sent to the engine after the SAN move; for example, "e4 (0:01)" was sent instead of just "e4". * It seems that scroll wheel mice with incompletely installed software (under Windows 95, at least) can send repeated middle button up events when the wheel is turned. Moved QuickPaste from middle button up to middle button down to avoid problems with this. * A premove is now sent *before* the opponent's move that it replies to is animated. The premove itself is no longer displayed (or animated) when sent; instead, it is displayed when the chess server echoes it back as a board update. * Bug fix: in -xreuse mode, xboard was only sending command line arguments to the engine the first time it was started. (WinBoard didn't have this bug.) * In -zippyPlay mode, we now initialize the chess engine for a new game immediately after the old game ends. (In -xreuse mode, this means starting a new engine process; in the default -reuse mode, it just means sending "new".) If the engine supports ping, we don't accept challenges until the "new" has finished. This should help avoid losing time (re)initializing the engine after the game starts. * We now handle the new FICS field in style 12 that says whether the clocks are ticking. * whiteFlag and blackFlag are now reset whenever an ICS board image arrives, giving autoflag a fresh chance to work. * Suppressed "geometry error" debug messages unless -debug flag is given. * Bugfix: avoid core dump on Solaris with -debug flag, caused by passing NULL to a %s format in GameEnds. * Added -firstProtocolVersion and -secondProtocolVersion. This will allow use of extremely broken engines that hang or die when given the "protover 2" command. It should be rarely if ever needed. * Zippy now strips highlights from player names in the Creating message; previously the ratings would not be extracted from this message properly if you had set the highlight variable. * Bug fix: Zippy with -zp but not -zt used to be fooled by false partner tells inside channel tells; e.g.: Garf(24): Garf (your partner) tells you: sit * Bug fix: when an engine reported its name with the new "feature myname=" command, we had been putting just that name into the window title even when in TwoMachines mode. * By default, WinBoard no longer uses the new feature introduced in 4.2.0beta of keeping the ICS menu, ICS server list, and lists of chess engine command lines in separate files; instead, the lists are back in the winboard.ini file. This gets rid of some problems where the separate files could not be opened because the working directory was not set to WinBoard's installation directory. * WinBoard command lines and ini files now have another optional syntax for quoting an option value. All characters within { } curly braces are interpreted literally except for '}' itself. SaveSettings now uses this syntax for string values that contain a backslash or newline and do not contain a '}'. This should address the problem that the separate .ini files had been meant to fix; engine command line lists can now be written without \-escapes. * Fixed three bugs in relaying moves between engines in TwoMachines mode: an engine would be sent SAN if the *other* engine had set feature san=1, a relayed SAN move did not end with a newline, and feature usermove was not implemented for relayed moves. * Fixed several bugs in exiting: File/Exit would sometimes hang; timestamp/timeseal would not get killed off; an engine crash would cause error messages to be printed recursively until stack overflow. * Fixed a bug in the code to detect which ICS is in use and adapt to it; the chess.net case was broken. * Removed the leading alias-suppression character when sending a move to ICS, because it seemed to break accuclock on chess.net. * Fixed a bug where a FICS prompt like "10:01_fics%" would be matched as finger note number 10, causing a problem detecting when the user is logged in. * Added tellicsnoalias command to protocol. * Changed st command in protocol back to old behavior. * Added done=0 feature to protocol, to lengthen initial timeout. * Added missing -colorSeek command line option to xboard. (Was present in WinBoard.) * Bug fix: setting feature reuse=0 was not working. xboard/WinBoard 4.2.0beta -- Sat Dec 16 16:34:56 PST 2000 Tim Mann * Setting -searchTime no longer turns off -clockMode. Note that when -searchTime is set, some engines may search for the lesser of searchTime and the amount of time their normal clock management would dictate, while others will disable their normal clock management and always search for exactly searchTime. * Fixed WinBoard bug where on Windows 2000 (and maybe Windows 98) the ICS Interaction window would scroll back to the top whenever it filled to capacity and WinBoard trimmed some text off the top. * Changed xboard dragging so that the center of the dragged piece is forced to be over the mouse cursor. (WinBoard dragging already worked that way.) This should avoid confusing cases when you start a drag with the mouse near the edge of a square -- formerly most or all of the piece could be over one square but the mouse cursor over another. Suggested by DAV. * Added move list window for xboard. Code contributed by Manuel Hoelss and re-hacked a bit by me. Performance of this window is poor, because the implementation regenerates the entire window contents whenever anything changes. It's hard to avoid this when using the Athena List widget, though we could be a little smarter and notice when the current move number has changed but the move list has not. There are also several drawing problems caused by bugs in the Athena Form and List widgets. The window should not really allow a horizontal scroll bar, but the bugs are much worse if I turn it off. In both Xaw and Xaw3d, the List widget tries to resize itself when XawListChange is called, even if you tell it not to; and what's worse, if the widget cannot resize itself to be large enough to avoid clipping any of the list item, it does not change the list! Arrgh. On top of that, the Xaw Form widget is very buggy in XFree86 4.0.1 (X11R6.4.3). * The OK button in the WinBoard startup dialog is now simply disabled if none of the radio buttons is selected, instead of bringing up an error dialog. Suggested by Ted Milbaugh. * Used ping to address the worst of the race conditions in the protocol. Now if an engine supports ping, we ping it after sending the "new" command and after trying to place it in force mode at the end of a game. When a ping has been sent and the corresponding pong has not yet come back, we (1) ignore or undo any moves the engine sends, (2) ignore game end messages (such as "offer draw", etc.) from the engine, (3) ignore thinking output from the engine, (4) delay starting the next game if in -matchGames mode, (5) in -zippyPlay mode, respond to challenges with a polite message to try again soon instead of accepting them. There are a few more things that should be done (and item 5 might not be quite what we want), but it's hard to fit them all into the existing code. * Patched the version of GNU Chess 5.00 included with WinBoard to support protover, feature, setboard, and ping, and to fix some minor bugs. See gnu500+.patch. * Changed the GNU Chess 4 kludges for missing "st" and "sd" commands to be invoked only if the engine gives an error message for "st" or "sd", and to always use protocol commands instead of engine command-line options. See "Idioms" in engine-intf.html. * Added new protocol command "protover 2" to tell the engine what version of the protocol is in use. Version 2 is still compatible with old engines; see engine-intf.html. * Add new protocol command "feature ..." The engine can send this in response to the protover command command, to say what extended protocol features it would like to enable, etc. xboard responds "accepted F" or "rejected F" for each feature F that is set. See engine-intf.html. * Added new protocol command "setboard ". This is an alternative to "edit", used only if the engine says "feature setboard=1". * Added new protocol command "ping ". The engine is supposed to respond "pong ". This gives us a tool to fix some race conditions in the protocol, but it is not used to the fullest yet. * Added new protocol command "tellopponent". This will do a "say" if you're on a chess server in Zippy mode, or pop up an information dialog otherwise. * Added new protocol command "tellall". This will do a "kibitz" if you're on a chess server in Zippy mode, or pop up an information dialog otherwise. * Added new protocol command "tellothers". This will do a "whisper" if you're on a chess server in Zippy mode, or do nothing otherwise. * Changed the WinBoard /icsNames, /icsMenu, /firstChessProgramNames, and /secondChessProgramNames options to accept a filename preceded by "@", meaning to find the value in the file. Changed the defaults to use this feature, with filenames icsnames.ini, icsmenu.ini, fcp.ini, and scp.ini. This should make it easier for users to edit the values, since one less level of quoting is needed, and each value is in its own file, not mixed into winboard.ini. Those who upgrade from an older winboard version and already have a winboard.ini file will not automatically have these values moved to a file; that has to be done by hand if desired. * We now strip .exe from engine names for "name" command, tags, etc. * Allowed WinBoard input widget to hold more than one line. You can get a newline into the widget with copy/paste or with Ctrl+Enter. * Fixed an xboard bug where the [P] button would appear in the opposite highlight state from what it should be after being pressed. * We now use the "/" or "$" alias suppression feature on the chess servers, to avoid problems if the user inadvertently aliases a needed command to something else. * Changed the method used to deiconize xboard in AutoRaise and cmail. This may fix bugs under some window managers where after deiconization, the board window was mapped but nothing was drawn inside. * Preliminary, partial support for playing several chess variants against a local engine or editing variant games. The -variant option must be given on the command line or WinBoard startup dialog; there is no menu. The current variant is not displayed (except in the Tags/EditTags window). Many variants will not work quite right even if the engine supports them; see item 326 in the ToDo file for details. * Added a workaround to detect the variant type when examining a scratch wild game on an ICS. * Fixed two cases where "variant" command should be sent to the engine when necessary but was not: loading a game from a file and restarting a dead engine. Thanks to Gian-Carlo Pascutto. * Added missing support for FICS games that start from a bsetup position with Black moving first. * Fixed a bug in loading a file from the game list window while in Analysis or AnalyzeFile mode. This now leaves us in AnalyzeFile mode, analyzing the new file. * Fixed a bug in loading games with a comment before the first move. * Fixed a bug in handling LoadGame (or -lgf) with -td 0. * Added a command line option to select an initial minor mode from the Mode menu. This should satisfy requests from a couple of users with special applications. * Fixed a problem where some things in WinBoard's General Options dialog box were grayed out at the wrong time. * We look for a few messages from the chess engine pipe that are intended to catch problems starting an engine via rsh, such as "No such file". Moved code so that these strings won't match until other protocol messages have been looked for, and documented the messages in engine-intf.html. * Fixed the WinBoard bug that sometimes made the console input box white-on-white even when not in password-entry mode. * Small changes to WinBoard to be compilable with the latest Cygwin net release (as of 10-16-2000). Thanks to Mark Schoenberg. * Recompiled GNU Chess 5.0 for WinBoard with the latest Cygwin net release (as of 10-16-2000). Also rebuilt the book just to be sure, since I had one bug report about it. It came out identical and seems to work fine. * Added messages for some common InstallShield errors instead of just printing InstallShield's stupid error code numbers. * Added -firstComputerString and -secondComputerString, allowing you to suppress or change the command that is sent to a chess engine when its opponent is another computer. * Added "configure --with-Xaw3d" to allow use of Xaw3d widgets instead of Xaw widgets in xboard. Thanks to Johnny C. Lam of the NetBSD project. I've left Xaw as the default because Xaw3d is too ugly. * The version of the Xaw Form widget released in XFree86 4.0.1 (X11R6.4.3) has a bug that causes xboard to display the button bar on top of the message widget. I've reported the bug and have installed a kludge workaround into xboard. xboard/WinBoard 4.1.0 -- Sun Sep 17 17:30:14 PDT 2000 Tim Mann * Merged Winboard Plus 4.0.8 from Mark Williams into xboard source pool. Status of Winboard Plus features in xboard: - White pieces now have borders, but the implementation is completely different from WinBoard's; see below. - Options menu not changed, probably won't be. - Copy&paste support working, using Mark's changes to backend.c, Ben Nye's changes to xboard.c for FEN positions, and some code of my own in xboard.c for PGN games. - Premove hooked up and working. No pre-first-move, though. - ICS Alarm hooked up and working. - Auto-flip working. - PGN Training mode hooked up and working. - Improved menu item enable/disable working. - Improved >> button working. - Auto activate board working. I changed this to be optional; you might not always want it, especially in Zippy mode. - Blindfold working. - Documentation updated. * Fixed more colorization bugs. Commands like "message foo tells you: xxx" and "tell 33 tells you: xxx" will no longer generate bogus colorization. * Added low-tech sound support to xboard, by invoking an external program on a filename for each sound to be played. * ICC wild 27 is now recognized as VariantAtomic, and it sets the "ignore check" flag, but is not otherwise supported. * Converted the piece bitmaps from .bm to .xpm for use with xboard's xpm support. (An .xim version was not created.) Wrote a shell script using ImageMagick to do the conversion and to bucket fill from coordinate 0,0 with the background color. Used xpaint by hand to clean up a few pieces where background color "leaked" into the inside or didn't flow all the way around the outside, then a sed script to fix up color names and bitmap names in the xpaint output. If any more sizes are added later, they should be straightforward to convert with reference to the existing scripts. With this conversion, not only do the white pieces now have dark borders, but (unlike with WinBoard) the light details on the black pieces are opaque. * If the XPM library is found when building xboard, the new xpm pieces are compiled in as the default. External bitmap (or xpm) pieces can still be used by giving the -bitmapDirectory (or -xpmDirectory) option. If the XPM library is not found, the old bitmap pieces are the default. In this case external bitmap (or xim) pieces can be used by giving the -bitmapDirectory (or -xpmDirectory) option. There is no way to compile in xim pieces. Winboard Plus 4.0.8 -- Sat Aug 5 15:51 PDT 2000 Mark Williams * Bugfix release. * Main menu now visible in Win NT. Thanks to Microsoft for creating a compiler which auto-mutilates the WinBoard.rc file so that the menu is displayed under Win 98 but not Win NT. I fixed the problem by hand editing the .rc file. Sigh. * "Reset game" now works properly when invoked from Analysis mode when two engines are present. Correction of bug introduced in Winboard Plus. Thanks to Mogens Larsen for reporting the bug. * Pasting a FEN position with Black to move now works in all modes. Thanks to Mogens Larsen for reporting the bug. * Added gnuchess.dat to the distribution and a couple of text files that were missing in 4.0.7. *** Merged in the following changes from Tim Mann: * Bugfix: Highlights would sometimes not be taken down, at least in xboard. The problem is that SetHighlight works in chess coordinates, not view coordinates, so if flipView has been toggled since the highlight was put up, it gets taken down from the wrong square. Fixed by being careful to call ClearHighlights before toggling flipView, not after. Ugh. * Bugfix: HighlightLastMove would sometimes highlight square a1 after a FICS "tomove black" command. * Bugfix: a move list with initial position that has black to play was not being handled correctly. * Removed "decline abort" and "decline adjourn" commands from Zippy. The syntax is changing on FICS, and Zippy really doesn't have to explicitly decline the requests anyway; it's sufficient to not accept them. * ICC wild 26 is now recognized as VariantSuicide (the FICS name; ICC calls it "giveaway"). * Bugfix: PGN games with black to move in the initial position weren't being legality checked correctly. I think this was introduced in 4.0.6 when I fixed a different PGN bug. Thanks to Mark Williams for spotting the bug and suggesting a fix. * Bugfix: the initial "name(" of a kibitz wasn't being colorized. Winboard Plus 4.0.7 -- Thu May 12 17:57 PDT 2000 Mark Williams * New white pieces with black borders. * Major overhaul to Options menu. New dialogs for setting General Options, Board Options, ICS Options, Sounds, Fonts, Colors. * Clipboard support for PGN game scores and FEN positions. * Optional ICS Premove with user-specified first moves for White and Black. * New sound events: ICS Win, ICS Loss, ICS Draw, ICS Unfinished, ICS Alarm. * New auto-flip option when playing against a chess program. * Added PGN Training mode. * Certain menu options now disabled while program is thinking. * ">>" button now always goes to the end of the game. * In ICS mode, the board is automatically activated at the start of a new game. 4.0.7 -- Sun Mar 5 17:17:49 PST 2000 Tim Mann * Fixed a nasty bug in parsing ICS game histories that was introduced in 4.0.6. 4.0.6 -- Fri Mar 3 16:20:11 PST 2000 Tim Mann * Fixed bugs in Zippy's code for responding to messages sent with the ICS "message" command. * Fixed bugs where xboard could still create dialogs partially off the top of the screen. Fixed unwanted interactions between initial sizes and positions of various unrelated xboard dialogs. Deleted borderXoffset and borderYoffset resources. * Fixed restoring the xterm name on exit to work in more cases. * Small fix to the WinBoard self-extracting installer: when it starts up, it now always deletes any old wb-setup directory left over from a previous installation. Formerly this worked only on Windows 95/98, so on NT the self-extractor would sometimes stop and ask the user whether it was OK to overwrite the old wb-setup files. * Modified WinBoard to be compilable with the free Cygwin tools available from http://sourceware.cygnus.com/cygwin/. Based on work by Mark Schoenberg. (His mods were enough to get WinBoard through the compiler, but a few things were broken along the way, so I reworked them.) * Merged changes from Don Fong to make WinBoard compilable with Borland C++ 4.5. I do not have Borland C++ and am unable to test with it, but I did make sure the changes don't stop it working with MSVC++ 5.0 and Cygwin. * Forbade entering TwoMachines mode from MachineWhite or MachineBlack mode when machine is on move. This used to confuse the engine and cause problems, because when we try to get the engine to stop, it might make a move first, and it might not do that immediately. * Variant classification now deals with new ICC wild 25, classifying it as "3check". Also, we are now conservative about new wild numbers we don't know about, classifying them as "unknown" instead of "normal". * Replaced bad GNU Chess 5.00 book in WinBoard distribution with a correct one. 1.e4 now no longer takes GNU Chess 5.00 out of book! Thanks to Pete Galati. * Made move parser accept and ignore nonstandard ep suffix on PGN moves, e.g., "exf6ep" or "exf6e.p." * Fixed bugs in parsing PGN files starting with no move number, or with a move number other than "1." (including "1..."). Thanks to Michael Soulier and Stefan Zipproth for example PGN files demonstrating the bugs. * Changed InitComboStringsFromString to not modify the input string; this caused an exception when WinBoard was compiled with MSVC++ 6. Thanks to Bert Tuyt for the report. * In WinBoard, dragging a piece off the edge of the board without releasing the mouse button no longer instantly aborts the move. You still must release the mouse button inside a square to complete a move, but you can now drag off the edge and come back inside. * WinBoard bugfix: If you went into EditGame or EditPosition mode while observing or playing an ICS game, and a new move came in (snapping you back to ICSClient mode) while you were dragging a piece around, the drag state would not be reset, causing the piece you were dragging to remain on the board wherever you dropped it. Thanks to David Brinegar for the bug report. * WinBoard bugfix: If you moved or resized the board while your opponent was moving, and you had AnimateMoving on, his move would not be displayed until after your next move. Thanks to DAV for reporting the bug repeatedly until I finally understood it. * Added a Zippy "farewell" feature; see zippy.README. * Fixed a bug (xboard only) in processing -zippyReplayTimeout on the command line. Thanks to Steve Beer for the report and patch. * Send "computer" command to both sides in TwoMachines matches. * Fixed a Y2K bug in Evan's cmail code! Thanks to Brian Mays for the report and patch. * Bugfix: Initialize variant field of GameInfo struct in gameinfo.c. This could cause crashes in LoadGame. Thanks to Andrzej Nagorko. * Fixed several pattern matching problems: Finger notes and formula vars no longer get replied to by zippyTalk or colorized. Channel tells by players with many titles are now colorized fully, and zippyTalk handles channel tells by such players correctly. The shout "--> foo(99): bar" no longer gets colorized as a channel tell. Code is cleaned up a bit, and autocomment capture now uses the same criteria as colorization. * xboard fix: Enter key now closes error popups as in WinBoard. Especially nice for the "Exiting: Connection closed by ICS" popup. 4.0.5 -- Tue Dec 7 10:30:40 PST 1999 Tim Mann * Added missing documentation of SIGTERM usage into engine-intf.html. * Bugfix: New -zippyReplayTimeout option was misspelled in WinBoard as -zippyReplyTimeout. Thanks to Francesco Di Tolla. * xboard -ics now restores the xterm's original title upon exit, at least if $WINDOWID is set. * Bugfix: -matchGames mode wasn't terminating properly. Final score popup would come up twice and engines would not be killed off. Thanks to Frank Quisinsky for the bug report. Bug was introduced in 4.0.4. * Bugfix: "tell 50 foo shouts: bar" no longer gets colored as a shout; similarly for "...s-shouts:" and "...c-shouts:". Thanks to David Lee for the bug report. 4.0.4 -- Fri Dec 3 17:51:27 PST 1999 Tim Mann * Bug fix: formerly if you invoked SaveGame from EditPosition mode with black to play, the position was not saved properly. As a quick fix, SaveGame now takes you out of EditPosition mode before saving. * Changed -matchGames to keep track of the score (won-lost-drawn) and display it in the banner. The final score is displayed in a modal popup before the program exits. * Changed "Connection closed by ICS" to display in a model popup before the program exits. * Added -popupExitMessage option, default on. Setting this to false suppresses the modal popups that you sometimes get just before xboard/winboard exits -- both the two new ones listed above and the existing Fatal Error popup. This is useful when running Zippy unattended from a shell script (or .bat file) that loops and starts a new copy after a time delay when there is an error. * In xboard, added missing support for WM_DELETE_WINDOW to all windows. This makes xboard a better citizen, and is much needed with the newer X window managers that put an [X] button on every window and bind it to "kill application" if the applicationd does not support "delete window". We can't allow xboard to be thoughtlessly killed, since that leaves the chess engine running in the background. * We now avoid positioning tops of xboard dialog boxes offscreen. * zippy.lines can now use the caret ('^') character as an inter-saying separator. You no longer need to dig up a text editor that can put NUL ('\000') characters in text files. * Bugfix: In traditional chess clock mode, White now gets time added to its clock as soon as it makes time control. Previously both White and Black got their time added only when Black made time control, which would cause some engines to make their 41st move as White too quickly, thinking they were low on time. * The zippyAcceptOnly feature no longer sends a decline command or a tell. Thus you can use it to put Zippy into a manual accept mode. * Bugfix: "tell 50 foo tells you: bar" no longer gets colored as a personal tell; similarly for "...whispers:" and "...kibitzes:". * WinBoard no longer blanks the message line when you start a new move, unless there was an error message there from the previous move. * WinBoard now never puts the white piece drop menu on the middle mouse button. Both colors are always on the right button. Windows users often don't think to look for a middle button menu, or don't really have a working middle button despite what Windows says. * Guest login handles on ICC are now parsed again; an ICC wording change had broken this feature. * Autodetect when the engine does not support the "draw" command and don't relay the command to it in that case. Needed because sending an unsupported command to GNU Chess makes it move immediately, so people could make Zippy move without thinking by continually offering a draw. Thanks to Frank Walker for the problem report. * Small changes based on code from Robert Jurjevic: The WinBoard analysis window can be minimized (though not to the taskbar). The WinBoard ICS Interaction window will autoscroll if you drag the mouse above or below the window while selecting, and password entry mode leaves the entry line as the background color instead of using 75% gray. Seeks are now colorized with a new color of their own. * Added -zippyMaxGames feature. * -zippyNoplayCrafty command line option was missing in xboard; fixed. Thanks to John Perry. * Fixed bug in detecting when Zippy loses his bughouse partner. Thanks to Ben Dean-Kawamura. * allobs fix in 4.0.3 didn't work; corrected it. * WinBoard will now update the board immediately if a move is made while the window is being moved or resized. 4.0.3 -- Sun Aug 15 18:44:39 PDT 1999 Tim Mann * Bugfix: moved winboard wizard functions that send a command directly to the chess engine from Ctrl+Alt+1 and Ctrl+Alt+2 to Alt+1 and Alt+2. Ctrl+Alt is equivalent to the European AltGr key, so the old assignments conflicted with typing an @-sign on some keyboards. * Bugfix: prevent "If this message stays up, your chess program does not support analysis" from appearing if AnalysisMode is selected when already in Analysis or AnalyzeFile mode. Also, deleting analysis window in WinBoard now switches you to EditGame mode, to avoid the anomaly of being in an analysis mode with no analysis window present. * Change all Zippy environment variables to work as command line options. For now they still work as environment variables too, but the environment variables are deprecated. * Use unsigned long to hold node counts from engines. * Print error instead of crashing on attempts to use xpm or xim pieces in monochrome mode. Thanks to Jim Torrance for the bug report. * Tightened pattern recognition for ICS messages sent to Zippy; should no longer match ICC allobs output. Fixed recognition of when Zippy is sent a message; small change to FICS output had broken it. * Zippy now exits if the engine dies unexpectedly. * Added Zippy "spoofedby" feature; see zippy.README. * Narrowed the margins on some older WinBoard dialogs to make their style uniform with the newer ones. * Bugfix: Changing Ponder Next Move from the Options menu did not take effect until the next game. This bug was in WinBoard only. Thanks to Stefan Zipproth for the bug report. * Got rid of "Internal error: bad move type" message when the engine makes a move that we can parse but think is illegal. Now the move is just passed on (which also may be the wrong thing to do). 4.0.2 -- Thu Feb 25 19:55:32 PST 1999 Tim Mann * Added one more built-in sound choice to WinBoard: move.wav from Pete Galati. * Added new larger piece sizes: big, huge, giant, colossal, titanic. * Modified the xboard font searcher to be able to use scalable fonts. The new -fontSizeTolerance flag controls how closely a nonscalable font must match to be used in preference to a scalable font. * Zippy environment variables ZIPPYABORT and ZIPPYADJOURN now control whether Zippy will accept abort and adjourn requests. * We now determine the variant type being played on ICS, send it as a command "variant VARTYPE" to the chess engine (if in Zippy mode), and put it in the PGN tags. See engine-intf.txt for variant names. See ZIPPYVARIANTS in zippy.README to control what variants Zippy will accept. Note that this now applies to bughouse, too. * Zippy now won't do -zippyTalk in a channel unless his handle is mentioned there. * Zippy now ignores bughouse holdings if not actually playing, instead of stupidly trying to abort the game. Let me know if other strange things happen when Zippy is observing a game. * Set ICS Interaction title bar to "user@server". User name is determined by parsing message during the login sequence. Zippy now uses this method to get its name too, so ZIPPYNAME is eliminated. Problem: with xboard, the title bar gets set to "xterm" upon exit, since we didn't know what it was to start with. * Fixed xboard-only bug in -colorChannel1 command line option. Thanks to Fredrik Sandstrom for the bug report and fix. * Check for overflow of MAX_MOVES. Still not sure this is checked for everywhere it needs to be. * Added .epd to suffixes recognized by WinBoard as position files. This is a bit of a kludge, as the .fen reading code was not written with .epd files in mind, but reading them with it is said to work. * Added ZIPPYGAMESTART feature, suggested by Jason Hoblit. See zippy.README. * Restored the feature of soaking up the moves from a user-typed "moves", "oldmoves", or "smoves" ICS command when xboard/WinBoard is idle, but changed it so that the move list is also echoed to the screen. Some folks still liked the old feature since it is faster than examine mode, and printing the moves to the screen should eliminate the confusion it caused for other people. * Bugfix: in WinBoard, starting a click-click move and then clicking on a black line would cause the source square to be forgotten without taking the highlight down. Now the errant click is ignored. * Corrected shortcut key labels for LoadNext/PrevPosition in WinBoard's File menu. Thanks to Andreas Stabel for the bug report. * Bugfix: if you had a completely full ICS context menu in WinBoard (90 items), the last one would do nothing if selected. * The "computer" engine command added in 4.0.1 was not working; I had left out part of the code patch. Oops. 4.0.1 -- Fri Feb 12 21:24:15 PST 1999 Tim Mann This is a minor bugfix release. The first item listed below is the only interesting new feature. * You can now type in moves from the keyboard in WinBoard. Either select TypeInMove from Step menu, or (if you are not in ICS mode), just start typing. In ICS mode you can type moves into the ICS interaction window anyway, so I've retained the feature that typing switches you there. Not implemented in xboard. * Removed the "noise 1000" command that used to be sent to the chess engine when entering analysis modes. * Deleted the feature where we soak up the output of a user-typed ICS "moves" or "oldmoves" command. This ancient feature is not really useful anymore, now that "examine" exists, and it caused a lot of complaints. * Increased maximum size of ICS text menu to 90 entries and added overflow checking. * The command sent to ICS by Zippy at the end of each game can now be customized with the ZIPPYGAMEEND environment variable. * We treat xboard.info as a pseudo-source since most people don't have the tools to rebuild it. But "make install" erroneously had a dependency on it, even though "make all" did not. Fixed. * Miscellaneous minor updates and clarifications to engine-intf.txt. In particular, documented the st and sd commands (support for command line options -searchTime and -searchDepth), warts and all. * Added a small code patch from Bob Hyatt to detect when Zippy's ICS opponent is a computer and send the command "computer" to the engine. Added this command to engine-intf.txt. Thanks, Bob. * Bugfix: configure was looking for usleep(), but config.h.in didn't have an entry for it, so HAVE_USLEEP was never defined. Also, in the non-HAVE_USLEEP case, there was a possible race condition between the signal handler and the pause() call. Thanks to Ben Dean-Kawamura for the bug reports. * Bugfix: a "1..." preceding Black's first move (usually present if there is a comment on White's first move) would cause the parser to think a new game started there and report "End of game" on the current game. Thanks to Dell Garner for the bug report. * Changed the abbreviation for -searchDepth from -sd to -depth to fix a clash with -secondDirectory. * Changed -searchDepth to be orthogonal to the various timing options. Previously it would search for an unlimited time to the given depth; now the engine is allowed to choose its search time in the normal way, but is told to cut off the search early if it reaches the given depth. * Bugfix: SaveSettings in WinBoard was saving both the long form option highlightSquareColor and its abbreviation (hsc). * Fixed a redisplay bug in DisplayBothClocks that could cause White's clock to be highlighted in EditPosition mode when Black's should have been. * Fixed Zippy's feature of passing on draw offers from the ICS opponent. The colorization code was eating the offer before Zippy saw it, so I disabled colorization of offers while in -zp or -zt mode. (Other types of colorization are already disabled in Zippy mode for similar reasons.) * Added some more commands to the default ICS context menu in WinBoard, and put "(name)" on the ones that insert a playername (or game number). * Added missing documentation to WinBoard help file: PonderNextMove, the -ponder/-xponder argument, and the up/down arrow history feature in the ICS Interaction window. * Fixed ZIPPYNOPLAYCRAFTY feature to fire only if the opponent is Crafty, not if some other Crafty is observing the game and kibitzes. * Fixed bugs in generating "partner" commands when Zippy is playing bughouse. 4.0.0 -- Sat Jun 20 16:59:47 PDT 1998 Tim Mann * Fixed WinBoard resizing so that the edges you do not drag remain in place, even when the final size is different from what you dragged to. (This doesn't work on NT 3.51 or earlier, if anyone cares.) * Fixed problems with resizing WinBoard on Windows NT: you no longer get whitespace around the board, a clipped board, or a lot of flashing during the drag. * Added customization for highlight-square color. * Bugfix: backend.c wrote to stderr in a few obscure places, which doesn't work in WinBoard. * Added Index Number field back to LoadGame/LoadPosition dialog boxes in WinBoard. This required some extra code to work with both the Explorer-style dialog boxes and the old-style NT 3.51 dialog boxes. Ugh. * WinBoard startup dialog now understands -zp mode. The first chess engine selector is enabled and the value is used. * Bugfix: ResetGame would send "exit" to engine twice if it was in an analysis mode. * Bugfix: The response "Illegal move: bk" to the "bk" command, indicating that it is not implemented, would confuse xboard. * Bugfix: Ignore empty hints ("Hint:\n") instead of printing a message saying that some bogus string (often "Hint:") is illegal. * Bugfix: LoadNextGame/LoadPreviousGame/ReloadSameGame were broken. 3.6.12 -- Sat Jun 13 14:57:10 PDT 1998 Tim Mann Beta test release of xboard and WinBoard. * Spruced up xboard man page a bit. * Added Highlight Last Move to xboard too. * The revamped xboard mouse click code had several more bugs than the previous version, so I revamped it again. All fixed now, I hope. * xboard bugfix: crash in CreatePieceMenu. * Oops. winboard-3_6_11beta.exe installed 3.6.10beta, not the new version. 3.6.11 -- Fri Jun 12 20:00:48 PDT 1998 Tim Mann Beta test release of xboard and WinBoard. * Major reorganization to engine-intf.txt. Some new features added, many existing features clarified and hints for engine programmers added. Support for new features added to program. * Changed defaults for -scp (etc.) back to being independent of -fcp, as in 3.6.2. That is, the default is no longer to copy the value from -fcp if -scp is not specified. This will sometimes make command lines longer but will remove some confusing situations. * Split -reuseChessPrograms into two options: -reuseFirst and -reuseSecond. Fixed obscure bugs when reuse is off. * Detect ICC and change some command usage slightly there: only ICC has set-quietly; only FICS has iset and bsetup clear. With this feature, we can now safely use bsetup clear when appropriate instead of deleting each piece one by one. * Added indent to lines that are wrapped by WinBoard ICS Interaction window. This seems to tickle a Microsoft bug in the RichEdit control: occasionally the start of the next line after the wrapped line is indented too. I think the wrapped indent feature is useful enough that it's worth having in spite of the bug. * WinBoard bugfix: bounding box for the board was computed incorrectly by mouse code. It would think you moved off the bottom of the board before you really did, so it was hard to drag pieces along the bottom rank on smaller board sizes. * Fixed obscure parser.l bug: ambiguity between capture using : instead of x and email header line. Also removed or simplified a lot of complex patterns for English (as opposed to PGN) end-of-game indications while I was in there. * Added PonderNextMove option. * xboard EditPosition piece menus now let you set the side to play by selecting the "White" or "Black" label at the top of the menu, like WinBoard. (Both xboard and WinBoard still let you set the side to play by clicking on the clock.) * Merged documentation of Crafty and GNU Chess thinking output in engine-intf.txt. Corrected code in backend.c to match documentation; it used to require the PV to start in column 27 (!). * Fixed bug that caused crashes in "-reuseChessProgram false" mode. * Draw by agreement in Two Machines mode now works as it is supposed to. Other minor bugs in handling game end messages from machines are also fixed, and engine-intf.txt is revised in this area. * Revamped xboard code for handling mouse clicks on the board. In particular, it had a bug if a click-click promotion move was made. * Fixed and reinstated optimization for << in analysis modes: send initString and re-send the board if needed. Sending repeated undos is bad because Crafty prints some analysis after every one. * Don't go into a spin loop while pausing between xboard animation frames. This caused problems, especially when compiling with -O2 on HP-UX. * WinBoard Options/Colors/RevertToDefaults now also turns off Monochrome if it was on, and similarly for Options/ICSInteractionColors/RevertToDefaults. This seemed to confuse people before. * Bugfix: ICS Interaction context menu items with neither of the two optional flags set did not work. * Bugfix: PGN move numbers are optional, but we were insisting on "1" right after the tags. * Bugfix: only the first game of an -mg match was loading -lpf or -lgf. * Other minor fixes and code cleanup. 3.6.10 -- Mon Jun 1 01:32:31 PDT 1998 Tim Mann * Added ZIPPYNOPLAYCRAFTY feature; see zippy.README. * Added timestamps for chess engine interaction to -debug output. * Now allow 10 seconds (was 5) between games in match mode for engines to respond to "force" command that ended previous game. * When a game is picked from the game list and the names of White and Black are known, display them in the window banner instead of the filename and game number. * Changed default for -scp and -sd to be the values of -fcp and -fd. * Added boxes for both engines to WinBoard startup dialog. Changed to dropdown boxes whose content can be set from winboard.ini, similar to the box for ICS name. * Accept "offer draw" (or "*offer*draw*") from engine to offer a draw. * Accept "move mmmm" from engine as well as silly "1. ... mmmm" syntax. * Added support for bughouse engines (Zippy mode only). * Move bombproofing for engines sending illegal or out of turn moves. * Always send "xboard\n" to engine as first command. Eliminates need to run crafty as "crafty xboard". * Rewrote xboard code for input from engines to fix longstanding bugs. Previously an engine that sent one line in two separate writes with some time lapse in between (or perhaps that sent several lines in one write) could make xboard hang. WinBoard did not have this bug. * Fixed minor bugs in dealing with illegal moves. * Added "iset startpos 1" for FICS. * Removed special support to put "GNU Chess" or "Crafty" in the window banner instead of the engine's base filename. This gives a more level playing field for other engines. Also fixed bugs in the code that finds the engine's base filename. * Bugfix: Abort or Resign at the very start of a game in chess engine mode would fail to send "force" to the engine. * Fixed some minor bugs in new "result" messages, and changed format to include a trailing PGN comment giving the reason the game ended. * Changed syntax of /font options in WinBoard; old syntax was assuming that a font name can't contain a digit, which is wrong. Old font names in WinBoard.ini files are still accepted. * Serious further work on getting WinBoard to read/write files in the "right" directories and documenting exactly what it does. * Added LoadPreviousPosition, LoadNextPosition, ReloadSamePosition. * Misc. tiny fixes and cleanup. 3.6.9 -- Sun May 24 20:53:08 PDT 1998 Tim Mann xboard and WinBoard beta release. * Tightened up illegal move handling. Illegal or meaningless moves from a file or chess engine should no longer get translated into a1a1 and blindly applied. Explicit moves to the same square (like a1a1) no longer make the piece on that square capture itself and vanish. * Added AlwaysOnTop feature to winboard. * Fixed bug in winboard "@" command line indirection operator. * Removed buggy "optimization" code for ToStart in analysis modes. * Fixed typo bug in zippy.c that would often cause winboard to crash right after starting a game in -zp mode. 3.6.8 -- Sat May 23 22:23:19 PDT 1998 Tim Mann xboard and WinBoard beta release. * Added -firstDirectory and -secondDirectory so that chess engines can be started in a different directory from xboard/WinBoard itself. * Added -matchGames to allow more than one game in -matchMode. The games are played with colors alternating between the two chess engines. Had to add a time delay at the end of each game to catch up with game ending messages from both chess engines -- yuck. * Changed TwoMachines mode to have firstChessProgram play White by default. Added -firstPlaysBlack to restore old behavior. * Major rework of code in backend.c for dealing with first and second chess engines. Generalized the code and created a struct type with one instance for each engine. Several small bugs fixed along the way. * Fixed bugs in Abort in local chess engine mode. * Tightened pattern matching to recognize moves from machine. Should cure bogus "Illegal move" errors while Crafty is pondering with Show Thinking on, among other things. * WinBoard keeps focus in board window after popping up a comment due to Forward/Backward/ToStart/ToEnd commands. * Finally got rid of warnings on compiling moves.c under Windows. * Fixed so WinBoard will compile on machines where WM_MOUSELEAVE is not defined. * Removed various bits of unused code. * Parse (and ignore) NAGs in PGN files. * Updated engine-intf.txt. * Send "result R" to the chess program at the end of each game, where R is the PGN result 1-0, 0-1, 1/2-1/2, or *. * Bugfix: suppress animation when loading a game with timeDelay=0. * Bug fix: pondering output from Crafty that contained "..." could be mistaken for a move, causing bogus error messages and general chaos. * xboard "make clean" bug fix: moved things created by configure to be removed only by "make distclean". * Fixed a remaining case where move was being animated before being relayed to opponent. * Backend was reversing time/otim commands to the chess program (new bug), and was often not sending them on the first move of a game or the first move after a mode change (old bug). Fixing the latter required a kludge to work with both GNU Chess and Crafty, because Crafty swaps white and black clock times when it swaps sides, while GNU Chess does not. The kludge is that we always make sure the chess engine thinks its opponent is on move before we set the clock. This will sometimes result in sequences like "white\ntime xxx\notim yyy\nblack\ngo", or the same with white and black interchanged. * Removed last trace of old -whiteString and -blackString arguments. * Fixed so that you can type "bd" into the Direct Command dialog when debugging gnuchess, without having xboard parse the clock display (starting with "White") as "White wins" and end the game. * Changed moves.c to make a distinction between IllegalMove (where we could tell what move was intended, but it violates the chess rules) and MeaninglessMove (where we could not tell). This is a step towards getting rid of cases where we translate meaningless moves into "a1a1", but some work is probably needed to track them all down. * Fixed bug in WinBoard monoMode dragging. * Changed WinBoard to new style file dialogs. In the process, disabled the feature that let you enter the index number of a game or position within the file in the dialog. This is no loss in LoadGame, as you can pick your game from the game list dialog that follows, but it does remove some functionality from LoadPosition. 3.6.7 -- Mon May 18 21:25:00 PDT 1998 Tim Mann xboard and WinBoard beta test release. I've been unable to reproduce some reported drawing bugs, so they may still not be fixed. * Changed PopUpErrors option to PopupMoveErrors, which is more useful, and changed default to off. Errors other than move errors should always be in popups; they are often too big for the message area and too important to put where they can be easily missed. But it seems good to get rid of the popups for move errors by default. * xboard analysis window no longer forces itself to top whenever there is new output. Also, now uses built-in Xaw word wrapping instead of trying to do its own; works better. * Bugfix: Reset did not take Crafty out of analyze mode. * A chess engine no longer has to claim to be Crafty to be able to use AnalysisMode and AnalyzeFile; it just has to implement the analyze command as Crafty does. Put in heuristics to generate more informative error messages if the engine does not support analyze, and checked that they work at least with GNU Chess. * Added click-click moving, HighlightLastMove, and HighlightDragging to WinBoard. The highlight features are unlikely to go into xboard unless the xboard drawing code is cleaned up to do *all* drawing on the board from DrawPosition, as WinBoard does. This is low priority for me. * Eliminated bogus "Error gathering move list: no header" popup. You could get this by observing two fast games at once without turning off GetMoveList. * Disable WinBoard Sounds menu entirely in -ncp mode, since not even MoveSound is used in that mode. * WinBoard bugfix: Several problems were caused if the user changed WinBoard's current directory in a Load, Save, or Browse dialog. In particular, WinBoard.ini would get saved in the wrong directory, and sound .wav file names would not get saved with a full pathname. I think all such problems are now fixed. * WinBoard bugfix: iconizing the board after an aborted mouse resize would (partially) resize it to Tiny. * WinBoard bugfix: board was not being drawn in color on 256-color displays. This bug was introduced in 3.6.6. 3.6.6 -- Tue May 12 17:43:43 PDT 1998 Tim Mann xboard and WinBoard beta release. Note: not all reported bugs are fixed. * Move animation in WinBoard, programmed by Henrik Gram. Great stuff! * Animate backward moves too. * xboard bugfix: -font (and friends) can now specify a font alias (such as "fixed"), not just a full X Consortium name pattern. Previously this would give a resource conversion error message. * Some coding style cleanup in xboard.c. * Earlier error check for moving wrong color piece in EditGame mode. * Completed fix to pattern matching; see 3.6.5. * Fixed some software rot bugs in Zippy. * Split AnimateDragging as separate option from AnimateMoves. * Added FlashMoves to options menu and -flash/-xflash to command line options (xboard only). * Some preliminary work on visible bughouse holding support. Most of the code is not present in this release because I have not gotten it working properly yet; my first approach went down a blind alley and I had to remove most of the partially working code in preparation for a rewrite. 3.6.5 -- Fri May 8 14:22:09 PDT 1998 Tim Mann Not generally released. * Pack bughouse holdings display in banner more tightly when board is one of the smaller sizes (when smallLayout or tinyLayout is true, that is). An interim measure, but should help. * Completed fix to make move list parsing recognize the end condition and final comment. * Fixed pattern matching for chatter (tells, etc.) to be more reliable. This should reduce the incidence of colors starting in the wrong place and of incorrectly matching things that look like other patterns inside chatter, such as "shout <12>". (These errors were already rare.) * WinBoard now lets you customize the list of ICS's in the startup dialog. For now, at least, requires editing WinBoard.ini with a text editor. * Bug fix: WinBoard window sizing and position setting save/restore did not work right when the taskbar was at the top (or left side) of the screen and not in autohide mode. * Merged xboard click/click mode and drag mode, and deleted ClickClickMoving option on menu. Now if you click on a piece, it highlights and a further click on another square will move it. (A second click on the same square takes down the highlight.) Or if you press down on a piece and start to drag, you can drag it to a new square. * When making click/click style moves, if your second click is on a piece of the same color, instead of saying "Illegal move", we now cancel the first starting square, replace it with the second, and wait for another click to finish the move. * Separate -secondInitString. Default: same as -initString. Suggested by Remi Coulom. * Patch from Frank McIngvale to make animation work with XIMs. Yay! * Changed move animation to happen after move is passed on to ICS or the chess engine, where applicable. Fixed problems with updating moveList that this uncovered. * Changed game list to show PGN result token for each game. * The usual minor bug fixes. 3.6.4 -- Thu Apr 30 23:14:43 PDT 1998 Tim Mann xboard and WinBoard beta test release. * xboard documentation updated, both man page and info file. An attempt to generate both from the same source with LinuxDocSGML was abandoned, at least for now. WinBoard doc updated too. * Merged updates to animation code from Hugh. Fixed a couple of remaining bugs, mostly to do with handling Pause mode correctly. * Added SaveSettingsOnExit to WinBoard. * WinBoard now saves the last screen position of the Comment, Edit Tags, Game List, and Analysis windows (in addition to the board and ICS Interaction windows) in WinBoard.ini. * WinBoard now provides a way to customize the right-button context menu in the output area of the ICS Interaction window. For now, requires editing WinBoard.ini with a text editor. * Various minor fixes to ICS message recognition, most affecting only Zippy. * Colorize the notification when someone sends you a message while you are logged in, not the output of the "messages" command. * Fixed colorization to turn off at the right place more reliably. * Added a new color and WinBoard sound for "requests": abort, adjourn, draw, pause, and takeback. The same color and sound are used for all of these. * Added GUI to change sounds in WinBoard. * Suppressed WinBoard error popup when a sound can't be played. They were popping up when two separate WinBoards tried to play a sound at the same time (such as during a bughouse match). * Fixed WinBoard crash when a sound file didn't exist. * WinBoard ports of timestamp and timeseal now produce decent error messages if they fail to connect, and WinBoard captures the messages and puts them into a popup. Previously WinBoard would exit with no message on such errors. * WinBoard resizing with mouse improved; now accurately picks the largest size that fits in the new area. * Added option to turn off error message popups. * Added sizes slim, dinky, and teeny. * Fixed some minor problems with error message wording. 3.6.3 -- Mon Feb 23 19:08:57 PST 1998 Tim Mann xboard beta test release only. Man page is updated for the changes, but info file is not. * Bug fix: LoadGame could not load a PGN game whose first move was castling (which is possible from setup positions). * Bug fix: we were ignoring illegal move messages from chess engines in modes where the engine is refereeing but not participating (EditGame, LoadGame, AnalyzeFile). The problem was in a workaround for a Crafty bug, where Crafty generates a bogus illegal move message if a "." (used by the PeriodicUpdates feature) is sent in analysis mode when the current analysis reveals a forced mate. Installed a different workaround (that works in most but not all cases) and reported the Crafty bug. Bob Hyatt replied with a fix, so the Crafty bug should be gone in Crafty 14.12 or so. * WinBoard only: enabled resizing board with the mouse. It snaps to the nearest (but not too much larger) predefined size. * The xboard default font is now sized according to piece size, just as clockFont and coordFont have always been. * Added more sizes: bulky, moderate, average, middling, mediocre, petite. * xboard only: Added Animate Moves and Click-Click Moving to Options menu. * xboard only: Added code to animate piece movement, from Hugh Fisher. * New feature: autoflag is implemented in MachineWhite, MachineBlack, and TwoMachines modes. If it is on and either a chess program or the user oversteps his time, xboard will automatically call the flag and end the game. This feature was requested by someone who runs matches between programs and wants to penalize GNU Chess for its habit of running slightly over at the end of a time control. I personally think it's pointless. * Fixed a bug in Zippy's pattern matching; he can now reply to ICC messages again. * Generate prettier notation for illegal moves. If a move is illegal only because it leaves the player in check, generate notation as if that were not illegal. For instance, if two knights are a knight's move away from f3, one on g1 and one on e5 that is pinned, the notation would be Nf3 to move the g1 knight, Nef3 to move the e5 knight. (Suggested by Philippe Schnoebelen.) In addition, if a move is illegal because the type of piece moved cannot go that way, would be jumping over another piece, etc., we give fully disambiguated coordinate notation; for example, Ng1g3, Ke1xe8, d2xd8=Q, etc. An alternative would be to still write Ng3 if there is only one knight on the board, or Ngg3 if the other knight is not on the g file, but life is too short to code up all this stuff, and perhaps the way I did it is better as it emphasizes that this move was really made despite being illegal. I wonder if the new PGN standard revision will speak to notation of illegal moves? * Fixed gross bug from 3.6.2: if a chess program said "checkmate" and White was left on move, the PGN outcome was "1-0 {Black mates}" instead of "0-1 {Black mates}"! The bug occurred only for that specific string. 3.6.2 -- Wed Jul 23 16:47:29 PDT 1997 Tim Mann * There was a bug in backing up from the end of a game against a chess engine, introduced when -reuse mode was added. Fixed. * Recognize "{" as terminating an ICS move list. Previously we needed to see a prompt (containing %), but occasionally ICC can send more stuff right after a move list with no prompt in between. * In WinBoard, -mm now implies -cp, so you don't get the startup dialog. * WinBoard startup dialog no longer sets -scp. People used to get confused because they would give the -fcp and -scp arguments, but omit -cp. This would bring up the startup dialog, which would set both -fcp and -scp to the value in the engine name box. Now you can change -scp only with the command-line argument. That will confuse some people too, but hopefully fewer. I think overall it's better than putting spaces for both -fcp and -scp in the dialog, which would puzzle newbies. * Bug fix: Analyze File mode now works in WinBoard. * Bug fix: WinBoard window no longer cuts off part of the bottom row if the menu bar wraps to a second line. * Accept game end messages of the form "PGN-result {comment}" from the chess engine, where PGN-result is 0-1, 1-0, or 1/2-1/2. Accept "resign" or "computer resigns" from the chess engine as a synonym for "0-1 {White resigns}" or "1-0 {Black resigns}". Accept any message from the chess engine containing "game is a draw" as a synonym for "1/2-1/2 {Draw}". Accept "White resigns" or "Black resigns". * Enable "Action / Draw" menu item in chess engine mode. It sends the command "draw" to the engine. Accept any message from the chess engine containing "offers a draw" as a draw offer. WARNING: Draw offers from the user and the engine (or from two engines) are not yet matched up by xboard in chess engine mode. Two engines could get into a loop offering each other draws. * Bug fix: Game end messages from the chess engine are always ignored in Zippy mode. Previously they could sometimes be processed, which was sometimes making Zippy hang at the start of a new game that followed quickly after an old one. * Zippy can now respond to titled players in channels. Zippy will avoid talking to himself in a channel if he knows his own name. * Bug fix: in colorization arguments, the bold setting was being ignored if the background color was defaulted. (xboard only.) * Extended ParseFEN to accept Crafty 12.2's interpretation of FEN. If fewer than 8 squares are given in a row, or fewer than 8 rows are given, the uncovered squares are empty. Also, there can be a / after the 8th row. 3.6.1 -- Sat May 17 01:02:33 PDT 1997 Tim Mann * Bug fix: Hitting escape while entering a password on WinBoard no longer sets the font color back to black (which made further typing visible). * Bug fix: On Windows NT 4.0, WinBoard /ics /icshelper=timestamp would often hang if you tried to exit with the Exit menu item, the [X] button, etc. The same fix may also have corrected the problem where running a chess program with /xreuse would sometimes crash Windows 95 (but not NT) when the chess program was killed and quickly restarted. * Bug fix: Periodic Updates would not work if turned on after having been off. Also, the default was needlessly "off" in WinBoard. * Zippy bug fix: Continuing an adjourned game was totally broken. The wrong moves, or no moves at all, were being fed to the chess program. * WinBoard change: Giving -ics without -icshost now pops up the startup dialog with "Use an Internet Chess Server" pre-selected, so that you get a menu of chess servers instead of going directly to ICC. * Bug fix: WinBoard's SaveSettings was saving -icshost, -icsport, and -icshelper in winboard.ini. This causes a problem if you use a different icshost later that needs the default values for icsport (5000) and icshelper ("", meaning none). * Disabled complaints about unexpected "[Ii]llegal move" messages from the chess program; we still get them at times. * Greatly simplified the code for Move Now and SIGINT (ATTENTION). Fixes the bug where Move Now did not work with GNU Chess in WinBoard, and several more obscure bugs as well. Reintroduces a minor bug: GNU Chess might not think on your time after a Move Now command. Trying to fix this causes too many other problems. Documented change in engine-intf.txt. * Cleaned up code for obtaining ratings from ICS. It was kludgey and may have had bugs on systems with no "Creating:" message. It should fail gracefully there, just not finding the ratings. 3.6.0 -- Thu May 8 19:55:58 PDT 1997 Tim Mann * WinBoard now has right-button context menus in the ICS Interaction window. Some of the items do immediate commands on the player name you have selected or pointed to. (Suggested by Paolo Casaschi.) Also, the middle button or shift+right does a immediate Copy and Paste. * Fixed a bug in Zippy's wild rejection. The bug was causing Zippy to reject all forms of wild. Now it rejects only 1, 9, 16, 17, and 24, as was intended. These variants have different rules, while the other variants defined so far only have different starting positions. (Actually, wild 2, 3, and 4 never allow castling, but may sometimes by chance have king and rook start on squares where castling appears legal. This could cause a problem later.) * Zippy now resumes adjourned games by feeding the chess program the move list instead of the position. Setting -getMoveList to False restores the old behavior. Feeding in the move list is better because it enables the chess program to correctly handle en passant legality, castling legality, draw by repetition, and draw by the 50 move rule. * Added a WinBoard startup dialog for people who run WinBoard.exe without using the Start menu or reading the help file. Instead of being dumped directly into GNU Chess mode, you now get a menu of choices. You now have to give the new WinBoard -cp option to go directly into chess engine mode. I did not add this feature to xboard. * Handling of "illegal move" from Crafty is now back on. (It was turned off in 3.4.6; see below.) Crafty 12.0 doesn't seem to send bogus ones anymore. I did have to suppress sending time and otim in analyze mode to make this work, but there is no harm in that. * Zippy now sends "gameend" to ICS at the end of each game. You can alias this to "seek" or whatever you like. * Added Crafty support for Move Now, using the "?" command. We test whether this command exists by trying it once at the start of the first game, before it really makes sense. If we don't get a message like "Illegal move ... ?", we assume it's OK. (We're careful about this because sending a "?" to GNU Chess on Move Now keeps it from pondering the next move as it should.) * Added support for a tellusererror command from the chess engine. See engine-intf.txt. * Attempted to make engine-intf.txt complete. * Minor fixes/cleanup to GameEnds code, to be sure we always interrupt when needed, and always undo an extra move generated by stopping the chess program while it is thinking. 3.5.7 -- Sat May 03 22:37:44 PDT 1997 Tim Mann Beta release of both xboard and WinBoard. * Updated xboard documentation. I really wish the man page was built from the info file instead of being separate! It's a pain to update them both. * Updated documentation of the interface between XBoard/WinBoard and chess programs, and renamed it to engine-intf.txt. * Added support for tellics, telluser, and askuser commands from the chess engine. See engine-intf.txt. * Various bug fixes. On WinBoard, 256 color displays are finally handled right; no more color flashing when you switch windows unless the colors really need to be updated. Also, I think the problem of the console font failing to change or changing back by itself is finally fixed. 3.5.6 -- Tue Apr 29 03:08:00 PDT 1997 Beta release, WinBoard only. ChangeLog was out of date in release, updated here. * Added ICC timestamp and FICS timeseal to WinBoard distribution. These are my own ports to Win32, based on and used by permission of the owners of the proprietary source code (Daniel Sleator for timestamp, Henrik Gram for timeseal). The owners permit these programs to be distributed only in binary form (to help prevent cheating), so to avoid running afoul of the GPL, I have kept them as separate programs, not linked into the WinBoard address space. Updated Start menu icons to use them. * Miscellaneous smaller changes. 3.5.5 -- Fri Apr 25 03:06:00 PDT 1997 Beta release, WinBoard only. ChangeLog was out of date in release; updated here. * Added simple sound support to WinBoard. * Updated WinBoard documentation. * Internal implementation of the telnet protocol is now more complete. You can now hop through a VMS host on the way to ICS. For example, do "xboard -ics -icshost vms.host.edu -icsport 23", then log in. Do not use the -telnet flag; that says to use an *external* telnet program. To avoid double echoes, you need to force character mode in VMS telnet after connecting from VMS to ICS. Do "^]^Mset mode char^M^M". * Display opponent names in the title bar for MachineWhite, MachineBlack, and TwoMachines modes. * WinBoard now has an installer, built with InstallShield. The installer works with a binary-only distribution. Sources are still freely available, but now separately. * Added SaveSettings to WinBoard, which saves current option settings to winboard.ini. Made sure all options can be saved and loaded, including fonts and com port settings. * If the game ends while you are dragging a piece, we now don't let you finish the move. Formerly the move was accepted and your opponent's clock would start running again. 3.5.4 -- Fri Apr 18 01:15:24 PDT 1997 Tim Mann Beta test release of WinBoard and xboard. The documentation remains out of date. * Many fixes and improvements to new WinBoard user interface code. * In Zippy mode, avoid sending another copy of the same move to the chess program if ICS sends us another copy of the board image. Hard to believe it took me until now to diagnose and fix this problem! 3.5.3 -- Sat Apr 12 19:49:33 PDT 1997 Tim Mann Beta test release of WinBoard and xboard. * Fixed fatal bug in WinBoard input handling. * Made code to stop chess program for reuse a bit smarter. Removed kludge of "white" in initString; it didn't work well, and is unneeded with Crafty 11.21 and later. 3.5.2 -- Sat Apr 12 15:40:01 PDT 1997 Tim Mann Beta test release of WinBoard. * Ignore check and permit promotion to King during suicide games; no need to turn off TestLegality. * Renamed CheckLegality to TestLegality to avoid confusion with the chess term "check". * Added Rematch to Action menu. * WinBoard now has a custom ICS interaction window with scrollback, a separate line for input, and colorization. Accelerators that conflict with normal editing keys were changed (by requiring Alt+) so they can work in both the console and the main window. * WinBoard error popups are now non-modal and disappear when you make a new move, as in xboard. * Configure now defaults to --disable-ptys on all systems. If anyone has an ancient SysV system where pipes don't work with select, they can still do "configure --enable-ptys" explicitly. I would appreciate getting a bug report if this happens to anyone, with complete output from configure and "uname -a". * "make install" now makes the installation directories too. * Fixed a bug that would cause an "Illegal move" message for Black from GNU Chess to be incorrectly considered bogus. * Handle name changes during an ICS game (FICS bname and wname commands). * You can force both chess programs to be killed at the end of each game by turning off the reuseChessPrograms option. There are still some problems with reusing Crafty even in version 11.20. * Now the second chess program stays around by default too, if it ever gets started. 3.5.1 -- Sat Apr 5 16:47:48 PST 1997 Tim Mann Beta test release. * Don't kill off and restart the chess program for each game; keep the same one running, using the "new" command to start a new game. This change works around the problem in Windows 95 that makes WinBoard crash it at times, and is generally desirable to make new games start faster. The second chess program (for TwoMachines) is still killed at the end of the game, and unfortunately this can still crash Windows 95. Temporarily added "white" to the initString to make this work with Crafty 11.20, which has a minor bug in "new". Older versions of Crafty have worse bugs in "new"; they should not be used with this version of xboard. * Support for FICS suicide chess: Parse illegal moves (that leave King in check) in game history. If CheckLegality is off, allow promotion to King and illegal moves in game files. We still generate e2e4 style notation for illegal moves. * Handle FICS "has timeseal; checking" message. * Changed the coords from white back to black; this was a bug. * Fixed problems compiling with K&R compilers. * Fixed an old bug in RegisterMove that was crashing cmail on some systems (notably linux). 3.5.0 -- Thu Jan 2 16:59:49 PST 1997 Tim Mann Thanks to Frank McIngvale for much of the work on versions 3.4.4 and above! * Fix Crafty resumed game time bug (frankm) * Word wrap text in Analysis window (frankm) * More debug info for XPM loading (frankm) * Replaced config.sub, config.guess, etc., with up-to-date versions from autoconf 2.12. Hopefully this will fix problems on Pentium Pro machines. * Removed some Makefile gunk that was causing looping for one person. 3.4.7 -- Thu Dec 19 14:22:41 PST 1996 Tim Mann All changes from Frank: * Retrieve ratings from ICC (and FICS, etc., when they add the Creating: message), save them in the PGN tags, and pass them to Crafty in Zippy mode. * Add settable time delay between characters in ICS login script. * Colorize messages like personal tells. Fix false recognition of channel tells. * Pass "tells" from Crafty through to ICS (in Zippy mode). * Implement ~/ filename convention from C shell for game and position file names. * ZIPPYACCEPTONLY feature for testing. 3.4, patchlevel 6 -- Sat Nov 23 16:58:50 PST 1996 Tim Mann * Put recognition of "illegal move" messages from Crafty for illegal castling, etc., inside an #if that is currently turned off, because of a bug in Crafty that generates bogus "illegal move" messages after some moves that are actually legal and accepted by Crafty. * Added -checkLegality option; previously this could not be turned off. * Fixed an old bug in finding default board size parameters. * Differentiated among channel tell, kibitz/whisper, and personal tell/say. * Fixed a bug in detecting Xpm in the configure script. 3.4, patchlevel 5 -- Mon Nov 18 16:22:53 PST 1996 Tim Mann * Added zic2xpm to the kit; it had been omitted by mistake. * Added some default colors for -colorize 3.4, patchlevel 4 -- Sat Nov 16 18:10:17 PST 1996 Tim Mann This is meant to be a beta release in preparation for version 3.5. * Added InfoXBoard and ManXBoard to the Help menu. * Made Frank's ICS input box optional, defaulting to off. * Merged in Frank McIngvale's XbKit. Many new features, including -clickClick mode, the Analysis modes, piece flashing, ZIICS import, ICS text colorization, and the ICS input box. Many thanks to Frank for supplying and documenting this code. 3.4, patchlevel 3 -- Mon Nov 11 18:23:14 PST 1996 Tim Mann Small set of changes made while Frank McIngvale was working on XbKit in parallel. Unreleased in this form. * Updated zippy.README. * Removed useless X event handler and removed strange code for copying form translation table to board that worked around the bug it caused. This makes changing bindings in .Xdefaults more straightforward. * Now pressing the Control key steps back one move, and releasing it steps forward again. * Moved quit from "q" to "Q" for greater safety. * Use "unobserve" instead of "observe" to stop observing; needed on FICS. * Support for interface variable. * Strip titles from people who are talking to us, so (for example) Zippy won't try things like "tell Darooha(*) hello". Needed on FICS. 3.4, patchlevel 2 -- Tue Jul 9 19:06:42 PDT 1996 Tim Mann This patchlevel is not planned to be an announced release. It's in preparation for integrating Frank McIngvale's XbKit. It mostly contains minor fixes I've accumulated since 3.4.pl1. * WinBoard /telnet option now fires up an external program, as with xboard, instead of trying to use a feature of NT 3.1 that does not exist in later versions of NT or in Windows 95. ChangeLog for 3.4.pl1 said this had been implemented there, but it really wasn't. * Indicating player to move by the icon color now works under Windows 95. * WinBoard now kills the chess program when you exit using the system menu or the [X] button. Thanks to Michael Lowe. * Minor changes to Zippy, including: Now understands wild challenges on FICS; these used to crash it. Removed limit on how fast a game will be accepted. Use "set formula ..." on the chess server to limit this if you are using GNU Chess. Now sends correct opponent name to Crafty. * Added some missing default values to documentation. Thanks to Stuart Cracraft. * Bugfix: Trying to print "No fonts match pattern" error message would crash. This can happen to Linux users who don't install Helvetica, for example. * Bugfix: Defaulting feature in -size n,n,n,n,n,n would put us in an infinite loop. * Added more directories to search for Athena widgets on HPUX. * New cmail (3.12) from Evan Welsh; includes small fix from Kayvan Sylvan. * Recognize "illegal move" messages from Crafty for illegal castling, etc. * Bugfix: "name" command added to zippy.c for Crafty was producing error message if GNU Chess was in use. * In bughouse mode, suppress holding messages from console window; show holdings only in banner. * Minor fixes/cleanup to Makefile.in and configure.in. 3.4, patchlevel 1 -- Mon Dec 11 13:43:12 PST 1995 Tim Mann * This patchlevel updates WinBoard to match xboard, and includes a few fixes and minor improvements. "-size tiny" and "-size n,n,n,n,n,n" are still not implemented for WinBoard. * Installed support for Crafty based on code from Bob Hyatt. Currently the only documentation for this is in the FAQ, and a few things don't work with Crafty 8.23. Please do not report these problems as bugs in either xboard or Crafty. Bob and I know about them. The worst ones (if not all of them) should be fixed in Crafty 8.24. * Changed the kludge command we send when gnuchess wants to print something that doesn't end with a newline, from "help" to "bogus". This works because the error message gnuchess prints ends with a newline. It also improves compatibility with Crafty, which doesn't need the kludge, but for which sending "help" causes a problem. * Don't draw grid at all if lineGap is 0; previously we drew the grid with X "0-width" lines (usually 1 pixel wide) and then overwrote it. * Makefile: Removed xboard.info from "all" target so we won't try to rebuild it, because this fails on hosts that don't have makeinfo installed. Other minor fixes to "clean" targets, etc. * Fixes and cleanup to Auto Comment code that handles continuation lines and highlighting. * Auto Observe now tries to observe the game from the point of view of the player who was on your gnotify list. Requested by rng. Limitations: We can't tell which player it was unless you have ICS highlighting turned on. Also, currently "observe foo" works as required (observing from foo's point of view) only on ICC, but FICS will probably implement this soon. * "-size tiny" now makes the default font smaller automatically. This was implemented by introducing an extra Form widget in the hierarchy for all xboard windows, named either normalLayout, smallLayout, or tinyLayout. So you can have resource specifications that apply only to certain layouts; in particular, XBoard*tinyLayout*font. * Bug fix: EditGame or EditPosition while playing or examining still was not really being permitted. * WinBoard bug fix: On the EditPosition menu, King did not work. * Added text catalog of WinSock error messages to WinBoard, because Microsoft still has not put them in the system message catalog. * Removed support for older ICS game-ending messages that do not have a PGN result token (*, 0-1, 1-0, or 1/2-1/2) after the closing '}'. The code for older messages was sometimes firing on the newer messages, due to parsing ambiguity. If the current code sees an old message, it will understand that the game is over, but will always display * as a result token instead of trying to guess the result by interpreting the text message. 3.4, patchlevel 0 -- Tue Nov 21 01:02:50 PST 1995 Tim Mann * This patchlevel was released for xboard only. * Updated the info file. It should now be as up-to-date as the man page, with good English except in the parts that pertain only to AmyBoard. * Added "-size tiny", requested by Bob Hyatt. Also cleaned up bitmap support and added "-size n,n,n,n,n,n" to allow arbitrary-sized bitmaps, if the actual bitmaps are supplied by the user. * Updated bughouse support. 3.3, patchlevel 4 -- Sat Nov 18 02:27:21 PST 1995 Tim Mann * Unreleased beta that works with preliminary FICS bughouse code. Will need changes before release to track FICS message changes. * Removed use of .EX macro from man page. It is not supported by some nroff -man macro packages, notably the one on Slackware Linux. Switched to boldface for references to xboard and other commands within the man page, as this seems to be the modern way. * Bug fix: If ICS rejected a move, it was correctly undone on the board, but the message widget still displayed the bad move. Reported by DAV. * Normally, xboard in ICS mode fetches the move list whenever the board display switches to a new game. Doing this is now an option (getMoveList) that can be turned off, which is useful if you are watching multiple blitz games. Requested by rng. * Move list fetching code is now smarter: it ignores a move list if it is not for the right game. * Added support for bughouse as implemented on FICS. Holdings are shown in the window title in place of the strength numbers. A menu on mouse buttons 2 and 3 (same on both) lets you drop pieces. There is no checking as to whether you actually hold the piece you are trying to drop; we rely on ICS to check that. Notation of the form P@f7 is generated and parsed. The mate detector does not understand that non-contact mate is not really mate in bughouse, but this does no real harm. It results in a "#" suffix being displayed on the move notation, but xboard does not assume the game is over. * Bug fix: Promotion to a knight was not working with ICC! Thanks to Wendigo for the report. * Bug fix: Special pty code for host types *-*-aix3* and *-*-irix3* (supplied from configure.in) had a bug that would cause childio.c to fail to compile, due to a "continue" that was not within a loop. * Bug fix: In pgntags.c, memory was being freed while still in use. One symptom this caused was that on some machines, cmail would fail with a message that it could not find the BlackNA tag. The error was in some submitted code that I included in version 3.2.pl3 without reading carefully enough. Anders Forberg noticed the symptoms, and Evan Welsh (who had nothing to do with causing the bug) found the bug and submitted a fix; thanks to them both. * Removed restriction against using EditGame while playing, observing, or examining on ICS. You still get a warning popup. 3.3, patchlevel 3 -- Sat Sep 16 11:44:05 PDT 1995 Tim Mann * Bug fix: Going directly from MachineWhite to TwoMachines mode would kill off the second chess program after Black's first move. * Added -timeIncrement feature. Thanks to Joel Rivat. * Deleted code that tries to keep you from observing more than one game, or observing while playing or examining. There is actually no problem in doing this, except that every time an update comes in from a different game than is currently being displayed, xboard fetches the history of the new game, which may be time-consuming if you are on a slow link. * Fixed configure so as not to crash when neither lex nor flex is found. lex or flex is needed only if the user wants to rebuild parser.c. Thanks to Phil Humpherys for reporting the crash. * Bug fix: config.h.in used #define instead of #undef for some macros used in the pty code in childio.c. This causes the code to fail to compile on some architectures, because the symbols are supposed to be undefined, not defined to empty, when they are not set in configure. Bug originated in 3.3.pl0 when config.h was introduced. Thanks to Phil Humpherys for report. * Bug fix: ShowThinking would not show anything when current position had no move to display in the move window. E.g., if position was created by LoadPosition or EditPosition. 3.3, patchlevel 2 -- Mon Aug 28 11:11:11 PDT 1995 Tim Mann * Zippy code was omitted from xboard-3.3.pl1 by mistake; now included. * For WinBoard, added hint to help file that you may need to turn off LocalLineEditing while typing dialing commands to your modem. 3.3, patchlevel 1 -- Sat Aug 19 15:13:30 PDT 1995 Tim Mann * Zippy distribution is no longer separate from regular xboard distribution. * Deal properly with Show Thinking output from GNU Chess when it is thinking on its opponent's time. In TwoMachines mode this output is suppressed to avoid interfering with the output from the machine that is on move; in other modes it is displayed (including the move that GNU Chess is predicting the user will make next). GNU Chess produces this output only if it is built without -DQUIETBACKGROUND defined; this symbol is defined by default in patchlevels before pl75, but undefined by default in pl75. * Bug fix: Handling of initial board position in move list for wild games was broken, so wild games could not be observed and adjourned wild games could not be continued. Thanks to "Maximum Entropy" for the bug report. * Added feature: algebraic notation now shows "+" indicator for check and "#" for checkmate, as called for in PGN standard. Thanks to Kevin Maher for the suggestion. 3.3, patchlevel 0 -- Thu Jul 27 22:21:07 PDT 1995 Tim Mann * Changed configuration to use a config.h file instead of passing zillions of -D options on the cc command line. * Merged a small fix and some updates to the texinfo file from Jochen Wiedmann. The texinfo file still needs work. 3.2, patchlevel 5 -- Tue Jul 18 20:29:39 PDT 1995 Tim Mann * Beta test release of xboard only. * Updated WinBoard code to include new xboard features. * Added texinfo file from Jochen Wiedmann to the release, but not as the primary documentation. It needs updating, and the English needs work. I did make a few improvements, mostly to change incorrect uses of @var to either @samp or @code as appropriate. * Merged in code changes to 3.2.pl4beta from Jochen Wiedmann. * Fixed EditComment; did not pop up window in previous beta. * Added AutoComment feature. * Added GameListDestroy to disable the outdated game list popup in cases where we load a new game file without building a new popup. * Added yyskipmoves feature to parser.l to speed up building of gamelist. * gamelist.c wouldn't compile with a non-ANSI compiler. Fixed. * Change to yy_text handling in patchlevel 3 still had problems. Can't use AC_DECL_YYTEXT in configure.in, because that defines YYTEXT_POINTER according to whether the lexer on the current host makes yytext a pointer. But most people will be using a parser.c that was generated on another host and shipped with the package. 3.2, patchlevel 4 -- Sun Jun 25 19:13:43 PDT 1995 Tim Mann * Beta test release of xboard only. * Added FIREWALLS section to man page. * Changed -icsport to be a string. Now with the -telnet option, specifying -icsport "" suppresses the second argument to telnet. * Added EditTags feature. Removed AboutGame from menu, because EditTags subsumes it. EditTags suggested by Jochen Wiedmann and first implemented by him in AmyBoard. xboard implementation is my own. * Fixed some missing or incorrect prototypes. 3.2, patchlevel 3 -- Sat Jun 3 18:57:38 1995 Tim Mann * Beta test release of xboard only. * New version of cmail from Evan Welsh, to fix compatibility problems with perl 5.0. * Added game list feature on Load Game, based on code from Jochen Wiedmann. Integrated it with cmail. * Several bug fixes from Jochen Wiedmann, including one to my yy_text workaround for the difference in the type of yytext between lex and flex. * Handle clock pause on FICS. * Suppress clocks in untimed FICS games (time control 0 0). * Rebuilt configure script with autoconf 2.3. This fixes a bug in configuring for X11R6, where -lSM -lICE would not be added when needed. * Fixed inconsistent type declarations on IntSigHandler and CmailSigHandler. Bug report from Josh Daynard. * backend.c wouldn't compile with a non-ANSI compiler. Fixed. 3.2, patchlevel 2 -- Tue Feb 7 14:50:30 1995 Tim Mann * Minor release of both xboard and WinBoard. * Added recognition of some FICS messages. On the other hand FICS is also changing some of its messages to match what xboard already recognizes. * Temporarily went back to using "promote" command on ICS instead of "a7a8=Q", because FICS doesn't implement the latter yet. * We now avoid using overlapped I/O on pipes in WinBoard, to make Windows 95 beta 2 happy. This lets WinBoard work with GNU Chess on Windows 95! * Installed patches from Jochen Wiedmann to coordinate with Amiga XBoard. * Installed patch to cmail bug in LoadGame from Evan Welsh. * Bugfix: checkmate and stalemate moves entered with EditGame in ICS mode were not being handled correctly. Bug was in GameEnds(). * Implemented EchoOn and EchoOff for xboard, using system("stty echo\n"). Now passwords won't be echoed when you connect directly to ICS. Also, telnet negotiation characters aren't displayed (when possible). * Implemented more of the telnet protocol. Now connecting to a telnet server with "-icsport 23" should work even without giving the -telnet option. The telnet is in "old line-by-line mode". 3.2, patchlevel 1 -- Sat Dec 10 13:50:46 1994 Tim Mann * This patchlevel released for WinBoard only. * winboard.c: Fixed ConsoleInputThread(). Needed to change CRLF to LF, not to CR. This was stopping normal /ics mode from working. Thanks to Asher Kobin for the bug report. * winboard.c: Fixed Raw(), EchoOn(), EchoOff(). Now they take effect immediately, not on the next console read after the one in progress. * winboard.c: Attempted to make WinBoard work with gnuchessx running directly on Windows (not remotely via rsh). It now works on NT, but only if gnuchess is told not to think on its opponent's time ("easy\n" removed from initString). The problem seems to be that GenerateConsoleCtrlEvent is not doing anything. On Windows 95 beta 2, we get error messages on both reading and writing to gnuchessx; I didn't investigate why. 3.2, patchlevel 0 -- Wed Dec 7 13:23:36 1994 Tim Mann * Thanks to all the beta testers who gave me feedback: Josef Nelissen, Steve Booth, Evan Welsh, Dima Dakhnovsky, Chris Petroff, Peter Jansen, Derek Terveer, Michel van der List, Richard Lloyd, Shelly Mistry, and Mike Lee. Sorry if I forgot anyone. Thanks to Virendra Kumar Mehta for information about DYNIX/ptx. * Don't exit on keyboard EOF unless we get two in a row. * WinBoard only: added -localLineEdit switch to allow turning off local line editing if you really want to. It is still a bad idea to let the echoing be done remotely, however; see below. * Fixed some configure problems on HP-UX. [Steve Booth] * Fixed (I hope) configure problem on SunOS 5.3/Solaris 2.3. [Josef Nelissen] * cmail bugfix from Evan Welsh (cmail 3.4). 3.1, patchlevel 9 -- Fri Dec 2 23:54:56 1994 Tim Mann * Beta distribution only * Always do local echo/edit of user typing in ICS mode. Doing the echo downstream may seem nicer in some modes, and it can be hard to turn that echo off, but the echoed characters can be interleaved with ICS output and make it impossible to parse correctly. For xboard this involved only a change to recommendations in the man page, as Raw() isn't implemented. For WinBoard, removing Raw() made a real difference. Added code in WinBoard to change /r/n back into /r on keyboard input, as we get the former when Raw() is not called. * Do not issue ICS "refresh" command after we start to observe a game unless we get to the next prompt without seeing a board image. Newest version of ICS doesn't require this refresh, but old versions around still do. * cmail bugfix and small code cleanup in LoadGame, from Evan Welsh. * Added keyboard accelerators N/P for LoadNextGame/LoadPreviousGame. Evan Welsh request. * Using "-" on the command line as a filename for loading (saving) games or positions specifies the standard input (standard output). Alain Picard suggestion. * On WinBoard only, a command line option without a leading '-' or '/' is now taken as the value of -lgf. * Changed to not use stdin, stdout, stderr as initializers in backend.c; needed for GNU libc compatibility. You also must build parser.c with flex (not lex) if you are using GNU libc, to avoid having the same problem there. * Changed WinBoard to avoid using "overlapped" input on the console. It now seems to fully work on Windows 95 beta 2. * Improved comment popups on WinBoard. Now newlines are handled properly, and the plain Comment popup window doesn't disappear and reappear when we step to a new move with a new comment. * Fixed bugs in detecting the absence of the time and otim commands. * Added built-in implementation of rcmd protocol to WinBoard. Windows NT does not implement passing signals through rsh, and Windows 95 does not have rsh at all. * Added -remoteUser option. 3.1, patchlevel 8 -- Mon Nov 28 15:26:07 1994 Tim Mann * Beta distribution only * Rearranged ChangeLog file into reverse chronological order to be closer to GNU standards. * Integrated new cmail code from Evan Welsh (including cmail RCS rev 3.2). Includes a bug fix to TruncateGame. * Updated ICS address to be chess.lm.com. * Bug fixes to handling the aftermath of FatalError. Thanks to Chris Petroff for the bug report. * Test for remsh before rsh, other fixes for HP-UX. Thanks to Richard Lloyd. I wasn't able to do all the things he suggested, so there may still be some rough edges in building on HP-UX. See the FAQ file for hints. * Bug fix; added missing check for HAVE_SYS_SYSTEMINFO. Thanks to Josef Nelissen for testing on Solaris 2.x. * Updated WinBoard to match xboard. (WinBoard still has a few option dialogs that don't exist in xboard.) * Changed Hint output to a popup. * ShowThinking output and move output no longer overwrite each other. ShowThinking output won't appear if the displayed position is not current. ShowThinking output in TwoMachines mode made clearer and documented. * Implemented --enable-ptys and --disable-ptys arguments to configure. * Fixed Book and Hint code to work over a pty with echo enabled and tabs expanded to spaces. Thanks to Dima Dahknovsky for the bug report. * Moved Attention calls from all over xboard to one place, inside SendToProgram. * Added bulletproofing to ShowThinkingEvent. * Added code to handle "refresh N" boards that come in from ICS properly, assuming ICS is changed to mark them with a new relation code (-3). 3.1, patchlevel 7 -- Sun Nov 13 22:16:01 PST 1994 -- Tim Mann * Beta distribution only * Changed ShowThinking to just show the current best line in the DisplayMessage area, instead of dumping everything to stdout. * Installed new cmail (RCS rev 3.1) and cmail.man (RCS rev 1.10), and changes to cmail code in backend.c, from Evan Welsh. * Miscellaneous minor fixes. 3.1, patchlevel 6 -- Fri Nov 4 12:53:53 PST 1994 -- Tim Mann * This patchlevel was not actually released to anyone. * Updated the pty code to be based on GNU Emacs 19.24, and moved it to a separate file. It was hard to split out just the pty configuration from all the stuff emacs does with its custom configure script and .h files, but I did my best. * Converted from imake to GNU autoconf. This was a serious upheaval. * Put in code to help trap "error gathering move list" problem reported by Michel van der List if it recurs. I couldn't reproduce it. 3.1, patchlevel 5 -- Mon Oct 31 21:12:00 PST 1994 -- Tim Mann * Beta distribution only. * We now test for checkmate or stalemate in EditGame mode after every user move, and in LoadGame mode whenever we hit the end of a game without seeing a PGN end marker. cmail needs an update to deal with this correctly; Evan promises one. * Bugfixes in new move generator. Thanks to Mike Lee for reporting one of the bugs. * Imakefile was omitted from patchlevel 4. 3.1, patchlevel 4 -- Mon Sep 19 18:19:46 PDT 1994 -- Tim Mann * Beta distribution only. * The move generator includes a mate tester. Initially this is used only by cmail, and even that usage needs further work. * Wrote a true move generator and used it to replace all the move disambiguation and legality checking code in parser.l. The move generator is capable of dealing correctly with en passant and castling availability, but the rest of the program still does not keep track of this information. * Bug fix: xboard did not handle "foo has made you an examiner of game 23" message. Thus you could not use examine features until the next board came in, showing your new relation to the game. Thanks to POOKIEWOOKIE on ICS for the bug report. * Added AutoObserve feature. Thanks to Chris Petroff for the idea. * Added Book feature to use new gnuchess "bk" command. Mike McGann request. * Redid code to handle missing "time" command in gnuchess, because latest gnuchess no longer sends a response to this command. * Eliminated need for -DFLEX. Thanks to Michael Shields (Vladimir?) for the idea. * Added missing code to implement MoveNow in TwoMachines mode. * Added ShowThinking feature. Thanks to Richard Lloyd for the idea. * Applied patches from Evan Welsh; some fixes and improvements to the cmail code. * Fixed bug in moving from EndOfGame mode to MachineWhite or MachineBlack, introduced in previous patchlevel. Also fixed related bug in ending a game in ICS mode; was entering EndOfGame mode instead of IcsIdle. * Added patch to implement internetChessServerLogonScript flag, from Kevin O'Connor. Thanks! 3.1, patchlevel 3 -- Wed Sep 7 13:22:07 PDT 1994 -- Tim Mann * Beta distribution only. * Merged in new cmail code from Evan Welsh. He added the ability to have more than one game per message, needed for official IECG matches. I added the ability to resign or offer/accept/decline a draw in a cmail game. * Bugfix: invalid -tc option caused segmentation fault; DisplayFatalError was called too early in initialization. Georges Honore reported this bug. * Decided to keep EndOfGame mode as an element of the user interface---it means that a gnuchess game or loaded game has ended, and the user must explicitly select EditGame to edit it, rather than just being able to enter more moves freely. But internally there is no longer an invariant tying this mode to whether the chess program is running. * Zippy bugfix: Was saving only the final position in the -sgf file when the game ended by something other than resignation or flag. Also fixed the longstanding bug that Zippy would think the final board of such a game was a new game and restart the chess program. * Now does a better job of faking castling availability in FEN. We still don't really keep track of it, but now at least we don't say that castling is still available when the king or rook is not on its home square. * Bugfix: Initial board of game history for wild games was going through too much processing, causing us to forget the game length, which is now needed by ParseGameHistory. This was causing problems with resuming adjourned wild games. * Updated ICS host to ics.onenet.net. * Zippy now accepts challenges where the opponent specified his color. * Added ZIPPYPASSWORD2 to let operator give commands directly to gnuchess. * Bitmap directory can include alternative icons now, too. * Handle "Game * (*) has no examiners" message from ICS. * Revamped window title and icon name selection. 3.1, patchlevel 2 -- Sun Jun 12 17:16:28 PDT 1994 -- Tim Mann * "Beta" distribution for Zippy users only. * Bugfix: common.h was assuming that X11 type Boolean is char, which is not always true. This might have caused all sorts of obscure bugs! * Installed new bitmaps from Elmar Bartel as the default. Many thanks! The old bitmaps can be used by changing the "bitmaps" symbolic link before compiling xboard, or by using the -bitmapDirectory option at runtime. * Loading a game that ends with the PGN unfinished symbol ("*") now always leaves you in EditGame mode. * Added documentation of -icscomm to man page. Thanks to Maarten Remkes for the linux script. * ^C now kills gnuchess as well as xboard. Thanks to Dima Dakhnovsky for reminding me how to do this. * Bitmap icon color now indicates player to move. Stuart Cracraft suggestion. * Changed piece bitmap flags to have just one flag, which points to a directory full of bitmaps, instead of a flag for each bitmap. Also changed bitmap naming convention. * "Connection closed by ICS" is no longer a FatalError popup. This was too annoying in the normal case where the user typed "quit". * Changed default font to 14 pixels instead of 10 points. This seems to make it close to the size I want it to be on more displays. * Major mode (GNU Chess, etc.) appears in title bar. Stuart Cracraft request. * Bug fix: EditGameEvent, MachineBlackEvent, MachineWhiteEvent, and TwoMachinesEvent were calling PauseEvent to get out of pause mode, which now has undesired side effects, such as advancing the display to the forwardMostMove. It works fine to just set pausing = FALSE instead. * IcsExamining mode now lets you access ICS edit position commands using the same popup menus as xboard's EditPosition mode. Thanks to DAV on ICS for inspiring the idea. * Corrected test for gcc on HP in Imakefile; thanks to Richard Lloyd. 3.1, patchlevel 1 -- Wed Jun 1 16:25:11 PDT 1994 -- Tim Mann * Added parser.c.lex and parser.c.flex to the distribution. * Added HP gcc options to Imakefile, from Mats Nylen. * EndOfGame mode no longer highlights EditGame mode indicator, because the modes really do differ. I would like to get rid of EndOfGame mode in the future, at least as far as users can see. * Larger %a in parser.l, needed for RS/6000 users. * Minor improvements to Mail Move error messages. * When -debug flag is given to xboard, -v is passed to cmail. * Old Save Style uses "1. ..." instead of "1..." when black moves after a comment; more like xboard 3.0's actual style. * New version of cmail from Evan Welsh. Looks for UCB Mail in a more portable way and has some minor bug fixes. * Bug fix: Saving a FEN position while in EditPosition mode with black to play was showing white to play in the saved position. 3.1, patchlevel 0 -- Fri May 20 16:36:15 PDT 1994 -- Tim Mann * This is the first general release since 3.0, patchlevel 9. Releases since then have been limited-distribution or beta releases. * Thanks to my version 3.1 beta testers: Dmitry Dakhnovsky, Ed Hanway, Richard Lloyd, Mike McGann, Shelly Mistry, Josef Nelissen, Chris Petroff, Jack Robertson, Michel van der List, Ky Macpherson, Derek Terveer, and Evan Welsh. Sorry if I've forgotten anyone who gave me feedback. * Updated man page. * Minor cleanup on menu sensitivity code. * Integrated another even better version of cmail from Evan Welsh, including some code he supplied in xboard itself. * A few more fixes to cmail support. * Automatically update clocks after an ICS "moretime" command. * Handle ICS automatic examine mode (set examine 1) after a game. 3.0, patchlevel 14 -- Tue May 17 13:41:44 PDT 1994 -- Tim Mann * Beta test release only. * Don't suppress prompt on first board of game being examined; otherwise it looks like nothing happened at all (i.e., like you're lagged). * Added StopExamining and StopObserving (Chris Petroff suggestion). * Made Reset do a refresh on ICS. John Chanak's original ICS code for xboard tried to do this; I finally decided it was a good idea after all. * Fixed bugs in handling updates that come in while you are pausing in examine mode. This is pretty tricky to do right. * Made un-Pausing immediately pop you to the current position. This is always necessary in examine mode, since the game may have changed under you; your remembered moves might no longer be right. So I made it do the same in all modes. * Took Detach Examine mode back out...used Pause mode for this instead! * Put in a trap for the GNU Chess bug of printing an Illegal Move message when its own hint move is illegal. * Attempted to fix a Zippy bug; bogus "exited unexpectedly" messages after it checkmates its opponent. This involved adding an argument to GameEnds to say who says it ended (ICS, GNU, etc.) and taking different actions in different cases. Unfortunately, this just restored an older Zippy bug, where Zippy restarts gnuchess when it gets the board with the final position, because GameEnds still puts xboard in EndOfGame mode. Sigh. * We now capture elapsed time on last move when getting game history. (Josef Nelissen bug report) * Rewrote code to redisplay last file title so it really works. * Fixed bug in oldSaveStyle. * Larger %a and %o were needed for lex. 3.0, patchlevel 13 -- Mon May 16 16:26:22 PDT 1994 -- Tim Mann * Beta test release only. * FatalError popups stay on the screen now. If the error is really fatal, all functions are disabled, and the program exits when you press OK. * Redisplay last file title when using Load (Next/Previous/Same) Game. * Zippy understands new match challenge message format on ICS. * Added Revert command. * When examining a game on ICS, < > buttons do ICS backward/forward commands, unless you set the Detach Examine option. Thanks to Dima Dakhnovsky for the idea. * Fixed various minor problems in cmail mode. * cmail generates the tags now. New version of cmail from Evan Welsh. * cmail mode won't let you do MailMove unless the currently displayed position is exactly one move past the end of the game you loaded. * Fixed building of man pages in Imakefile * Updates to INSTALL file 3.0, patchlevel 12 -- Sat May 7 21:10:03 PDT 1994 -- Tim Mann * Beta test release only. * Brought man page up to date. * Added Shift+R to resign from keyboard. * Some items on Action menu available in GNU Chess mode now. * Revamped Action menu. * Reordered functions in backend.c as a small step toward reorganizing this whole mess. * Generate TimeControl PGN tag. * Get type of ICS game (e.g., rated blitz) and save in PGN tags. * Bug fix: Clocks were not redisplayed when entering EditGame mode. * Bug fix: Clocks were not being redisplayed after loading a game file with -td 0, so they could show the wrong color active. * Bug fix: Chess programs would be killed and match mode would exit prematurely when loading a PGN game fragment ending with "*". * ICS command "sposition" no longer confuses xboard. * Integrated new version of cmail (with support code in xboard) from Evan Welsh. * Added TruncateGame, MoveNow, RetractMove, and QuietPlay. * Bug fix: switching between MachineWhite and MachineBlack was not calling Attention(). Reported by Dino Dini. * More improvements to INSTALL and Imakefile. * Pack moves into 79 character lines in PGN output. We don't generate check indications, and we always break the line before the result, so this is not quite PGN export format. * Use FEN tag in PGN. * Improved finding and counting of game starts in save files. * Negative position or game numbers in -lpi/-lgi mean to seek to that byte offset. Hook for possible future features, not in man page. * Detect and handle absence of either "time" or "otim" commands in gnuchess. * Don't use "promote" command to ICS anymore. * Handle switching sides and taking back moves on FICS. * Handle flip state flag in style 12 board. * Handle examine mode on ICS. * Improved error popups for various kinds of illegal moves. * Suppress unasked-for hints from gnuchess (which it generates in post mode). * Load/save position functions use FEN. Old style also supported. * Added detailed error messages if loading a bitmap file fails. * Small board has 2-pixel lines between squares instead of 3-pixel. * Added OldSaveStyle and AboutGame. * Renamed ForceMoves to EditGame. 3.0, patchlevel 11 -- Tue Sep 21 15:25:36 PDT 1993 -- Tim Mann * The following changes were present in xboard 3.0, patchlevel 11, but the first group did not make it into WinBoard 3.0 until later. xboard 3.0.pl11 was a limited-distribution release only, mostly to Zippy users. * Man page minor fixes. * Added a missing file close. * Removed automatic error popdown on Reset, which was destroying some error messages before they could be read. * Fixed char vs. unsigned char warnings on bitmaps. * Use ICS board style 12. Some improvements to ICS parsing. * Comment window is now labelled with the move the comment is on, and comments don't pop down when you step to the next move. * Save files now in PGN format. * Support for loading PGN files. PGN tags pop up when a PGN game file is loaded. * More info in INSTALL and Imakefile about building for Suns (and other systems). * WinBoard 3.0 patchlevel 11 split off from an early version of xboard 3.0 patchlevel 11, so it does not have all the features of that patchlevel. The following changes made it into both xboard and WinBoard: * Made Comment dialog non-modal in WinBoard. * EndOfGame mode is now more transparent. It looks like ForceMoves mode except that there is no chess program running. * Small bug fixes in clock management. Most noticeably, pausing when it is gnuchess's move now works as documented (again). * Add minimal support for -icscomm option. Not documented yet because I haven't sorted out the issues with setting the tty modes on the comm port device, or with locking it properly. But it's usable by wizards. * Don't restart the chess program upon Backward event from EndOfGame mode. * Suppress extra prompt after ICS sends us a board. 3.0, patchlevel 10 -- Sat Sep 11 18:44:03 PDT 1993 -- Tim Mann * Beta test release only. * Zippy now plays chess. zippy.c and zippy.h are still not included in the standard distribution, but are available on request. * Switched to using style 12 on ICS. * Updated man page, and documented use of XBoard*form.translations to add more shortcut keys. * Added shortcut keys "d" to claim/offer/accept a draw, and "t" to call flag. Suggested by venu on ICS. * More explicit instructions in INSTALL file. 3.0, patchlevel 9 -- Tue Sep 7 14:02:00 PDT 1993 -- Tim Mann * General release, minor update to 3.0.pl8. * Loosened checking on whether it's okay to start a move, to satisfy ICS ultra-blitz players. Now we don't check whether it's your turn until you let go of the piece. * Parser now recognizes "+-+" as meaning the game ended in a draw. * Got rid of S_NONE symbol, which seems to conflict with some symbol Sun defines. * Tweaked the man page. Clarified that there is currently no way for two people running copies of xboard to play each other without going through the Internet Chess Server. * Fixed a bug in color name conversion. Asking for two different colors whose names were the same in the first four characters would get you two copies of the first one. Thanks to Volker Zink for the bug report. * Improved confusing Usage() message. * Added a bunch of Sun information to the Imakefile and INSTALL file. Thanks to Ed Hanway, Arik Klingensmith, and others who responded. * Test for defined(WIN32) instead of !defined(unix). * Avoid using (void *) type with non-ANSI C compilers. Thanks to James Altucher for the bug report. 3.0, patchlevel 8 -- Thu Sep 2 12:23:01 PDT 1993 -- Tim Mann * Note: Patchlevel 8 was the first non-beta release of xboard 3.0 * Added cmail to distribution. Contributed (and still maintained) by Evan Welsh. * Bug fix: -queen option wasn't initializing menu check. Reported by Pat Surry. 3.0, patchlevel 7 -- Thu Aug 26 13:23:24 PDT 1993 -- Tim Mann * Sent WinBoard 3.0.pl7 to Torre on ICS * Added parser.h to hold the interface to parser.l * Upgraded COPYING file and copyright notices to GNU GPL version 2. 3.0, patchlevel 6 -- Tue Aug 24 15:16:13 PDT 1993 -- Tim Mann * We no longer display intermediate positions or intermediate comments while loading a game file with -timeDelay 0 or loading an opening to start up a -matchMode game. * Loading an empty game from an xboard save file now gives a status message "No moves in game" instead of an error popup saying "Game not found in file." * Added comment.awk to distribution. 3.0, patchlevel 5 -- Tue Aug 17 16:45:54 PDT 1993 -- Tim Mann * Bug fix: xboard would crash if it couldn't get all its colors; now it switches to monoMode instead. Also, xboard was trying to convert color resources even when using a b/w display. Reported by Larry Rogers. * Bug fix: Declared fields of TimeMark as signed so that we get signed instead of unsigned arithmetic. SubtractTimeMarks was breaking on Alpha AXP (which has 64-bit longs) with old declarations. Reported by Michel van der List. * Bug fixes: Keyboard accelerators now work after EditComment window is popped down. Iconize keyboard accelerator now works even if xboard was started with -iconic flag and later deiconized. * Bug fix: The routine that tests whether a move is illegal because it would leave you in check was not handling e.p. captures properly. Reported by Patrick Surry. * Bug (?) fix: Was adding time to clocks at time control even when loading a game file. Actually it's not entirely clear how time controls should be dealt with when some moves are loaded from a file or clicked in with ForceMoves. For now ForceMoves mode does add the time (because it can be used to change moves during a live game), but LoadGame mode does not. * Updated usage message. * Previous attempted fix to matchMode had broken TwoMachines mode and generally needed more work. Also simplified command line interface to matchMode. 3.0, patchlevel 4 -- Thu Aug 5 14:17:18 PDT 1993 -- Tim Mann * Thanks again to the beta testers listed for 3.0 patchlevel 3, and also Desnogues, Steve Cariglia, Niklas Engsner, Mark Silver, and Roger Rowe. * Reorganized man page, splitting OPTIONS into subsections. * matchMode was very broken; fixed. * Changed convention for turning off command line options from --opt to -xopt, to be less inconsistent with GNU standards. Also changed the long command line options to take True/False arguments like resources; seems to make more sense this way. * Added AlwaysQueen option -- suppresses promotion dialog and always promotes to a queen if you move a pawn to the last rank. Has no effect on gnuchess (or your ICS opponents!) -- they can still underpromote. * Subtracted an extra fudge term when determining how wide message and title widgets should be. This fixes a problem some beta testers had. Wish I knew why it's needed. * Bugfix in parser; symptom was that you couldn't do LoadGame after observing a game on ICS. * Bugfix in Forward; didn't work after game ended while Pause was turned on. * Removed bogus execute bits on .h files. * Use REMOTE_SHELL and TELNET_PROGRAM definitions. * MachineWhite and MachineBlack now work from TwoMachines mode. * Popping down an error message with the [ok] button was not turning off the errorUp flag, so the next move would cause xboard to try to pop it down again, resulting in a wild memory reference and sometimes a crash. 3.0, patchlevel 3 -- Tue Aug 3 17:40:27 1993 -- Tim Mann * Thanks to my beta testers: Patrick Surry, Takuya Kojima, Robert J. Luoma, Chris L. Petroff, Richard K. Lloyd, Michel van der List, Craig Metz, Antoon Frehe, Simon Clift, Shelly, Eric Peterson, Christopher Mitchell, Martin Koch, Ed Hanway, Steve Booth, Udo, Ken Hobday, and Joseph Duhamel. * Improved error messages for trying to move the wrong color pieces or to move when it's not your turn. * Special code for monoMode on 1-bit displays now understands displays where 1=white and 0=black. * Declare getenv() if not included; avoids a compiler warning. * Documented borderXoffset and borderYoffset. * Added -titleInWindow option for use with X window managers that don't let us set the title in the window banner. * Fixed error message printing in WinBoard; system error messages no longer appear as numeric codes. * The error message popup is now non-modal; you don't have to press the [ok] button before you can do something else. In addition, the popup is positioned so that it doesn't cover up the board (too much), and making a move or otherwise clicking on the board pops it down. (Not implemented in WinBoard.) * You can now call your opponent's flag in ICS mode by clicking on his clock. * Fixed minor bugs in -flipView option and documented exactly how xboard decides which way to flip the view. 3.0, patchlevel 2 -- Fri Jul 30 22:20:23 PDT 1993 -- Tim Mann * Added Autosave to Options menu. Would be better to have Save Options dialog as in WinBoard, but this was quick to do and gives the most-needed functionality. * Changed "Reload Game" on menu to "Reload Same Game". 3.0, patchlevel 1 -- Thu Jul 8 21:22:59 PDT 1993 -- Tim Mann * Sent a copy of patchlevel 1 to Patrick Surry to beta-test. * Added -cmail option that sets appData.cmailMode. Currently a no-op. In the future this may set special modes for use by the cmail script for playing chess by email. * Added LoadNextGame, LoadPreviousGame, and ReloadGame to File menu. ReloadGame suggested by Patrick Surry. * Added -flipView command-line option. Suggested by Patrick Surry. * Fixed bugs in parser.l: (1) Pattern for "# xboard game file ..." needed to match to end of line. (2) Start of a new file was not matching the ^ start-of-line character. The fix for this is a kludge. * Made game counting code in LoadGame more robust, and made LoadGame able to detect the end of a saved partial game (by noticing the start of the next game) in game files created by XBoard itself. We don't try to find the start of the next game that way in other kinds of game files, because the only way I can think of to do that is to look for another move #1, and that technique gets too many false hits. * Fixed recently introduced bug in LoadGame when game starts with a position diagram. 3.0, patchlevel 0 -- Fri Jun 25 14:17:17 PDT 1993 -- Tim Mann * Changes in this patchlevel were too numerous to list. Larger ones are listed below. * Added a popup dialog to enter and edit comments. Inspired by some code from Patrick Surry. Changed the normal read-only comment popup to the same style. * Added ICS init script feature from Karl Schwamb. * Added some ESIX fixes and OMIT_SOCKETS ifdef option, from Kayvan Sylvan. * Revamped code to allow use of flex instead of lex on parser.l. Using flex requires adding -DFLEX to defines in Imakefile. * Source code is split into front end (xboard.c), which knows about X and Unix, and back end (backend.c), which knows about chess, gnuchess, and the ICS. There is also a front end for Windows NT. * Boolean command line options now use "-foo" to turn on and "--foo" to turn off instead of "-foo true" and "-foo false". [Later -xfoo; see above.] * Added menu commands to control autoflag, bell, and coords options. * User interface has a new look: (1) Menu bar instead of array of buttons. A few very commonly used features have small buttons in addition to being on the menus. (2) Large font for clock. (3) Pop-up dialogs for errors. 2.1, patchlevel 11 -- Sat Jun 5 00:01:01 PDT 1993 -- mann@src.dec.com * Added code to deal with "wild" games on ICS. This includes allowing castling with the king on d1 or d8, which is allowed in wild(1) games if the king started there. Notation is o-o to castle "short"---to whichever side the king is closer to---and o-o-o to castle "long." Right now wild castling is always allowed by xboard; we rely on ICS or gnuchess to reject it when we aren't really in wild mode. * memcpy call had arguments in wrong order. * Removed April Fool code 2.1, patchlevel 10 -- Mon Feb 15 10:19:31 PST 1993 -- mann@src.dec.com * Avoid trying to select on a pipe when using System V. Needed to copy some code from InitChessProgram() up into establish(). * Bug fix in disambiguating pawn moves like "ed". * Fix to error handling in ReceiveFromProgram. * Bug fix: entering EditPosition mode with black to play highlighted White's clock instead of Black's. * Added telnetProgram resource in case "telnet" is not the name of the telnet program. 2.1, patchlevel 9 -- Fri Jan 22 19:08:27 PST 1993 -- mann@src.dec.com * Entering Force Moves mode clears "flag has fallen" messages from display. * ICS host name can now be in numeric format; for example 128.2.232.4. * Bug fix: LegalityTest was failing to test whether a pawn move was illegal because the move would discover a check. * Handle ICS message "mann asserts a win over manntest, who disconnected." * Bug fix: A recent change to PromotionCallBack had broken underpromotion to a knight. * Bug fix: In EditPosition mode, dragging a piece onto a square border would make it vanish. xboard wasn't distinguishing this case from dragging the piece off the board. Thanks to Matthew Kidd. * Removed "static" declaration from yywrap for compatibility with IRIX version of lex. Thanks to stiller@blaze.cs.jhu.edu. * Added substitutes for bzero, bcopy, and gethostname for Solaris SVR4. Thanks to Michael Grant. * Bug fixes to queen move disambiguation. Bugs showed up only when promotion resulted in more than one queen on the board. 2.1, patchlevel 8 -- Fri Dec 11 17:54:18 PST 1992 -- mann@src.dec.com * parser bug fix: It now really works to leave off the piece a pawn is promoting to and let it default to queen. * When starting to observe or play an ICS game, don't draw board in initial position and then immediately redraw it in the current position. * Handle ICS messages when an "abuser" forfeits a game by disconnecting and when a game is aborted ("removed") by an administrator. * Bug fix: A user move when in LoadGame+Pause mode was resuming the game load instead of putting us in force mode. * It seems that crashes inside sscanf when xboard is compiled with gcc (as on IBM PS/2 AIX, mentioned below, and also on VAX Ultrix 3.1) are caused by an incompatibility between gcc and the sscanf implementation on these platforms. A workaround is to specify -fwritable-strings to gcc (see the gcc documentation). Added info on how to do this to the Imakefile. Thanks to Tom McConnell for this information. * Clocks are allowed to go negative. This is mostly for ICS compatibility, but it affects gnuchess mode too. Also, we give the time bonus when a player hits the time control boundary even if his flag is already down. This choice is a bit debatable, but it makes things look better when you are in TwoMachines mode and gnuchess's time management screws up causing it to exceed its time limit. * Implemented move legality checking code. Moves made with the mouse or parsed from a file are checked for legality before being made. This is mostly in preparation for future extensions, such as human-human play. For now it makes -noChessProgram mode more useful. * If the user takes back moves, we restore the clocks to the earlier settings. * We now handle the output of the ICS oldmoves command, including parsing the game end condition. * Added autoCallFlag mode. * Fixed glitches in the medium size outline king and rook bitmaps, and touched up the medium size solid king and outline queen. * bug fix: DisplayMove would not display backwardMostMove - 1. * Added CallFlag button and removed AcceptMatch. CallFlag is more important with new ICS, and accepting the current match offer is easy with the new ICS command "accept" (can be abbreviated "ac"). * LoadGame and LoadPosition display tail of file name (plus index number, if any) as title. * MachineWhite, MachineBlack, and TwoMachines now work properly from LoadGame and LoadGame+Pause mode. * Use o-o and o-o-o to castle on ICS, not 00 and 000. * Stripped out code for old ICS messages; new ICS is now installed. * Bug fix: don't offer autosave when paused during LoadGame. 2.1, patchlevel 7 - Fri Dec 11 17:40:56 PST 1992 - mann@src.dec.com * Track change to "Illegal move" message in new ICS. 2.1, patchlevel 6 -- Tue Dec 8 10:48:44 PST 1992 -- mann@src.dec.com * Kludged around bug in keeping comment popup where you put it by adding borderXoffset and borderYoffset resources that give the width of the borders added by the window manager. Yucch. * Changed searchDepth kludge back to using "help" instead of "bd"; the latter didn't work because the output contains a line starting with "White", so we think gnuchess is telling us that White won. Oops. * Removed some code that uses an X11R5 feature, XrmGetDatabase. Without this, the auto font sizing code is harder to make work, so to keep my sanity I had to change it to affect only the fonts that appear in the main window and the comment popup, not the other popups. Maybe this is better anyway. * AcceptMatch button now works after a counterchallenge, too. * Added code for more variants of messages about games being adjourned or aborted. These messages need to be unified in new version of ICS. * Added workaround for minor bug in ICS; game number on first board can be wrong. * Removed code to say "refresh n" instead of "refresh"; was broken and wasn't needed anyway. * Added missing casts for compilers that distinguish enums from ints and missing cast in connect call. * Added code to recognize "both sides are out of time" draw message proposed for next version of ICS. * Thanks to Danny Sleator and Joe Peterson for bug reports. 2.1, patchlevel 5 -- Sun Dec 6 19:52:40 PST 1992 -- mann@src.dec.com * Removed gcc and CDEBUGFLAGS from Imakefile. * Corrected setting of mode to ForceMoves when game file ends or contains an AmbiguousMove or BadMove. Previous bug was harmless. * Added AcceptMatch button and mention of 50-move rule for Draw button to man page. 2.1, patchlevel 4 -- Sun Dec 6 02:55:42 PST 1992 -- mann@src.dec.com * Now handles revised messages from new version of ICS. New ICS is not released yet, so this code might change further. Next patchlevel will remove support for old ICS; both are there now. * Initial processing for a new game being watched or played now happens when we see the first board image. Removes the need to parse some messages and unifies some code. 2.1, patchlevel 3 -- Tue Dec 1 19:40:40 PST 1992 -- mann@src.dec.com * Handles ICS messages "Draw : neither player has mating material" and "Draw : White has no material, Black has no time." * Added AcceptMatch button for ICS mode. * Fixed bug in previous fix to yylexstr(). * Fixed bugs in code for loading old position files that don't start with "#" and for handling case where user asked for nth position in file but there aren't that many. * Handles ICS message "* has restored your old game" * ResetProc always clears title line now. * Don't issue just "refresh" when watching a game; use game number. Upcoming new version of ICS may need this. * Added code to try to prevent user from watching and/or playing more than one game at a time. There is a race condition inherent here; if we get more than one board from the game before our command to stop watching it takes effect, we'll think the user started it again. Not clear how to fix this. * Redid ParseBoard8 to use sscanf. Code is a good deal cleaner now. Also, we now parse out the game number too, though we don't make much use of it yet. * (Tried to put in a feature that recognizes the current game in a game file must have ended when we see the start of a new one, but had to disable it because we have too many false hits with the current parser, especially in gnuchess listing files.) * Moves read from game files or received from ICS are now translated into canonical algebraic form just like all other moves. Minor nit: If you use Reset while playing or observing a game in ICS mode, the game history (including the current board position) is lost, so the next move of the current game can't be translated. * Default fonts now vary with board size, and are chosen by pixel size instead of point size (since piece bitmaps have a fixed pixel size). * Bug fix: An extra Forward was required to skip over time indications in game files. 2.1 patchlevel 2 -- Fri Nov 27 23:30:00 PST 1992 -- mann@src.dec.com * If you move the comment popup, the next time it pops up it will come back where you put it. * Fixed yylexstr() so calls to it can be interspersed with calls to yylex(). * Fixed bugs in Forward/Backward while in LoadGame mode. * Changed Save{Game,Position} functions to append instead of overwriting if file exists. Changed Load{Game,Position} functions to deal with multiple games/positions per file. * Changed load{Game,Position}File resources to trigger automatic load on program startup. Changed save{Game,Position}File resources to trigger automatic save after every completed game and on program exit. * Added autoSaveGames mode. * Fixed bug with PromoPiece in call to MakeAlg from MakeMove. * Many changes to get rid of picky compiler warnings and generally clean up the code. 2.1 patchlevel 1 -- Fri Nov 27 02:45:00 PST 1992 -- mann@src.dec.com * A last minute change before patchlevel 0 went out broke ParseGameHistory(). Immediately fixed in patchlevel 1. Version 2.1, patchlevel 0 -- Fri Nov 27 02:00:00 PST 1992 -- mann@src.dec.com * Uses "time" command of gnuchess 4.0 and following to keep clocks in sync. Still works with older versions without this command; we test whether the command is present the first time each chess program is started. * File name dialog pops up under the mouse cursor, so that it's got the keyboard focus if the window manager is using pointer focus. * Attempts to move the wrong color piece or an empty square are filtered out in xboard instead of being passed on to GNU Chess or the ICS. * The reason a game ended is now remembered even if you move backward and forward after it ends. It is forgotten only if you make a move (which is as it should be---this is now a different game, which hasn't ended yet). The message saying why the game ended no longer wipes out the last move. * Pause, Backward, Forward, ForceMoves, and EditPosition now work from TwoMachines mode. * Forward and Backward now change only the board display unless you are in ForceMoves mode. Pause mode keeps new moves that are received from being displayed on your screen until you unpause (or use Forward). * Added option to ring the bell after opponents' moves. * Saved games that start from other than the standard initial position now begin with a postion diagram as in saved position files. The loader is modified to understand such save files. * Improved error checking when trying to read from gnuchess. * Parser understands things that look like time indications, e.g., (0:12), instead of popping them up as comments. * Send "quit" to gnuchess before trying to kill it. I needed this locally because sending a SIGTERM to rsh was not killing the remote program on some internal field test systems we have. * Merged in code from John Chanak to make xboard a front end to the Internet Chess Server, and added several improvements of my own. (These include parsing end of game messages, loading the current state and previous history of a game that's joined in progress via "watch" or "load", automatic switch from board style 1 to 8 when needed, removing irrelevant buttons and adding some new ones, adding the useTelnet and gateway resources, and miscellaneous code cleanup, bug fixes, and documentation.) Many thanks to John for writing and contributing the initial version of this code. Fri Oct 30 20:16:40 PST 1992 (patchlevel 25) mann@src.dec.com * gnuchess now castles by sending us "o-o" or "o-o-o" (starting with a preliminary version of 4.0.pl60 that I have). Added code to handle this. The old format ("e1g1", etc.) still works too. * Added code to format moves in normal abbreviated algebraic notation (for example, e4, exd4, f8Q, Nf6, 0-0) instead of coordinate algebraic (for example, e2e4, e3d4, f7f8q, g1f6, e1g1). Moves entered with the mouse or received from gnuchess are translated into this canonical format for display on the message line or in saved game files. Moves read from game files are not translated, however; they are shown and saved just as they appear in the file. Mon Sep 14 13:19:01 PDT 1992 (patchlevel 24) mann@src.dec.com * It's not really correct to write an ep capture of a pawn on e5 as fxe5; this should be written as fxe6 because e6 is where the capturing pawn ends up. Nevertheless, the parser now interprets fxe5 as the ep capture f5xe6 unless there is a pawn on f4, in which case it interprets fxe5 as f4xe5. By design, the parser does not flag fxe5 as ambiguous if there are pawns on both f4 and f5; instead it prefers the more legitimate f4xe5 interpretation. * A move like fxe6 or fe6 is now interpreted as an e.p. capture of the pawn on e5 if there is one there and e6 is empty. * A move like fxe5 can no longer be interpreted as an e.p. capture if there isn't a pawn on e5 to be captured. Previously this could happen erroneously if there were pawns on both f4 and f5, and the f4 pawn was capturing a piece on e5. * The parser no longer munges the move it is parsing; in the past, for instance, it would remove the "x" from a move like dxc5 before echoing it to the screen. * The parser now detects when a move is ambiguous and returns an error, instead of arbitrarily choosing one possibility as it used to. Mon Aug 10 18:40:47 PDT 1992 (patchlevel 23) mann@src.dec.com * Added code so parser can handle fully qualified algebraic, e.g., Ng1-f3, N/g1-f3, Ng1f3, or even Pe2-e4. The "P" and "/" work only for fully qualified moves, not generally. * Fixed parser bugs in handling moves with rank or file disambiguator, e.g. N1f3 or Ngf3. Mon Jul 6 17:55:32 PDT 1992 (patchlevel 22) mann@src.dec.com * AIXV3 patch from Tom McConnell; thanks! * After hitting the Backward button we see the last move made instead of the word "Pausing" displayed. * Fixed a couple of problems compiling on IRIX; thanks to Michel Arsenault and Alan Walsh for bug reports and help with fixes. * Added optional display of algebraic notation coordinates along left and bottom edges of board. This was inspired by some code from Jean-Christophe Engel; thanks! * Swapped EditPosition and Pause buttons to reduce danger of losing the game in progress by hitting EditPosition when you wanted Backward. Thanks to Ove Lundberg for complaining (though it bugged me too). * Despite one complaint, I kept the feature of changing both clocks when black makes time control, rather than changing each individually when the player involved makes it. This is to avoid having it look like White is way ahead on time while Black is thinking about the last move of the time control period (i.e., when White has made time control but Black hasn't yet). * Corrected clocks to work as in real tournaments. Time is *added* when you reach time control; previously the clocks were simply set to the length of the new time period. Also, when a player's flag falls, he still does not receive a new time allotment at the next time control, but his opponent does still receive more time if *his* flag has not fallen; previously, time controls were ignored for both players if either flag fell. I forget who reported this bug. * Added a small ESIX patch from Kayvan Sylvan. Mon Jun 22 13:24:38 PDT 1992 (patchlevel 21) * Added some SVR4 support code from Ronald Cole. It's Greek to me. * Note: Stephen Meatheringham reports a bug causing xboard to crash with an error from the X server when run on a Sun Sparcstation IPX with Solaris 1.0.1 and OpenWindows 3.0. This bug has not been tracked down yet. * Fixed a problem with ATTENTION code. On some operating systems, you have to be even more cautious about when you send a SIGINT to gnuchess, because the signal handler gets deinstalled each time it is used, and gnuchess does not reinstall it immediately. In particular, if you send a SIGINT and make an illegal move or ask for a hint, gnuchess does not reinstall the handler until *after* you make your next move, so you had better not send a SIGINT before it. I put a workaround for this case into xboard; I hope there are no more. * The ATTENTION code is needed when compiling for the ESIX operating system, because ESIX has a bug in the FIONREAD ioctl, so the code in gnuchess that lets you interrupt its thinking on your time just by typing in your move does not work. Perhaps gnuchess will have a workaround for this eventually. * Fixed yet another bug in using XtGetValues; code to inhibit shell resizing was leaving a null pointer as the place to store the current sizes. * Man page fixes: corrected -sl to -sd, updated LIMITATIONS. * Added include of conditional on HAS_GETTIMEOFDAY. I hope this works for all systems; on mine, and are the same file, but with an #ifndef that makes it harmless to include both. * Thanks for reports from Mike Pearlman, Stephen Meatheringham, Kayvan Sylvan, d87-mal@nada.kth.se, Urban Koistinen, and Ronald Cole. Mon Jun 8 11:39:18 PDT 1992 (patchlevel 20) * Documented default value of initString and explained what it means. This paragraph also serves to inform the user that xboard by default will tell gnuchess to think on his time, something one user apparently didn't understand. * Redid -searchDepth (formerly -searchLevel) and -searchTime code. They both work correctly with gnuchess 3.1 now. The -searchDepth option also works correctly with gnuchess 4.0. The -searchTime option does not work with gnuchess 4.0.pl50 or earlier because those gnuchess versions do not have a working searchTime feature. Instead of having xboard do a half-baked emulation of this feature by using a 1-move time control, I will be submitting a patch to the gnuchess folks to restore the feature as in 3.1. * Improved clock code. It now keeps accurate track of fractional seconds of clock running time, if your system has gettimeofday(); if not, it is generous about them---if a clock has been going for n.m seconds when it is stopped, only n seconds are charged. Previously, xboard would charge one second immediately when a clock was started, so if n.m had elapsed when it was stopped, n+1 would be charged. This should stop xboard from thinking gnuchess has let its flag fall on the last move of a time control, as it often did before. I also improved the comments and condensed the code a little. I hope there are no systems that have X11 and don't have gettimeofday(), but if there are, I'd like to know what to replace it with. * "Flag dropped" messages now show up on the top line, beside the clocks, so that they don't obscure more interesting messages on the second line. * Fixed confusion of NULL and '\000'. * Include time.h to get ctime() declaration. * Fix to "parser bug" messages in parser.l. * Changed code to work with old-fashioned tolower() macro that requires its argument to be an uppercase letter. * Minor fix to some usage error messages; was reversing program name and erroneous argument value. * Thanks to Mitch Wright, Ranier Orth, and Henrik Schmiediche for bug reports. Fri Jun 5 13:06:08 PDT 1992 (patchlevel 19) * Note: xboard does not seem to work when compiled with gcc 1.40 on a PS/2 running AIX. It crashes at the sscanf in line 768 of xboard.c. You can work around the problem by specifying the -timeControl option on the command line instead of defaulting it. This does not seem to be a bug in xboard itself; it runs okay on PS/2 AIX when compiled with MetaWare High C. [But see 2.1.pl8 above.] * Removed bogus files from distribution. * Changed variable name that conflicted with SVR4 ttyname function. * Thanks to Christoph Strozyk for another bug report, and to several of the folks mentioned under patchlevel 18 for testing it. Wed Jun 3 17:50:37 PDT 1992 (patchlevel 18) mann@src.dec.com * Added an include of sys/fcntl.h to pick up the definition of O_RDWR for System V users. * Fixed a bug in CatchPipeSignal; was testing the wrong variable to determine which chess program got the signal. * Removed the declaration of strrchr, which was causing problems for some people, and added an include of or instead. * Fixed a bunch of type errors uncovered by compilers that check more carefully than the one I was using. I just patched many of them with casts---typically cases where a function didn't take the same number and type of arguments as the X header file prototype said it should---because I didn't see any other way to fix them. The versions of the X header files that I have don't actually have full prototypes for these function types; they declare only the return type and just give the argument types as comments. * InitChessProgram returns immediately if chess program died while we were waiting for it to say "Chess". I think this fixes a bug that could make xboard crash or go into an infinite loop printing "Warning: Select failed; error code 9" if gnuchess crashed there. * Removed code that tries to put the file descriptor used to read messages from gnuchess into nonblocking mode. I don't see how this kludge could ever have fixed the problem it was intended to (see below), and it seemed to be causing a race condition when we were waiting for the initial message from gnuchess after it started up. * Thanks to Richard K. Lloyd, Konstantinos Konstantinides, Mark Seiden, Erik Schoenfelder, Andreas Stolcke, Rainer Orth, Henry Thomas, and Kris Van Hees for bug reports and help with fixes. Sun May 31 08:00:00 PDT 1992 (patchlevel 17) Bart Massey bart@cs.uoregon.edu * 'xboard' suffered from a couple of serious bugs. An initial size needed to be given to the message label to avoid a race condition (!) so I gave it some text (otherwise occasionally xboard would fail because the message widget was 0 width under MIT X11R4). The sizes needed to be Dimension, not int, because they were written in by Xt -- on my big-endian box Dimension is short, causing chaos. Also, I hacked a declaration in for strrchr() to shut the compiler up -- this is arguably a kludge, but I couldn't think of anything better; maybe you can. Fri May 22 13:40:50 PDT 1992 (patchlevel 16) * First real (non-beta) release of version 2.0. * Added GNU copyleft notices covering version 2.0 enhancements. Thu May 21 12:30:09 PDT 1992 (patchlevel 15) * Removed -g from Imakefile. * Added casts in parser.l to prevent warning messages from some C compilers. * Bugfix: code to exit if chess program couldn't be started had bug in error message printing. Tue May 19 11:58:06 PDT 1992 (patchlevel 14) * Fixes one small bug: If LoadGame does not find a game in the file, it resets xboard to BeginningOfGame mode (as if the Reset button was pressed), instead of leaving it in LoadGame mode. Mon Apr 13 18:32:27 PDT 1992 (patchlevel 13) * Improved error handling when gnuchessx crashes. Now displays a message and enters EndOfGame state without exiting. This should help with diagnosing gnuchessx problems, since the position and move history are not lost. * Debugged man page. Version 2.0 -- Thu Apr 2 16:04:54 PST 1992 (patchlevel 12) * Added small 40x40 pixel pieces; board size now specified as small, medium, or large. * Improved man page. * Saved position files now say "white to play" if it's white's move. * SavePosition while in EditPosition mode now gets side to play right. * Made "Pawn" the default on edit position menus. * Removed "To play" from edit position menus, since it's redundant. Left support code in so it can be restored if someone wants it. * Tightened parser's definition of a move number to help further with skipping over stuff before the first move. * Put back feature of skipping over stuff in game files before a start of game marker. This helps when loading electronic mail messages that have things like "00" in the header (looks like castling), or that talk about moves in running text before the actual game score. Tradeoff is that we can't load games that don't either have move numbers or say "gnuchess game" just before the moves. * Changed version number to 2.0 because others have used "1.3" for patched versions of 1.2. Display version number and patchlevel at startup. Thu Apr 2 15:30:22 PST 1992 (patchlevel 11) * Bugfix: Match started with TwoMachines button now handles the case where user loaded/edited a position *and* forced some moves. * added error message feedback to many cases where the user's button press is rejected because it isn't allowed in the current mode. * added -noChessProgram option to allow use as a passive chessboard without gnuchess, replacing old buggy scheme that tried to do this automatically when gnuchess was not found on the search path. * parser accepts "=" in front of promotion piece * parser accepts ":" notation for captures * Removed SwitchSides button to make room for EditPosition. Left code in place, ifdef'ed out. * Added EditPosition mode. * Reformatted xboard.c to eliminate long lines. * Promotion popup now appears near rank to which pawn is moving. * UI improvement: Button representing current program mode is kept highlighted. * Bug fix: Hint button is now disabled when machine is on move. Sat Mar 21 14:57:37 PST 1992 (patchlevel 10) * TwoMachines now works from MachineWhite or MachineBlack mode. * ForceMoves and Backward/Forward now work at the end of a game started by the TwoMachines button. * Sends o-o or o-o-o to gnuchess instead of O-O or O-O-O. * Bug fix: SwitchSides button is now disabled when machine is on move. * Added -searchLevel option and corrected handling of -searchTime to reflect the way gnuchess really handles command line options instead of what the documentation used to say. Allowed optional ":seconds" on times. Tue Mar 17 21:00:35 PST 1992 (patchlevel 9) * Removed non-working code that tried to recover when a remote chess program could not be started; now exits with a message instead. * Now waits for chess program to print its first message (normally "Chess") before sending it any commands. * Matches between two machines can now start from a black-to-play position or black-to-play opening. * Bug fix: The program would sometimes lose track of the board position after the end of the game, drawing a board full of white pawns next time it got an X redraw request. Now fixed. * Cleaned up handling of illegal moves in game files. Now we just stop reading and go into ForceMoves mode. * Saved games against gnuchess indicate who won (restored and debugged 1.2 feature). * Setting -searchTime turns off -clockMode. * My trick for setting up a black-to-play position broke in the transition from gnuchess 3.1+ to 4.0. Installed a different trick that works with both. * Bug fix: Was clobbering memory by mallocing one byte too few for the file name in SetupPositionFromFileProc. This usually resulted in a crash on the second attempt to load a position from a file. Mon Mar 16 16:49:00 PST 1992 (patchlevel 8) * Game and position files are saved in CHESSDIR as well as loaded from there. We actually chdir there, so gnuchess listing files also wind up there. * Underpromotion moves from gnuchess really work now. Sat Mar 14 14:55:24 PST 1992 (patchlevel 7) * Cleaned up lots of bugs and kruft in parser.l. It's a wonder the old version worked at all. Improved rejection of random text interspersed with the moves. * Relabeled buttons to reduce confusion (Play From File --> Load Game; Setup From File --> Load Position). * Bug fix: Doesn't exit at the end of a game that was started by pressing the Two Machines button. * Bug fix: Doesn't get confused if you hit Machine Black (White) while the machine is already playing black (white) and is on move. * Prints "White to play" or "Black to play" after loading a position file. * Bug fix: No longer hangs if no start-of-game is found in a game file. * More permissive about game file format. The first line is not assumed to be a header comment unless it starts with "#". We don't insist on seeing a "1." before the first move. * Added pop-up dialog to allow underpromotion. Moving a pawn to the last rank pops up a dialog to let you select what piece to promote to. Also added code to handle underpromotion moves from gnuchess or from a game file correctly. * Added code to send SIGINT to gnuchess before trying to move, if gnuchess might be busy thinking on our time. The code is ifdef'ed out because it's not necessary; only beta-test versions of gnuchess 4.0 at patchlevel 19 or below require it. Mon Feb 24 20:10:22 PST 1992 * Merged fixes received from Stuart Cracraft and Mike McGann, to iconic mode and to ShutdownChessPrograms. (They both sent the same fixes.) I did not install the change that removed "easy" from the initialization string, so xboard will still try to run gnuchessx in "hard" mode (thinking on opponent's time) by sending this command. Version 1.3 -- Thu Dec 19 18:19:00 PST 1991 mann@src.dec.com (Tim Mann) * I've fixed a slew of bugs in this version of xboard: * You can now back up from the end of a game, even if gnuchess was playing against you. Since gnuchess exits upon mate or draw (when it's not in force mode), this feature works by starting up a new copy of gnuchess and feeding it the saved starting position and moves. Drawback: the new gnuchess starts with clocks at the beginning of a fresh time control. * Note: the "force" command to gnuchess is a toggle. I fixed a couple of places in xboard where "force" was being issued when gnuchess was already in force mode, which resulted in chaos. I don't know if they were in 1.2 or if I added them myself in the course of putting in new features. * ForceMoves button is now legal in PlayFromFile mode. It closes the game file and lets you force moves (or go Backward) from whatever position you've reached. * The parser now recognizes "white resigns" and "black resigns" (in any combination of upper and lower case, with or without the closing "s"). These used to be misinterpreted as meaning "white wins" or "black wins" respectively! Added "1 - 0" and "0 - 1" as equivalents for "1-0" and "0-1". * I removed the parser feature of considering "!" as a comment delimiter. "!" is so common as an annotation in game scores that this feature seems like a very bad idea. * Added a wait() after each successful call to kill() to avoid leaving zombie processes around. * Removed the feature of putting an indication of how the game ended into the internal move list when playing from a file. The only benefit of this was that it would get written back out if you saved the game at that point. This feature doesn't seem too useful, since you are unlikely to save a game you've read in without making any changes, and it caused a lot of problems in the code and user interface. The end condition is still displayed as a message when it's first read in from the file. End conditions when playing against gnuchess are still saved, too. * programName is now the last file name component of argv[0], not all of it. * xboard.c got three compiler warnings due to arguments that didn't match the prototypes on X toolkit functions. I got rid of them by adding some casts, and adding extra unused arguments to the ReceiveFromProgram function. * As I received it, the distribution had an extra period glued on the front of every line that started with a period. This broke the manpage in an obvious way. It also broke parser.l in a nonobvious way that stopped PlayFromFile from working. * Fixed one or two bugs where the clock was started when it shouldn't have been. I think one example was if you tried an illegal move in ForceMoves mode. * Now starts the machine's clock if you hit MachineWhite when white is on move or MachineBlack when black is on move. * Now updates the to-move indicator (highlight on clock display) when you use Forward/Backward or ForceMoves. * gnuchess 3.1+ has a bug that makes it try to think on its opponent's time even when in force mode; this causes problems with xboard's SetupFromFile command because gnuchess's saved hint move is garbage after the new position is loaded, so gnuchess prints out an error message when it tries to think about what it would do if the user made this move. Here is a patch for gnuchess 3.1+: *** nondsp.c~ Mon Dec 2 12:37:18 1991 *-- nondsp.c Thu Dec 19 15:36:06 1991 *************** *** 1223,1229 **** ok = flag.quit = false; player = opponent; ft = 0; ! if (hint > 0 && !flag.easy && Book == NULL) { fflush (stdout); time0 = time ((long *) 0); *-- 1223,1229 ---- ok = flag.quit = false; player = opponent; ft = 0; ! if (hint > 0 && !flag.easy && Book == NULL && !flag.force) { fflush (stdout); time0 = time ((long *) 0); * SavePosition/SetupFromFile now handle black-to-play positions. If it's black's move in a saved position, the line "black to play" is printed immediately after the board display. Upon loading a position, xboard looks for "black" at the beginning of this line to determine whether it's black's move. * SetupFromFile now leaves you (effectively) in ForceMoves mode. This eliminates some cases where the program would get into an inconsistent state, and hopefully is more intuitive for the user, too. * PlayFromFile now leaves xboard in ForceMoves mode after playing through all the moves in the file. You can use Backward/Forward, make moves, get gnuchess to join the game with MachineWhite or MachineBlack, etc. The game file can end with either white or black to play. * Backward/Forward now seem to work in all cases. Previously using these buttons during a game against the machine would get xboard out of sync with gnuchess's idea of what was going on, resulting in chaos. Now using these buttons puts xboard in ForceMoves mode; you can bring gnuchess back into the game using the MachineWhite or MachineBlack buttons. Thu Jun 27 15:06:25 PDT 1991 * Remove comment popups during a reset. * Bug in my forward move fix. Didn't work for playgamefile mode. Thu Jun 20 15:04:06 PDT 1991 * Can't do a backward move when it isn't your turn because gnuchess gets confused. Similar bug for forward move. Do a bunch of moves, back up move and go forward. These get filtered out now. * Put easy back into the initString. This DISABLES easy mode which by default is ON. * New-line wasn't always being added to forward move strings sent to gnuchess. * Parsed comments as [ ..............text follows ] into d7d5 * Long game file comments cause core dumps on HP systems. * Multiple uses of the get positition file button got confused on the second click. Minor fixes to the 1.2 release Version 1.2 -- Tue Jun 11 17:14:12 PDT 1991 * For version 1.2, Jeff Kenton, Richard LLoyd, David Jensen, Martin D., Bill Schmidt, Scott Hemphill, Paul Vaughan and Bill Shauck all found a lot of bugs that we put into xboard just to see if they were paying attention. They were. * Changed the protocol that xboard uses to work with the new version of gnuchessr. * There was an off by one error with the clock resetting code. Also, the clock display highliting was wrong. Thanks to Bill Shauck for pointing these out. * enumerations are not really integers on some C compilers. I added casting. The new version of gnuchess expects the "go" command for two machine and machine plays white cases. The whiteString resource is for compatibility with previous gnuchess versions which get confused by go. Thanks to Martin D. for catching these. * Fixed a bug where the checkmate message wasn't being parsed and xboard kept playing. Also, the message was added to game file if saved. Thanks to Scott Hemhill for pointing this out. * Fixed a bug where saving a long game, resetting and saving a short game resulted in appending the end of the long game to the short one. If a game is just being played out and there is no reason for gnuchessr to be used, ignore pipe signals. This allows people to use xboard as a chess board without need for gnuchess. Also, trivially bad moves such as e2e2 are not passed on to gnuchessr but instead ignored out of hand. This allows people using xboard as a chessboard with gnuchessr to pick a piece up, think and put it back down without making a move. Thanks to Jeff Kenton for pointing these out. * Added the CHESSDIR environment variable. Game and position files are found in this directory. If this variable is not declared, then the current directory is used. File names starting with / are treated specially. * The bitmap file names were changed so that none exceeded 14 characters. This is necessary for R5. fcntl(from_prog[0], F_SETFL, O_NDELAY); The xboard fix was to set non-blocking i/o on the read pipe for gnuchessr printz ("Illegal move (no matching move generated)"); * fixed a problem with the new version of gnuchessr where xboard wasn't getting gnuchessr error messages for illegal moves. The problem seems to be fixed *without* any gnuchess changes but this is likely to be highly system dependant. There should be a new line on line 246 of nondsp.c * -iconic doesn't work at all now. The Iconify() does work. This was a tradeoff and it is really an Xt bug. * Fixed a compiler warning for gcc and an error for the IBM RT compilers. This is the VOID_PROC macro in xboard.h. Thanks to David Jensen for this. * If the DisplayWidth or DisplayHeight is less than 800, use small size mode. Also the size of the name widget was reduced from 500 pixels to 400 pixels because in small size mode there was a gap on the right. Changed the default font from fixed to helvetica_oblique14 to: **-helvetica-bold-r-normal--14-*-*-*-*-*-*-* helvetica_oblique14 is a font alias not on all R4 systems. Curiously enough, the 17 point is not available on 75dpi systems and the 18 point font is not available on 100dpi systems. Thanks to Richard K. Lloyd for pointing these out. * Minor hacks to work with R5 alpha. Had to add an event handler to the boardWidget to get translations to work. This may go away with the real R5. Added WM_PROTOCOLS: QuitProc() for R5 ICCCM compatibility. * If the first character of the file is not `1' then the first line of a game or position file is displayed as the name in a label widget. * Added a PopUp dialog for getting file names. * Modified the code to use the R4 routines rather than R3 compatibility. * Changed the forwards/backwards/readgamefile code to allow a play to step back and forth in a game. If he steps all the way to the beginning he has to restart the game. If he gets into a mated position, same problem. * Moved the man page from xboard.1 to xboard.man. This makes imake man page installs work correctly. Thanks to Richard K. Lloyd for pointing this out. * Corrected the queening code. XBoard was sending the wrong syntax. It was sending for example h8(Q) when it should have been sending h8q. Thanks to Paul Vaughan and Mike McGann for pointing this out. * Added a lex parser for algebraic games. It should be easy to use the parser for other interfaces such as the Microsoft Windows version. It parses comments of the form [anything] and ! to the end of a line. Version 1.1 -- Mon Jan 7 14:46:03 PST 1991 * Roger Dubar, Konstantinos Konstantinides, Wolfgang S. Rupprecht, Paul Scowen, Mvh Smidt and Kayvan Sylvan all helped immensely during beta-testing. * older non-ANSI versions of Sun compilers complain vociferously. * the remoteShell resource was added for HP-UX systems and other systems where the remoteShell isn't rsh. * -iconic doesn't work properly. If XBoard is opened iconic then iconifying it later with a keystroke doesn't work. I think this is an Xt bug. * For systems with smaller screens, XBoard can use smaller pieces, and a smaller board. -bigSizeMode False uses a smaller set of pieces. These are scaled versions of the large pieces. They look ok but could be improved. * getlogin() does not work in all cases. It was replaced by getpwuid(getuid())->pw_name). * Warning messages get displayed in the message box. * Any button restarts a paused game. * Kayvan Sylvan contributed a patch for ESIX. It seems that select() on pipes is broken on his system. We declined to incorporate his patch though, because it was a work-around for something that was broken on one system, and selfishly, that system was not my own. Nevertheless, it is likely that other System V users on PC's may need to use this patch and it is is included as the file ESIX.patch. To use it, type patch xboard.c ESIX.patch * Fixed a bug where hint didn't work. The local version of gnuchessr had been hacked. The fix was to clone stderr and stdout for gnuchessr. * Fixed a bug where a player could play after a game had been finished. * The bitmaps have been pushed into the bitmaps directory. * Substantially rewrote and simplified the Two Machine code. * Added StrStr() because many systems don't have this ANSI function. * Added keyboard equivalents. Added an iconify keystroke, C or c. * Works with gcc now. gcc complained about casting float constants as XtPointers. * Detect if the visual doesn't support color. If so, run in monoMode. An alternative would be to detect grayscale visual and use a collection of gray user interface colors. XBoard.clockMode: False * For people who don't like or use chess clocks a clockMode switch has been added. It is on by default. It can be turned off in the .Xdefaults file with * Added a declaration, xtVersion, which will quickly break on R3 Intrinsics. * Hal Peterson contributed a new Imakefile. * Rewrote DisplayClocks(). * Rewrote TwoMachinesPlay mode. * Konstantinos Konstantinides added the -searchTime option. * Substantially rewrote and simplified the clock code. If a game was paused and then resumed, the clocks were out of sync. * Fixed a bug in HandleUserMove() where the user could make a move while the machine was thinking. The fix detects and ignores these moves. onMove was not being used and was removed. xboard-4.7.3/menus.c0000644000175000001440000011122012262562252011215 00000000000000/* * menus.c -- platform-indendent menu handling code for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define HIGHDRAG 1 #include "config.h" #include #include #include #include #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #if ENABLE_NLS #include #endif // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are. #include "common.h" #include "frontend.h" #include "backend.h" #include "menus.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif /* * Button/menu procedures */ char *gameCopyFilename, *gamePasteFilename; Boolean saveSettingsOnExit; char *settingsFileName; static int LoadGamePopUp (FILE *f, int gameNumber, char *title) { cmailMsgLoaded = FALSE; if (gameNumber == 0) { int error = GameListBuild(f); if (error) { DisplayError(_("Cannot build game list"), error); } else if (!ListEmpty(&gameList) && ((ListGame *) gameList.tailPred)->number > 1) { GameListPopUp(f, title); return TRUE; } GameListDestroy(); gameNumber = 1; } return LoadGame(f, gameNumber, title, FALSE); } void LoadGameProc () { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); } FileNamePopUp(_("Load game file name?"), "", ".pgn .game", LoadGamePopUp, "rb"); } void LoadNextGameProc () { ReloadGame(1); } void LoadPrevGameProc () { ReloadGame(-1); } void ReloadGameProc () { ReloadGame(0); } void LoadNextPositionProc () { ReloadPosition(1); } void LoadPrevPositionProc () { ReloadPosition(-1); } void ReloadPositionProc () { ReloadPosition(0); } void LoadPositionProc() { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); } FileNamePopUp(_("Load position file name?"), "", ".fen .epd .pos", LoadPosition, "rb"); } void SaveGameProc () { FileNamePopUp(_("Save game file name?"), DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"), appData.oldSaveStyle ? ".game" : ".pgn", SaveGame, "a"); } void SavePositionProc () { FileNamePopUp(_("Save position file name?"), DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"), appData.oldSaveStyle ? ".pos" : ".fen", SavePosition, "a"); } void ReloadCmailMsgProc () { ReloadCmailMsgEvent(FALSE); } void CopyFENToClipboard () { // wrapper to make call from back-end possible CopyPositionProc(); } void CopyPositionProc () { static char *selected_fen_position=NULL; if(gameMode == EditPosition) EditPositionDone(TRUE); if (selected_fen_position) free(selected_fen_position); selected_fen_position = (char *)PositionToFEN(currentMove, NULL); if (!selected_fen_position) return; CopySomething(selected_fen_position); } void CopyGameProc () { int ret; ret = SaveGameToFile(gameCopyFilename, FALSE); if (!ret) return; CopySomething(NULL); } void CopyGameListProc () { if(!SaveGameListAsText(fopen(gameCopyFilename, "w"))) return; CopySomething(NULL); } void AutoSaveGame () { SaveGameProc(); } void QuitProc () { ExitEvent(0); } void MatchProc () { MatchEvent(2); } void AdjuWhiteProc () { UserAdjudicationEvent(+1); } void AdjuBlackProc () { UserAdjudicationEvent(-1); } void AdjuDrawProc () { UserAdjudicationEvent(0); } void RevertProc () { RevertEvent(False); } void AnnotateProc () { RevertEvent(True); } void FlipViewProc () { if(twoBoards) { partnerUp = 1; DrawPosition(True, NULL); partnerUp = 0; } flipView = !flipView; DrawPosition(True, NULL); } void SaveOnExitProc () { saveSettingsOnExit = !saveSettingsOnExit; MarkMenuItem("Options.SaveSettingsonExit", saveSettingsOnExit); } void SaveSettingsProc () { SaveSettings(settingsFileName); } void InfoProc () { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &", INFODIR, INFOFILE); system(buf); } void BugReportProc () { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s mailto:bug-xboard@gnu.org", appData.sysOpen); system(buf); } void GuideProc () { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/user_guide/UserGuide.html", appData.sysOpen); system(buf); } void HomePageProc () { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/", appData.sysOpen); system(buf); } void NewsPageProc () { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/whats_new/portal.html", appData.sysOpen); system(buf); } void AboutProc () { char buf[2 * MSG_SIZ]; #if ZIPPY char *zippy = _(" (with Zippy code)"); #else char *zippy = ""; #endif snprintf(buf, sizeof(buf), _("%s%s\n\n" "Copyright 1991 Digital Equipment Corporation\n" "Enhancements Copyright 1992-2014 Free Software Foundation\n" "Enhancements Copyright 2005 Alessandro Scotti\n\n" "%s is free software and carries NO WARRANTY;" "see the file COPYING for more information.\n" "The GTK build of this version is experimental and unstable\n\n" "Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" "Check out the newest features at: http://www.gnu.org/software/xboard/whats_new.html\n\n" "Report bugs via email at: \n\n" ), programVersion, zippy, PACKAGE); ErrorPopUp(_("About XBoard"), buf, FALSE); } void DebugProc () { appData.debugMode = !appData.debugMode; if(!strcmp(appData.nameOfDebugFile, "stderr")) return; // stderr is already open, and should never be closed if(!appData.debugMode) fclose(debugFP); else { debugFP = fopen(appData.nameOfDebugFile, "w"); if(debugFP == NULL) debugFP = stderr; else setbuf(debugFP, NULL); } } void NothingProc () { return; } #ifdef OPTIONSDIALOG # define MARK_MENU_ITEM(X,Y) #else # define MARK_MENU_ITEM(X,Y) MarkMenuItem(X, Y) #endif void PonderNextMoveProc () { PonderNextMoveEvent(!appData.ponderNextMove); MARK_MENU_ITEM("Options.PonderNextMove", appData.ponderNextMove); } void AlwaysQueenProc () { appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen; MARK_MENU_ITEM("Options.AlwaysQueen", appData.alwaysPromoteToQueen); } void AnimateDraggingProc () { appData.animateDragging = !appData.animateDragging; if (appData.animateDragging) CreateAnimVars(); MARK_MENU_ITEM("Options.AnimateDragging", appData.animateDragging); } void AnimateMovingProc () { appData.animate = !appData.animate; if (appData.animate) CreateAnimVars(); MARK_MENU_ITEM("Options.AnimateMoving", appData.animate); } void AutoflagProc () { appData.autoCallFlag = !appData.autoCallFlag; MARK_MENU_ITEM("Options.AutoFlag", appData.autoCallFlag); } void AutoflipProc () { appData.autoFlipView = !appData.autoFlipView; MARK_MENU_ITEM("Options.AutoFlipView", appData.autoFlipView); } void BlindfoldProc () { appData.blindfold = !appData.blindfold; MARK_MENU_ITEM("Options.Blindfold", appData.blindfold); DrawPosition(True, NULL); } void TestLegalityProc () { appData.testLegality = !appData.testLegality; MARK_MENU_ITEM("Options.TestLegality", appData.testLegality); } void FlashMovesProc () { if (appData.flashCount == 0) { appData.flashCount = 3; } else { appData.flashCount = -appData.flashCount; } MARK_MENU_ITEM("Options.FlashMoves", appData.flashCount > 0); } #if HIGHDRAG void HighlightDraggingProc () { appData.highlightDragging = !appData.highlightDragging; MARK_MENU_ITEM("Options.HighlightDragging", appData.highlightDragging); } #endif void HighlightLastMoveProc () { appData.highlightLastMove = !appData.highlightLastMove; MARK_MENU_ITEM("Options.HighlightLastMove", appData.highlightLastMove); } void HighlightArrowProc () { appData.highlightMoveWithArrow = !appData.highlightMoveWithArrow; MARK_MENU_ITEM("Options.HighlightWithArrow", appData.highlightMoveWithArrow); } void IcsAlarmProc () { appData.icsAlarm = !appData.icsAlarm; // MARK_MENU_ITEM("Options.ICSAlarm", appData.icsAlarm); } void MoveSoundProc () { appData.ringBellAfterMoves = !appData.ringBellAfterMoves; MARK_MENU_ITEM("Options.MoveSound", appData.ringBellAfterMoves); } void OneClickProc () { appData.oneClick = !appData.oneClick; MARK_MENU_ITEM("Options.OneClickMoving", appData.oneClick); } void PeriodicUpdatesProc () { PeriodicUpdatesEvent(!appData.periodicUpdates); MARK_MENU_ITEM("Options.PeriodicUpdates", appData.periodicUpdates); } void PopupExitMessageProc () { appData.popupExitMessage = !appData.popupExitMessage; MARK_MENU_ITEM("Options.PopupExitMessage", appData.popupExitMessage); } void PopupMoveErrorsProc () { appData.popupMoveErrors = !appData.popupMoveErrors; MARK_MENU_ITEM("Options.PopupMoveErrors", appData.popupMoveErrors); } void PremoveProc () { appData.premove = !appData.premove; // MARK_MENU_ITEM("Options.Premove", appData.premove); } void ShowCoordsProc () { appData.showCoords = !appData.showCoords; MARK_MENU_ITEM("Options.ShowCoords", appData.showCoords); DrawPosition(True, NULL); } void ShowThinkingProc () { appData.showThinking = !appData.showThinking; // [HGM] thinking: taken out of ShowThinkingEvent ShowThinkingEvent(); } void HideThinkingProc () { appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman; // [HGM] thinking: taken out of ShowThinkingEvent ShowThinkingEvent(); MARK_MENU_ITEM("Options.HideThinking", appData.hideThinkingFromHuman); } void CreateBookDelayed () { ScheduleDelayedEvent(CreateBookEvent, 50); } /* * Menu definition tables */ MenuItem fileMenu[] = { {N_("New Game"), "n", "NewGame", ResetGameEvent}, {N_("New Shuffle Game ..."), NULL, "NewShuffleGame", ShuffleMenuProc}, {N_("New Variant ..."), "v", "NewVariant", NewVariantProc},// [HGM] variant: not functional yet {"----", NULL, NULL, NothingProc}, {N_("Load Game"), "o", "LoadGame", LoadGameProc, CHECK}, {N_("Load Position"), "o", "LoadPosition", LoadPositionProc}, {N_("Next Position"), "Page_Down", "LoadNextPosition", LoadNextPositionProc}, {N_("Prev Position"), "Page_Up", "LoadPreviousPosition", LoadPrevPositionProc}, {"----", NULL, NULL, NothingProc}, {N_("Save Game"), "s", "SaveGame", SaveGameProc}, {N_("Save Position"), "s", "SavePosition", SavePositionProc}, {N_("Save Games as Book"), NULL, "CreateBook", CreateBookDelayed}, {"----", NULL, NULL, NothingProc}, {N_("Mail Move"), NULL, "MailMove", MailMoveEvent}, {N_("Reload CMail Message"), NULL, "ReloadCMailMessage", ReloadCmailMsgProc}, {"----", NULL, NULL, NothingProc}, {N_("Quit "), "q", "Quit", QuitProc}, {NULL, NULL, NULL, NULL} }; MenuItem editMenu[] = { {N_("Copy Game"), "c", "CopyGame", CopyGameProc}, {N_("Copy Position"), "c", "CopyPosition", CopyPositionProc}, {N_("Copy Game List"), NULL, "CopyGameList", CopyGameListProc}, {"----", NULL, NULL, NothingProc}, {N_("Paste Game"), "v", "PasteGame", PasteGameProc}, {N_("Paste Position"), "v", "PastePosition", PastePositionProc}, {"----", NULL, NULL, NothingProc}, {N_("Edit Game"), "e", "EditGame", EditGameEvent}, {N_("Edit Position"), "e", "EditPosition", EditPositionEvent}, {N_("Edit Tags"), NULL, "EditTags", EditTagsProc}, {N_("Edit Comment"), NULL, "EditComment", EditCommentProc}, {N_("Edit Book"), NULL, "EditBook", EditBookEvent}, {"----", NULL, NULL, NothingProc}, {N_("Revert"), "Home", "Revert", RevertProc}, {N_("Annotate"), NULL, "Annotate", AnnotateProc}, {N_("Truncate Game"), "End", "TruncateGame", TruncateGameEvent}, {"----", NULL, NULL, NothingProc}, {N_("Backward"), "Left", "Backward", BackwardEvent}, {N_("Forward"), "Right", "Forward", ForwardEvent}, {N_("Back to Start"), "Home", "BacktoStart", ToStartEvent}, {N_("Forward to End"), "End", "ForwardtoEnd", ToEndEvent}, {NULL, NULL, NULL, NULL} }; MenuItem viewMenu[] = { {N_("Flip View"), "F2", "FlipView", FlipViewProc, CHECK}, {"----", NULL, NULL, NothingProc}, {N_("Engine Output"), "o", "EngineOutput", EngineOutputProc, CHECK}, {N_("Move History"), "h", "MoveHistory", HistoryShowProc, CHECK}, // [HGM] hist: activate 4.2.7 code {N_("Evaluation Graph"), "e", "EvaluationGraph", EvalGraphProc, CHECK}, {N_("Game List"), "g", "GameList", ShowGameListProc, CHECK}, {N_("ICS text menu"), NULL, "ICStextmenu", IcsTextProc, CHECK}, {"----", NULL, NULL, NothingProc}, {N_("Tags"), NULL, "Tags", EditTagsProc, CHECK}, {N_("Comments"), NULL, "Comments", EditCommentProc, CHECK}, {N_("ICS Input Box"), NULL, "ICSInputBox", IcsInputBoxProc, CHECK}, {N_("Open Chat Window"), NULL, "OpenChatWindow", ChatProc, CHECK}, {"----", NULL, NULL, NothingProc}, {N_("Board..."), NULL, "Board", BoardOptionsProc}, {N_("Game List Tags..."), NULL, "GameListTags", GameListOptionsProc}, {NULL, NULL, NULL, NULL} }; MenuItem modeMenu[] = { {N_("Machine White"), "w", "MachineWhite", MachineWhiteEvent, RADIO }, {N_("Machine Black"), "b", "MachineBlack", MachineBlackEvent, RADIO }, {N_("Two Machines"), "t", "TwoMachines", TwoMachinesEvent, RADIO }, {N_("Analysis Mode"), "a", "AnalysisMode", (MenuProc*) AnalyzeModeEvent, RADIO }, {N_("Analyze Game"), "g", "AnalyzeFile", AnalyzeFileEvent, RADIO }, {N_("Edit Game"), "e", "EditGame", EditGameEvent, RADIO }, {N_("Edit Position"), "e", "EditPosition", EditPositionEvent, RADIO }, {N_("Training"), NULL, "Training", TrainingEvent, RADIO }, {N_("ICS Client"), NULL, "ICSClient", IcsClientEvent, RADIO }, {"----", NULL, NULL, NothingProc}, {N_("Machine Match"), NULL, "MachineMatch", MatchProc, CHECK }, {N_("Pause"), "Pause", "Pause", PauseEvent, CHECK }, {NULL, NULL, NULL, NULL} }; MenuItem actionMenu[] = { {N_("Accept"), "F3", "Accept", AcceptEvent}, {N_("Decline"), "F4", "Decline", DeclineEvent}, {N_("Rematch"), "F12", "Rematch", RematchEvent}, {"----", NULL, NULL, NothingProc}, {N_("Call Flag"), "F5", "CallFlag", CallFlagEvent}, {N_("Draw"), "F6", "Draw", DrawEvent}, {N_("Adjourn"), "F7", "Adjourn", AdjournEvent}, {N_("Abort"), "F8", "Abort", AbortEvent}, {N_("Resign"), "F9", "Resign", ResignEvent}, {"----", NULL, NULL, NothingProc}, {N_("Stop Observing"), "F10", "StopObserving", StopObservingEvent}, {N_("Stop Examining"), "F11", "StopExamining", StopExaminingEvent}, {N_("Upload to Examine"), NULL, "UploadtoExamine", UploadGameEvent}, {"----", NULL, NULL, NothingProc}, {N_("Adjudicate to White"), NULL, "AdjudicatetoWhite", AdjuWhiteProc}, {N_("Adjudicate to Black"), NULL, "AdjudicatetoBlack", AdjuBlackProc}, {N_("Adjudicate Draw"), NULL, "AdjudicateDraw", AdjuDrawProc}, {NULL, NULL, NULL, NULL} }; MenuItem engineMenu[100] = { {N_("Load New 1st Engine ..."), NULL, "LoadNew1stEngine", LoadEngine1Proc}, {N_("Load New 2nd Engine ..."), NULL, "LoadNew2ndEngine", LoadEngine2Proc}, {"----", NULL, NULL, NothingProc}, {N_("Engine #1 Settings ..."), NULL, "Engine#1Settings", FirstSettingsProc}, {N_("Engine #2 Settings ..."), NULL, "Engine#2Settings", SecondSettingsProc}, {"----", NULL, NULL, NothingProc}, {N_("Hint"), NULL, "Hint", HintEvent}, {N_("Book"), NULL, "Book", BookEvent}, {"----", NULL, NULL, NothingProc}, {N_("Move Now"), "m", "MoveNow", MoveNowEvent}, {N_("Retract Move"), "x", "RetractMove", RetractMoveEvent}, {NULL, NULL, NULL, NULL} }; MenuItem optionsMenu[] = { #ifdef OPTIONSDIALOG {N_("General ..."), NULL, "General", OptionsProc}, #endif {N_("Time Control ..."), "t", "TimeControl", TimeControlProc}, {N_("Common Engine ..."), "u", "CommonEngine", UciMenuProc}, {N_("Adjudications ..."), "j", "Adjudications", EngineMenuProc}, {N_("ICS ..."), NULL, "ICS", IcsOptionsProc}, {N_("Match ..."), NULL, "Match", MatchOptionsProc}, {N_("Load Game ..."), NULL, "LoadGame", LoadOptionsProc}, {N_("Save Game ..."), NULL, "SaveGame", SaveOptionsProc}, {N_("Game List ..."), NULL, "GameList", GameListOptionsProc}, {N_("Sounds ..."), NULL, "Sounds", SoundOptionsProc}, {"----", NULL, NULL, NothingProc}, #ifndef OPTIONSDIALOG {N_("Always Queen"), "q", "AlwaysQueen", AlwaysQueenProc}, {N_("Animate Dragging"), NULL, "AnimateDragging", AnimateDraggingProc}, {N_("Animate Moving"), "a", "AnimateMoving", AnimateMovingProc}, {N_("Auto Flag"), "f", "AutoFlag", AutoflagProc}, {N_("Auto Flip View"), NULL, "AutoFlipView", AutoflipProc}, {N_("Blindfold"), NULL, "Blindfold", BlindfoldProc}, {N_("Flash Moves"), NULL, "FlashMoves", FlashMovesProc}, #if HIGHDRAG {N_("Highlight Dragging"), NULL, "HighlightDragging", HighlightDraggingProc}, #endif {N_("Highlight Last Move"), NULL, "HighlightLastMove", HighlightLastMoveProc}, {N_("Highlight With Arrow"), NULL, "HighlightWithArrow", HighlightArrowProc}, {N_("Move Sound"), NULL, "MoveSound", MoveSoundProc}, {N_("One-Click Moving"), NULL, "OneClickMoving", OneClickProc}, {N_("Periodic Updates"), NULL, "PeriodicUpdates", PeriodicUpdatesProc}, {N_("Ponder Next Move"), "p", "PonderNextMove", PonderNextMoveProc}, {N_("Popup Exit Message"), NULL, "PopupExitMessage", PopupExitMessageProc}, {N_("Popup Move Errors"), NULL, "PopupMoveErrors", PopupMoveErrorsProc}, {N_("Show Coords"), NULL, "ShowCoords", ShowCoordsProc}, {N_("Hide Thinking"), "h", "HideThinking", HideThinkingProc}, {N_("Test Legality"), "l", "TestLegality", TestLegalityProc}, {"----", NULL, NULL, NothingProc}, #endif {N_("Save Settings Now"), NULL, "SaveSettingsNow", SaveSettingsProc}, {N_("Save Settings on Exit"), NULL, "SaveSettingsonExit", SaveOnExitProc, CHECK }, {NULL, NULL, NULL, NULL} }; MenuItem helpMenu[] = { {N_("Info XBoard"), NULL, "InfoXBoard", InfoProc}, {N_("Man XBoard"), "F1", "ManXBoard", ManProc}, {"----", NULL, NULL, NothingProc}, {N_("XBoard Home Page"), NULL, "XBoardHomePage", HomePageProc}, {N_("On-line User Guide"), NULL, "On-lineUserGuide", GuideProc}, {N_("Development News"), NULL, "DevelopmentNews", NewsPageProc}, {N_("e-Mail Bug Report"), NULL, "e-MailBugReport", BugReportProc}, {"----", NULL, NULL, NothingProc}, {N_("About XBoard"), NULL, "AboutXBoard", AboutProc}, {NULL, NULL, NULL, NULL} }; MenuItem noMenu[] = { { "", "Next" ,"LoadNextGame", LoadNextGameProc }, { "", "Prior" ,"LoadPrevGame", LoadPrevGameProc }, { "", NULL,"ReloadGame", ReloadGameProc }, { "", NULL,"ReloadPosition", ReloadPositionProc }, #ifndef OPTIONSDIALOG { "", NULL,"AlwaysQueen", AlwaysQueenProc }, { "", NULL,"AnimateDragging", AnimateDraggingProc }, { "", NULL,"AnimateMoving", AnimateMovingProc }, { "", NULL,"Autoflag", AutoflagProc }, { "", NULL,"Autoflip", AutoflipProc }, { "", NULL,"Blindfold", BlindfoldProc }, { "", NULL,"FlashMoves", FlashMovesProc }, #if HIGHDRAG { "", NULL,"HighlightDragging", HighlightDraggingProc }, #endif { "", NULL,"HighlightLastMove", HighlightLastMoveProc }, { "", NULL,"MoveSound", MoveSoundProc }, { "", NULL,"PeriodicUpdates", PeriodicUpdatesProc }, { "", NULL,"PopupExitMessage", PopupExitMessageProc }, { "", NULL,"PopupMoveErrors", PopupMoveErrorsProc }, { "", NULL,"ShowCoords", ShowCoordsProc }, { "", NULL,"ShowThinking", ShowThinkingProc }, { "", NULL,"HideThinking", HideThinkingProc }, { "", NULL,"TestLegality", TestLegalityProc }, #endif { "", NULL,"AboutGame", AboutGameEvent }, { "", "d" ,"DebugProc", DebugProc }, { "", NULL,"Nothing", NothingProc }, {NULL, NULL, NULL, NULL} }; Menu menuBar[] = { {N_("File"), "File", fileMenu}, {N_("Edit"), "Edit", editMenu}, {N_("View"), "View", viewMenu}, {N_("Mode"), "Mode", modeMenu}, {N_("Action"), "Action", actionMenu}, {N_("Engine"), "Engine", engineMenu}, {N_("Options"), "Options", optionsMenu}, {N_("Help"), "Help", helpMenu}, {NULL, NULL, NULL} }; MenuItem * MenuNameToItem (char *menuName) { int i=0; char buf[MSG_SIZ], *p; MenuItem *menuTab; static MenuItem a = { NULL, NULL, NULL, NothingProc }; extern Option mainOptions[]; safeStrCpy(buf, menuName, MSG_SIZ); p = strchr(buf, '.'); if(!p) menuTab = noMenu, p = menuName; else { *p++ = NULLCHAR; for(i=0; menuBar[i].name; i++) if(!strcmp(buf, menuBar[i].name)) break; if(!menuBar[i].name) return NULL; // main menu not found menuTab = menuBar[i].mi; } if(*p == NULLCHAR) { a.handle = mainOptions[i+1].handle; return &a; } // main menu bar for(i=0; menuTab[i].string; i++) if(menuTab[i].ref && !strcmp(p, menuTab[i].ref)) return menuTab + i; return NULL; // item not found } int firstEngineItem; void AppendEnginesToMenu (char *list) { int i=0; char *p; if(appData.icsActive || appData.recentEngines <= 0) return; for(firstEngineItem=0; engineMenu[firstEngineItem].string; firstEngineItem++); recentEngines = strdup(list); while (*list) { p = strchr(list, '\n'); if(p == NULL) break; if(i == 0) engineMenu[firstEngineItem++].string = "----"; // at least one valid item to add *p = 0; if(firstEngineItem + i < 99) engineMenu[firstEngineItem+i].string = strdup(list); // just set name; MenuProc stays NULL i++; *p = '\n'; list = p + 1; } } Enables icsEnables[] = { { "File.MailMove", False }, { "File.ReloadCMailMessage", False }, { "Mode.MachineBlack", False }, { "Mode.MachineWhite", False }, { "Mode.AnalysisMode", False }, { "Mode.AnalyzeFile", False }, { "Mode.TwoMachines", False }, { "Mode.MachineMatch", False }, #if !ZIPPY { "Engine.Hint", False }, { "Engine.Book", False }, { "Engine.MoveNow", False }, #ifndef OPTIONSDIALOG { "PeriodicUpdates", False }, { "HideThinking", False }, { "PonderNextMove", False }, #endif #endif { "Engine.Engine#1Settings", False }, { "Engine.Engine#2Settings", False }, { "Engine.Load1stEngine", False }, { "Engine.Load2ndEngine", False }, { "Edit.Annotate", False }, { "Options.Match", False }, { NULL, False } }; Enables ncpEnables[] = { { "File.MailMove", False }, { "File.ReloadCMailMessage", False }, { "Mode.MachineWhite", False }, { "Mode.MachineBlack", False }, { "Mode.AnalysisMode", False }, { "Mode.AnalyzeFile", False }, { "Mode.TwoMachines", False }, { "Mode.MachineMatch", False }, { "Mode.ICSClient", False }, { "View.ICStextmenu", False }, { "View.ICSInputBox", False }, { "View.OpenChatWindow", False }, { "Action.", False }, { "Edit.Revert", False }, { "Edit.Annotate", False }, { "Engine.Engine#1Settings", False }, { "Engine.Engine#2Settings", False }, { "Engine.MoveNow", False }, { "Engine.RetractMove", False }, { "Options.ICS", False }, #ifndef OPTIONSDIALOG { "Options.AutoFlag", False }, { "Options.AutoFlip View", False }, // { "Options.ICSAlarm", False }, { "Options.MoveSound", False }, { "Options.HideThinking", False }, { "Options.PeriodicUpdates", False }, { "Options.PonderNextMove", False }, #endif { "Engine.Hint", False }, { "Engine.Book", False }, { NULL, False } }; Enables gnuEnables[] = { { "Mode.ICSClient", False }, { "View.ICStextmenu", False }, { "View.ICSInputBox", False }, { "View.OpenChatWindow", False }, { "Action.Accept", False }, { "Action.Decline", False }, { "Action.Rematch", False }, { "Action.Adjourn", False }, { "Action.StopExamining", False }, { "Action.StopObserving", False }, { "Action.UploadtoExamine", False }, { "Edit.Revert", False }, { "Edit.Annotate", False }, { "Options.ICS", False }, /* The next two options rely on SetCmailMode being called *after* */ /* SetGNUMode so that when GNU is being used to give hints these */ /* menu options are still available */ { "File.MailMove", False }, { "File.ReloadCMailMessage", False }, // [HGM] The following have been added to make a switch from ncp to GNU mode possible { "Mode.MachineWhite", True }, { "Mode.MachineBlack", True }, { "Mode.AnalysisMode", True }, { "Mode.AnalyzeFile", True }, { "Mode.TwoMachines", True }, { "Mode.MachineMatch", True }, { "Engine.Engine#1Settings", True }, { "Engine.Engine#2Settings", True }, { "Engine.Hint", True }, { "Engine.Book", True }, { "Engine.MoveNow", True }, { "Engine.RetractMove", True }, { "Action.", True }, { NULL, False } }; Enables cmailEnables[] = { { "Action.", True }, { "Action.CallFlag", False }, { "Action.Draw", True }, { "Action.Adjourn", False }, { "Action.Abort", False }, { "Action.StopObserving", False }, { "Action.StopExamining", False }, { "File.MailMove", True }, { "File.ReloadCMailMessage", True }, { NULL, False } }; Enables trainingOnEnables[] = { { "Edit.EditComment", False }, { "Mode.Pause", False }, { "Edit.Forward", False }, { "Edit.Backward", False }, { "Edit.ForwardtoEnd", False }, { "Edit.BacktoStart", False }, { "Engine.MoveNow", False }, { "Edit.TruncateGame", False }, { NULL, False } }; Enables trainingOffEnables[] = { { "Edit.EditComment", True }, { "Mode.Pause", True }, { "Edit.Forward", True }, { "Edit.Backward", True }, { "Edit.ForwardtoEnd", True }, { "Edit.BacktoStart", True }, { "Engine.MoveNow", True }, { "Engine.TruncateGame", True }, { NULL, False } }; Enables machineThinkingEnables[] = { { "File.LoadGame", False }, // { "LoadNextGame", False }, // { "LoadPreviousGame", False }, // { "ReloadSameGame", False }, { "Edit.PasteGame", False }, { "File.LoadPosition", False }, // { "LoadNextPosition", False }, // { "LoadPreviousPosition", False }, // { "ReloadSamePosition", False }, { "Edit.PastePosition", False }, { "Mode.MachineWhite", False }, { "Mode.MachineBlack", False }, { "Mode.TwoMachines", False }, // { "MachineMatch", False }, { "Engine.RetractMove", False }, { NULL, False } }; Enables userThinkingEnables[] = { { "File.LoadGame", True }, // { "LoadNextGame", True }, // { "LoadPreviousGame", True }, // { "ReloadSameGame", True }, { "Edit.PasteGame", True }, { "File.LoadPosition", True }, // { "LoadNextPosition", True }, // { "LoadPreviousPosition", True }, // { "ReloadSamePosition", True }, { "Edit.PastePosition", True }, { "Mode.MachineWhite", True }, { "Mode.MachineBlack", True }, { "Mode.TwoMachines", True }, // { "MachineMatch", True }, { "Engine.RetractMove", True }, { NULL, False } }; void SetICSMode () { SetMenuEnables(icsEnables); #if ZIPPY if (appData.zippyPlay && !appData.noChessProgram) { /* [DM] icsEngineAnalyze */ EnableNamedMenuItem("Mode.AnalysisMode", True); EnableNamedMenuItem("Engine.Engine#1Settings", True); } #endif } void SetNCPMode () { SetMenuEnables(ncpEnables); } void SetGNUMode () { SetMenuEnables(gnuEnables); } void SetCmailMode () { SetMenuEnables(cmailEnables); } void SetTrainingModeOn () { SetMenuEnables(trainingOnEnables); if (appData.showButtonBar) { EnableButtonBar(False); } CommentPopDown(); } void SetTrainingModeOff () { SetMenuEnables(trainingOffEnables); if (appData.showButtonBar) { EnableButtonBar(True); } } void SetUserThinkingEnables () { if (appData.noChessProgram) return; SetMenuEnables(userThinkingEnables); } void SetMachineThinkingEnables () { if (appData.noChessProgram) return; SetMenuEnables(machineThinkingEnables); switch (gameMode) { case MachinePlaysBlack: case MachinePlaysWhite: case TwoMachinesPlay: EnableNamedMenuItem(ModeToWidgetName(gameMode), True); break; default: break; } } void GreyRevert (Boolean grey) { EnableNamedMenuItem("Edit.Revert", !grey); EnableNamedMenuItem("Edit.Annotate", !grey); } char * ModeToWidgetName (GameMode mode) { switch (mode) { case BeginningOfGame: if (appData.icsActive) return "Mode.ICSClient"; else if (appData.noChessProgram || *appData.cmailGameName != NULLCHAR) return "Mode.EditGame"; else return "Mode.MachineBlack"; case MachinePlaysBlack: return "Mode.MachineBlack"; case MachinePlaysWhite: return "Mode.MachineWhite"; case AnalyzeMode: return "Mode.AnalysisMode"; case AnalyzeFile: return "Mode.AnalyzeFile"; case TwoMachinesPlay: return "Mode.TwoMachines"; case EditGame: return "Mode.EditGame"; case PlayFromGameFile: return "File.LoadGame"; case EditPosition: return "Mode.EditPosition"; case Training: return "Mode.Training"; case IcsPlayingWhite: case IcsPlayingBlack: case IcsObserving: case IcsIdle: case IcsExamining: return "Mode.ICSClient"; default: case EndOfGame: return NULL; } } void InitMenuMarkers() { #ifndef OPTIONSDIALOG if (appData.alwaysPromoteToQueen) { MarkMenuItem("Options.Always Queen", True); } if (appData.animateDragging) { MarkMenuItem("Options.Animate Dragging", True); } if (appData.animate) { MarkMenuItem("Options.Animate Moving", True); } if (appData.autoCallFlag) { MarkMenuItem("Options.Auto Flag", True); } if (appData.autoFlipView) { XtSetValues(XtNameToWidget(menuBarWidget,"Options.Auto Flip View", True); } if (appData.blindfold) { MarkMenuItem("Options.Blindfold", True); } if (appData.flashCount > 0) { MarkMenuItem("Options.Flash Moves", True); } #if HIGHDRAG if (appData.highlightDragging) { MarkMenuItem("Options.Highlight Dragging", True); } #endif if (appData.highlightLastMove) { MarkMenuItem("Options.Highlight Last Move", True); } if (appData.highlightMoveWithArrow) { MarkMenuItem("Options.Arrow", True); } // if (appData.icsAlarm) { // MarkMenuItem("Options.ICS Alarm", True); // } if (appData.ringBellAfterMoves) { MarkMenuItem("Options.Move Sound", True); } if (appData.oneClick) { MarkMenuItem("Options.OneClick", True); } if (appData.periodicUpdates) { MarkMenuItem("Options.Periodic Updates", True); } if (appData.ponderNextMove) { MarkMenuItem("Options.Ponder Next Move", True); } if (appData.popupExitMessage) { MarkMenuItem("Options.Popup Exit Message", True); } if (appData.popupMoveErrors) { MarkMenuItem("Options.Popup Move Errors", True); } // if (appData.premove) { // MarkMenuItem("Options.Premove", True); // } if (appData.showCoords) { MarkMenuItem("Options.Show Coords", True); } if (appData.hideThinkingFromHuman) { MarkMenuItem("Options.Hide Thinking", True); } if (appData.testLegality) { MarkMenuItem("Options.Test Legality", True); } #endif if (saveSettingsOnExit) { MarkMenuItem("Options.SaveSettingsonExit", True); } } xboard-4.7.3/xaw/0000755000175000001440000000000012262562300010576 500000000000000xboard-4.7.3/xaw/xboard.h0000644000175000001440000001630412262415351012155 00000000000000/* * xboard.h -- Parameter definitions for X front end * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include #define ICS_LOGON ".icsrc" #define MANPAGE "xboard.6" #if ENABLE_NLS #define CLOCK_FONT_NAME \ "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #define COORD_FONT_NAME \ "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #define DEFAULT_FONT_NAME \ "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-medium-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #else #define CLOCK_FONT_NAME "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*" #define COORD_FONT_NAME "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*" #define DEFAULT_FONT_NAME "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*" #endif #define COLOR_SHOUT "green" #define COLOR_SSHOUT "green,black,1" #define COLOR_CHANNEL1 "cyan" #define COLOR_CHANNEL "cyan,black,1" #define COLOR_KIBITZ "magenta,black,1" #define COLOR_TELL "yellow,black,1" #define COLOR_CHALLENGE "red,black,1" #define COLOR_REQUEST "red" #define COLOR_SEEK "blue" #define COLOR_NORMAL "default" #define COLOR_LOWTIMEWARNING "red" typedef struct { char *name; int squareSize; int lineGap; int clockFontPxlSize; int coordFontPxlSize; int fontPxlSize; int smallLayout; int tinyLayout; int minScreenSize; } SizeDefaults; #define SIZE_DEFAULTS \ { { "Titanic", 129, 4, 34, 14, 14, 0, 0, 1200 }, \ { "Colossal", 116, 4, 34, 14, 14, 0, 0, 1200 }, \ { "Giant", 108, 3, 34, 14, 14, 0, 0, 1024 }, \ { "Huge", 95, 3, 34, 14, 14, 0, 0, 1024 }, \ { "Big", 87, 3, 34, 14, 14, 0, 0, 864 }, \ { "Large", 80, 3, 34, 14, 14, 0, 0, 864 }, \ { "Bulky", 72, 3, 34, 12, 14, 0, 0, 864 }, \ { "Medium", 64, 3, 34, 12, 14, 1, 0, 768 }, \ { "Moderate", 58, 3, 34, 12, 14, 1, 0, 768 }, \ { "Average", 54, 2, 30, 11, 12, 1, 0, 600 }, \ { "Middling", 49, 2, 24, 10, 12, 1, 0, 600 }, \ { "Mediocre", 45, 2, 20, 10, 12, 1, 0, 600 }, \ { "Small", 40, 2, 20, 10, 12, 1, 0, 480 }, \ { "Slim", 37, 2, 20, 10, 12, 1, 0, 480 }, \ { "Petite", 33, 1, 15, 9, 11, 1, 0, 480 }, \ { "Dinky", 29, 1, 15, 9, 11, 1, 0, 480 }, \ { "Teeny", 25, 1, 12, 8, 11, 1, 1, 480 }, \ { "Tiny", 21, 1, 12, 8, 11, 1, 1, 0 }, \ { NULL, 0, 0, 0, 0, 0, 0, 0, 0 } } #define BORDER_X_OFFSET 3 #define BORDER_Y_OFFSET 27 #define FIRST_CHESS_PROGRAM "fairymax" #define SECOND_CHESS_PROGRAM "fairymax" #define FIRST_DIRECTORY "." #define SECOND_DIRECTORY "." #define SOUND_BELL "" #define ICS_NAMES "" #define FCP_NAMES "" #define SCP_NAMES "" #define ICS_TEXT_MENU_DEFAULT "" #define SETTINGS_FILE SYSCONFDIR"/xboard.conf" #define COLOR_BKGD "white" void NewTagsPopup P((char *text, char *msg)); int AppendText P((Option *opt, char *s)); void NewCommentPopup P((char *title, char *text, int index)); void CatchDeleteWindow(Widget w, String procname); void GenericPopDown P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void InitDrawingSizes P((int i, int j)); void SendToICS P((char *buf)); void SendToProgram P((char *message, ChessProgramState *cps)); void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b); // from xoptions.c void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); Widget CreateMenuItem P((Widget menu, char *msg, XtCallbackProc CB, int n)); void WheelProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TabProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GenericMenu P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); // from xengineoutput.c void SelectPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void StopPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); extern char memoTranslations[]; extern Widget shells[]; extern int dialogError; extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; extern Display *xDisplay; extern Window xBoardWindow; extern int squareSize; extern Pixmap xMarkPixmap, wIconPixmap, bIconPixmap; extern char *layoutName; extern Pixel timerForegroundPixel, timerBackgroundPixel, dialogColor, buttonColor; extern int searchTime; extern Atom wm_delete_window; extern int squareSize, lineGap, defaultLineGap, useImages, useImageSqs; extern int startedFromPositionFile; extern char *icsTextMenuString; extern char ICSInputTranslations[]; extern char *selected_fen_position; extern GC coordGC; extern Dimension textHeight; // of message widget in board window extern int savedIndex; #define TOPLEVEL 1 /* preference item; 1 = make popup windows toplevel */ xboard-4.7.3/xaw/xhistory.h0000644000175000001440000000232212262415351012562 00000000000000/* * xhistory.h -- Eval graph window, part of X front end for XBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef XB_XHISTLIST #define XB_XHISTLIST void HistoryShowProc P((void)); Boolean MoveHistoryIsUp P((void)); void SelectMoveX P((Widget w, XEvent * event, String * params, Cardinal * nParams)); #endif /* XB_XHISTLIST */ xboard-4.7.3/xaw/xgamelist.c0000644000175000001440000000657312262415351012675 00000000000000/* * xgamelist.c -- Game list window, part of X front end for XBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include #include #include #if USE_XAW3D #include #include #include #include #include #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #include #include #include #include #include #endif #include "common.h" #include "backend.h" #include "xboard.h" #include "xgamelist.h" #include "dialogs.h" char gameListTranslations[] = ": WheelProc(-3) \n \ : WheelProc(3) \n \ : LoadSelectedProc(100) Set() \n \ (2): LoadSelectedProc(0) \n \ Home: LoadSelectedProc(-2) \n \ End: LoadSelectedProc(2) \n \ CtrlUp: LoadSelectedProc(-3) \n \ CtrlDown: LoadSelectedProc(3) \n \ Up: LoadSelectedProc(-1) \n \ Down: LoadSelectedProc(1) \n \ Left: LoadSelectedProc(-1) \n \ Right: LoadSelectedProc(1) \n \ Prior: LoadSelectedProc(-4) \n \ Next: LoadSelectedProc(4) \n \ Return: LoadSelectedProc(0) \n"; char filterTranslations[] = "Return: SetFilterProc() \n"; void LoadSelectedProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if(GameListClicks(atoi(prms[0]))) return; // if no game loaded, no focus transfer XSync(xDisplay, False); XSetInputFocus(xDisplay, XtWindow(boardWidget), RevertToPointerRoot, CurrentTime); } void SetFilterProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { SetFilter(); } xboard-4.7.3/xaw/xboard.c0000644000175000001440000021521412262562252012154 00000000000000/* * xboard.c -- X front end for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define HIGHDRAG 1 #include "config.h" #include #include #include #include #include #include #include #include #include #include #if !OMIT_SOCKETS # if HAVE_SYS_SOCKET_H # include # include # include # else /* not HAVE_SYS_SOCKET_H */ # if HAVE_LAN_SOCKET_H # include # include # include # else /* not HAVE_LAN_SOCKET_H */ # define OMIT_SOCKETS 1 # endif /* not HAVE_LAN_SOCKET_H */ # endif /* not HAVE_SYS_SOCKET_H */ #endif /* !OMIT_SOCKETS */ #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_SYS_FCNTL_H # include #else /* not HAVE_SYS_FCNTL_H */ # if HAVE_FCNTL_H # include # endif /* HAVE_FCNTL_H */ #endif /* not HAVE_SYS_FCNTL_H */ #if HAVE_SYS_SYSTEMINFO_H # include #endif /* HAVE_SYS_SYSTEMINFO_H */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) # define HAVE_DIR_STRUCT #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_SYS_DIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_NDIR_H # include # define HAVE_DIR_STRUCT # endif #endif #if ENABLE_NLS #include #endif #include #include #include #include #include #include #if USE_XAW3D #include #include #include #include #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #include #include #include #include #endif // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are. #include "common.h" #if HAVE_LIBXPM #include #define IMAGE_EXT "xpm" #else #define IMAGE_EXT "xim" #endif #include "bitmaps/icon_white.bm" #include "bitmaps/icon_black.bm" #include "bitmaps/checkmark.bm" #include "frontend.h" #include "backend.h" #include "backendz.h" #include "moves.h" #include "xboard.h" #include "childio.h" #include "xgamelist.h" #include "xhistory.h" #include "menus.h" #include "board.h" #include "dialogs.h" #include "engineoutput.h" #include "usystem.h" #include "gettext.h" #include "draw.h" #define SLASH '/' #define DATADIR "~~" #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif int main P((int argc, char **argv)); RETSIGTYPE CmailSigHandler P((int sig)); RETSIGTYPE IntSigHandler P((int sig)); RETSIGTYPE TermSizeSigHandler P((int sig)); Widget CreateMenuBar P((Menu *mb, int boardWidth)); #if ENABLE_NLS char *InsertPxlSize P((char *pattern, int targetPxlSize)); XFontSet CreateFontSet P((char *base_fnt_lst)); #else char *FindFont P((char *pattern, int targetPxlSize)); #endif void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq)); void EventProc P((Widget widget, caddr_t unused, XEvent *event)); void DelayedDrag P((void)); static void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event)); void HandlePV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void DrawPositionProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void CommentClick P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void ICSInputBoxPopUp P((void)); void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data)); void KeyBindingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void QuitWrapper P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); static void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); static void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); static void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TempBackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TempForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); Boolean TempBackwardActive = False; void ManInner P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void DisplayMove P((int moveNumber)); void update_ics_width P(()); int CopyMemoProc P(()); /* * XBoard depends on Xt R4 or higher */ int xtVersion = XtSpecificationRelease; int xScreen; Display *xDisplay; Window xBoardWindow; Pixel lowTimeWarningColor, dialogColor, buttonColor; // used in widgets Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap; Widget shellWidget, formWidget, boardWidget, titleWidget, dropMenu, menuBarWidget; Option *optList; // contains all widgets of main window #if ENABLE_NLS XFontSet fontSet, clockFontSet; #else Font clockFontID; XFontStruct *clockFontStruct; #endif Font coordFontID, countFontID; XFontStruct *coordFontStruct, *countFontStruct; XtAppContext appContext; char *layoutName; char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion Position commentX = -1, commentY = -1; Dimension commentW, commentH; typedef unsigned int BoardSize; BoardSize boardSize; Boolean chessProgram; int minX, minY; // [HGM] placement: volatile limits on upper-left corner int smallLayout = 0, tinyLayout = 0, marginW, marginH, // [HGM] for run-time resizing fromX = -1, fromY = -1, toX, toY, commentUp = False, errorExitStatus = -1, defaultLineGap; Dimension textHeight; Pixel timerForegroundPixel, timerBackgroundPixel; Pixel buttonForegroundPixel, buttonBackgroundPixel; char *chessDir, *programName, *programVersion; Boolean alwaysOnTop = False; char *icsTextMenuString; char *icsNames; char *firstChessProgramNames; char *secondChessProgramNames; WindowPlacement wpMain; WindowPlacement wpConsole; WindowPlacement wpComment; WindowPlacement wpMoveHistory; WindowPlacement wpEvalGraph; WindowPlacement wpEngineOutput; WindowPlacement wpGameList; WindowPlacement wpTags; WindowPlacement wpDualBoard; /* This magic number is the number of intermediate frames used in each half of the animation. For short moves it's reduced by 1. The total number of frames will be factor * 2 + 1. */ #define kFactor 4 SizeDefaults sizeDefaults[] = SIZE_DEFAULTS; typedef struct { char piece; char* widget; } DropMenuEnables; DropMenuEnables dmEnables[] = { { 'P', "Pawn" }, { 'N', "Knight" }, { 'B', "Bishop" }, { 'R', "Rook" }, { 'Q', "Queen" } }; Arg shellArgs[] = { { XtNwidth, 0 }, { XtNheight, 0 }, { XtNminWidth, 0 }, { XtNminHeight, 0 }, { XtNmaxWidth, 0 }, { XtNmaxHeight, 0 } }; XtResource clientResources[] = { { "flashCount", "flashCount", XtRInt, sizeof(int), XtOffset(AppDataPtr, flashCount), XtRImmediate, (XtPointer) FLASH_COUNT }, }; XrmOptionDescRec shellOptions[] = { { "-flashCount", "flashCount", XrmoptionSepArg, NULL }, { "-flash", "flashCount", XrmoptionNoArg, "3" }, { "-xflash", "flashCount", XrmoptionNoArg, "0" }, }; XtActionsRec boardActions[] = { { "DrawPosition", DrawPositionProc }, { "HandlePV", HandlePV }, { "SelectPV", SelectPV }, { "StopPV", StopPV }, { "MenuItem", KeyBindingProc }, // [HGM] generic handler for key bindings { "QuitProc", QuitWrapper }, { "ManProc", ManInner }, { "TempBackwardProc", TempBackwardProc }, { "TempForwardProc", TempForwardProc }, { "CommentClick", (XtActionProc) CommentClick }, { "GenericPopDown", (XtActionProc) GenericPopDown }, { "ErrorPopDown", (XtActionProc) ErrorPopDown }, { "CopyMemoProc", (XtActionProc) CopyMemoProc }, { "SelectMove", (XtActionProc) SelectMoveX }, { "LoadSelectedProc", LoadSelectedProc }, { "SetFilterProc", SetFilterProc }, { "TypeInProc", TypeInProc }, { "EnterKeyProc", EnterKeyProc }, { "UpKeyProc", UpKeyProc }, { "DownKeyProc", DownKeyProc }, { "WheelProc", WheelProc }, { "TabProc", TabProc }, }; char globalTranslations[] = ":MetaNext: MenuItem(LoadNextGameProc) \n \ :MetaPrior: MenuItem(LoadPrevGameProc) \n \ :CtrlDown: LoadSelectedProc(3) \n \ :CtrlUp: LoadSelectedProc(-3) \n \ :ShiftNext: MenuItem(LoadNextPositionProc) \n \ :ShiftPrior: MenuItem(LoadPrevPositionProc) \n \ :Pause: MenuItem(Mode.Pause) \n \ :Ctrld: MenuItem(DebugProc) \n \ :Meta CtrlF12: MenuItem(DebugProc) \n \ :Left: MenuItem(Edit.Backward) \n \ :Right: MenuItem(Edit.Forward) \n \ :CtrlP: MenuItem(PonderNextMove) \n " #ifndef OPTIONSDIALOG "\ :CtrlQ: MenuItem(AlwaysQueenProc) \n \ :CtrlF: MenuItem(AutoflagProc) \n \ :CtrlA: MenuItem(AnimateMovingProc) \n \ :CtrlL: MenuItem(TestLegalityProc) \n \ :CtrlH: MenuItem(HideThinkingProc) \n " #endif "\ :Return: TempBackwardProc() \n \ :Return: TempForwardProc() \n"; char ICSInputTranslations[] = "Up: UpKeyProc() \n " "Down: DownKeyProc() \n " "Return: EnterKeyProc() \n"; // [HGM] vari: another hideous kludge: call extend-end first so we can be sure select-start works, // as the widget is destroyed before the up-click can call extend-end char commentTranslations[] = ": extend-end(PRIMARY) select-start() CommentClick() \n"; String xboardResources[] = { "*Error*translations: #override\\n Return: ErrorPopDown()", NULL }; /* Max possible square size */ #define MAXSQSIZE 256 static int xpm_avail[MAXSQSIZE]; #ifdef HAVE_DIR_STRUCT /* Extract piece size from filename */ static int xpm_getsize (char *name, int len, char *ext) { char *p, *d; char buf[10]; if (len < 4) return 0; if ((p=strchr(name, '.')) == NULL || StrCaseCmp(p+1, ext) != 0) return 0; p = name + 3; d = buf; while (*p && isdigit(*p)) *(d++) = *(p++); *d = 0; return atoi(buf); } /* Setup xpm_avail */ static int xpm_getavail (char *dirname, char *ext) { DIR *dir; struct dirent *ent; int i; for (i=0; id_name, NAMLEN(ent), ext); if (i > 0 && i < MAXSQSIZE) xpm_avail[i] = 1; } closedir(dir); return 0; } void xpm_print_avail (FILE *fp, char *ext) { int i; fprintf(fp, _("Available `%s' sizes:\n"), ext); for (i=1; iWM_PROTOCOLS: %s() \n", procname); XtAugmentTranslations(w, XtParseTranslationTable(buf)); } void BoardToTop () { Arg args[16]; XtSetArg(args[0], XtNiconic, False); XtSetValues(shellWidget, args, 1); XtPopup(shellWidget, XtGrabNone); /* Raise if lowered */ } //--------------------------------------------------------------------------------------------------------- // some symbol definitions to provide the proper (= XBoard) context for the code in args.h #define XBOARD True #define JAWS_ARGS #define CW_USEDEFAULT (1<<31) #define ICS_TEXT_MENU_SIZE 90 #define DEBUG_FILE "xboard.debug" #define SetCurrentDirectory chdir #define GetCurrentDirectory(SIZE, NAME) getcwd(NAME, SIZE) #define OPTCHAR "-" #define SEPCHAR " " // The option definition and parsing code common to XBoard and WinBoard is collected in this file #include "args.h" // front-end part of option handling // [HGM] This platform-dependent table provides the location for storing the color info extern char *crWhite, * crBlack; void * colorVariable[] = { &appData.whitePieceColor, &appData.blackPieceColor, &appData.lightSquareColor, &appData.darkSquareColor, &appData.highlightSquareColor, &appData.premoveHighlightColor, &appData.lowTimeWarningColor, NULL, NULL, NULL, NULL, NULL, &crWhite, &crBlack, NULL }; // [HGM] font: keep a font for each square size, even non-stndard ones #define NUM_SIZES 18 #define MAX_SIZE 130 Boolean fontIsSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE]; char *fontTable[NUM_FONTS][MAX_SIZE]; void ParseFont (char *name, int number) { // in XBoard, only 2 of the fonts are currently implemented, and we just copy their name int size; if(sscanf(name, "size%d:", &size)) { // [HGM] font: font is meant for specific boardSize (likely from settings file); // defer processing it until we know if it matches our board size if(size >= 0 && sizeargLoc; switch(n) { case 0: // CLOCK_FONT name = appData.clockFont; break; case 1: // MESSAGE_FONT name = appData.font; break; case 2: // COORD_FONT name = appData.coordFont; break; default: return; } for(i=0; iargName, i, fontTable[n][i]); } void ExportSounds () { // nothing to do, as the sounds are at all times represented by their text-string names already } void SaveAttribsArg (FILE *f, ArgDescriptor *ad) { // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)(intptr_t)ad->argLoc]); } void SaveColor (FILE *f, ArgDescriptor *ad) { // in WinBoard the color is an int and has to be converted to text. In X it would be a string already? if(colorVariable[(int)(intptr_t)ad->argLoc]) fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)(intptr_t)ad->argLoc]); } void SaveBoardSize (FILE *f, char *name, void *addr) { // wrapper to shield back-end from BoardSize & sizeInfo fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", name, appData.boardSize); } void ParseCommPortSettings (char *s) { // no such option in XBoard (yet) } int frameX, frameY; void GetActualPlacement (Widget wg, WindowPlacement *wp) { XWindowAttributes winAt; Window win, dummy; int rx, ry; if(!wg) return; win = XtWindow(wg); XGetWindowAttributes(xDisplay, win, &winAt); // this works, where XtGetValues on XtNx, XtNy does not! XTranslateCoordinates (xDisplay, win, winAt.root, -winAt.border_width, -winAt.border_width, &rx, &ry, &dummy); wp->x = rx - winAt.x; wp->y = ry - winAt.y; wp->height = winAt.height; wp->width = winAt.width; frameX = winAt.x; frameY = winAt.y; // remember to decide if windows touch } void GetWindowCoords () { // wrapper to shield use of window handles from back-end (make addressible by number?) // In XBoard this will have to wait until awareness of window parameters is implemented GetActualPlacement(shellWidget, &wpMain); if(shellUp[EngOutDlg]) GetActualPlacement(shells[EngOutDlg], &wpEngineOutput); if(shellUp[HistoryDlg]) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory); if(shellUp[EvalGraphDlg]) GetActualPlacement(shells[EvalGraphDlg], &wpEvalGraph); if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList); if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment); if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags); } void PrintCommPortSettings (FILE *f, char *name) { // This option does not exist in XBoard } void EnsureOnScreen (int *x, int *y, int minX, int minY) { return; } int MainWindowUp () { // [HGM] args: allows testing if main window is realized from back-end return xBoardWindow != 0; } void PopUpStartupDialog () { // start menu not implemented in XBoard } char * ConvertToLine (int argc, char **argv) { static char line[128*1024], buf[1024]; int i; line[0] = NULLCHAR; for(i=1; imax_logical_extent.height + 5; // add borderWidth } #else appData.font = FindFont(appData.font, fontPxlSize); appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize); appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); clockFontID = XLoadFont(xDisplay, appData.clockFont); clockFontStruct = XQueryFont(xDisplay, clockFontID); coordFontID = XLoadFont(xDisplay, appData.coordFont); coordFontStruct = XQueryFont(xDisplay, coordFontID); // textHeight in !NLS mode! #endif countFontID = coordFontID; // [HGM] holdings countFontStruct = coordFontStruct; xdb = XtDatabase(xDisplay); #if ENABLE_NLS XrmPutLineResource(&xdb, "*international: True"); vTo.size = sizeof(XFontSet); vTo.addr = (XtPointer) &fontSet; XrmPutResource(&xdb, "*fontSet", XtRFontSet, &vTo); #else XrmPutStringResource(&xdb, "*font", appData.font); #endif } char * PrintArg (ArgType t) { char *p=""; switch(t) { case ArgZ: case ArgInt: p = " N"; break; case ArgString: p = " STR"; break; case ArgBoolean: p = " TF"; break; case ArgSettingsFilename: case ArgBackupSettingsFile: case ArgFilename: p = " FILE"; break; case ArgX: p = " Nx"; break; case ArgY: p = " Ny"; break; case ArgAttribs: p = " TEXTCOL"; break; case ArgColor: p = " COL"; break; case ArgFont: p = " FONT"; break; case ArgBoardSize: p = " SIZE"; break; case ArgFloat: p = " FLOAT"; break; case ArgTrue: case ArgFalse: case ArgTwo: case ArgNone: case ArgCommSettings: break; } return p; } char * GenerateGlobalTranslationTable (void) { /* go through all menu items and extract the keyboard shortcuts, so that X11 can load them */ char *output; int i,j; MenuItem *mi; output = strdup(""); /* loop over all menu entries */ for( i=0; menuBar[i].mi ; i++) { mi = menuBar[i].mi; for(j=0; mi[j].proc; j++) { if (mi[j].accel) { int ctrl = 0; int shift = 0; int alt = 0; char *key,*test, *mods; /* check for Ctrl/Alt */ if( strstr(mi[j].accel, "") ) ctrl = 1; if( strstr(mi[j].accel, "") ) shift = 1; if( strstr(mi[j].accel, "") ) alt = 1; /* remove all <...> */ test = strrchr(mi[j].accel, '>'); if ( test==NULL ) key = strdup(mi[j].accel); else key = strdup(++test); // remove ">" /* instead of shift X11 uses the uppercase letter directly*/ if (shift && strlen(key)==1 ) { *key = toupper(*key); shift = 0; } /* handle some special cases which have different names in X11 */ if ( strncmp(key, "Page_Down", 9) == 0 ) { free(key); key=strdup("Next"); } else if ( strncmp(key, "Page_Up", 7) == 0 ) { free(key); key=strdup("Prior"); }; /* create string of mods */ if (ctrl) mods = strdup("Ctrl "); else mods = strdup(""); if(alt) { mods = realloc(mods, strlen(mods) + strlen("Meta ")+1); strncat(mods, "Meta ", 5); }; if(shift) { mods = realloc(mods, strlen(mods) + strlen("Shift ")+1); strncat(mods, "Shift ", 6); }; // remove trailing space if( isspace(mods[strlen(mods)-1]) ) mods[strlen(mods)-1]='\0'; /* get the name for the callback, we can use MenuItem() here that will call KeyBindingProc */ size_t namesize = snprintf(NULL, 0, "%s.%s", menuBar[i].ref, mi[j].ref); char *name = malloc(namesize+1); snprintf(name, namesize+1, "%s.%s", menuBar[i].ref, mi[j].ref); size_t buffersize = snprintf(NULL, 0, ":%s%s: MenuItem(%s) \n ", mods, key, name); char *buffer = malloc(buffersize+1); snprintf(buffer, buffersize+1, ":%s%s: MenuItem(%s) \n ", mods, key, name); /* add string to the output */ output = realloc(output, strlen(output) + strlen(buffer)+1); strncat(output, buffer, strlen(buffer)); /* clean up */ free(key); free(buffer); free(name); free(mods); } } } return output; } void PrintOptions () { char buf[MSG_SIZ]; int len=0; ArgDescriptor *q, *p = argDescriptors+5; printf("\nXBoard accepts the following options:\n" "(N = integer, TF = true or false, STR = text string, FILE = filename,\n" " Nx, Ny = relative coordinates, COL = color, FONT = X-font spec,\n" " SIZE = board-size spec(s)\n" " Within parentheses are short forms, or options to set to true or false.\n" " Persistent options (saved in the settings file) are marked with *)\n\n"); while(p->argName) { if(p->argType == ArgCommSettings) { p++; continue; } // XBoard has no comm port snprintf(buf+len, MSG_SIZ, "-%s%s", p->argName, PrintArg(p->argType)); if(p->save) strcat(buf+len, "*"); for(q=p+1; q->argLoc == p->argLoc; q++) { if(q->argName[0] == '-') continue; strcat(buf+len, q == p+1 ? " (" : " "); sprintf(buf+strlen(buf), "-%s%s", q->argName, PrintArg(q->argType)); } if(q != p+1) strcat(buf+len, ")"); len = strlen(buf); if(len > 39) len = 0, printf("%s\n", buf); else while(len < 39) buf[len++] = ' '; p = q; } if(len) buf[len] = NULLCHAR, printf("%s\n", buf); } void SlaveResize (Option *opt) { } int main (int argc, char **argv) { int i, clockFontPxlSize, coordFontPxlSize, fontPxlSize; XSetWindowAttributes window_attributes; Arg args[16]; Dimension boardWidth, boardHeight, w, h; char *p; int forceMono = False; srandom(time(0)); // [HGM] book: make random truly random setbuf(stdout, NULL); setbuf(stderr, NULL); debugFP = stderr; if(argc > 1 && (!strcmp(argv[1], "-v" ) || !strcmp(argv[1], "--version" ))) { printf("%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION); exit(0); } if(argc > 1 && !strcmp(argv[1], "--help" )) { PrintOptions(); exit(0); } programName = strrchr(argv[0], '/'); if (programName == NULL) programName = argv[0]; else programName++; #ifdef ENABLE_NLS XtSetLanguageProc(NULL, NULL, NULL); if (appData.debugMode) { fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL)); } bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif appData.boardSize = ""; InitAppData(ConvertToLine(argc, argv)); p = getenv("HOME"); if (p == NULL) p = "/tmp"; i = strlen(p) + strlen("/.xboardXXXXXx.pgn") + 1; gameCopyFilename = (char*) malloc(i); gamePasteFilename = (char*) malloc(i); snprintf(gameCopyFilename,i, "%s/.xboard%05uc.pgn", p, getpid()); snprintf(gamePasteFilename,i, "%s/.xboard%05up.pgn", p, getpid()); { // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string. static char buf[MSG_SIZ]; EscapeExpand(buf, appData.firstInitString); appData.firstInitString = strdup(buf); EscapeExpand(buf, appData.secondInitString); appData.secondInitString = strdup(buf); EscapeExpand(buf, appData.firstComputerString); appData.firstComputerString = strdup(buf); EscapeExpand(buf, appData.secondComputerString); appData.secondComputerString = strdup(buf); } if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) { chessDir = "."; } else { if (chdir(chessDir) != 0) { fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName); perror(chessDir); exit(1); } } if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) { /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */ if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL) { printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile); exit(errno); } setbuf(debugFP, NULL); } /* [HGM,HR] make sure board size is acceptable */ if(appData.NrFiles > BOARD_FILES || appData.NrRanks > BOARD_RANKS ) DisplayFatalError(_("Recompile with larger BOARD_RANKS or BOARD_FILES to support this size"), 0, 2); #if !HIGHDRAG /* This feature does not work; animation needs a rewrite */ appData.highlightDragging = FALSE; #endif InitBackEnd1(); gameInfo.variant = StringToVariant(appData.variant); InitPosition(FALSE); shellWidget = XtAppInitialize(&appContext, "XBoard", shellOptions, XtNumber(shellOptions), &argc, argv, xboardResources, NULL, 0); XtGetApplicationResources(shellWidget, (XtPointer) &appData, clientResources, XtNumber(clientResources), NULL, 0); xDisplay = XtDisplay(shellWidget); xScreen = DefaultScreen(xDisplay); wm_delete_window = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True); /* * determine size, based on supplied or remembered -size, or screen size */ if (isdigit(appData.boardSize[0])) { i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize, &lineGap, &clockFontPxlSize, &coordFontPxlSize, &fontPxlSize, &smallLayout, &tinyLayout); if (i == 0) { fprintf(stderr, _("%s: bad boardSize syntax %s\n"), programName, appData.boardSize); exit(2); } if (i < 7) { /* Find some defaults; use the nearest known size */ SizeDefaults *szd, *nearest; int distance = 99999; nearest = szd = sizeDefaults; while (szd->name != NULL) { if (abs(szd->squareSize - squareSize) < distance) { nearest = szd; distance = abs(szd->squareSize - squareSize); if (distance == 0) break; } szd++; } if (i < 2) lineGap = nearest->lineGap; if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize; if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize; if (i < 5) fontPxlSize = nearest->fontPxlSize; if (i < 6) smallLayout = nearest->smallLayout; if (i < 7) tinyLayout = nearest->tinyLayout; } } else { SizeDefaults *szd = sizeDefaults; if (*appData.boardSize == NULLCHAR) { while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize || DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) { szd++; } if (szd->name == NULL) szd--; appData.boardSize = strdup(szd->name); // [HGM] settings: remember name for saving settings } else { while (szd->name != NULL && StrCaseCmp(szd->name, appData.boardSize) != 0) szd++; if (szd->name == NULL) { fprintf(stderr, _("%s: unrecognized boardSize name %s\n"), programName, appData.boardSize); exit(2); } } squareSize = szd->squareSize; lineGap = szd->lineGap; clockFontPxlSize = szd->clockFontPxlSize; coordFontPxlSize = szd->coordFontPxlSize; fontPxlSize = szd->fontPxlSize; smallLayout = szd->smallLayout; tinyLayout = szd->tinyLayout; // [HGM] font: use defaults from settings file if available and not overruled } defaultLineGap = lineGap; if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; /* [HR] height treated separately (hacked) */ boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); /* * Determine what fonts to use. */ InitializeFonts(clockFontPxlSize, coordFontPxlSize, fontPxlSize); /* * Detect if there are not enough colors available and adapt. */ if (DefaultDepth(xDisplay, xScreen) <= 2) { appData.monoMode = True; } forceMono = MakeColors(); if (forceMono) { fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), programName); appData.monoMode = True; } if (appData.monoMode && appData.debugMode) { fprintf(stderr, _("white pixel = 0x%lx, black pixel = 0x%lx\n"), (unsigned long) XWhitePixel(xDisplay, xScreen), (unsigned long) XBlackPixel(xDisplay, xScreen)); } ParseIcsTextColors(); XtAppAddActions(appContext, boardActions, XtNumber(boardActions)); /* * widget hierarchy */ if (tinyLayout) { layoutName = "tinyLayout"; } else if (smallLayout) { layoutName = "smallLayout"; } else { layoutName = "normalLayout"; } optList = BoardPopUp(squareSize, lineGap, (void*) #if ENABLE_NLS &clockFontSet); #else clockFontStruct); #endif InitDrawingHandle(optList + W_BOARD); currBoard = &optList[W_BOARD]; boardWidget = optList[W_BOARD].handle; menuBarWidget = optList[W_MENU].handle; dropMenu = optList[W_DROP].handle; titleWidget = optList[optList[W_TITLE].type != -1 ? W_TITLE : W_SMALL].handle; formWidget = XtParent(boardWidget); XtSetArg(args[0], XtNbackground, &timerBackgroundPixel); XtSetArg(args[1], XtNforeground, &timerForegroundPixel); XtGetValues(optList[W_WHITE].handle, args, 2); if (appData.showButtonBar) { // can't we use timer pixels for this? (Or better yet, just black & white?) XtSetArg(args[0], XtNbackground, &buttonBackgroundPixel); XtSetArg(args[1], XtNforeground, &buttonForegroundPixel); XtGetValues(optList[W_PAUSE].handle, args, 2); } xBoardWindow = XtWindow(boardWidget); // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would // not need to go into InitDrawingSizes(). /* * Create X checkmark bitmap and initialize option menu checks. */ ReadBitmap(&xMarkPixmap, "checkmark.bm", checkmark_bits, checkmark_width, checkmark_height); InitMenuMarkers(); /* * Create an icon. */ ReadBitmap(&wIconPixmap, "icon_white.bm", icon_white_bits, icon_white_width, icon_white_height); ReadBitmap(&bIconPixmap, "icon_black.bm", icon_black_bits, icon_black_width, icon_black_height); iconPixmap = wIconPixmap; i = 0; XtSetArg(args[i], XtNiconPixmap, iconPixmap); i++; XtSetValues(shellWidget, args, i); /* * Create a cursor for the board widget. */ window_attributes.cursor = XCreateFontCursor(xDisplay, XC_hand2); XChangeWindowAttributes(xDisplay, xBoardWindow, CWCursor, &window_attributes); /* * Inhibit shell resizing. */ shellArgs[0].value = (XtArgVal) &w; shellArgs[1].value = (XtArgVal) &h; XtGetValues(shellWidget, shellArgs, 2); shellArgs[4].value = shellArgs[2].value = w; shellArgs[5].value = shellArgs[3].value = h; // XtSetValues(shellWidget, &shellArgs[2], 4); marginW = w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board marginH = h - boardHeight; CatchDeleteWindow(shellWidget, "QuitProc"); CreateAnyPieces(); CreateGrid(); if(appData.logoSize) { // locate and read user logo char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s/%s.png", appData.logoDir, UserName()); ASSIGN(userLogo, buf); } if (appData.animate || appData.animateDragging) CreateAnimVars(); char *TranslationsTableMenus=GenerateGlobalTranslationTable (); XtAugmentTranslations(formWidget, XtParseTranslationTable(globalTranslations)); XtAugmentTranslations(formWidget, XtParseTranslationTable(TranslationsTableMenus)); XtAddEventHandler(formWidget, KeyPressMask, False, (XtEventHandler) MoveTypeInProc, NULL); XtAddEventHandler(shellWidget, StructureNotifyMask, False, (XtEventHandler) EventProc, NULL); /* [AS] Restore layout */ if( wpMoveHistory.visible ) { HistoryPopUp(); } if( wpEvalGraph.visible ) { EvalGraphPopUp(); }; if( wpEngineOutput.visible ) { EngineOutputPopUp(); } InitBackEnd2(); if (errorExitStatus == -1) { if (appData.icsActive) { /* We now wait until we see "login:" from the ICS before sending the logon script (problems with timestamp otherwise) */ /*ICSInitScript();*/ if (appData.icsInputBox) ICSInputBoxPopUp(); } #ifdef SIGWINCH signal(SIGWINCH, TermSizeSigHandler); #endif signal(SIGINT, IntSigHandler); signal(SIGTERM, IntSigHandler); if (*appData.cmailGameName != NULLCHAR) { signal(SIGUSR1, CmailSigHandler); } } gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() InitPosition(TRUE); UpdateLogos(TRUE); // XtSetKeyboardFocus(shellWidget, formWidget); XSetInputFocus(xDisplay, XtWindow(formWidget), RevertToPointerRoot, CurrentTime); XtAppMainLoop(appContext); if (appData.debugMode) fclose(debugFP); // [DM] debug return 0; } RETSIGTYPE TermSizeSigHandler (int sig) { update_ics_width(); } RETSIGTYPE IntSigHandler (int sig) { ExitEvent(sig); } RETSIGTYPE CmailSigHandler (int sig) { int dummy = 0; int error; signal(SIGUSR1, SIG_IGN); /* suspend handler */ /* Activate call-back function CmailSigHandlerCallBack() */ OutputToProcess(cmailPR, (char *)(&dummy), sizeof(int), &error); signal(SIGUSR1, CmailSigHandler); /* re-activate handler */ } void CmailSigHandlerCallBack (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error) { BoardToTop(); ReloadCmailMsgEvent(TRUE); /* Reload cmail msg */ } /**** end signal code ****/ #define Abs(n) ((n)<0 ? -(n) : (n)) #ifdef ENABLE_NLS char * InsertPxlSize (char *pattern, int targetPxlSize) { char *base_fnt_lst, strInt[12], *p, *q; int alternatives, i, len, strIntLen; /* * Replace the "*" (if present) in the pixel-size slot of each * alternative with the targetPxlSize. */ p = pattern; alternatives = 1; while ((p = strchr(p, ',')) != NULL) { alternatives++; p++; } snprintf(strInt, sizeof(strInt), "%d", targetPxlSize); strIntLen = strlen(strInt); base_fnt_lst = calloc(1, strlen(pattern) + strIntLen * alternatives + 1); p = pattern; q = base_fnt_lst; while (alternatives--) { char *comma = strchr(p, ','); for (i=0; i<14; i++) { char *hyphen = strchr(p, '-'); if (!hyphen) break; if (comma && hyphen > comma) break; len = hyphen + 1 - p; if (i == 7 && *p == '*' && len == 2) { p += len; memcpy(q, strInt, strIntLen); q += strIntLen; *q++ = '-'; } else { memcpy(q, p, len); p += len; q += len; } } if (!comma) break; len = comma + 1 - p; memcpy(q, p, len); p += len; q += len; } strcpy(q, p); return base_fnt_lst; } XFontSet CreateFontSet (char *base_fnt_lst) { XFontSet fntSet; char **missing_list; int missing_count; char *def_string; fntSet = XCreateFontSet(xDisplay, base_fnt_lst, &missing_list, &missing_count, &def_string); if (appData.debugMode) { int i, count; XFontStruct **font_struct_list; char **font_name_list; fprintf(debugFP, "Requested font set for list %s\n", base_fnt_lst); if (fntSet) { fprintf(debugFP, " got list %s, locale %s\n", XBaseFontNameListOfFontSet(fntSet), XLocaleOfFontSet(fntSet)); count = XFontsOfFontSet(fntSet, &font_struct_list, &font_name_list); for (i = 0; i < count; i++) { fprintf(debugFP, " got charset %s\n", font_name_list[i]); } } for (i = 0; i < missing_count; i++) { fprintf(debugFP, " missing charset %s\n", missing_list[i]); } } if (fntSet == NULL) { fprintf(stderr, _("Unable to create font set for %s.\n"), base_fnt_lst); exit(2); } return fntSet; } #else // not ENABLE_NLS /* * Find a font that matches "pattern" that is as close as * possible to the targetPxlSize. Prefer fonts that are k * pixels smaller to fonts that are k pixels larger. The * pattern must be in the X Consortium standard format, * e.g. "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*". * The return value should be freed with XtFree when no * longer needed. */ char * FindFont (char *pattern, int targetPxlSize) { char **fonts, *p, *best, *scalable, *scalableTail; int i, j, nfonts, minerr, err, pxlSize; fonts = XListFonts(xDisplay, pattern, 999999, &nfonts); if (nfonts < 1) { fprintf(stderr, _("%s: no fonts match pattern %s\n"), programName, pattern); exit(2); } best = fonts[0]; scalable = NULL; minerr = 999999; for (i=0; i 0 && err < 0 && -err == minerr)) { best = fonts[i]; minerr = err; } } } if (scalable && Abs(minerr) > appData.fontSizeTolerance) { /* If the error is too big and there is a scalable font, use the scalable font. */ int headlen = scalableTail - scalable; p = (char *) XtMalloc(strlen(scalable) + 10); while (isdigit(*scalableTail)) scalableTail++; sprintf(p, "%.*s%d%s", headlen, scalable, targetPxlSize, scalableTail); } else { p = (char *) XtMalloc(strlen(best) + 2); safeStrCpy(p, best, strlen(best)+1 ); } if (appData.debugMode) { fprintf(debugFP, "resolved %s at pixel size %d\n to %s\n", pattern, targetPxlSize, p); } XFreeFontNames(fonts); return p; } #endif void ReadBitmap (Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq) { if (bits != NULL) { *pm = XCreateBitmapFromData(xDisplay, xBoardWindow, (char *) bits, wreq, hreq); } } void MarkMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); if(item) { Arg args[2]; XtSetArg(args[0], XtNleftBitmap, state ? xMarkPixmap : None); XtSetValues(item->handle, args, 1); } } void EnableNamedMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); if(item) XtSetSensitive(item->handle, state); } void EnableButtonBar (int state) { XtSetSensitive(optList[W_BUTTON].handle, state); } void SetMenuEnables (Enables *enab) { while (enab->name != NULL) { EnableNamedMenuItem(enab->name, enab->value); enab++; } } void KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] new method of key binding: specify MenuItem(FlipView) in stead of FlipViewProc in translation string MenuItem *item; if(*nprms == 0) return; item = MenuNameToItem(prms[0]); if(item) ((MenuProc *) item->proc) (); } void SetupDropMenu () { int i, j, count; char label[32]; Arg args[16]; Widget entry; char* p; for (i=0; i 1.) f = 1.; else if(f < 0.) f = 0.; return f; } static WindowPlacement wpNew; void CoDrag (Widget sh, WindowPlacement *wp) { Arg args[16]; int j=0, touch=0, fudge = 2; GetActualPlacement(sh, wp); if(abs(wpMain.x + wpMain.width + 2*frameX - wp->x) < fudge) touch = 1; else // right touch if(abs(wp->x + wp->width + 2*frameX - wpMain.x) < fudge) touch = 2; else // left touch if(abs(wpMain.y + wpMain.height + frameX + frameY - wp->y) < fudge) touch = 3; else // bottom touch if(abs(wp->y + wp->height + frameX + frameY - wpMain.y) < fudge) touch = 4; // top touch if(!touch ) return; // only windows that touch co-move if(touch < 3 && wpNew.height != wpMain.height) { // left or right and height changed int heightInc = wpNew.height - wpMain.height; double fracTop = Fraction(wp->y, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); double fracBot = Fraction(wp->y + wp->height + frameX + frameY + 1, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); wp->y += fracTop * heightInc; heightInc = (int) (fracBot * heightInc) - (int) (fracTop * heightInc); if(heightInc) XtSetArg(args[j], XtNheight, wp->height + heightInc), j++; } else if(touch > 2 && wpNew.width != wpMain.width) { // top or bottom and width changed int widthInc = wpNew.width - wpMain.width; double fracLeft = Fraction(wp->x, wpMain.x, wpMain.x + wpMain.width + 2*frameX); double fracRght = Fraction(wp->x + wp->width + 2*frameX + 1, wpMain.x, wpMain.x + wpMain.width + 2*frameX); wp->y += fracLeft * widthInc; widthInc = (int) (fracRght * widthInc) - (int) (fracLeft * widthInc); if(widthInc) XtSetArg(args[j], XtNwidth, wp->width + widthInc), j++; } wp->x += wpNew.x - wpMain.x; wp->y += wpNew.y - wpMain.y; if(touch == 1) wp->x += wpNew.width - wpMain.width; else if(touch == 3) wp->y += wpNew.height - wpMain.height; XtSetArg(args[j], XtNx, wp->x); j++; XtSetArg(args[j], XtNy, wp->y); j++; XtSetValues(sh, args, j); } void ReSize (WindowPlacement *wp) { int sqx, sqy, w, h; if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized sqx = (wp->width - lineGap - marginW) / BOARD_WIDTH - lineGap; sqy = (wp->height - lineGap - marginH) / BOARD_HEIGHT - lineGap; if(sqy < sqx) sqx = sqy; if(sqx != squareSize) { squareSize = sqx; // adopt new square size CreatePNGPieces(); // make newly scaled pieces InitDrawingSizes(0, 0); // creates grid etc. } else ResizeBoardWindow(BOARD_WIDTH * (squareSize + lineGap) + lineGap, BOARD_HEIGHT * (squareSize + lineGap) + lineGap, 0); w = BOARD_WIDTH * (squareSize + lineGap) + lineGap; h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap; if(optList[W_BOARD].max > w) optList[W_BOARD].max = w; if(optList[W_BOARD].value > h) optList[W_BOARD].value = h; } static XtIntervalId delayedDragID = 0; void DragProc () { static int busy; if(busy) return; busy = 1; GetActualPlacement(shellWidget, &wpNew); if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized busy = 0; return; // false alarm } ReSize(&wpNew); if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput); if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory); if(shellUp[EvalGraphDlg]) CoDrag(shells[EvalGraphDlg], &wpEvalGraph); if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList); wpMain = wpNew; DrawPosition(True, NULL); delayedDragID = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other) busy = 0; } void DelayedDrag () { if(delayedDragID) XtRemoveTimeOut(delayedDragID); // cancel pending delayedDragID = XtAppAddTimeOut(appContext, 200, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later } void EventProc (Widget widget, caddr_t unused, XEvent *event) { if(XtIsRealized(widget) && event->type == ConfigureNotify || appData.useStickyWindows) DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other } /* * event handler for redrawing the board */ void DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { DrawPosition(True, NULL); } void HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams) { // [HGM] pv: walk PV MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap)); } extern int savedIndex; /* gross that this is global */ void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) { String val; XawTextPosition index, dummy; Arg arg; XawTextGetSelectionPos(w, &index, &dummy); XtSetArg(arg, XtNstring, &val); XtGetValues(w, &arg, 1); ReplaceComment(savedIndex, val); if(savedIndex != currentMove) ToNrEvent(savedIndex); LoadVariation( index, val ); // [HGM] also does the actual moving to it, now } /* Disable all user input other than deleting the window */ static int frozen = 0; void FreezeUI () { if (frozen) return; /* Grab by a widget that doesn't accept input */ XtAddGrab(optList[W_MESSG].handle, TRUE, FALSE); frozen = 1; } /* Undo a FreezeUI */ void ThawUI () { if (!frozen) return; XtRemoveGrab(optList[W_MESSG].handle); frozen = 0; } void ModeHighlight () { Arg args[16]; static int oldPausing = FALSE; static GameMode oldmode = (GameMode) -1; char *wname; if (!boardWidget || !XtIsRealized(boardWidget)) return; if (pausing != oldPausing) { oldPausing = pausing; MarkMenuItem("Mode.Pause", pausing); if (appData.showButtonBar) { /* Always toggle, don't set. Previous code messes up when invoked while the button is pressed, as releasing it toggles the state again. */ { Pixel oldbg, oldfg; XtSetArg(args[0], XtNbackground, &oldbg); XtSetArg(args[1], XtNforeground, &oldfg); XtGetValues(optList[W_PAUSE].handle, args, 2); XtSetArg(args[0], XtNbackground, oldfg); XtSetArg(args[1], XtNforeground, oldbg); } XtSetValues(optList[W_PAUSE].handle, args, 2); } } wname = ModeToWidgetName(oldmode); if (wname != NULL) { MarkMenuItem(wname, False); } wname = ModeToWidgetName(gameMode); if (wname != NULL) { MarkMenuItem(wname, True); } oldmode = gameMode; MarkMenuItem("Mode.MachineMatch", matchMode && matchGame < appData.matchGames); /* Maybe all the enables should be handled here, not just this one */ EnableNamedMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile); DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]); } /* * Button/menu procedures */ /* this variable is shared between CopyPositionProc and SendPositionSelection */ char *selected_fen_position=NULL; Boolean SendPositionSelection (Widget w, Atom *selection, Atom *target, Atom *type_return, XtPointer *value_return, unsigned long *length_return, int *format_return) { char *selection_tmp; // if (!selected_fen_position) return False; /* should never happen */ if (*target == XA_STRING || *target == XA_UTF8_STRING(xDisplay)){ if (!selected_fen_position) { // since it never happens, we use it for indicating a game is being sent FILE* f = fopen(gameCopyFilename, "r"); // This code, taken from SendGameSelection, now merges the two long len; size_t count; if (f == NULL) return False; fseek(f, 0, 2); len = ftell(f); rewind(f); selection_tmp = XtMalloc(len + 1); count = fread(selection_tmp, 1, len, f); fclose(f); if (len != count) { XtFree(selection_tmp); return False; } selection_tmp[len] = NULLCHAR; } else { /* note: since no XtSelectionDoneProc was registered, Xt will * automatically call XtFree on the value returned. So have to * make a copy of it allocated with XtMalloc */ selection_tmp= XtMalloc(strlen(selected_fen_position)+16); safeStrCpy(selection_tmp, selected_fen_position, strlen(selected_fen_position)+16 ); } *value_return=selection_tmp; *length_return=strlen(selection_tmp); *type_return=*target; *format_return = 8; /* bits per byte */ return True; } else if (*target == XA_TARGETS(xDisplay)) { Atom *targets_tmp = (Atom *) XtMalloc(2 * sizeof(Atom)); targets_tmp[0] = XA_UTF8_STRING(xDisplay); targets_tmp[1] = XA_STRING; *value_return = targets_tmp; *type_return = XA_ATOM; *length_return = 2; #if 0 // This code leads to a read of value_return out of bounds on 64-bit systems. // Other code which I have seen always sets *format_return to 32 independent of // sizeof(Atom) without adjusting *length_return. For instance see TextConvertSelection() // at http://cgit.freedesktop.org/xorg/lib/libXaw/tree/src/Text.c -- BJ *format_return = 8 * sizeof(Atom); if (*format_return > 32) { *length_return *= *format_return / 32; *format_return = 32; } #else *format_return = 32; #endif return True; } else { return False; } } /* note: when called from menu all parameters are NULL, so no clue what the * Widget which was clicked on was, or what the click event was */ void CopySomething (char *src) { selected_fen_position = src; /* * Set both PRIMARY (the selection) and CLIPBOARD, since we don't * have a notion of a position that is selected but not copied. * See http://www.freedesktop.org/wiki/Specifications/ClipboardsWiki */ XtOwnSelection(menuBarWidget, XA_PRIMARY, CurrentTime, SendPositionSelection, NULL/* lose_ownership_proc */ , NULL/* transfer_done_proc */); XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), CurrentTime, SendPositionSelection, NULL/* lose_ownership_proc */ , NULL/* transfer_done_proc */); } /* function called when the data to Paste is ready */ static void PastePositionCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { char *fenstr=value; if (value==NULL || *len==0) return; /* nothing had been selected to copy */ fenstr[*len]='\0'; /* normally this string is terminated, but be safe */ EditPositionPasteFEN(fenstr); XtFree(value); } /* called when Paste Position button is pressed, * all parameters will be NULL */ void PastePositionProc () { XtGetSelectionValue(menuBarWidget, appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, /* (XtSelectionCallbackProc) */ PastePositionCB, NULL, /* client_data passed to PastePositionCB */ /* better to use the time field from the event that triggered the * call to this function, but that isn't trivial to get */ CurrentTime ); return; } /* note: when called from menu all parameters are NULL, so no clue what the * Widget which was clicked on was, or what the click event was */ /* function called when the data to Paste is ready */ static void PasteGameCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { FILE* f; if (value == NULL || *len == 0) { return; /* nothing had been selected to copy */ } f = fopen(gamePasteFilename, "w"); if (f == NULL) { DisplayError(_("Can't open temp file"), errno); return; } fwrite(value, 1, *len, f); fclose(f); XtFree(value); LoadGameFromFile(gamePasteFilename, 0, gamePasteFilename, TRUE); } /* called when Paste Game button is pressed, * all parameters will be NULL */ void PasteGameProc () { XtGetSelectionValue(menuBarWidget, appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, /* (XtSelectionCallbackProc) */ PasteGameCB, NULL, /* client_data passed to PasteGameCB */ /* better to use the time field from the event that triggered the * call to this function, but that isn't trivial to get */ CurrentTime ); return; } void QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms) { QuitProc(); } int ShiftKeys () { // bassic primitive for determining if modifier keys are pressed long int codes[] = { XK_Meta_L, XK_Meta_R, XK_Control_L, XK_Control_R, XK_Shift_L, XK_Shift_R }; char keys[32]; int i,j, k=0; XQueryKeymap(xDisplay,keys); for(i=0; i<6; i++) { k <<= 1; j = XKeysymToKeycode(xDisplay, codes[i]); k += ( (keys[j>>3]&1<<(j&7)) != 0 ); } return k; } static void MoveTypeInProc (Widget widget, caddr_t unused, XEvent *event) { char buf[10]; KeySym sym; int n = XLookupString(&(event->xkey), buf, 10, &sym, NULL); if ( n == 1 && *buf >= 32 // printable && !(ShiftKeys() & 0x3C) // no Alt, Ctrl ) BoxAutoPopUp (buf); } static void UpKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] input: let up-arrow recall previous line from history IcsKey(1); } static void DownKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] input: let down-arrow recall next line from history IcsKey(-1); } static void EnterKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { IcsKey(0); } void TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (!TempBackwardActive) { TempBackwardActive = True; BackwardEvent(); } } void TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { /* Check to see if triggered by a key release event for a repeating key. * If so the next queued event will be a key press of the same key at the same time */ if (XEventsQueued(xDisplay, QueuedAfterReading)) { XEvent next; XPeekEvent(xDisplay, &next); if (next.type == KeyPress && next.xkey.time == event->xkey.time && next.xkey.keycode == event->xkey.keycode) return; } ForwardEvent(); TempBackwardActive = False; } void ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // called as key binding char buf[MSG_SIZ]; String name; if (nprms && *nprms > 0) name = prms[0]; else name = "xboard"; snprintf(buf, sizeof(buf), "xterm -e man %s &", name); system(buf); } void ManProc () { // called from menu ManInner(NULL, NULL, NULL, NULL); } void SetWindowTitle (char *text, char *title, char *icon) { Arg args[16]; int i; if (appData.titleInWindow) { i = 0; XtSetArg(args[i], XtNlabel, text); i++; XtSetValues(titleWidget, args, i); } i = 0; XtSetArg(args[i], XtNiconName, (XtArgVal) icon); i++; XtSetArg(args[i], XtNtitle, (XtArgVal) title); i++; XtSetValues(shellWidget, args, i); XSync(xDisplay, False); } static int NullXErrorCheck (Display *dpy, XErrorEvent *error_event) { return 0; } void DisplayIcsInteractionTitle (String message) { if (oldICSInteractionTitle == NULL) { /* Magic to find the old window title, adapted from vim */ char *wina = getenv("WINDOWID"); if (wina != NULL) { Window win = (Window) atoi(wina); Window root, parent, *children; unsigned int nchildren; int (*oldHandler)() = XSetErrorHandler(NullXErrorCheck); for (;;) { if (XFetchName(xDisplay, win, &oldICSInteractionTitle)) break; if (!XQueryTree(xDisplay, win, &root, &parent, &children, &nchildren)) break; if (children) XFree((void *)children); if (parent == root || parent == 0) break; win = parent; } XSetErrorHandler(oldHandler); } if (oldICSInteractionTitle == NULL) { oldICSInteractionTitle = "xterm"; } } printf("\033]0;%s\007", message); fflush(stdout); } XtIntervalId delayedEventTimerXID = 0; DelayedEventCallback delayedEventCallback = 0; void FireDelayedEvent () { delayedEventTimerXID = 0; delayedEventCallback(); } void ScheduleDelayedEvent (DelayedEventCallback cb, long millisec) { if(delayedEventTimerXID && delayedEventCallback == cb) // [HGM] alive: replace, rather than add or flush identical event XtRemoveTimeOut(delayedEventTimerXID); delayedEventCallback = cb; delayedEventTimerXID = XtAppAddTimeOut(appContext, millisec, (XtTimerCallbackProc) FireDelayedEvent, (XtPointer) 0); } DelayedEventCallback GetDelayedEvent () { if (delayedEventTimerXID) { return delayedEventCallback; } else { return NULL; } } void CancelDelayedEvent () { if (delayedEventTimerXID) { XtRemoveTimeOut(delayedEventTimerXID); delayedEventTimerXID = 0; } } XtIntervalId loadGameTimerXID = 0; int LoadGameTimerRunning () { return loadGameTimerXID != 0; } int StopLoadGameTimer () { if (loadGameTimerXID != 0) { XtRemoveTimeOut(loadGameTimerXID); loadGameTimerXID = 0; return TRUE; } else { return FALSE; } } void LoadGameTimerCallback (XtPointer arg, XtIntervalId *id) { loadGameTimerXID = 0; AutoPlayGameLoop(); } void StartLoadGameTimer (long millisec) { loadGameTimerXID = XtAppAddTimeOut(appContext, millisec, (XtTimerCallbackProc) LoadGameTimerCallback, (XtPointer) 0); } XtIntervalId analysisClockXID = 0; void AnalysisClockCallback (XtPointer arg, XtIntervalId *id) { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { // [DM] AnalysisPeriodicEvent(0); StartAnalysisClock(); } } void StartAnalysisClock () { analysisClockXID = XtAppAddTimeOut(appContext, 2000, (XtTimerCallbackProc) AnalysisClockCallback, (XtPointer) 0); } XtIntervalId clockTimerXID = 0; int ClockTimerRunning () { return clockTimerXID != 0; } int StopClockTimer () { if (clockTimerXID != 0) { XtRemoveTimeOut(clockTimerXID); clockTimerXID = 0; return TRUE; } else { return FALSE; } } void ClockTimerCallback (XtPointer arg, XtIntervalId *id) { clockTimerXID = 0; DecrementClocks(); } void StartClockTimer (long millisec) { clockTimerXID = XtAppAddTimeOut(appContext, millisec, (XtTimerCallbackProc) ClockTimerCallback, (XtPointer) 0); } void DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) { char buf[MSG_SIZ]; Arg args[16]; Widget w = (Widget) opt->handle; /* check for low time warning */ Pixel foregroundOrWarningColor = timerForegroundPixel; if (timer > 0 && appData.lowTimeWarning && (timer / 1000) < appData.icsAlarmTime) foregroundOrWarningColor = lowTimeWarningColor; if (appData.clockMode) { snprintf(buf, MSG_SIZ, "%s:%s%s", color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); XtSetArg(args[0], XtNlabel, buf); } else { snprintf(buf, MSG_SIZ, "%s ", color); XtSetArg(args[0], XtNlabel, buf); } if (highlight) { XtSetArg(args[1], XtNbackground, foregroundOrWarningColor); XtSetArg(args[2], XtNforeground, timerBackgroundPixel); } else { XtSetArg(args[1], XtNbackground, timerBackgroundPixel); XtSetArg(args[2], XtNforeground, foregroundOrWarningColor); } XtSetValues(w, args, 3); } static Pixmap *clockIcons[] = { &wIconPixmap, &bIconPixmap }; void SetClockIcon (int color) { Arg args[16]; Pixmap pm = *clockIcons[color]; if (iconPixmap != pm) { iconPixmap = pm; XtSetArg(args[0], XtNiconPixmap, iconPixmap); XtSetValues(shellWidget, args, 1); } } #define INPUT_SOURCE_BUF_SIZE 8192 typedef struct { CPKind kind; int fd; int lineByLine; char *unused; InputCallback func; XtInputId xid; char buf[INPUT_SOURCE_BUF_SIZE]; VOIDSTAR closure; } InputSource; void DoInputCallback (caddr_t closure, int *source, XtInputId *xid) { InputSource *is = (InputSource *) closure; int count; int error; char *p, *q; if (is->lineByLine) { count = read(is->fd, is->unused, INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf)); if (count <= 0) { (is->func)(is, is->closure, is->buf, count, count ? errno : 0); return; } is->unused += count; p = is->buf; while (p < is->unused) { q = memchr(p, '\n', is->unused - p); if (q == NULL) break; q++; (is->func)(is, is->closure, p, q - p, 0); p = q; } q = is->buf; while (p < is->unused) { *q++ = *p++; } is->unused = q; } else { count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); if (count == -1) error = errno; else error = 0; (is->func)(is, is->closure, is->buf, count, error); } } InputSourceRef AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure) { InputSource *is; ChildProc *cp = (ChildProc *) pr; is = (InputSource *) calloc(1, sizeof(InputSource)); is->lineByLine = lineByLine; is->func = func; if (pr == NoProc) { is->kind = CPReal; is->fd = fileno(stdin); } else { is->kind = cp->kind; is->fd = cp->fdFrom; } if (lineByLine) { is->unused = is->buf; } is->xid = XtAppAddInput(appContext, is->fd, (XtPointer) (XtInputReadMask), (XtInputCallbackProc) DoInputCallback, (XtPointer) is); is->closure = closure; return (InputSourceRef) is; } void RemoveInputSource (InputSourceRef isr) { InputSource *is = (InputSource *) isr; if (is->xid == 0) return; XtRemoveInput(is->xid); is->xid = 0; } #ifndef HAVE_USLEEP static Boolean frameWaiting; static RETSIGTYPE FrameAlarm (int sig) { frameWaiting = False; /* In case System-V style signals. Needed?? */ signal(SIGALRM, FrameAlarm); } void FrameDelay (int time) { struct itimerval delay; XSync(xDisplay, False); if (time > 0) { frameWaiting = True; signal(SIGALRM, FrameAlarm); delay.it_interval.tv_sec = delay.it_value.tv_sec = time / 1000; delay.it_interval.tv_usec = delay.it_value.tv_usec = (time % 1000) * 1000; setitimer(ITIMER_REAL, &delay, NULL); while (frameWaiting) pause(); delay.it_interval.tv_sec = delay.it_value.tv_sec = 0; delay.it_interval.tv_usec = delay.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &delay, NULL); } } #else void FrameDelay (int time) { XSync(xDisplay, False); if (time > 0) usleep(time * 1000); } #endif static void LoadLogo (ChessProgramState *cps, int n, Boolean ics) { char buf[MSG_SIZ], *logoName = buf; if(appData.logo[n][0]) { logoName = appData.logo[n]; } else if(appData.autoLogo) { if(ics) { // [HGM] logo: in ICS mode second can be used for ICS sprintf(buf, "%s/%s.png", appData.logoDir, appData.icsHost); } else if(appData.directory[n] && appData.directory[n][0]) { sprintf(buf, "%s/%s.png", appData.logoDir, cps->tidy); } } if(logoName[0]) { ASSIGN(cps->programLogo, logoName); } } void UpdateLogos (int displ) { if(optList[W_WHITE-1].handle == NULL) return; LoadLogo(&first, 0, 0); LoadLogo(&second, 1, appData.icsActive); if(displ) DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]); return; } xboard-4.7.3/xaw/xoptions.c0000644000175000001440000014111512262562252012556 00000000000000/* * xoptions.c -- Move list window, part of X front end for XBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // [HGM] this file is the counterpart of woptions.c, containing xboard popup menus // similar to those of WinBoard, to set the most common options interactively. #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "backend.h" #include "xboard.h" #include "dialogs.h" #include "menus.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines static Widget previous = NULL; static Option *currentOption; void UnCaret () { Arg args[2]; if(previous) { XtSetArg(args[0], XtNdisplayCaret, False); XtSetValues(previous, args, 1); } previous = NULL; } void SetFocus (Widget w, XtPointer data, XEvent *event, Boolean *b) { Arg args[2]; char *s; int j; UnCaret(); XtSetArg(args[0], XtNstring, &s); XtGetValues(w, args, 1); j = 1; XtSetArg(args[0], XtNdisplayCaret, True); if(!strchr(s, '\n') && strlen(s) < 80) XtSetArg(args[1], XtNinsertPosition, strlen(s)), j++; XtSetValues(w, args, j); XtSetKeyboardFocus((Widget) data, w); previous = w; } void BoardFocus () { XtSetKeyboardFocus(shellWidget, formWidget); } //--------------------------- Engine-specific options menu ---------------------------------- int dialogError; Option *dialogOptions[NrOfDialogs]; static Arg layoutArgs[] = { { XtNborderWidth, 0 }, { XtNdefaultDistance, 0 }, }; static Arg formArgs[] = { { XtNborderWidth, 0 }, { XtNresizable, (XtArgVal) True }, }; void CursorAtEnd (Option *opt) { } void GetWidgetText (Option *opt, char **buf) { Arg arg; XtSetArg(arg, XtNstring, buf); XtGetValues(opt->handle, &arg, 1); } void SetWidgetText (Option *opt, char *buf, int n) { Arg arg; XtSetArg(arg, XtNstring, buf); XtSetValues(opt->handle, &arg, 1); if(n >= 0) SetFocus(opt->handle, shells[n], NULL, False); } void GetWidgetState (Option *opt, int *state) { Arg arg; XtSetArg(arg, XtNstate, state); XtGetValues(opt->handle, &arg, 1); } void SetWidgetState (Option *opt, int state) { Arg arg; XtSetArg(arg, XtNstate, state); XtSetValues(opt->handle, &arg, 1); } void SetWidgetLabel (Option *opt, char *buf) { Arg arg; XtSetArg(arg, XtNlabel, (XtArgVal) buf); XtSetValues(opt->handle, &arg, 1); } void SetDialogTitle (DialogClass dlg, char *title) { Arg args[16]; XtSetArg(args[0], XtNtitle, title); XtSetValues(shells[dlg], args, 1); } void LoadListBox (Option *opt, char *emptyText, int n1, int n2) { static char *dummyList[2]; dummyList[0] = emptyText; // empty listboxes tend to crash X, so display user-supplied warning string instead XawListChange(opt->handle, *(char**)opt->target ? opt->target : dummyList, 0, 0, True); //printf("listbox data = %x\n", opt->target); } int ReadScroll (Option *opt, float *top, float *bottom) { // retreives fractions of top and bottom of thumb Arg args[16]; Widget w = XtParent(opt->handle); // viewport Widget v = XtNameToWidget(w, "vertical"); int j=0; float h; if(!v) return FALSE; // no scroll bar XtSetArg(args[j], XtNshown, &h); j++; XtSetArg(args[j], XtNtopOfThumb, top); j++; XtGetValues(v, args, j); *bottom = *top + h; return TRUE; } void SetScroll (Option *opt, float f) { // sets top of thumb to given fraction static char *params[3] = { "", "Continuous", "Proportional" }; static XEvent event; Widget w = XtParent(opt->handle); // viewport Widget v = XtNameToWidget(w, "vertical"); if(!v) return; // no scroll bar XtCallActionProc(v, "StartScroll", &event, params+1, 1); XawScrollbarSetThumb(v, f, -1.0); XtCallActionProc(v, "NotifyThumb", &event, params, 0); // XtCallActionProc(v, "NotifyScroll", &event, params+2, 1); XtCallActionProc(v, "EndScroll", &event, params, 0); } void HighlightListBoxItem (Option *opt, int nr) { XawListHighlight(opt->handle, nr); } void HighlightWithScroll (Option *opt, int sel, int max) { float top, bottom, f, g; HighlightListBoxItem(opt, sel); if(!ReadScroll(opt, &top, &bottom)) return; // no scroll bar bottom = bottom*max - 1.f; f = g = top; top *= max; if(sel > (top + 3*bottom)/4) f = (sel - 0.75f*(bottom-top))/max; else if(sel < (3*top + bottom)/4) f = (sel - 0.25f*(bottom-top))/max; if(f < 0.f) f = 0.; if(f + 1.f/max > 1.f) f = 1. - 1./max; if(f != g) SetScroll(opt, f); } int SelectedListBoxItem (Option *opt) { XawListReturnStruct *rs; rs = XawListShowCurrent(opt->handle); return rs->list_index; } void HighlightText (Option *opt, int start, int end, Boolean on) { if(on) XawTextSetSelection( opt->handle, start, end ); // for lack of a better method, use selection for highighting else XawTextSetSelection( opt->handle, 0, 0 ); } void FocusOnWidget (Option *opt, DialogClass dlg) { UnCaret(); XtSetKeyboardFocus(shells[dlg], opt->handle); } void SetIconName (DialogClass dlg, char *name) { Arg args[16]; int j = 0; XtSetArg(args[j], XtNiconName, (XtArgVal) name); j++; // XtSetArg(args[j], XtNtitle, (XtArgVal) name); j++; XtSetValues(shells[dlg], args, j); } static void CheckCallback (Widget ww, XtPointer client_data, XEvent *event, Boolean *b) { int s, data = (intptr_t) client_data; Option *opt = dialogOptions[data >> 8] + (data & 255); if(opt->type == Label) { ((ButtonCallback*) opt->target)(data&255); return; } GetWidgetState(opt, &s); SetWidgetState(opt, !s); } static void SpinCallback (Widget w, XtPointer client_data, XtPointer call_data) { String name, val; Arg args[16]; char buf[MSG_SIZ], *p; int j = 0; // Initialisation is necessary because the text value may be non-numeric causing the scanf conversion to fail int data = (intptr_t) client_data; Option *opt = dialogOptions[data >> 8] + (data & 255); XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); GetWidgetText(opt, &val); sscanf(val, "%d", &j); if (strcmp(name, _("browse")) == 0) { char *q=val, *r; for(r = ""; *q; q++) if(*q == '.') r = q; else if(*q == '/') r = ""; // last dot after last slash if(!strcmp(r, "") && !currentCps && opt->type == FileName && opt->textValue) r = opt->textValue; Browse(data>>8, opt->name, NULL, r, opt->type == PathName, "", &p, (FILE**) opt); return; } else if (strcmp(name, "+") == 0) { if(++j > opt->max) return; } else if (strcmp(name, "-") == 0) { if(--j < opt->min) return; } else return; snprintf(buf, MSG_SIZ, "%d", j); SetWidgetText(opt, buf, TransientDlg); } static void ComboSelect (Widget w, caddr_t addr, caddr_t index) // callback for all combo items { Arg args[16]; Option *opt = dialogOptions[((intptr_t)addr)>>24]; // applicable option list int i = ((intptr_t)addr)>>16 & 255; // option number int j = 0xFFFF & (intptr_t) addr; values[i] = j; // store selected value in Option struct, for retrieval at OK if(opt[i].type == Graph || opt[i].min & COMBO_CALLBACK && (!currentCps || shellUp[BrowserDlg])) { ((ButtonCallback*) opt[i].target)(i); return; } if(opt[i].min & NO_GETTEXT) XtSetArg(args[0], XtNlabel, ((char**)opt[i].choice)[j]); else XtSetArg(args[0], XtNlabel, _(((char**)opt[i].choice)[j])); XtSetValues(opt[i].handle, args, 1); } Widget CreateMenuItem (Widget menu, char *msg, XtCallbackProc CB, int n) { int j=0; Widget entry; Arg args[16]; XtSetArg(args[j], XtNleftMargin, 20); j++; XtSetArg(args[j], XtNrightMargin, 20); j++; if(!strcmp(msg, "----")) { XtCreateManagedWidget(msg, smeLineObjectClass, menu, args, j); return NULL; } XtSetArg(args[j], XtNlabel, msg); entry = XtCreateManagedWidget("item", smeBSBObjectClass, menu, args, j+1); XtAddCallback(entry, XtNcallback, CB, (caddr_t)(intptr_t) n); return entry; } char * format_accel (char *input) { char *output; char *key,*test; output = strdup(""); if( strstr(input, "") ) { output = realloc(output, strlen(output) + strlen(_("Ctrl"))+2); strncat(output, _("Ctrl"), strlen(_("Ctrl")) +1); strncat(output, "+", 1); }; if( strstr(input, "") ) { output = realloc(output, strlen(output) + strlen(_("Alt"))+2); strncat(output, _("Alt"), strlen(_("Alt")) +1); strncat(output, "+", 1); }; if( strstr(input, "") ) { output = realloc(output, strlen(output) + strlen(_("Shift"))+2); strncat(output, _("Shift"), strlen(_("Shift")) +1); strncat(output, "+", 1); }; test = strrchr(input, '>'); if ( test==NULL ) key = strdup(input); else key = strdup(++test); // remove ">" if(strlen(key) == 1) key[0] = ToUpper(key[0]); output = realloc(output, strlen(output) + strlen(_(key))+2); strncat(output, _(key), strlen(_(key)) +1); free(key); return output; } int pixlen (char *s) { #if 0 int dummy; XCharStruct overall; XTextExtents(messageFontStruct, s, strlen(s), &dummy, &dummy, &dummy, &overall); return overall.width; #else float tot = 0; while(*s) switch(*s++) { case '.': tot += 0.45; break; case ' ': tot += 0.55; break; case 'i': tot += 0.45; break; case 'l': tot += 0.45; break; case 'j': tot += 0.45; break; case 'f': tot += 0.45; break; case 'I': tot += 0.45; break; case 't': tot += 0.45; break; case 'k': tot += 0.83; break; case 's': tot += 0.83; break; case 'x': tot += 0.83; break; case 'z': tot += 0.83; break; case 'r': tot += 0.55; break; case 'w': tot += 1.3; break; case 'm': tot += 1.3; break; case 'A': tot += 1.3; break; case 'C': tot += 1.3; break; case 'D': tot += 1.3; break; case 'G': tot += 1.3; break; case 'H': tot += 1.3; break; case 'N': tot += 1.3; break; case 'V': tot += 1.3; break; case 'X': tot += 1.3; break; case 'Y': tot += 1.3; break; case 'Z': tot += 1.3; break; case 'M': tot += 1.6; break; case 'W': tot += 1.6; break; case 'B': tot += 1.1; break; case 'E': tot += 1.1; break; case 'F': tot += 1.1; break; case 'K': tot += 1.1; break; case 'P': tot += 1.1; break; case 'R': tot += 1.1; break; case 'S': tot += 1.1; break; case 'O': tot += 1.4; break; case 'Q': tot += 1.4; break; default: tot++; } return tot; #endif } static Widget CreateComboPopup (Widget parent, Option *opt, int n, int fromList, int def) { // fromList determines if the item texts are taken from a list of strings, or from a menu table int i; Widget menu, entry; Arg arg; MenuItem *mb = (MenuItem *) opt->choice; char **list = (char **) opt->choice; int maxlength=0, menuLen[1000]; if(list[0] == NULL) return NULL; // avoid empty menus, as they cause crash menu = XtCreatePopupShell(opt->name, simpleMenuWidgetClass, parent, NULL, 0); if(!fromList) for (i=0; mb[i].string; i++) if(mb[i].accel) { int len = pixlen(_(mb[i].string)); menuLen[i] = len; if (maxlength < len ) maxlength = len; } for (i=0; 1; i++) { char *msg = fromList ? list[i] : mb[i].string; char *label=NULL; if(!msg) break; if(!fromList && mb[i].accel) { char *menuname = opt->min & NO_GETTEXT ? msg : _(msg); char *accel = format_accel(mb[i].accel); size_t len; // int fill = maxlength - strlen(menuname) +2+strlen(accel); int fill = (maxlength - menuLen[i] + 3)*1.8; len = strlen(menuname)+fill+strlen(accel)+1; label = malloc(len); snprintf(label,len,"%s%*s%s",menuname,fill," ",accel); free(accel); } else label = strdup(opt->min & NO_GETTEXT ? msg : _(msg)); entry = CreateMenuItem(menu, label, (XtCallbackProc) ComboSelect, (n<<16)+i); if(!fromList) mb[i].handle = (void*) entry; // save item ID, for enabling / checkmarking if(i==def) { XtSetArg(arg, XtNpopupOnEntry, entry); XtSetValues(menu, &arg, 1); } free(label); } return menu; } char moveTypeInTranslations[] = "Return: TypeInProc(1) \n" "Escape: TypeInProc(0) \n"; extern char filterTranslations[]; extern char gameListTranslations[]; extern char memoTranslations[]; char *translationTable[] = { // beware: order is essential! historyTranslations, commentTranslations, moveTypeInTranslations, ICSInputTranslations, filterTranslations, gameListTranslations, memoTranslations }; void AddHandler (Option *opt, DialogClass dlg, int nr) { XtOverrideTranslations(opt->handle, XtParseTranslationTable(translationTable[nr])); } //----------------------------Generic dialog -------------------------------------------- // cloned from Engine Settings dialog (and later merged with it) Widget shells[NrOfDialogs]; DialogClass parents[NrOfDialogs]; WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum NULL, &wpComment, &wpTags, NULL, NULL, NULL, NULL, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph, NULL, NULL, NULL, NULL, /*&wpMain*/ NULL }; int DialogExists (DialogClass n) { // accessor for use in back-end return shells[n] != NULL; } void RaiseWindow (DialogClass dlg) { static XEvent xev; Window root = RootWindow(xDisplay, DefaultScreen(xDisplay)); Atom atom = XInternAtom (xDisplay, "_NET_ACTIVE_WINDOW", False); xev.xclient.type = ClientMessage; xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.display = xDisplay; xev.xclient.window = XtWindow(shells[dlg]); xev.xclient.message_type = atom; xev.xclient.format = 32; xev.xclient.data.l[0] = 1; xev.xclient.data.l[1] = CurrentTime; XSendEvent (xDisplay, root, False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); XFlush(xDisplay); XSync(xDisplay, False); } int PopDown (DialogClass n) { // pops down any dialog created by GenericPopUp (or returns False if it wasn't up), unmarks any associated marked menu int j; Arg args[10]; Dimension windowH, windowW; Position windowX, windowY; if (!shellUp[n] || !shells[n]) return 0; if(n && wp[n]) { // remember position j = 0; XtSetArg(args[j], XtNx, &windowX); j++; XtSetArg(args[j], XtNy, &windowY); j++; XtSetArg(args[j], XtNheight, &windowH); j++; XtSetArg(args[j], XtNwidth, &windowW); j++; XtGetValues(shells[n], args, j); wp[n]->x = windowX; wp[n]->x = windowY; wp[n]->width = windowW; wp[n]->height = windowH; } previous = NULL; XtPopdown(shells[n]); shellUp[n]--; // count rather than clear if(n == 0 || n >= PromoDlg) XtDestroyWidget(shells[n]), shells[n] = NULL; if(marked[n]) { MarkMenuItem(marked[n], False); marked[n] = NULL; } if(!n && n != BrowserDlg) currentCps = NULL; // if an Engine Settings dialog was up, we must be popping it down now currentOption = dialogOptions[TransientDlg]; // just in case a transient dialog was up (to allow its check and combo callbacks to work) RaiseWindow(parents[n]); if(parents[n] == BoardWindow) XtSetKeyboardFocus(shellWidget, formWidget); return 1; } void GenericPopDown (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // to cause popdown through a translation (Delete Window button!) int dlg = atoi(prms[0]); Widget sh = shells[dlg]; if(shellUp[BrowserDlg] && dlg != BrowserDlg || dialogError) return; // prevent closing dialog when it has an open file-browse daughter shells[dlg] = w; PopDown(dlg); shells[dlg] = sh; // restore } int AppendText (Option *opt, char *s) { XawTextBlock t; char *v; int len; GetWidgetText(opt, &v); len = strlen(v); t.ptr = s; t.firstPos = 0; t.length = strlen(s); t.format = XawFmt8Bit; XawTextReplace(opt->handle, len, len, &t); return len; } void SetColor (char *colorName, Option *box) { // sets the color of a widget Arg args[5]; Pixel buttonColor; XrmValue vFrom, vTo; if (!appData.monoMode) { vFrom.addr = (caddr_t) colorName; vFrom.size = strlen(colorName); XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); if (vTo.addr == NULL) { buttonColor = (Pixel) -1; } else { buttonColor = *(Pixel *) vTo.addr; } } else buttonColor = timerBackgroundPixel; XtSetArg(args[0], XtNbackground, buttonColor);; XtSetValues(box->handle, args, 1); } void ColorChanged (Widget w, XtPointer data, XEvent *event, Boolean *b) { // for detecting a typed change in color char buf[10]; if ( (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && *buf == '\r' ) RefreshColor((int)(intptr_t) data, 0); } static void GraphEventProc(Widget widget, caddr_t client_data, XEvent *event) { // handle expose and mouse events on Graph widget Dimension w, h; Arg args[16]; int j, button=10, f=1, sizing=0; Option *opt, *graph = (Option *) client_data; PointerCallback *userHandler = graph->target; if (!XtIsRealized(widget)) return; switch(event->type) { case Expose: // make handling of expose events generic, just copying from memory buffer (->choice) to display (->textValue) /* Get window size */ j = 0; XtSetArg(args[j], XtNwidth, &w); j++; XtSetArg(args[j], XtNheight, &h); j++; XtGetValues(widget, args, j); if(w < graph->max || w > graph->max + 1 || h != graph->value) { // use width fudge of 1 pixel if(((XExposeEvent*)event)->count >= 0) { // suppress sizing on expose for ordered redraw in response to sizing. sizing = 1; graph->max = w; graph->value = h; // note: old values are kept if we we don't exceed width fudge } } else w = graph->max; if(sizing && ((XExposeEvent*)event)->count > 0) { graph->max = 0; return; } // don't bother if further exposure is pending during resize if(!graph->textValue || sizing) { // create surfaces of new size for display widget if(graph->textValue) cairo_surface_destroy((cairo_surface_t *)graph->textValue); graph->textValue = (char*) cairo_xlib_surface_create(xDisplay, XtWindow(widget), DefaultVisual(xDisplay, 0), w, h); } if(sizing) { // the memory buffer was already created in GenericPopup(), // to give drawing routines opportunity to use it before first expose event // (which are only processed when main gets to the event loop, so after all init!) // so only change when size is no longer good cairo_t *cr; if(graph->choice) cairo_surface_destroy((cairo_surface_t *) graph->choice); graph->choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); // paint white, to prevent weirdness when people maximize window and drag pieces over space next to board cr = cairo_create ((cairo_surface_t *) graph->choice); cairo_rectangle (cr, 0, 0, w, h); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); cairo_fill(cr); cairo_destroy (cr); break; } w = ((XExposeEvent*)event)->width; if(((XExposeEvent*)event)->x + w > graph->max) w--; // cut off fudge pixel if(w) ExposeRedraw(graph, ((XExposeEvent*)event)->x, ((XExposeEvent*)event)->y, w, ((XExposeEvent*)event)->height); return; case MotionNotify: f = 0; w = ((XButtonEvent*)event)->x; h = ((XButtonEvent*)event)->y; break; case ButtonRelease: f = -1; // release indicated by negative button numbers case ButtonPress: w = ((XButtonEvent*)event)->x; h = ((XButtonEvent*)event)->y; switch(((XButtonEvent*)event)->button) { case Button1: button = 1; break; case Button2: button = 2; break; case Button3: button = 3; break; case Button4: button = 4; break; case Button5: button = 5; break; } } button *= f; opt = userHandler(button, w, h); if(opt) { // user callback specifies a context menu; pop it up XUngrabPointer(xDisplay, CurrentTime); XtCallActionProc(widget, "XawPositionSimpleMenu", event, &(opt->name), 1); XtPopupSpringLoaded(opt->handle); } XSync(xDisplay, False); } void GraphExpose (Option *opt, int x, int y, int w, int h) { XExposeEvent e; if(!opt->handle) return; e.x = x; e.y = y; e.width = w; e.height = h; e.count = -1; e.type = Expose; // count = -1: kludge to suppress sizing GraphEventProc(opt->handle, (caddr_t) opt, (XEvent *) &e); // fake expose event } static void GenericCallback (Widget w, XtPointer client_data, XtPointer call_data) { // all Buttons in a dialog (including OK, cancel) invoke this String name; Arg args[16]; char buf[MSG_SIZ]; int data = (intptr_t) client_data; DialogClass dlg; Widget sh = XtParent(XtParent(XtParent(w))), oldSh; currentOption = dialogOptions[dlg=data>>16]; data &= 0xFFFF; oldSh = shells[dlg]; shells[dlg] = sh; // bow to reality if (data == 30000) { // cancel PopDown(dlg); } else if (data == 30001) { // save buttons imply OK if(GenericReadout(currentOption, -1)) PopDown(dlg); // calls OK-proc after full readout, but no popdown if it returns false } else if(currentCps && dlg != BrowserDlg) { XtSetArg(args[0], XtNlabel, &name); XtGetValues(w, args, 1); if(currentOption[data].type == SaveButton) GenericReadout(currentOption, -1); snprintf(buf, MSG_SIZ, "option %s\n", name); SendToProgram(buf, currentCps); } else ((ButtonCallback*) currentOption[data].target)(data); shells[dlg] = oldSh; // in case of multiple instances, restore previous (as this one could be popped down now) } void TabProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // for transfering focus to the next text-edit Option *opt; for(opt = currentOption; opt->type != EndMark; opt++) { if(opt->handle == w) { while(++opt) { if(opt->type == EndMark) opt = currentOption; // wrap if(opt->handle == w) return; // full circle if(opt->type == TextBox || opt->type == Spin || opt->type == Fractional || opt->type == FileName || opt->type == PathName) { SetFocus(opt->handle, XtParent(XtParent(XtParent(w))), NULL, 0); return; } } } } } void WheelProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // for scrolling a widget seen through a viewport with the mouse wheel (ListBox!) int j=0, n = atoi(prms[0]); static char *params[3] = { "", "Continuous", "Proportional" }; Arg args[16]; float h, top; Widget v; if(!n) { // transient dialogs also use this for list-selection callback n = prms[1][0]-'0'; Option *opt=dialogOptions[prms[2][0]-'A'] + n; if(opt->textValue) ((ListBoxCallback*) opt->textValue)(n, SelectedListBoxItem(opt)); return; } v = XtNameToWidget(XtParent(w), "vertical"); if(!v) return; XtSetArg(args[j], XtNshown, &h); j++; XtSetArg(args[j], XtNtopOfThumb, &top); j++; XtGetValues(v, args, j); top += 0.1f*h*n; if(top < 0.f) top = 0.; XtCallActionProc(v, "StartScroll", event, params+1, 1); XawScrollbarSetThumb(v, top, -1.0); XtCallActionProc(v, "NotifyThumb", event, params, 0); // XtCallActionProc(w, "NotifyScroll", event, params+2, 1); XtCallActionProc(v, "EndScroll", event, params, 0); } static char *oneLiner = "Return: redraw-display() \n \ Tab: TabProc() \n "; static char scrollTranslations[] = "(2): WheelProc(0 0 A) \n \ : WheelProc(-1) \n \ : WheelProc(1) \n "; static void SqueezeIntoBox (Option *opt, int nr, int width) { // size buttons in bar to fit, clipping button names where necessary int i, wtot = 0; Dimension widths[20], oldWidths[20]; Arg arg; for(i=1; imin = wtot; if(width <= 0) return; while(wtot > width) { int wmax=0, imax=0; for(i=1; i wmax) wmax = widths[imax=i]; widths[imax]--; wtot--; } for(i=1; imin = wtot; } int SetPositionAndSize (Arg *args, Widget leftNeigbor, Widget topNeigbor, int b, int w, int h, int chaining) { // sizing and positioning most widgets have in common int j = 0; // first position the widget w.r.t. earlier ones if(chaining & 1) { // same row: position w.r.t. last (on current row) and lastrow XtSetArg(args[j], XtNfromVert, topNeigbor); j++; XtSetArg(args[j], XtNfromHoriz, leftNeigbor); j++; } else // otherwise it goes at left margin (which is default), below the previous element XtSetArg(args[j], XtNfromVert, leftNeigbor), j++; // arrange chaining ('2'-bit indicates top and bottom chain the same) if((chaining & 14) == 6) XtSetArg(args[j], XtNtop, XtChainBottom), j++; if((chaining & 14) == 10) XtSetArg(args[j], XtNbottom, XtChainTop ), j++; if(chaining & 4) XtSetArg(args[j], XtNbottom, XtChainBottom ), j++; if(chaining & 8) XtSetArg(args[j], XtNtop, XtChainTop), j++; if(chaining & 0x10) XtSetArg(args[j], XtNright, XtChainRight), j++; if(chaining & 0x20) XtSetArg(args[j], XtNleft, XtChainRight), j++; if(chaining & 0x40) XtSetArg(args[j], XtNright, XtChainLeft ), j++; if(chaining & 0x80) XtSetArg(args[j], XtNleft, XtChainLeft ), j++; // set size (if given) if(w) XtSetArg(args[j], XtNwidth, w), j++; if(h) XtSetArg(args[j], XtNheight, h), j++; // color if(!appData.monoMode) { if(!b && appData.dialogColor[0]) XtSetArg(args[j], XtNbackground, dialogColor), j++; if(b == 3 && appData.buttonColor[0]) XtSetArg(args[j], XtNbackground, buttonColor), j++; } if(b == 3) b = 1; // border XtSetArg(args[j], XtNborderWidth, b); j++; return j; } int GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent, int modal, int top) { Arg args[24]; Widget popup, layout, dialog=NULL, edit=NULL, form, last, b_ok, b_cancel, previousPane = NULL, textField = NULL, oldForm, oldLastRow, oldForeLast; Window root, child; int x, y, i, j, height=999, width=1, h, c, w, shrink=FALSE, stack = 0, box, chain; int win_x, win_y, maxWidth, maxTextWidth; unsigned int mask; char def[MSG_SIZ], *msg, engineDlg = (currentCps != NULL && dlgNr != BrowserDlg); static char pane[6] = "paneX"; Widget texts[100], forelast = NULL, anchor, widest, lastrow = NULL, browse = NULL; Dimension bWidth = 50; if(dlgNr < PromoDlg && shellUp[dlgNr]) return 0; // already up if(dlgNr && dlgNr < PromoDlg && shells[dlgNr]) { // reusable, and used before (but popped down) XtPopup(shells[dlgNr], XtGrabNone); shellUp[dlgNr] = True; return 0; } dialogOptions[dlgNr] = option; // make available to callback // post currentOption globally, so Spin and Combo callbacks can already use it // WARNING: this kludge does not work for persistent dialogs, so that these cannot have spin or combo controls! currentOption = option; if(engineDlg) { // Settings popup for engine: format through heuristic int n = currentCps->nrOptions; if(n > 50) width = 4; else if(n>24) width = 2; else width = 1; height = n / width + 1; if(n && (currentOption[n-1].type == Button || currentOption[n-1].type == SaveButton)) currentOption[n].min = SAME_ROW; // OK on same line currentOption[n].type = EndMark; currentOption[n].target = NULL; // delimit list by callback-less end mark } i = 0; XtSetArg(args[i], XtNresizable, True); i++; shells[BoardWindow] = shellWidget; parents[dlgNr] = parent; if(dlgNr == BoardWindow) popup = shellWidget; else popup = shells[dlgNr] = XtCreatePopupShell(title, !top || !appData.topLevel ? transientShellWidgetClass : topLevelShellWidgetClass, shells[parent], args, i); layout = XtCreateManagedWidget(layoutName, formWidgetClass, popup, layoutArgs, XtNumber(layoutArgs)); if(!appData.monoMode && appData.dialogColor[0]) XtSetArg(args[0], XtNbackground, dialogColor); XtSetValues(layout, args, 1); for(c=0; c 33) w += (squareSize - 33)/2; j = SetPositionAndSize(args, dialog, last, 1 /* border */, w /* w */, option[i].type == TextBox ? option[i].value : 0 /* h */, 0x91 /* chain full width */); if(option[i].type == TextBox) { // decorations for multi-line text-edits if(option[i].min & T_VSCRL) { XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways); j++; } if(option[i].min & T_HSCRL) { XtSetArg(args[j], XtNscrollHorizontal, XawtextScrollAlways); j++; } if(option[i].min & T_FILL) { XtSetArg(args[j], XtNautoFill, True); j++; } if(option[i].min & T_WRAP) { XtSetArg(args[j], XtNwrap, XawtextWrapWord); j++; } if(option[i].min & T_TOP) { XtSetArg(args[j], XtNtop, XtChainTop); j++; if(!option[i].value) { XtSetArg(args[j], XtNbottom, XtChainTop); j++; XtSetValues(dialog, args+j-2, 2); } } } else shrink = TRUE; XtSetArg(args[j], XtNeditType, XawtextEdit); j++; XtSetArg(args[j], XtNuseStringInPlace, False); j++; XtSetArg(args[j], XtNdisplayCaret, False); j++; XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNinsertPosition, 9999); j++; XtSetArg(args[j], XtNstring, option[i].type==Spin || option[i].type==Fractional ? def : engineDlg ? option[i].textValue : *(char**)option[i].target); j++; edit = last; option[i].handle = (void*) (textField = last = XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j)); XtAddEventHandler(last, ButtonPressMask, False, SetFocus, (XtPointer) popup); // gets focus on mouse click if(option[i].min == 0 || option[i].type != TextBox) XtOverrideTranslations(last, XtParseTranslationTable(oneLiner)); // standard handler for and if(option[i].type == TextBox || option[i].type == Fractional) break; // add increment and decrement controls for spin if(option[i].type == FileName || option[i].type == PathName) { msg = _("browse"); w = 0; // automatically scale to width of text j = textHeight ? textHeight : 0; } else { w = 20; msg = "+"; j = textHeight/2; // spin button } j = SetPositionAndSize(args, last, edit, 3 /* border */, w /* w */, j /* h */, 0x31 /* chain to right edge */); edit = XtCreateManagedWidget(msg, commandWidgetClass, form, args, j); XtAddCallback(edit, XtNcallback, SpinCallback, (XtPointer)(intptr_t) i + 256*dlgNr); if(w == 0) browse = edit; if(option[i].type != Spin) break; j = SetPositionAndSize(args, last, edit, 3 /* border */, 20 /* w */, textHeight/2 /* h */, 0x31 /* chain to right edge */); XtSetArg(args[j], XtNvertDistance, -1); j++; last = XtCreateManagedWidget("-", commandWidgetClass, form, args, j); XtAddCallback(last, XtNcallback, SpinCallback, (XtPointer)(intptr_t) i + 256*dlgNr); break; case CheckBox: if(!engineDlg) option[i].value = *(Boolean*)option[i].target; // where checkbox callback uses it j = SetPositionAndSize(args, last, lastrow, 1 /* border */, textHeight/2 /* w */, textHeight/2 /* h */, 0xC0 /* chain both to left edge */); XtSetArg(args[j], XtNvertDistance, (textHeight+2)/4 + 3); j++; XtSetArg(args[j], XtNstate, option[i].value); j++; lastrow = last; option[i].handle = (void*) (last = XtCreateManagedWidget(" ", toggleWidgetClass, form, args, j)); j = SetPositionAndSize(args, last, lastrow, 0 /* border */, option[i].max /* w */, textHeight /* h */, 0xC1 /* chain */); XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; last = XtCreateManagedWidget("label", commandWidgetClass, form, args, j); // make clicking the text toggle checkbox XtAddEventHandler(last, ButtonPressMask, False, CheckCallback, (XtPointer)(intptr_t) i + 256*dlgNr); shrink = TRUE; // following buttons must get text height break; case Icon: case Label: msg = option[i].name; if(!msg) break; chain = option[i].min; if(chain & SAME_ROW) forelast = lastrow; else shrink = FALSE; j = SetPositionAndSize(args, last, lastrow, (chain & 2) != 0 /* border */, option[i].max /* w */, shrink ? textHeight : 0 /* h */, chain | 2 /* chain */); #if ENABLE_NLS if(option[i].choice) XtSetArg(args[j], XtNfontSet, *(XFontSet*)option[i].choice), j++; #else if(option[i].choice) XtSetArg(args[j], XtNfont, (XFontStruct*)option[i].choice), j++; #endif XtSetArg(args[j], XtNresizable, False); j++; XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNlabel, _(msg)); j++; option[i].handle = (void*) (last = XtCreateManagedWidget("label", labelWidgetClass, form, args, j)); if(option[i].target) // allow user to specify event handler for button presses XtAddEventHandler(last, ButtonPressMask, False, CheckCallback, (XtPointer)(intptr_t) i + 256*dlgNr); break; case SaveButton: case Button: if(option[i].min & SAME_ROW) { chain = 0x31; // 0011.0001 = both left and right side to right edge forelast = lastrow; } else chain = 0, shrink = FALSE; j = SetPositionAndSize(args, last, lastrow, 3 /* border */, option[i].max /* w */, shrink ? textHeight : 0 /* h */, option[i].min & 0xE | chain /* chain */); XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; if(option[i].textValue) { // special for buttons of New Variant dialog XtSetArg(args[j], XtNsensitive, option[i].value >= 0 && (appData.noChessProgram || strstr(first.variants, VariantName(option[i].value)))); j++; XtSetArg(args[j], XtNborderWidth, (gameInfo.variant == option[i].value)+1); j++; } option[i].handle = (void*) (dialog = last = XtCreateManagedWidget(option[i].name, commandWidgetClass, form, args, j)); if(option[i].choice && ((char*)option[i].choice)[0] == '#' && !engineDlg) { // for the color picker default-reset SetColor( *(char**) option[i-1].target, &option[i]); XtAddEventHandler(option[i-1].handle, KeyReleaseMask, False, ColorChanged, (XtPointer)(intptr_t) i-1); } XtAddCallback(last, XtNcallback, GenericCallback, (XtPointer)(intptr_t) i + (dlgNr<<16)); // invokes user callback if(option[i].textValue) SetColor( option[i].textValue, &option[i]); // for new-variant buttons break; case ComboBox: j = SetPositionAndSize(args, last, lastrow, 0 /* border */, 0 /* w */, textHeight /* h */, 0xC0 /* chain both sides to left edge */); XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++; XtSetArg(args[j], XtNlabel, _(option[i].name)); j++; texts[h] = dialog = XtCreateManagedWidget(option[i].name, labelWidgetClass, form, args, j); if(option[i].min & COMBO_CALLBACK) msg = _(option[i].name); else { if(!engineDlg) SetCurrentComboSelection(option+i); msg=_(((char**)option[i].choice)[option[i].value]); } j = SetPositionAndSize(args, dialog, last, (option[i].min & 2) == 0 /* border */, option[i].max && !engineDlg ? option[i].max : 100 /* w */, textHeight /* h */, 0x91 /* chain */); // same row as its label! XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name)); j++; XtSetArg(args[j], XtNlabel, msg); j++; shrink = TRUE; option[i].handle = (void*) (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j)); CreateComboPopup(last, option + i, i + 256*dlgNr, TRUE, -1); values[i] = option[i].value; break; case ListBox: // Listbox goes in viewport, as needed for game list if(option[i].min & SAME_ROW) forelast = lastrow; j = SetPositionAndSize(args, last, lastrow, 1 /* border */, option[i].max /* w */, option[i].value /* h */, option[i].min /* chain */); XtSetArg(args[j], XtNresizable, False); j++; XtSetArg(args[j], XtNallowVert, True); j++; // scoll direction last = XtCreateManagedWidget("viewport", viewportWidgetClass, form, args, j); j = 0; // now list itself XtSetArg(args[j], XtNdefaultColumns, 1); j++; XtSetArg(args[j], XtNforceColumns, True); j++; XtSetArg(args[j], XtNverticalList, True); j++; option[i].handle = (void*) (edit = XtCreateManagedWidget("list", listWidgetClass, last, args, j)); XawListChange(option[i].handle, option[i].target, 0, 0, True); XawListHighlight(option[i].handle, 0); scrollTranslations[25] = '0' + i; scrollTranslations[27] = 'A' + dlgNr; XtOverrideTranslations(edit, XtParseTranslationTable(scrollTranslations)); // for mouse-wheel break; case Graph: j = SetPositionAndSize(args, last, lastrow, 0 /* border */, option[i].max /* w */, option[i].value /* h */, option[i].min /* chain */); option[i].handle = (void*) (last = XtCreateManagedWidget("graph", widgetClass, form, args, j)); XtAddEventHandler(last, ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask, False, (XtEventHandler) GraphEventProc, &option[i]); // mandatory user-supplied expose handler if(option[i].min & SAME_ROW) last = forelast, forelast = lastrow; option[i].choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, option[i].max, option[i].value); // image buffer break; case PopUp: // note: used only after Graph, so 'last' refers to the Graph widget option[i].handle = (void*) CreateComboPopup(last, option + i, i + 256*dlgNr, TRUE, option[i].value); break; case BarBegin: case BoxBegin: if(option[i].min & SAME_ROW) forelast = lastrow; j = SetPositionAndSize(args, last, lastrow, 0 /* border */, 0 /* w */, 0 /* h */, option[i].min /* chain */); XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++; XtSetArg(args[j], XtNvSpace, 0); j++; option[box=i].handle = (void*) (last = XtCreateWidget("box", boxWidgetClass, form, args, j)); oldForm = form; form = last; oldLastRow = lastrow; oldForeLast = forelast; lastrow = NULL; last = NULL; break; case DropDown: j = SetPositionAndSize(args, last, lastrow, 0 /* border */, 0 /* w */, 0 /* h */, 1 /* chain (always on same row) */); forelast = lastrow; msg = _(option[i].name); // write name on the menu button XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name)); j++; XtSetArg(args[j], XtNlabel, msg); j++; option[i].handle = (void*) (last = XtCreateManagedWidget(option[i].name, menuButtonWidgetClass, form, args, j)); option[i].textValue = (char*) CreateComboPopup(last, option + i, i + 256*dlgNr, FALSE, -1); break; case BarEnd: case BoxEnd: XtManageChildren(&form, 1); SqueezeIntoBox(&option[box], i-box, option[box].max); if(option[i].target) ((ButtonCallback*)option[i].target)(box); // callback that can make sizing decisions last = form; lastrow = oldLastRow; form = oldForm; forelast = oldForeLast; break; case Break: width++; height = i+1; stack = !(option[i].min & SAME_ROW); break; default: printf("GenericPopUp: unexpected case in switch.\n"); break; } } // make an attempt to align all spins and textbox controls maxWidth = maxTextWidth = 0; if(browse != NULL) { j=0; XtSetArg(args[j], XtNwidth, &bWidth); j++; XtGetValues(browse, args, j); } for(h=0; h maxWidth) maxWidth = w; widest = texts[h]; } else { if(w > maxTextWidth) maxTextWidth = w; if(!widest) widest = texts[h]; } } } if(maxTextWidth + 110 < maxWidth) maxTextWidth = maxWidth - 110; else maxWidth = maxTextWidth + 110; for(h=0; hWM_PROTOCOLS: GenericPopDown(\"%d\") \n", dlgNr); XtAugmentTranslations(popup, XtParseTranslationTable(def)); XQueryPointer(xDisplay, xBoardWindow, &root, &child, &x, &y, &win_x, &win_y, &mask); XtSetArg(args[0], XtNx, x - 10); XtSetArg(args[1], XtNy, y - 30); XtSetValues(popup, args, 2); } XtPopup(popup, modal ? XtGrabExclusive : XtGrabNone); shellUp[dlgNr]++; // count rather than flag previous = NULL; if(textField) SetFocus(textField, popup, (XEvent*) NULL, False); if(dlgNr && wp[dlgNr]) { // if persistent window-info available, reposition j = 0; if(wp[dlgNr]->width > 0 && wp[dlgNr]->height > 0) { XtSetArg(args[j], XtNheight, (Dimension) (wp[dlgNr]->height)); j++; XtSetArg(args[j], XtNwidth, (Dimension) (wp[dlgNr]->width)); j++; } if(wp[dlgNr]->x > 0 && wp[dlgNr]->y > 0) { XtSetArg(args[j], XtNx, (Position) (wp[dlgNr]->x)); j++; XtSetArg(args[j], XtNy, (Position) (wp[dlgNr]->y)); j++; } if(j) XtSetValues(popup, args, j); } RaiseWindow(dlgNr); return 1; // tells caller he must do initialization (e.g. add specific event handlers) } /* function called when the data to Paste is ready */ static void SendTextCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { char buf[MSG_SIZ], *p = (char*) textOptions[(int)(intptr_t) client_data].choice, *name = (char*) value, *q; if (value==NULL || *len==0) return; /* nothing selected, abort */ name[*len]='\0'; strncpy(buf, p, MSG_SIZ); q = strstr(p, "$name"); snprintf(buf + (q-p), MSG_SIZ -(q-p), "%s%s", name, q+5); SendString(buf); XtFree(value); } void SendText (int n) { char *p = (char*) textOptions[n].choice; if(strstr(p, "$name")) { XtGetSelectionValue(menuBarWidget, XA_PRIMARY, XA_STRING, /* (XtSelectionCallbackProc) */ SendTextCB, (XtPointer) (intptr_t) n, /* client_data passed to PastePositionCB */ CurrentTime ); } else SendString(p); } void SetInsertPos (Option *opt, int pos) { Arg args[16]; XtSetArg(args[0], XtNinsertPosition, pos); XtSetValues(opt->handle, args, 1); // SetFocus(opt->handle, shells[InputBoxDlg], NULL, False); // No idea why this does not work, and the following is needed: // XSetInputFocus(xDisplay, XtWindow(opt->handle), RevertToPointerRoot, CurrentTime); } void TypeInProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // can be used as handler for any text edit in any dialog (from GenericPopUp, that is) int n = prms[0][0] - '0'; Widget sh = XtParent(XtParent(XtParent(w))); // popup shell if(n<2) { // Enter or Esc typed from primed text widget: treat as if dialog OK or cancel button hit. int dlgNr; // figure out what the dialog number is by comparing shells (because we must pass it :( ) for(dlgNr=0; dlgNrhandle), RevertToPointerRoot, CurrentTime); } void FileNamePopUpWrapper (char *label, char *def, char *filter, FileProc proc, Boolean pathFlag, char *openMode, char **openName, FILE **openFP) { Browse(BoardWindow, label, (def[0] ? def : NULL), filter, False, openMode, openName, openFP); } xboard-4.7.3/xaw/xengineoutput.c0000644000175000001440000002101012262562252013600 00000000000000/* * Engine output (PV) * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, * 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "dialogs.h" #include "xboard.h" #include "engineoutput.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif #include // [HGM] pixmaps of some ICONS used in the engine-outut window #include "pixmaps/WHITE_14.xpm" #include "pixmaps/BLACK_14.xpm" #include "pixmaps/CLEAR_14.xpm" #include "pixmaps/UNKNOWN_14.xpm" #include "pixmaps/THINKING_14.xpm" #include "pixmaps/PONDER_14.xpm" #include "pixmaps/ANALYZING_14.xpm" /* Module variables */ static int currentPV; static Pixmap icons[8]; // [HGM] this front-end array translates back-end icon indicator to handle static Widget memoWidget; static void ReadIcon (char *pixData[], int iconNr, Widget w) { int r; if ((r=XpmCreatePixmapFromData(xDisplay, XtWindow(w), pixData, &(icons[iconNr]), NULL, NULL /*&attr*/)) != 0) { fprintf(stderr, _("Error %d loading icon image\n"), r); exit(1); } } void InitEngineOutput (Option *opt, Option *memo2) { // front-end, because it must have access to the pixmaps Widget w = opt->handle; memoWidget = memo2->handle; ReadIcon(WHITE_14, nColorWhite, w); ReadIcon(BLACK_14, nColorBlack, w); ReadIcon(UNKNOWN_14, nColorUnknown, w); ReadIcon(CLEAR_14, nClear, w); ReadIcon(PONDER_14, nPondering, w); ReadIcon(THINK_14, nThinking, w); ReadIcon(ANALYZE_14, nAnalyzing, w); } void DrawWidgetIcon (Option *opt, int nIcon) { // as we are already in X front-end, so do X-stuff here Arg arg; XtSetArg(arg, XtNleftBitmap, (XtArgVal) icons[nIcon]); XtSetValues(opt->handle, &arg, 1); } void InsertIntoMemo (int which, char * text, int where) { XawTextBlock t; Widget edit; /* the backend adds \r\n, which is needed for winboard, * for xboard we delete them again over here */ if(t.ptr = strchr(text, '\r')) *t.ptr = ' '; t.ptr = text; t.firstPos = 0; t.length = strlen(text); t.format = XawFmt8Bit; edit = XtNameToWidget(shells[EngOutDlg], which ? "*paneB.text" : "*paneA.text"); XawTextReplace(edit, where, where, &t); if(where < highTextStart[which]) { // [HGM] multiPVdisplay: move highlighting int len = strlen(text); highTextStart[which] += len; highTextEnd[which] += len; XawTextSetSelection( edit, highTextStart[which], highTextEnd[which] ); } } //--------------------------------- PV walking --------------------------------------- char memoTranslations[] = ":Ctrlc: CopyMemoProc() \n \ : HandlePV() \n \ Shift: select-start() extend-end(PRIMARY) SelectPV(1) \n \ Any: select-start() extend-end(PRIMARY) SelectPV(0) \n \ : StopPV() \n"; void SelectPV (Widget w, XEvent * event, String * params, Cardinal * nParams) { // [HGM] pv: translate click to PV line, and load it for display String val; int start, end; XawTextPosition index, dummy; int x, y; Arg arg; x = event->xmotion.x; y = event->xmotion.y; currentPV = (w != memoWidget); XawTextGetSelectionPos(w, &index, &dummy); XtSetArg(arg, XtNstring, &val); XtGetValues(w, &arg, 1); shiftKey = strcmp(params[0], "0"); if(LoadMultiPV(x, y, val, index, &start, &end, currentPV)) { XawTextSetSelection( w, start, end ); highTextStart[currentPV] = start; highTextEnd[currentPV] = end; } } void StopPV (Widget w, XEvent * event, String * params, Cardinal * nParams) { // [HGM] pv: on right-button release, stop displaying PV XawTextUnsetSelection( w ); highTextStart[currentPV] = highTextEnd[currentPV] = 0; UnLoadPV(); XtCallActionProc(w, "beginning-of-file", event, NULL, 0); } //------------------------- Ctrl-C copying of memo texts --------------------------- // Awfull code: first read our own primary selection into selected_fen_position, // and then transfer ownership of this to the clipboard, so that the // copy-position callback can fetch it there when somebody pastes it // Worst of all is that I only added it because I did not know how to copy primary: // my laptop has no middle button. Ctrl-C might not be needed at all... [HGM] // cloned from CopyPositionProc. Abuse selected_fen_position to hold selection Boolean SendPositionSelection(Widget w, Atom *selection, Atom *target, Atom *type_return, XtPointer *value_return, unsigned long *length_return, int *format_return); // from xboard.c static void MemoCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { if (value==NULL || *len==0) return; /* nothing had been selected to copy */ selected_fen_position = value; selected_fen_position[*len]='\0'; /* normally this string is terminated, but be safe */ XtOwnSelection(menuBarWidget, XA_CLIPBOARD(xDisplay), CurrentTime, SendPositionSelection, NULL/* lose_ownership_proc */ , NULL/* transfer_done_proc */); } void CopyMemoProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if(appData.pasteSelection) return; if (selected_fen_position) free(selected_fen_position); XtGetSelectionValue(menuBarWidget, XA_PRIMARY, XA_STRING, /* (XtSelectionCallbackProc) */ MemoCB, NULL, /* client_data passed to PastePositionCB */ /* better to use the time field from the event that triggered the * call to this function, but that isn't trivial to get */ CurrentTime ); } //------------------------------- pane switching ----------------------------------- void ResizeWindowControls (int mode) { // another hideous kludge: to have only a single pane, we resize the // second to 5 pixels (which makes it too small to display anything) Widget form1, form2; Arg args[16]; int j; Dimension ew_height, tmp; Widget shell = shells[EngOutDlg]; form1 = XtNameToWidget(shell, "*paneA"); form2 = XtNameToWidget(shell, "*paneB"); j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) &ew_height); j++; XtGetValues(form1, args, j); j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) &tmp); j++; XtGetValues(form2, args, j); ew_height += tmp; // total height if(mode==0) { j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) 5); j++; XtSetValues(form2, args, j); j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height-5)); j++; XtSetValues(form1, args, j); } else { j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height/2)); j++; XtSetValues(form1, args, j); j = 0; XtSetArg(args[j], XtNheight, (XtArgVal) (ew_height/2)); j++; XtSetValues(form2, args, j); } } xboard-4.7.3/xaw/xhistory.c0000644000175000001440000000655012262415351012564 00000000000000/* * New (WinBoard-style) Move history for XBoard * * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "frontend.h" #include "backend.h" #include "xhistory.h" #include "xboard.h" #include "dialogs.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif // templates for calls into back-end (= history.c; should be moved to history.h header shared with it!) void RefreshMemoContent P((void)); void MemoContentUpdated P((void)); void FindMoveByCharIndex P(( int char_index )); // variables in xoptions.c extern Option historyOptions[]; // ------------- low-level front-end actions called by MoveHistory back-end ----------------- // the bold argument says 0 = normal, 1 = bold typeface // the colorNr argument says 0 = font-default, 1 = gray void ScrollToCursor (Option *opt, int caretPos) { Arg args[10]; char *s; int len; GetWidgetText(opt, &s); len = strlen(s); if(caretPos < 0 || caretPos > len) caretPos = len; if(caretPos > len-30) { // scroll to end, which causes no flicker static XEvent event; XtCallActionProc(opt->handle, "end-of-file", &event, NULL, 0); return; } // the following leads to a very annoying flicker, even when no scrolling is done at all. XtSetArg(args[0], XtNinsertPosition, caretPos); // this triggers scrolling in Xaw XtSetArg(args[1], XtNdisplayCaret, False); XtSetValues(opt->handle, args, 2); } // ------------------------------ callbacks -------------------------- char *historyText; char historyTranslations[] = ": select-start() \n \ : extend-end(PRIMARY) SelectMove() \n"; void SelectMoveX (Widget w, XEvent * event, String * params, Cardinal * nParams) { XawTextPosition index, dummy; XawTextGetSelectionPos(w, &index, &dummy); FindMoveByCharIndex( index ); // [HGM] also does the actual moving to it, now } xboard-4.7.3/xaw/xgamelist.h0000644000175000001440000000234512262415351012673 00000000000000/* * xgamelist.h -- Game list window, part of X front end for XBoard * * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #ifndef XB_XGAMELIST #define XB_XGAMELIST void LoadSelectedProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SetFilterProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); #endif /* XB_XGAMELIST */ xboard-4.7.3/xboard2.h0000644000175000001440000000235612262562252011445 00000000000000/* * xboard2.h -- Move list window, part of X front end for XBoard * * Copyright 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ void SendToProgram P((char *message, ChessProgramState *cps)); void SendToICS P((char *buf)); void InitDrawingSizes P((int i, int j)); extern int searchTime; extern int squareSize, lineGap, defaultLineGap; extern int startedFromPositionFile; extern char *icsTextMenuString; xboard-4.7.3/missing0000755000175000001440000001533112247021262011321 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: xboard-4.7.3/zippy.h0000644000175000001440000000557212262415351011257 00000000000000/* * zippy.h -- Interface to zippy.c module in XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * Enhancements Copyright 2005 Alessandro Scotti * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ void ZippyInit P((void)); int ZippyControl P((char *buf, int *i)); int ZippyConverse P((char *buf, int *i)); void ZippyGameStart P((char *white, char *black)); int ZippyMatch P((char *buf, int *i)); void ZippyFirstBoard P((int moveNum, int basetime, int increment)); void ZippyGameEnd P((ChessMove result, char *resultDetails)); void ZippyHoldings P((char *white_holding, char *black_holding, char *new_piece)); xboard-4.7.3/uci.c0000644000175000001440000000530212262415351010646 00000000000000/* * UCI support thru Polyglot * * Author: Alessandro Scotti (Jan 2006) * * Copyright 2006 Alessandro Scotti * * Enhancement Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ */ #include #include #include #include #include "common.h" #include "backend.h" Boolean GetArgValue(char *a); void InitEngineUCI (const char *iniDir, ChessProgramState *cps) { // replace engine command line by adapter command with expanded meta-symbols if( cps->isUCI ) { char *p, *q; char polyglotCommand[MSG_SIZ]; if(cps->isUCI == 2) p = appData.ucciAdapter; else p = appData.adapterCommand; q = polyglotCommand; while(*p) { if(*p == '\\') p++; else if(*p == '%') { // substitute marker char argName[MSG_SIZ], buf[MSG_SIZ], *s = buf; if(*++p == '%') { // second %, expand as f or s in option name (e.g. %%cp -> fcp) *s++ = cps == &first ? 'f' : 's'; p++; } while(isdigit(*p) || isalpha(*p)) *s++ = *p++; // copy option name *s = NULLCHAR; if(cps == &second) { // change options for first into those for second engine if(strstr(buf, "first") == buf) sprintf(argName, "second%s", buf+5); else if(buf[0] == 'f') sprintf(argName, "s%s", buf+1); else safeStrCpy(argName, buf, sizeof(argName)/sizeof(argName[0])); } else safeStrCpy(argName, buf, sizeof(argName)/sizeof(argName[0])); if(GetArgValue(argName)) { // look up value of option with this name s = argName; while(*s) *q++ = *s++; } else DisplayFatalError("Bad adapter command", 0, 1); continue; } if(*p) *q++ = *p++; } *q = NULLCHAR; cps->program = StrSave(polyglotCommand); cps->dir = appData.polyglotDir; } } xboard-4.7.3/gtk/0000755000175000001440000000000012262562300010564 500000000000000xboard-4.7.3/gtk/xboard.h0000644000175000001440000001613612262415351012146 00000000000000/* * xboard.h -- Parameter definitions for X front end * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include #define ICS_LOGON ".icsrc" #define MANPAGE "xboard.6" #if ENABLE_NLS #define CLOCK_FONT_NAME \ "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #define COORD_FONT_NAME \ "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-bold-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #define DEFAULT_FONT_NAME \ "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*," \ "-misc-fixed-medium-r-normal--*-*-*-*-*-*-*-*," \ "-*-*-*-*-*-*-*-*-*-*-*-*-*-*" #else #define CLOCK_FONT_NAME "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*" #define COORD_FONT_NAME "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*" #define DEFAULT_FONT_NAME "-*-helvetica-medium-r-normal--*-*-*-*-*-*-*-*" #endif #define COLOR_SHOUT "green" #define COLOR_SSHOUT "green,black,1" #define COLOR_CHANNEL1 "cyan" #define COLOR_CHANNEL "cyan,black,1" #define COLOR_KIBITZ "magenta,black,1" #define COLOR_TELL "yellow,black,1" #define COLOR_CHALLENGE "red,black,1" #define COLOR_REQUEST "red" #define COLOR_SEEK "blue" #define COLOR_NORMAL "default" #define COLOR_LOWTIMEWARNING "red" typedef struct { char *name; int squareSize; int lineGap; int clockFontPxlSize; int coordFontPxlSize; int fontPxlSize; int smallLayout; int tinyLayout; int minScreenSize; } SizeDefaults; #define SIZE_DEFAULTS \ { { "Titanic", 129, 4, 34, 14, 14, 0, 0, 1200 }, \ { "Colossal", 116, 4, 34, 14, 14, 0, 0, 1200 }, \ { "Giant", 108, 3, 34, 14, 14, 0, 0, 1024 }, \ { "Huge", 95, 3, 34, 14, 14, 0, 0, 1024 }, \ { "Big", 87, 3, 34, 14, 14, 0, 0, 864 }, \ { "Large", 80, 3, 34, 14, 14, 0, 0, 864 }, \ { "Bulky", 72, 3, 34, 12, 14, 0, 0, 864 }, \ { "Medium", 64, 3, 34, 12, 14, 1, 0, 768 }, \ { "Moderate", 58, 3, 34, 12, 14, 1, 0, 768 }, \ { "Average", 54, 2, 30, 11, 12, 1, 0, 600 }, \ { "Middling", 49, 2, 24, 10, 12, 1, 0, 600 }, \ { "Mediocre", 45, 2, 20, 10, 12, 1, 0, 600 }, \ { "Small", 40, 2, 20, 10, 12, 1, 0, 480 }, \ { "Slim", 37, 2, 20, 10, 12, 1, 0, 480 }, \ { "Petite", 33, 1, 15, 9, 11, 1, 0, 480 }, \ { "Dinky", 29, 1, 15, 9, 11, 1, 0, 480 }, \ { "Teeny", 25, 1, 12, 8, 11, 1, 1, 480 }, \ { "Tiny", 21, 1, 12, 8, 11, 1, 1, 0 }, \ { NULL, 0, 0, 0, 0, 0, 0, 0, 0 } } #define BORDER_X_OFFSET 3 #define BORDER_Y_OFFSET 27 #define FIRST_CHESS_PROGRAM "fairymax" #define SECOND_CHESS_PROGRAM "fairymax" #define FIRST_DIRECTORY "." #define SECOND_DIRECTORY "." #define SOUND_BELL "" #define ICS_NAMES "" #define FCP_NAMES "" #define SCP_NAMES "" #define ICS_TEXT_MENU_DEFAULT "" #define SETTINGS_FILE SYSCONFDIR"/xboard.conf" #define COLOR_BKGD "white" void NewTagsPopup P((char *text, char *msg)); int AppendText P((Option *opt, char *s)); void NewCommentPopup P((char *title, char *text, int index)); void GetActualPlacement P((GtkWidget *shell, WindowPlacement *wp)); #ifdef TODO_GTK void CatchDeleteWindow(Widget w, String procname); void GenericPopDown P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SetFocus(Widget w, XtPointer data, XEvent *event, Boolean *b); // from xoptions.c void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); Widget CreateMenuItem P((Widget menu, char *msg, XtCallbackProc CB, int n)); void WheelProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void TabProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GenericMenu P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); // from xengineoutput.c void SelectPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void StopPV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); #endif extern char memoTranslations[]; extern GtkAccelGroup *GtkAccelerators; #if TODO_GTK extern Widget shells[]; extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; extern Display *xDisplay; extern Window xBoardWindow; extern Pixmap xMarkPixmap, wIconPixmap, bIconPixmap; extern Pixel timerForegroundPixel, timerBackgroundPixel, dialogColor, buttonColor; extern Atom wm_delete_window; extern GC coordGC; extern Dimension textHeight; // of message widget in board window #else extern GtkWidget *shells[]; #endif extern int dialogError; extern int squareSize; extern char *layoutName; extern int useImages, useImageSqs; extern char ICSInputTranslations[]; extern char *selected_fen_position; #define TOPLEVEL 1 /* preference item; 1 = make popup windows toplevel */ xboard-4.7.3/gtk/xtimer.c0000644000175000001440000001307212262415351012166 00000000000000/* * xtimer.c -- timing functions for X front end of XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define HIGHDRAG 1 #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_SYS_SYSTEMINFO_H # include #endif /* HAVE_SYS_SYSTEMINFO_H */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #include "common.h" #include "backend.h" #include "frontend.h" #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif guint delayedEventTimerTag = 0; DelayedEventCallback delayedEventCallback = 0; void FireDelayedEvent(gpointer data) { g_source_remove(delayedEventTimerTag); delayedEventTimerTag = 0; delayedEventCallback(); } void ScheduleDelayedEvent (DelayedEventCallback cb, long millisec) { if(delayedEventTimerTag && delayedEventCallback == cb) // [HGM] alive: replace, rather than add or flush identical event g_source_remove(delayedEventTimerTag); delayedEventCallback = cb; delayedEventCallback = cb; delayedEventTimerTag = g_timeout_add(millisec,(GSourceFunc) FireDelayedEvent, NULL); } DelayedEventCallback GetDelayedEvent () { if (delayedEventTimerTag) { return delayedEventCallback; } else { return NULL; } } void CancelDelayedEvent () { if (delayedEventTimerTag) { g_source_remove(delayedEventTimerTag); delayedEventTimerTag = 0; } } guint loadGameTimerTag = 0; int LoadGameTimerRunning() { return loadGameTimerTag != 0; } int StopLoadGameTimer () { if (loadGameTimerTag != 0) { g_source_remove(loadGameTimerTag); loadGameTimerTag = 0; return TRUE; } else { return FALSE; } } void LoadGameTimerCallback(gpointer data) { g_source_remove(loadGameTimerTag); loadGameTimerTag = 0; AutoPlayGameLoop(); } void StartLoadGameTimer (long millisec) { loadGameTimerTag = g_timeout_add( millisec, (GSourceFunc) LoadGameTimerCallback, NULL); } guint analysisClockTag = 0; void AnalysisClockCallback(gpointer data) { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { // [DM] AnalysisPeriodicEvent(0); } } void StartAnalysisClock () { analysisClockTag = g_timeout_add( 2000,(GSourceFunc) AnalysisClockCallback, NULL); } guint clockTimerTag = 0; int ClockTimerRunning () { return clockTimerTag != 0; } int StopClockTimer () { if (clockTimerTag != 0) { g_source_remove(clockTimerTag); clockTimerTag = 0; return TRUE; } else { return FALSE; } } void ClockTimerCallback(gpointer data) { /* remove timer */ g_source_remove(clockTimerTag); clockTimerTag = 0; DecrementClocks(); } void StartClockTimer (long millisec) { clockTimerTag = g_timeout_add(millisec,(GSourceFunc) ClockTimerCallback,NULL); } xboard-4.7.3/gtk/xboard.c0000644000175000001440000017345312262562252012152 00000000000000/* * xboard.c -- X front end for XBoard * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #define HIGHDRAG 1 #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #if !OMIT_SOCKETS # if HAVE_SYS_SOCKET_H # include # include # include # else /* not HAVE_SYS_SOCKET_H */ # if HAVE_LAN_SOCKET_H # include # include # include # else /* not HAVE_LAN_SOCKET_H */ # define OMIT_SOCKETS 1 # endif /* not HAVE_LAN_SOCKET_H */ # endif /* not HAVE_SYS_SOCKET_H */ #endif /* !OMIT_SOCKETS */ #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_SYS_FCNTL_H # include #else /* not HAVE_SYS_FCNTL_H */ # if HAVE_FCNTL_H # include # endif /* HAVE_FCNTL_H */ #endif /* not HAVE_SYS_FCNTL_H */ #if HAVE_SYS_SYSTEMINFO_H # include #endif /* HAVE_SYS_SYSTEMINFO_H */ #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_WAIT_H # include #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) # define HAVE_DIR_STRUCT #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_SYS_DIR_H # include # define HAVE_DIR_STRUCT # endif # if HAVE_NDIR_H # include # define HAVE_DIR_STRUCT # endif #endif #if ENABLE_NLS #include #endif // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are. #include "common.h" #include "frontend.h" #include "backend.h" #include "backendz.h" #include "moves.h" #include "xboard.h" #include "xboard2.h" #include "childio.h" #include "menus.h" #include "board.h" #include "dialogs.h" #include "engineoutput.h" #include "usystem.h" #include "gettext.h" #include "draw.h" #ifdef __APPLE__ # include // prevent pathname of positional file argument provided by OS X being be mistaken for option name // (price is that we won't recognize Windows option format anymore). # define SLASH '-' // redefine some defaults # undef ICS_LOGON # undef SYSCONFDIR # define ICS_LOGON "Library/Preferences/XboardICS.conf" # define SYSCONFDIR "../etc" # define DATADIR dataDir char *dataDir; // for expanding ~~ #else # define SLASH '/' # define DATADIR "~~" #endif #ifdef __EMX__ #ifndef HAVE_USLEEP #define HAVE_USLEEP #endif #define usleep(t) _sleep2(((t)+500)/1000) #endif #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif int main P((int argc, char **argv)); RETSIGTYPE CmailSigHandler P((int sig)); RETSIGTYPE IntSigHandler P((int sig)); RETSIGTYPE TermSizeSigHandler P((int sig)); #if ENABLE_NLS char *InsertPxlSize P((char *pattern, int targetPxlSize)); XFontSet CreateFontSet P((char *base_fnt_lst)); #else char *FindFont P((char *pattern, int targetPxlSize)); #endif void DelayedDrag P((void)); void ICSInputBoxPopUp P((void)); void MoveTypeInProc P((GdkEventKey *eventkey)); gboolean KeyPressProc P((GtkWindow *window, GdkEventKey *eventkey, gpointer data)); Boolean TempBackwardActive = False; void DisplayMove P((int moveNumber)); void update_ics_width P(()); int CopyMemoProc P(()); static gboolean EventProc P((GtkWidget *widget, GdkEvent *event, gpointer g)); #ifdef TODO_GTK #if ENABLE_NLS XFontSet fontSet, clockFontSet; #else Font clockFontID; XFontStruct *clockFontStruct; #endif Font coordFontID, countFontID; XFontStruct *coordFontStruct, *countFontStruct; #else void *shellWidget, *formWidget, *boardWidget, *titleWidget, *dropMenu, *menuBarWidget; GtkWidget *mainwindow; #endif Option *optList; // contains all widgets of main window char *layoutName; char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion /* pixbufs */ static GdkPixbuf *mainwindowIcon=NULL; static GdkPixbuf *WhiteIcon=NULL; static GdkPixbuf *BlackIcon=NULL; /* key board accelerators */ GtkAccelGroup *GtkAccelerators; typedef unsigned int BoardSize; BoardSize boardSize; Boolean chessProgram; int minX, minY; // [HGM] placement: volatile limits on upper-left corner int smallLayout = 0, tinyLayout = 0, marginW, marginH, // [HGM] for run-time resizing fromX = -1, fromY = -1, toX, toY, commentUp = False, errorExitStatus = -1, defaultLineGap; #ifdef TODO_GTK Dimension textHeight; #endif char *chessDir, *programName, *programVersion; Boolean alwaysOnTop = False; char *icsTextMenuString; char *icsNames; char *firstChessProgramNames; char *secondChessProgramNames; WindowPlacement wpMain; WindowPlacement wpConsole; WindowPlacement wpComment; WindowPlacement wpMoveHistory; WindowPlacement wpEvalGraph; WindowPlacement wpEngineOutput; WindowPlacement wpGameList; WindowPlacement wpTags; WindowPlacement wpDualBoard; /* This magic number is the number of intermediate frames used in each half of the animation. For short moves it's reduced by 1. The total number of frames will be factor * 2 + 1. */ #define kFactor 4 SizeDefaults sizeDefaults[] = SIZE_DEFAULTS; typedef struct { char piece; char* widget; } DropMenuEnables; DropMenuEnables dmEnables[] = { { 'P', "Pawn" }, { 'N', "Knight" }, { 'B', "Bishop" }, { 'R', "Rook" }, { 'Q', "Queen" } }; #ifdef TODO_GTK XtResource clientResources[] = { { "flashCount", "flashCount", XtRInt, sizeof(int), XtOffset(AppDataPtr, flashCount), XtRImmediate, (XtPointer) FLASH_COUNT }, }; #endif /* keyboard shortcuts not yet transistioned int menuitem @ menu.c */ char globalTranslations[] = ":CtrlDown: LoadSelectedProc(3) \n \ :CtrlUp: LoadSelectedProc(-3) \n \ :Return: TempBackwardProc() \n \ :Return: TempForwardProc() \n"; char ICSInputTranslations[] = "Up: UpKeyProc() \n " "Down: DownKeyProc() \n " "Return: EnterKeyProc() \n"; // [HGM] vari: another hideous kludge: call extend-end first so we can be sure select-start works, // as the widget is destroyed before the up-click can call extend-end char commentTranslations[] = ": extend-end() select-start() CommentClick() \n"; #ifdef TODO_GTK String xboardResources[] = { "*Error*translations: #override\\n Return: ErrorPopDown()", NULL }; #endif void BoardToTop () { gtk_window_present(GTK_WINDOW(shells[BoardWindow])); } //--------------------------------------------------------------------------------------------------------- // some symbol definitions to provide the proper (= XBoard) context for the code in args.h #define XBOARD True #define JAWS_ARGS #define CW_USEDEFAULT (1<<31) #define ICS_TEXT_MENU_SIZE 90 #define DEBUG_FILE "xboard.debug" #define SetCurrentDirectory chdir #define GetCurrentDirectory(SIZE, NAME) getcwd(NAME, SIZE) #define OPTCHAR "-" #define SEPCHAR " " // The option definition and parsing code common to XBoard and WinBoard is collected in this file #include "args.h" // front-end part of option handling // [HGM] This platform-dependent table provides the location for storing the color info extern char *crWhite, * crBlack; void * colorVariable[] = { &appData.whitePieceColor, &appData.blackPieceColor, &appData.lightSquareColor, &appData.darkSquareColor, &appData.highlightSquareColor, &appData.premoveHighlightColor, &appData.lowTimeWarningColor, NULL, NULL, NULL, NULL, NULL, &crWhite, &crBlack, NULL }; // [HGM] font: keep a font for each square size, even non-stndard ones #define NUM_SIZES 18 #define MAX_SIZE 130 Boolean fontIsSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE]; char *fontTable[NUM_FONTS][MAX_SIZE]; void ParseFont (char *name, int number) { // in XBoard, only 2 of the fonts are currently implemented, and we just copy their name int size; if(sscanf(name, "size%d:", &size)) { // [HGM] font: font is meant for specific boardSize (likely from settings file); // defer processing it until we know if it matches our board size if(size >= 0 && sizeargLoc; switch(n) { case 0: // CLOCK_FONT name = appData.clockFont; break; case 1: // MESSAGE_FONT name = appData.font; break; case 2: // COORD_FONT name = appData.coordFont; break; default: return; } for(i=0; iargName, i, fontTable[n][i]); } void ExportSounds () { // nothing to do, as the sounds are at all times represented by their text-string names already } void SaveAttribsArg (FILE *f, ArgDescriptor *ad) { // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)(intptr_t)ad->argLoc]); } void SaveColor (FILE *f, ArgDescriptor *ad) { // in WinBoard the color is an int and has to be converted to text. In X it would be a string already? if(colorVariable[(int)(intptr_t)ad->argLoc]) fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)(intptr_t)ad->argLoc]); } void SaveBoardSize (FILE *f, char *name, void *addr) { // wrapper to shield back-end from BoardSize & sizeInfo fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", name, appData.boardSize); } void ParseCommPortSettings (char *s) { // no such option in XBoard (yet) } int frameX, frameY; void GetActualPlacement (GtkWidget *shell, WindowPlacement *wp) { GtkAllocation a; if(!shell) return; gtk_widget_get_allocation(shell, &a); gtk_window_get_position(GTK_WINDOW(shell), &a.x, &a.y); wp->x = a.x; wp->y = a.y; wp->width = a.width; wp->height = a.height; //printf("placement: (%d,%d) %dx%d\n", a.x, a.y, a.width, a.height); frameX = 3; frameY = 3; // remember to decide if windows touch } void GetWindowCoords () { // wrapper to shield use of window handles from back-end (make addressible by number?) // In XBoard this will have to wait until awareness of window parameters is implemented GetActualPlacement(shellWidget, &wpMain); if(shellUp[EngOutDlg]) GetActualPlacement(shells[EngOutDlg], &wpEngineOutput); if(shellUp[HistoryDlg]) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory); if(shellUp[EvalGraphDlg]) GetActualPlacement(shells[EvalGraphDlg], &wpEvalGraph); if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList); if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment); if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags); } void PrintCommPortSettings (FILE *f, char *name) { // This option does not exist in XBoard } void EnsureOnScreen (int *x, int *y, int minX, int minY) { return; } int MainWindowUp () { // [HGM] args: allows testing if main window is realized from back-end return DialogExists(BoardWindow); } void PopUpStartupDialog () { // start menu not implemented in XBoard } char * ConvertToLine (int argc, char **argv) { static char line[128*1024], buf[1024]; int i; line[0] = NULLCHAR; for(i=1; imax_logical_extent.height + 5; // add borderWidth } #else appData.font = FindFont(appData.font, fontPxlSize); appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize); appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); clockFontID = XLoadFont(xDisplay, appData.clockFont); clockFontStruct = XQueryFont(xDisplay, clockFontID); coordFontID = XLoadFont(xDisplay, appData.coordFont); coordFontStruct = XQueryFont(xDisplay, coordFontID); // textHeight in !NLS mode! #endif countFontID = coordFontID; // [HGM] holdings countFontStruct = coordFontStruct; xdb = XtDatabase(xDisplay); #if ENABLE_NLS XrmPutLineResource(&xdb, "*international: True"); vTo.size = sizeof(XFontSet); vTo.addr = (XtPointer) &fontSet; XrmPutResource(&xdb, "*fontSet", XtRFontSet, &vTo); #else XrmPutStringResource(&xdb, "*font", appData.font); #endif #endif } char * PrintArg (ArgType t) { char *p=""; switch(t) { case ArgZ: case ArgInt: p = " N"; break; case ArgString: p = " STR"; break; case ArgBoolean: p = " TF"; break; case ArgSettingsFilename: case ArgBackupSettingsFile: case ArgFilename: p = " FILE"; break; case ArgX: p = " Nx"; break; case ArgY: p = " Ny"; break; case ArgAttribs: p = " TEXTCOL"; break; case ArgColor: p = " COL"; break; case ArgFont: p = " FONT"; break; case ArgBoardSize: p = " SIZE"; break; case ArgFloat: p = " FLOAT"; break; case ArgTrue: case ArgFalse: case ArgTwo: case ArgNone: case ArgCommSettings: break; } return p; } void PrintOptions () { char buf[MSG_SIZ]; int len=0; ArgDescriptor *q, *p = argDescriptors+5; printf("\nXBoard accepts the following options:\n" "(N = integer, TF = true or false, STR = text string, FILE = filename,\n" " Nx, Ny = relative coordinates, COL = color, FONT = X-font spec,\n" " SIZE = board-size spec(s)\n" " Within parentheses are short forms, or options to set to true or false.\n" " Persistent options (saved in the settings file) are marked with *)\n\n"); while(p->argName) { if(p->argType == ArgCommSettings) { p++; continue; } // XBoard has no comm port snprintf(buf+len, MSG_SIZ, "-%s%s", p->argName, PrintArg(p->argType)); if(p->save) strcat(buf+len, "*"); for(q=p+1; q->argLoc == p->argLoc; q++) { if(q->argName[0] == '-') continue; strcat(buf+len, q == p+1 ? " (" : " "); sprintf(buf+strlen(buf), "-%s%s", q->argName, PrintArg(q->argType)); } if(q != p+1) strcat(buf+len, ")"); len = strlen(buf); if(len > 39) len = 0, printf("%s\n", buf); else while(len < 39) buf[len++] = ' '; p = q; } if(len) buf[len] = NULLCHAR, printf("%s\n", buf); } void SlaveResize (Option *opt) { static int slaveW, slaveH, w, h; GtkAllocation a; if(!slaveH) { gtk_widget_get_allocation(shells[DummyDlg], &a); w = a.width; h = a.height; gtk_widget_get_allocation(opt->handle, &a); slaveW = w - opt->max; // [HGM] needed to set new shellWidget size when we resize board slaveH = h - a.height + 13; } gtk_window_resize(GTK_WINDOW(shells[DummyDlg]), slaveW + opt->max, slaveH + opt->value); } #ifdef __APPLE__ static char clickedFile[MSG_SIZ]; static int suppress; static gboolean StartNewXBoard(GtkosxApplication *app, gchar *path, gpointer user_data) { // handler of OSX OpenFile signal, which sends us the filename of clicked file or first argument if(suppress) { // we just started XBoard without arguments strncpy(clickedFile, path, MSG_SIZ); // remember file name, but otherwise ignore } else { // we are running something presumably useful char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "open -n -a \"xboard\" --args \"%s\"", path); system(buf); // start new instance on this file } return TRUE; } #endif int main (int argc, char **argv) { int i, clockFontPxlSize, coordFontPxlSize, fontPxlSize; int boardWidth, boardHeight, w, h; char *p; int forceMono = False; srandom(time(0)); // [HGM] book: make random truly random setbuf(stdout, NULL); setbuf(stderr, NULL); debugFP = stderr; if(argc > 1 && (!strcmp(argv[1], "-v" ) || !strcmp(argv[1], "--version" ))) { printf("%s version %s\n", PACKAGE_NAME, PACKAGE_VERSION); exit(0); } if(argc > 1 && !strcmp(argv[1], "--help" )) { PrintOptions(); exit(0); } /* set up GTK */ gtk_init (&argc, &argv); #ifdef __APPLE__ { // prepare to catch OX OpenFile signal, which will tell us the clicked file GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); dataDir = gtkosx_application_get_bundle_path(); g_signal_connect(theApp, "NSApplicationOpenFile", G_CALLBACK(StartNewXBoard), NULL); // we must call application ready before we can get the signal, // and supply a (dummy) menu bar before that, to avoid problems with dual apples in it gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(gtk_menu_bar_new())); gtkosx_application_ready(theApp); suppress = (argc == 1 || argc > 1 && argv[1][00] != '-'); // OSX sends signal even if name was already argv[1]! if(argc == 1) { // called without args: OSX open-file signal might follow static char *fakeArgv[3] = {NULL, clickedFile, NULL}; usleep(10000); // wait 10 msec (and hope this is long enough). while(gtk_events_pending()) gtk_main_iteration(); // process all events that came in upto now suppress = 0; // future open-file signals should start new instance if(clickedFile[0]) { // we were sent an open-file signal with filename! fakeArgv[0] = argv[0]; argc = 2; argv = fakeArgv; // fake that we were called as "xboard filename" } } } #endif /* set up keyboard accelerators group */ GtkAccelerators = gtk_accel_group_new(); programName = strrchr(argv[0], '/'); if (programName == NULL) programName = argv[0]; else programName++; #ifdef ENABLE_NLS // if (appData.debugMode) { // fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL)); // } bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); // needed when creating markup for the clocks textdomain(PACKAGE); #endif appData.boardSize = ""; InitAppData(ConvertToLine(argc, argv)); p = getenv("HOME"); if (p == NULL) p = "/tmp"; i = strlen(p) + strlen("/.xboardXXXXXx.pgn") + 1; gameCopyFilename = (char*) malloc(i); gamePasteFilename = (char*) malloc(i); snprintf(gameCopyFilename,i, "%s/.xboard%05uc.pgn", p, getpid()); snprintf(gamePasteFilename,i, "%s/.xboard%05up.pgn", p, getpid()); { // [HGM] initstring: kludge to fix bad bug. expand '\n' characters in init string and computer string. static char buf[MSG_SIZ]; EscapeExpand(buf, appData.firstInitString); appData.firstInitString = strdup(buf); EscapeExpand(buf, appData.secondInitString); appData.secondInitString = strdup(buf); EscapeExpand(buf, appData.firstComputerString); appData.firstComputerString = strdup(buf); EscapeExpand(buf, appData.secondComputerString); appData.secondComputerString = strdup(buf); } if ((chessDir = (char *) getenv("CHESSDIR")) == NULL) { chessDir = "."; } else { if (chdir(chessDir) != 0) { fprintf(stderr, _("%s: can't cd to CHESSDIR: "), programName); perror(chessDir); exit(1); } } if (appData.debugMode && appData.nameOfDebugFile && strcmp(appData.nameOfDebugFile, "stderr")) { /* [DM] debug info to file [HGM] make the filename a command-line option, and allow it to remain stderr */ if ((debugFP = fopen(appData.nameOfDebugFile, "w")) == NULL) { printf(_("Failed to open file '%s'\n"), appData.nameOfDebugFile); exit(errno); } setbuf(debugFP, NULL); } #if ENABLE_NLS if (appData.debugMode) { fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL)); } #endif /* [HGM,HR] make sure board size is acceptable */ if(appData.NrFiles > BOARD_FILES || appData.NrRanks > BOARD_RANKS ) DisplayFatalError(_("Recompile with larger BOARD_RANKS or BOARD_FILES to support this size"), 0, 2); #if !HIGHDRAG /* This feature does not work; animation needs a rewrite */ appData.highlightDragging = FALSE; #endif InitBackEnd1(); gameInfo.variant = StringToVariant(appData.variant); InitPosition(FALSE); /* * determine size, based on supplied or remembered -size, or screen size */ if (isdigit(appData.boardSize[0])) { i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize, &lineGap, &clockFontPxlSize, &coordFontPxlSize, &fontPxlSize, &smallLayout, &tinyLayout); if (i == 0) { fprintf(stderr, _("%s: bad boardSize syntax %s\n"), programName, appData.boardSize); exit(2); } if (i < 7) { /* Find some defaults; use the nearest known size */ SizeDefaults *szd, *nearest; int distance = 99999; nearest = szd = sizeDefaults; while (szd->name != NULL) { if (abs(szd->squareSize - squareSize) < distance) { nearest = szd; distance = abs(szd->squareSize - squareSize); if (distance == 0) break; } szd++; } if (i < 2) lineGap = nearest->lineGap; if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize; if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize; if (i < 5) fontPxlSize = nearest->fontPxlSize; if (i < 6) smallLayout = nearest->smallLayout; if (i < 7) tinyLayout = nearest->tinyLayout; } } else { SizeDefaults *szd = sizeDefaults; if (*appData.boardSize == NULLCHAR) { GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(mainwindow)); guint screenwidth = gdk_screen_get_width(screen); guint screenheight = gdk_screen_get_height(screen); while (screenwidth < szd->minScreenSize || screenheight < szd->minScreenSize) { szd++; } if (szd->name == NULL) szd--; appData.boardSize = strdup(szd->name); // [HGM] settings: remember name for saving settings } else { while (szd->name != NULL && StrCaseCmp(szd->name, appData.boardSize) != 0) szd++; if (szd->name == NULL) { fprintf(stderr, _("%s: unrecognized boardSize name %s\n"), programName, appData.boardSize); exit(2); } } squareSize = szd->squareSize; lineGap = szd->lineGap; clockFontPxlSize = szd->clockFontPxlSize; coordFontPxlSize = szd->coordFontPxlSize; fontPxlSize = szd->fontPxlSize; smallLayout = szd->smallLayout; tinyLayout = szd->tinyLayout; // [HGM] font: use defaults from settings file if available and not overruled } defaultLineGap = lineGap; if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; /* [HR] height treated separately (hacked) */ boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); /* * Determine what fonts to use. */ #ifdef TODO_GTK InitializeFonts(clockFontPxlSize, coordFontPxlSize, fontPxlSize); #endif /* * Detect if there are not enough colors available and adapt. */ #ifdef TODO_GTK if (DefaultDepth(xDisplay, xScreen) <= 2) { appData.monoMode = True; } #endif forceMono = MakeColors(); if (forceMono) { fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), programName); appData.monoMode = True; } ParseIcsTextColors(); /* * widget hierarchy */ if (tinyLayout) { layoutName = "tinyLayout"; } else if (smallLayout) { layoutName = "smallLayout"; } else { layoutName = "normalLayout"; } wpMain.width = -1; // prevent popup sizes window optList = BoardPopUp(squareSize, lineGap, (void*) #ifdef TODO_GTK #if ENABLE_NLS &clockFontSet); #else clockFontStruct); #endif #else 0); #endif InitDrawingHandle(optList + W_BOARD); shellWidget = shells[BoardWindow]; currBoard = &optList[W_BOARD]; boardWidget = optList[W_BOARD].handle; menuBarWidget = optList[W_MENU].handle; dropMenu = optList[W_DROP].handle; titleWidget = optList[optList[W_TITLE].type != -1 ? W_TITLE : W_SMALL].handle; #ifdef TODO_GTK formWidget = XtParent(boardWidget); XtSetArg(args[0], XtNbackground, &timerBackgroundPixel); XtSetArg(args[1], XtNforeground, &timerForegroundPixel); XtGetValues(optList[W_WHITE].handle, args, 2); if (appData.showButtonBar) { // can't we use timer pixels for this? (Or better yet, just black & white?) XtSetArg(args[0], XtNbackground, &buttonBackgroundPixel); XtSetArg(args[1], XtNforeground, &buttonForegroundPixel); XtGetValues(optList[W_PAUSE].handle, args, 2); } #endif // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would // not need to go into InitDrawingSizes(). InitMenuMarkers(); // add accelerators to main shell gtk_window_add_accel_group(GTK_WINDOW(shellWidget), GtkAccelerators); /* * Create an icon. (Use two icons, to indicate whther it is white's or black's turn.) */ WhiteIcon = gdk_pixbuf_new_from_file(SVGDIR "/icon_white.svg", NULL); BlackIcon = gdk_pixbuf_new_from_file(SVGDIR "/icon_black.svg", NULL); mainwindowIcon = WhiteIcon; gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon); /* * Create a cursor for the board widget. */ #ifdef TODO_GTK window_attributes.cursor = XCreateFontCursor(xDisplay, XC_hand2); XChangeWindowAttributes(xDisplay, xBoardWindow, CWCursor, &window_attributes); #endif /* * Inhibit shell resizing. */ #ifdef TODO_GTK shellArgs[0].value = (XtArgVal) &w; shellArgs[1].value = (XtArgVal) &h; XtGetValues(shellWidget, shellArgs, 2); shellArgs[4].value = shellArgs[2].value = w; shellArgs[5].value = shellArgs[3].value = h; // XtSetValues(shellWidget, &shellArgs[2], 4); #endif { // Note: We cannot do sensible sizing here, because the height of the clock widget is not yet known // It wil only become known asynchronously, when we first write a string into it. // This will then change the clock widget height, which triggers resizing the top-level window // and a configure event. Only then can we know the total height of the top-level window, // and calculate the height we need. The clockKludge flag suppresses all resizing until // that moment comes, after which the configure event-handler handles it through a (delayed) DragProg. int hc; GtkAllocation a; gtk_widget_get_allocation(shells[BoardWindow], &a); w = a.width; h = a.height; gtk_widget_get_allocation(optList[W_WHITE].handle, &a); clockKludge = hc = a.height; gtk_widget_get_allocation(boardWidget, &a); marginW = w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board marginH = h - a.height - hc; // subtract current clock height, so it can be added back dynamically } CreateAnyPieces(); CreateGrid(); if(appData.logoSize) { // locate and read user logo char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s/%s.png", appData.logoDir, UserName()); ASSIGN(userLogo, buf); } if (appData.animate || appData.animateDragging) CreateAnimVars(); g_signal_connect(shells[BoardWindow], "key-press-event", G_CALLBACK(KeyPressProc), NULL); g_signal_connect(shells[BoardWindow], "configure-event", G_CALLBACK(EventProc), NULL); /* [AS] Restore layout */ if( wpMoveHistory.visible ) { HistoryPopUp(); } if( wpEvalGraph.visible ) { EvalGraphPopUp(); }; if( wpEngineOutput.visible ) { EngineOutputPopUp(); } InitBackEnd2(); if (errorExitStatus == -1) { if (appData.icsActive) { /* We now wait until we see "login:" from the ICS before sending the logon script (problems with timestamp otherwise) */ /*ICSInitScript();*/ if (appData.icsInputBox) ICSInputBoxPopUp(); } #ifdef SIGWINCH signal(SIGWINCH, TermSizeSigHandler); #endif signal(SIGINT, IntSigHandler); signal(SIGTERM, IntSigHandler); if (*appData.cmailGameName != NULLCHAR) { signal(SIGUSR1, CmailSigHandler); } } gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() InitPosition(TRUE); UpdateLogos(TRUE); // XtSetKeyboardFocus(shellWidget, formWidget); #ifdef TODO_GTK XSetInputFocus(xDisplay, XtWindow(formWidget), RevertToPointerRoot, CurrentTime); #endif /* check for GTK events and process them */ // gtk_main(); while(1) { gtk_main_iteration(); } if (appData.debugMode) fclose(debugFP); // [DM] debug return 0; } RETSIGTYPE TermSizeSigHandler (int sig) { update_ics_width(); } RETSIGTYPE IntSigHandler (int sig) { ExitEvent(sig); } RETSIGTYPE CmailSigHandler (int sig) { int dummy = 0; int error; signal(SIGUSR1, SIG_IGN); /* suspend handler */ /* Activate call-back function CmailSigHandlerCallBack() */ OutputToProcess(cmailPR, (char *)(&dummy), sizeof(int), &error); signal(SIGUSR1, CmailSigHandler); /* re-activate handler */ } void CmailSigHandlerCallBack (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error) { BoardToTop(); ReloadCmailMsgEvent(TRUE); /* Reload cmail msg */ } /**** end signal code ****/ #define Abs(n) ((n)<0 ? -(n) : (n)) #ifdef ENABLE_NLS char * InsertPxlSize (char *pattern, int targetPxlSize) { char *base_fnt_lst, strInt[12], *p, *q; int alternatives, i, len, strIntLen; /* * Replace the "*" (if present) in the pixel-size slot of each * alternative with the targetPxlSize. */ p = pattern; alternatives = 1; while ((p = strchr(p, ',')) != NULL) { alternatives++; p++; } snprintf(strInt, sizeof(strInt), "%d", targetPxlSize); strIntLen = strlen(strInt); base_fnt_lst = calloc(1, strlen(pattern) + strIntLen * alternatives + 1); p = pattern; q = base_fnt_lst; while (alternatives--) { char *comma = strchr(p, ','); for (i=0; i<14; i++) { char *hyphen = strchr(p, '-'); if (!hyphen) break; if (comma && hyphen > comma) break; len = hyphen + 1 - p; if (i == 7 && *p == '*' && len == 2) { p += len; memcpy(q, strInt, strIntLen); q += strIntLen; *q++ = '-'; } else { memcpy(q, p, len); p += len; q += len; } } if (!comma) break; len = comma + 1 - p; memcpy(q, p, len); p += len; q += len; } strcpy(q, p); return base_fnt_lst; } #ifdef TODO_GTK XFontSet CreateFontSet (char *base_fnt_lst) { XFontSet fntSet; char **missing_list; int missing_count; char *def_string; fntSet = XCreateFontSet(xDisplay, base_fnt_lst, &missing_list, &missing_count, &def_string); if (appData.debugMode) { int i, count; XFontStruct **font_struct_list; char **font_name_list; fprintf(debugFP, "Requested font set for list %s\n", base_fnt_lst); if (fntSet) { fprintf(debugFP, " got list %s, locale %s\n", XBaseFontNameListOfFontSet(fntSet), XLocaleOfFontSet(fntSet)); count = XFontsOfFontSet(fntSet, &font_struct_list, &font_name_list); for (i = 0; i < count; i++) { fprintf(debugFP, " got charset %s\n", font_name_list[i]); } } for (i = 0; i < missing_count; i++) { fprintf(debugFP, " missing charset %s\n", missing_list[i]); } } if (fntSet == NULL) { fprintf(stderr, _("Unable to create font set for %s.\n"), base_fnt_lst); exit(2); } return fntSet; } #endif #else // not ENABLE_NLS /* * Find a font that matches "pattern" that is as close as * possible to the targetPxlSize. Prefer fonts that are k * pixels smaller to fonts that are k pixels larger. The * pattern must be in the X Consortium standard format, * e.g. "-*-helvetica-bold-r-normal--*-*-*-*-*-*-*-*". * The return value should be freed with XtFree when no * longer needed. */ char * FindFont (char *pattern, int targetPxlSize) { char **fonts, *p, *best, *scalable, *scalableTail; int i, j, nfonts, minerr, err, pxlSize; #ifdef TODO_GTK fonts = XListFonts(xDisplay, pattern, 999999, &nfonts); if (nfonts < 1) { fprintf(stderr, _("%s: no fonts match pattern %s\n"), programName, pattern); exit(2); } best = fonts[0]; scalable = NULL; minerr = 999999; for (i=0; i 0 && err < 0 && -err == minerr)) { best = fonts[i]; minerr = err; } } } if (scalable && Abs(minerr) > appData.fontSizeTolerance) { /* If the error is too big and there is a scalable font, use the scalable font. */ int headlen = scalableTail - scalable; p = (char *) XtMalloc(strlen(scalable) + 10); while (isdigit(*scalableTail)) scalableTail++; sprintf(p, "%.*s%d%s", headlen, scalable, targetPxlSize, scalableTail); } else { p = (char *) XtMalloc(strlen(best) + 2); safeStrCpy(p, best, strlen(best)+1 ); } if (appData.debugMode) { fprintf(debugFP, "resolved %s at pixel size %d\n to %s\n", pattern, targetPxlSize, p); } XFreeFontNames(fonts); #endif return p; } #endif void EnableNamedMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); if(item) gtk_widget_set_sensitive(item->handle, state); } void EnableButtonBar (int state) { #ifdef TODO_GTK XtSetSensitive(optList[W_BUTTON].handle, state); #endif } void SetMenuEnables (Enables *enab) { while (enab->name != NULL) { EnableNamedMenuItem(enab->name, enab->value); enab++; } } gboolean KeyPressProc(window, eventkey, data) GtkWindow *window; GdkEventKey *eventkey; gpointer data; { MoveTypeInProc(eventkey); // pop up for typed in moves #ifdef TODO_GTK /* check for other key values */ switch(eventkey->keyval) { case GDK_question: AboutGameEvent(); break; default: break; } #endif return False; } #ifdef TODO_GTK void KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] new method of key binding: specify MenuItem(FlipView) in stead of FlipViewProc in translation string MenuItem *item; if(*nprms == 0) return; item = MenuNameToItem(prms[0]); if(item) ((MenuProc *) item->proc) (); } #endif void SetupDropMenu () { #ifdef TODO_GTK int i, j, count; char label[32]; Arg args[16]; Widget entry; char* p; for (i=0; i 1.) f = 1.; else if(f < 0.) f = 0.; return f; } static WindowPlacement wpNew; void CoDrag (GtkWidget *sh, WindowPlacement *wp) { int touch=0, fudge = 2, f = 2; GetActualPlacement(sh, wp); if(abs(wpMain.x + wpMain.width + 2*frameX - f - wp->x) < fudge) touch = 1; else // right touch if(abs(wp->x + wp->width + 2*frameX + f - wpMain.x) < fudge) touch = 2; else // left touch if(abs(wpMain.y + wpMain.height + frameX - f + frameY - wp->y) < fudge) touch = 3; else // bottom touch if(abs(wp->y + wp->height + frameX + frameY + f - wpMain.y) < fudge) touch = 4; // top touch //printf("CoDrag: touch = %d x=%d w=%d x2=%d w2=%d fx=%d\n", touch, wpMain.x, wpMain.width, wp->x, wp->width, frameX); if(!touch ) return; // only windows that touch co-move if(touch < 3 && wpNew.height != wpMain.height) { // left or right and height changed int heightInc = wpNew.height - wpMain.height; double fracTop = Fraction(wp->y, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); double fracBot = Fraction(wp->y + wp->height + frameX + frameY + 1, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); wp->y += fracTop * heightInc; heightInc = (int) (fracBot * heightInc) - (int) (fracTop * heightInc); #ifdef TODO_GTK if(heightInc) XtSetArg(args[j], XtNheight, wp->height + heightInc), j++; #endif wp->height += heightInc; } else if(touch > 2 && wpNew.width != wpMain.width) { // top or bottom and width changed int widthInc = wpNew.width - wpMain.width; double fracLeft = Fraction(wp->x, wpMain.x, wpMain.x + wpMain.width + 2*frameX); double fracRght = Fraction(wp->x + wp->width + 2*frameX + 1, wpMain.x, wpMain.x + wpMain.width + 2*frameX); wp->y += fracLeft * widthInc; widthInc = (int) (fracRght * widthInc) - (int) (fracLeft * widthInc); #ifdef TODO_GTK if(widthInc) XtSetArg(args[j], XtNwidth, wp->width + widthInc), j++; #endif wp->width += widthInc; } wp->x += wpNew.x - wpMain.x; wp->y += wpNew.y - wpMain.y; if(touch == 1) wp->x += wpNew.width - wpMain.width; else if(touch == 3) wp->y += wpNew.height - wpMain.height; #ifdef TODO_GTK XtSetArg(args[j], XtNx, wp->x); j++; XtSetArg(args[j], XtNy, wp->y); j++; XtSetValues(sh, args, j); #endif gtk_window_move(GTK_WINDOW(sh), wp->x, wp->y); //printf("moved to (%d,%d)\n", wp->x, wp->y); gtk_window_resize(GTK_WINDOW(sh), wp->width, wp->height); } void ReSize (WindowPlacement *wp) { GtkAllocation a; int sqx, sqy, w, h, hc, lg = lineGap; gtk_widget_get_allocation(optList[W_WHITE].handle, &a); hc = a.height; // clock height can depend on single / double line clock text! if(clockKludge == a.height) return; // wait for clock to get final size at startup if(clockKludge) { // clock height OK now; calculate desired initial board height clockKludge = 0; wp->height = BOARD_HEIGHT * (squareSize + lineGap) + lineGap + marginH + hc; } if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg; sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg; if(sqy < sqx) sqx = sqy; if(appData.overrideLineGap < 0) { // do second iteration with adjusted lineGap lg = lineGap = sqx < 37 ? 1 : sqx < 59 ? 2 : sqx < 116 ? 3 : 4; sqx = (wp->width - lg - marginW) / BOARD_WIDTH - lg; sqy = (wp->height - lg - marginH - hc) / BOARD_HEIGHT - lg; if(sqy < sqx) sqx = sqy; } if(sqx != squareSize) { //printf("new sq size %d (%dx%d)\n", sqx, wp->width, wp->height); squareSize = sqx; // adopt new square size CreatePNGPieces(); // make newly scaled pieces InitDrawingSizes(0, 0); // creates grid etc. } else ResizeBoardWindow(BOARD_WIDTH * (squareSize + lineGap) + lineGap, BOARD_HEIGHT * (squareSize + lineGap) + lineGap, 0); w = BOARD_WIDTH * (squareSize + lineGap) + lineGap; h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap; if(optList[W_BOARD].max > w) optList[W_BOARD].max = w; if(optList[W_BOARD].value > h) optList[W_BOARD].value = h; } static guint delayedDragTag = 0; void DragProc () { static int busy; if(busy) return; busy = 1; // GetActualPlacement(shellWidget, &wpNew); if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved wpNew.width == wpMain.width && wpNew.height == wpMain.height) { // not sized busy = 0; return; // false alarm } ReSize(&wpNew); if(appData.useStickyWindows) { if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput); if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory); if(shellUp[EvalGraphDlg]) CoDrag(shells[EvalGraphDlg], &wpEvalGraph); if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList); } wpMain = wpNew; DrawPosition(True, NULL); if(delayedDragTag) g_source_remove(delayedDragTag); delayedDragTag = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other) busy = 0; } void DelayedDrag () { //printf("old timr = %d\n", delayedDragTag); if(delayedDragTag) g_source_remove(delayedDragTag); delayedDragTag = g_timeout_add( 200, (GSourceFunc) DragProc, NULL); //printf("new timr = %d\n", delayedDragTag); } static gboolean EventProc (GtkWidget *widget, GdkEvent *event, gpointer g) { //printf("event proc (%d,%d) %dx%d\n", event->configure.x, event->configure.y, event->configure.width, event->configure.height); // immediately wpNew.x = event->configure.x; wpNew.y = event->configure.y; wpNew.width = event->configure.width; wpNew.height = event->configure.height; DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other return FALSE; } /* Disable all user input other than deleting the window */ static int frozen = 0; void FreezeUI () { if (frozen) return; /* Grab by a widget that doesn't accept input */ gtk_grab_add(optList[W_MESSG].handle); frozen = 1; } /* Undo a FreezeUI */ void ThawUI () { if (!frozen) return; gtk_grab_remove(optList[W_MESSG].handle); frozen = 0; } void ModeHighlight () { static int oldPausing = FALSE; static GameMode oldmode = (GameMode) -1; char *wname; if (!boardWidget) return; if (pausing != oldPausing) { oldPausing = pausing; MarkMenuItem("Mode.Pause", pausing); if (appData.showButtonBar) { /* Always toggle, don't set. Previous code messes up when invoked while the button is pressed, as releasing it toggles the state again. */ GdkColor color; gdk_color_parse( pausing ? "#808080" : "#F0F0F0", &color ); gtk_widget_modify_bg ( GTK_WIDGET(optList[W_PAUSE].handle), GTK_STATE_NORMAL, &color ); } } wname = ModeToWidgetName(oldmode); if (wname != NULL) { MarkMenuItem(wname, False); } wname = ModeToWidgetName(gameMode); if (wname != NULL) { MarkMenuItem(wname, True); } oldmode = gameMode; MarkMenuItem("Mode.MachineMatch", matchMode && matchGame < appData.matchGames); /* Maybe all the enables should be handled here, not just this one */ EnableNamedMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile); DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]); } /* * Button/menu procedures */ void CopyFileToClipboard(gchar *filename) { gchar *selection_tmp; GtkClipboard *cb; // read the file FILE* f = fopen(filename, "r"); long len; size_t count; if (f == NULL) return; fseek(f, 0, 2); len = ftell(f); rewind(f); selection_tmp = g_try_malloc(len + 1); if (selection_tmp == NULL) { printf("Malloc failed in CopyFileToClipboard\n"); return; } count = fread(selection_tmp, 1, len, f); fclose(f); if (len != count) { g_free(selection_tmp); return; } selection_tmp[len] = NULLCHAR; // file is now in selection_tmp // copy selection_tmp to clipboard GdkDisplay *gdisp = gdk_display_get_default(); if (!gdisp) { g_free(selection_tmp); return; } cb = gtk_clipboard_get_for_display(gdisp, GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(cb, selection_tmp, -1); g_free(selection_tmp); } void CopySomething (char *src) { GdkDisplay *gdisp = gdk_display_get_default(); GtkClipboard *cb; if(!src) { CopyFileToClipboard(gameCopyFilename); return; } if (gdisp == NULL) return; cb = gtk_clipboard_get_for_display(gdisp, GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(cb, src, -1); } void PastePositionProc () { GdkDisplay *gdisp = gdk_display_get_default(); GtkClipboard *cb; gchar *fenstr; if (gdisp == NULL) return; cb = gtk_clipboard_get_for_display(gdisp, GDK_SELECTION_CLIPBOARD); fenstr = gtk_clipboard_wait_for_text(cb); if (fenstr==NULL) return; // nothing had been selected to copy EditPositionPasteFEN(fenstr); return; } void PasteGameProc () { gchar *text=NULL; GtkClipboard *cb; guint len=0; FILE* f; // get game from clipboard GdkDisplay *gdisp = gdk_display_get_default(); if (gdisp == NULL) return; cb = gtk_clipboard_get_for_display(gdisp, GDK_SELECTION_CLIPBOARD); text = gtk_clipboard_wait_for_text(cb); if (text == NULL) return; // nothing to paste len = strlen(text); // write to temp file if (text == NULL || len == 0) { return; //nothing to paste } f = fopen(gamePasteFilename, "w"); if (f == NULL) { DisplayError(_("Can't open temp file"), errno); return; } fwrite(text, 1, len, f); fclose(f); // load from file LoadGameFromFile(gamePasteFilename, 0, gamePasteFilename, TRUE); return; } #ifdef TODO_GTK void QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms) { QuitProc(); } #endif void MoveTypeInProc(eventkey) GdkEventKey *eventkey; { char buf[10]; // ingnore if ctrl, alt, or meta is pressed if (eventkey->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK | GDK_META_MASK)) { return; } buf[0]=eventkey->keyval; buf[1]='\0'; if (eventkey->keyval > 32 && eventkey->keyval < 256) BoxAutoPopUp (buf); } #ifdef TODO_GTK void TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (!TempBackwardActive) { TempBackwardActive = True; BackwardEvent(); } } void TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { /* Check to see if triggered by a key release event for a repeating key. * If so the next queued event will be a key press of the same key at the same time */ if (XEventsQueued(xDisplay, QueuedAfterReading)) { XEvent next; XPeekEvent(xDisplay, &next); if (next.type == KeyPress && next.xkey.time == event->xkey.time && next.xkey.keycode == event->xkey.keycode) return; } ForwardEvent(); TempBackwardActive = False; } #endif void ManProc () { // called from menu #ifdef __APPLE__ system("%s ./man.command", appData.sysOpen); #else system("xterm -e man xboard &"); #endif } void SetWindowTitle (char *text, char *title, char *icon) { #ifdef TODO_GTK Arg args[16]; int i; if (appData.titleInWindow) { i = 0; XtSetArg(args[i], XtNlabel, text); i++; XtSetValues(titleWidget, args, i); } i = 0; XtSetArg(args[i], XtNiconName, (XtArgVal) icon); i++; XtSetArg(args[i], XtNtitle, (XtArgVal) title); i++; XtSetValues(shellWidget, args, i); XSync(xDisplay, False); #endif if (appData.titleInWindow) { SetWidgetLabel(titleWidget, text); } gtk_window_set_title (GTK_WINDOW(shells[BoardWindow]), title); } void DisplayIcsInteractionTitle (String message) { #ifdef TODO_GTK if (oldICSInteractionTitle == NULL) { /* Magic to find the old window title, adapted from vim */ char *wina = getenv("WINDOWID"); if (wina != NULL) { Window win = (Window) atoi(wina); Window root, parent, *children; unsigned int nchildren; int (*oldHandler)() = XSetErrorHandler(NullXErrorCheck); for (;;) { if (XFetchName(xDisplay, win, &oldICSInteractionTitle)) break; if (!XQueryTree(xDisplay, win, &root, &parent, &children, &nchildren)) break; if (children) XFree((void *)children); if (parent == root || parent == 0) break; win = parent; } XSetErrorHandler(oldHandler); } if (oldICSInteractionTitle == NULL) { oldICSInteractionTitle = "xterm"; } } printf("\033]0;%s\007", message); fflush(stdout); #endif } void DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) { GtkWidget *w = (GtkWidget *) opt->handle; GdkColor col; char *markup; char bgcolor[10]; char fgcolor[10]; if (highlight) { strcpy(bgcolor, "black"); strcpy(fgcolor, "white"); } else { strcpy(bgcolor, "white"); strcpy(fgcolor, "black"); } if (timer > 0 && appData.lowTimeWarning && (timer / 1000) < appData.icsAlarmTime) { strcpy(fgcolor, appData.lowTimeWarningColor); } gdk_color_parse( bgcolor, &col ); gtk_widget_modify_bg(gtk_widget_get_parent(opt->handle), GTK_STATE_NORMAL, &col); if (appData.clockMode) { markup = g_markup_printf_escaped("%s:%s%s", bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer)); } else { markup = g_markup_printf_escaped("%s ", bgcolor, fgcolor, color); } gtk_label_set_markup(GTK_LABEL(w), markup); g_free(markup); } static GdkPixbuf **clockIcons[] = { &WhiteIcon, &BlackIcon }; void SetClockIcon (int color) { GdkPixbuf *pm = *clockIcons[color]; if (mainwindowIcon != pm) { mainwindowIcon = pm; gtk_window_set_icon(GTK_WINDOW(shellWidget), mainwindowIcon); } } #define INPUT_SOURCE_BUF_SIZE 8192 typedef struct { CPKind kind; int fd; int lineByLine; char *unused; InputCallback func; guint sid; char buf[INPUT_SOURCE_BUF_SIZE]; VOIDSTAR closure; } InputSource; gboolean DoInputCallback(io, cond, data) GIOChannel *io; GIOCondition cond; gpointer *data; { /* read input from one of the input source (for example a chess program, ICS, etc). * and call a function that will handle the input */ int count; int error; char *p, *q; /* All information (callback function, file descriptor, etc) is * saved in an InputSource structure */ InputSource *is = (InputSource *) data; if (is->lineByLine) { count = read(is->fd, is->unused, INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf)); if (count <= 0) { (is->func)(is, is->closure, is->buf, count, count ? errno : 0); return True; } is->unused += count; p = is->buf; /* break input into lines and call the callback function on each * line */ while (p < is->unused) { q = memchr(p, '\n', is->unused - p); if (q == NULL) break; q++; (is->func)(is, is->closure, p, q - p, 0); p = q; } /* remember not yet used part of the buffer */ q = is->buf; while (p < is->unused) { *q++ = *p++; } is->unused = q; } else { /* read maximum length of input buffer and send the whole buffer * to the callback function */ count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE); if (count == -1) error = errno; else error = 0; (is->func)(is, is->closure, is->buf, count, error); } return True; // Must return true or the watch will be removed } InputSourceRef AddInputSource(pr, lineByLine, func, closure) ProcRef pr; int lineByLine; InputCallback func; VOIDSTAR closure; { InputSource *is; GIOChannel *channel; ChildProc *cp = (ChildProc *) pr; is = (InputSource *) calloc(1, sizeof(InputSource)); is->lineByLine = lineByLine; is->func = func; if (pr == NoProc) { is->kind = CPReal; is->fd = fileno(stdin); } else { is->kind = cp->kind; is->fd = cp->fdFrom; } if (lineByLine) is->unused = is->buf; else is->unused = NULL; /* GTK-TODO: will this work on windows?*/ channel = g_io_channel_unix_new(is->fd); g_io_channel_set_close_on_unref (channel, TRUE); is->sid = g_io_add_watch(channel, G_IO_IN,(GIOFunc) DoInputCallback, is); is->closure = closure; return (InputSourceRef) is; } void RemoveInputSource(isr) InputSourceRef isr; { InputSource *is = (InputSource *) isr; if (is->sid == 0) return; g_source_remove(is->sid); is->sid = 0; return; } #ifndef HAVE_USLEEP static Boolean frameWaiting; static RETSIGTYPE FrameAlarm (int sig) { frameWaiting = False; /* In case System-V style signals. Needed?? */ signal(SIGALRM, FrameAlarm); } void FrameDelay (int time) { struct itimerval delay; if (time > 0) { frameWaiting = True; signal(SIGALRM, FrameAlarm); delay.it_interval.tv_sec = delay.it_value.tv_sec = time / 1000; delay.it_interval.tv_usec = delay.it_value.tv_usec = (time % 1000) * 1000; setitimer(ITIMER_REAL, &delay, NULL); while (frameWaiting) pause(); delay.it_interval.tv_sec = delay.it_value.tv_sec = 0; delay.it_interval.tv_usec = delay.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &delay, NULL); } } #else void FrameDelay (int time) { #ifdef TODO_GTK XSync(xDisplay, False); #endif // gtk_main_iteration_do(False); if (time > 0) usleep(time * 1000); } #endif static void LoadLogo (ChessProgramState *cps, int n, Boolean ics) { char buf[MSG_SIZ], *logoName = buf; if(appData.logo[n][0]) { logoName = appData.logo[n]; } else if(appData.autoLogo) { if(ics) { // [HGM] logo: in ICS mode second can be used for ICS sprintf(buf, "%s/%s.png", appData.logoDir, appData.icsHost); } else if(appData.directory[n] && appData.directory[n][0]) { sprintf(buf, "%s/%s.png", appData.logoDir, cps->tidy); } } if(logoName[0]) { ASSIGN(cps->programLogo, logoName); } } void UpdateLogos (int displ) { if(optList[W_WHITE-1].handle == NULL) return; LoadLogo(&first, 0, 0); LoadLogo(&second, 1, appData.icsActive); if(displ) DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]); return; } void FileNamePopUpWrapper(label, def, filter, proc, pathFlag, openMode, name, fp) char *label; char *def; char *filter; FileProc proc; char *openMode; Boolean pathFlag; char **name; FILE **fp; { GtkWidget *dialog; GtkFileFilter *gtkfilter; GtkFileFilter *gtkfilter_all; char space[] = " "; char fileext[10] = ""; char *result = NULL; char *cp; /* make a copy of the filter string, so that strtok can work with it*/ cp = strdup(filter); /* add filters for file extensions */ gtkfilter = gtk_file_filter_new(); gtkfilter_all = gtk_file_filter_new(); /* one filter to show everything */ gtk_file_filter_add_pattern(gtkfilter_all, "*.*"); gtk_file_filter_set_name (gtkfilter_all, "All Files"); /* add filter if present */ result = strtok(cp, space); while( result != NULL ) { snprintf(fileext,10,"*%s",result); result = strtok( NULL, space ); gtk_file_filter_add_pattern(gtkfilter, fileext); }; /* second filter to only show what's useful */ gtk_file_filter_set_name (gtkfilter,filter); if (openMode[0] == 'r') { dialog = gtk_file_chooser_dialog_new (label, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); } else { dialog = gtk_file_chooser_dialog_new (label, NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); /* add filename suggestions */ if (strlen(def) > 0 ) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), def); //gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER (dialog),TRUE); } /* add filters */ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog),gtkfilter_all); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); /* activate filter */ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; FILE *f; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); //see loadgamepopup f = fopen(filename, openMode); if (f == NULL) { DisplayError(_("Failed to open file"), errno); } else { /* TODO add indec */ *fp = f; ASSIGN(*name, filename); ScheduleDelayedEvent(DelayedLoad, 50); } g_free (filename); }; gtk_widget_destroy (dialog); ModeHighlight(); free(cp); return; } xboard-4.7.3/gtk/xoptions.c0000644000175000001440000016301512262562252012547 00000000000000/* * xoptions.c -- Move list window, part of X front end for XBoard * * Copyright 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ // [HGM] this file is the counterpart of woptions.c, containing xboard popup menus // similar to those of WinBoard, to set the most common options interactively. #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include #include #include #include #ifdef __APPLE__ # include #endif #include "common.h" #include "backend.h" #include "xboard.h" #include "xboard2.h" #include "dialogs.h" #include "menus.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif // [HGM] the following code for makng menu popups was cloned from the FileNamePopUp routines #ifdef TODO_GTK static Widget previous = NULL; #endif static Option *currentOption; static Boolean browserUp; void UnCaret () { #ifdef TODO_GTK Arg args[2]; if(previous) { XtSetArg(args[0], XtNdisplayCaret, False); XtSetValues(previous, args, 1); } previous = NULL; #endif } #ifdef TODO_GTK void SetFocus (Widget w, XtPointer data, XEvent *event, Boolean *b) { Arg args[2]; char *s; int j; UnCaret(); XtSetArg(args[0], XtNstring, &s); XtGetValues(w, args, 1); j = 1; XtSetArg(args[0], XtNdisplayCaret, True); if(!strchr(s, '\n') && strlen(s) < 80) XtSetArg(args[1], XtNinsertPosition, strlen(s)), j++; XtSetValues(w, args, j); XtSetKeyboardFocus((Widget) data, w); previous = w; } #endif void BoardFocus () { #ifdef TODO_GTK XtSetKeyboardFocus(shellWidget, formWidget); #endif } //--------------------------- Engine-specific options menu ---------------------------------- int dialogError; Option *dialogOptions[NrOfDialogs]; #ifdef TODO_GTK static Arg layoutArgs[] = { { XtNborderWidth, 0 }, { XtNdefaultDistance, 0 }, }; static Arg formArgs[] = { { XtNborderWidth, 0 }, { XtNresizable, (XtArgVal) True }, }; #endif void MarkMenuItem (char *menuRef, int state) { MenuItem *item = MenuNameToItem(menuRef); if(item) { ((GtkCheckMenuItem *) (item->handle))->active = state; } } void GetWidgetTextGTK(GtkWidget *w, char **buf) { GtkTextIter start; GtkTextIter end; if (GTK_IS_ENTRY(w)) { *buf = (char *) gtk_entry_get_text(GTK_ENTRY (w)); } else if (GTK_IS_TEXT_BUFFER(w)) { gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(w), &start); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(w), &end); *buf = gtk_text_buffer_get_text(GTK_TEXT_BUFFER(w), &start, &end, FALSE); } else { printf("error in GetWidgetText, invalid widget\n"); *buf = NULL; } } void GetWidgetText (Option *opt, char **buf) { int x; static char val[12]; switch(opt->type) { case Fractional: case FileName: case PathName: case TextBox: GetWidgetTextGTK((GtkWidget *) opt->handle, buf); break; case Spin: x = gtk_spin_button_get_value (GTK_SPIN_BUTTON(opt->handle)); snprintf(val, 12, "%d", x); *buf = val; break; default: printf("unexpected case (%d) in GetWidgetText\n", opt->type); *buf = NULL; } } void SetSpinValue(Option *opt, char *val, int n) { if (opt->type == Spin) { if (!strcmp(val, _("Unused"))) gtk_widget_set_sensitive(opt->handle, FALSE); else { gtk_widget_set_sensitive(opt->handle, TRUE); gtk_spin_button_set_value(opt->handle, atoi(val)); } } else printf("error in SetSpinValue, unknown type %d\n", opt->type); } void SetWidgetTextGTK(GtkWidget *w, char *text) { if (GTK_IS_ENTRY(w)) { gtk_entry_set_text (GTK_ENTRY (w), text); } else if (GTK_IS_TEXT_BUFFER(w)) { gtk_text_buffer_set_text(GTK_TEXT_BUFFER(w), text, -1); } else printf("error: SetWidgetTextGTK arg is neitherGtkEntry nor GtkTextBuffer\n"); } void SetWidgetText (Option *opt, char *buf, int n) { switch(opt->type) { case Fractional: case FileName: case PathName: case TextBox: SetWidgetTextGTK((GtkWidget *) opt->handle, buf); break; case Spin: SetSpinValue(opt, buf, n); break; default: printf("unexpected case (%d) in GetWidgetText\n", opt->type); } #ifdef TODO_GTK // focus is automatic in GTK? if(n >= 0) SetFocus(opt->handle, shells[n], NULL, False); #endif } void GetWidgetState (Option *opt, int *state) { *state = gtk_toggle_button_get_active(opt->handle); } void SetWidgetState (Option *opt, int state) { gtk_toggle_button_set_active(opt->handle, state); } void SetWidgetLabel (Option *opt, char *buf) { if(opt->type == Button) // Chat window uses this routine for changing button labels gtk_button_set_label(opt->handle, buf); else gtk_label_set_text(opt->handle, buf); } void SetDialogTitle (DialogClass dlg, char *title) { gtk_window_set_title(GTK_WINDOW(shells[dlg]), title); } void SetListBoxItem (GtkListStore *store, int n, char *msg) { GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_indices(n, -1); gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, path); gtk_tree_path_free(path); gtk_list_store_set(store, &iter, 0, msg, -1); } void LoadListBox (Option *opt, char *emptyText, int n1, int n2) { char **data = (char **) (opt->target); GtkWidget *list = (GtkWidget *) (opt->handle); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list)); GtkListStore *store = GTK_LIST_STORE(model); GtkTreeIter iter; if(n1 >= 0 && n2 >= 0) { SetListBoxItem(store, n1, data[n1]); SetListBoxItem(store, n2, data[n2]); return; } if (gtk_tree_model_get_iter_first(model, &iter)) gtk_list_store_clear(store); while(*data) { // add elements to listbox one by one gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, *data++, -1); // 0 = first column } } void HighlightItem (Option *opt, int index, int scroll) { GtkWidget *list = (GtkWidget *) (opt->handle); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); GtkTreePath *path = gtk_tree_path_new_from_indices(index, -1); gtk_tree_selection_select_path(selection, path); if(scroll) gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(list), path, NULL, 0, 0, 0); gtk_tree_path_free(path); } void HighlightListBoxItem (Option *opt, int index) { HighlightItem (opt, index, FALSE); } void HighlightWithScroll (Option *opt, int index, int max) { HighlightItem (opt, index, TRUE); // ignore max } void ScrollToCursor (Option *opt, int caretPos) { static GtkTextIter iter; static GtkTextMark *mark; if(!mark) mark = gtk_text_mark_new(NULL, 0); gtk_text_buffer_get_iter_at_offset((GtkTextBuffer *) opt->handle, &iter, caretPos); gtk_text_buffer_add_mark((GtkTextBuffer *) opt->handle, mark, &iter); gtk_text_view_scroll_to_mark((GtkTextView *) opt->textValue, mark, 0.0, 0, 0.5, 0.5); // gtk_text_view_scroll_to_iter((GtkTextView *) opt->textValue, &iter, 0.0, 0, 0.5, 0.5); gtk_text_buffer_delete_mark((GtkTextBuffer *) opt->handle, mark); } int SelectedListBoxItem (Option *opt) { int i; char *value, **data = (char **) (opt->target); GtkWidget *list = (GtkWidget *) (opt->handle); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list)); GtkTreeModel *model; GtkTreeIter iter; if (!gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter)) return -1; gtk_tree_model_get(model, &iter, 0, &value, -1); for(i=0; data[i]; i++) if(!strcmp(data[i], value)) return i; g_free(value); return -1; } void FocusOnWidget (Option *opt, DialogClass dlg) { UnCaret(); #ifdef TODO_GTK XtSetKeyboardFocus(shells[dlg], opt->handle); #endif gtk_widget_grab_focus(opt->handle); } void SetIconName (DialogClass dlg, char *name) { #ifdef TODO_GTK Arg args[16]; int j = 0; XtSetArg(args[j], XtNiconName, (XtArgVal) name); j++; // XtSetArg(args[j], XtNtitle, (XtArgVal) name); j++; XtSetValues(shells[dlg], args, j); #endif } void ComboSelect(GtkWidget *widget, gpointer addr) { Option *opt = dialogOptions[((intptr_t)addr)>>8]; // applicable option list gint i = ((intptr_t)addr) & 255; // option number gint g; g = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); values[i] = g; // store in temporary, for transfer at OK #if TODO_GTK // Note: setting text on button is probably automatic // Is this still needed? Could be all comboboxes that needed a callbak are now listboxes! #endif if(opt[i].type == Graph || opt[i].min & COMBO_CALLBACK && (!currentCps || shellUp[BrowserDlg])) { ((ButtonCallback*) opt[i].target)(i); return; } } #ifdef TODO_GTK Widget CreateMenuItem (Widget menu, char *msg, XtCallbackProc CB, int n) { int j=0; Widget entry; Arg args[16]; XtSetArg(args[j], XtNleftMargin, 20); j++; XtSetArg(args[j], XtNrightMargin, 20); j++; if(!strcmp(msg, "----")) { XtCreateManagedWidget(msg, smeLineObjectClass, menu, args, j); return NULL; } XtSetArg(args[j], XtNlabel, msg); entry = XtCreateManagedWidget("item", smeBSBObjectClass, menu, args, j+1); XtAddCallback(entry, XtNcallback, CB, (caddr_t)(intptr_t) n); return entry; } #endif static void MenuSelect (gpointer addr) // callback for all combo items { Option *opt = dialogOptions[((intptr_t)addr)>>24]; // applicable option list int i = ((intptr_t)addr)>>16 & 255; // option number int j = 0xFFFF & (intptr_t) addr; values[i] = j; // store selected value in Option struct, for retrieval at OK ((ButtonCallback*) opt[i].target)(i); } static GtkWidget * CreateMenuPopup (Option *opt, int n, int def) { // fromList determines if the item texts are taken from a list of strings, or from a menu table int i; GtkWidget *menu, *entry; MenuItem *mb = (MenuItem *) opt->choice; menu = gtk_menu_new(); // menu = XtCreatePopupShell(opt->name, simpleMenuWidgetClass, parent, NULL, 0); for (i=0; 1; i++) { char *msg = mb[i].string; if(!msg) break; #ifdef __APPLE__ if(!strcmp(msg, "Quit ")) continue; // Quit item will appear automatically in App menu if(!strcmp(msg, "About XBoard")) msg = "About"; // 'XBoard' will be appended automatically when moved to App menu 1st item #endif if(strcmp(msg, "----")) { // if(!(opt->min & NO_GETTEXT)) msg = _(msg); if(mb[i].handle) { entry = gtk_check_menu_item_new_with_label(msg); // should be used for items that can be checkmarked if(mb[i].handle == RADIO) gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(entry), True); } else entry = gtk_menu_item_new_with_label(msg); gtk_signal_connect_object (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC(MenuSelect), (gpointer) (intptr_t) ((n<<16)+i)); if(mb[i].accel) { guint accelerator_key; GdkModifierType accelerator_mods; gtk_accelerator_parse(mb[i].accel, &accelerator_key, &accelerator_mods); #ifdef __APPLE__ if(accelerator_mods & GDK_CONTROL_MASK) { // in OSX use Meta where Linux uses Ctrl accelerator_mods &= ~GDK_CONTROL_MASK; // clear Ctrl flag accelerator_mods |= GDK_META_MASK; // set Meta flag } #endif gtk_widget_add_accelerator (GTK_WIDGET(entry), "activate",GtkAccelerators, accelerator_key, accelerator_mods, GTK_ACCEL_VISIBLE); } } else entry = gtk_separator_menu_item_new(); gtk_widget_show(entry); gtk_menu_append(GTK_MENU (menu), entry); //CreateMenuItem(menu, opt->min & NO_GETTEXT ? msg : _(msg), (XtCallbackProc) ComboSelect, (n<<16)+i); mb[i].handle = (void*) entry; // save item ID, for enabling / checkmarking // if(i==def) { // XtSetArg(arg, XtNpopupOnEntry, entry); // XtSetValues(menu, &arg, 1); // } } return menu; } Option *icsBox; // kludge to distinguish type-in callback from input-box callback void CursorAtEnd (Option *opt) { gtk_editable_set_position(opt->handle, -1); } static gboolean ICSKeyEvent (int keyval) { // TODO_GTK: arrow-handling should really be integrated in type-in proc, and this should be a backe-end OK handler switch(keyval) { case GDK_Return: IcsKey(0); return TRUE; case GDK_Up: IcsKey(1); return TRUE; case GDK_Down: IcsKey(-1); return TRUE; default: return FALSE; } } int shiftState, controlState; static gboolean TypeInProc (GtkWidget *widget, GdkEventKey *event, gpointer gdata) { // This callback catches key presses on text-entries, and uses and as synonyms for dialog OK or Cancel // *** kludge alert *** If a dialog does want some other action, like sending the line typed in the text-entry to an ICS, // it should define an OK handler that does so, and returns FALSE to suppress the popdown. int n = (intptr_t) gdata; int dlg = n >> 16; Option *opt; n &= 0xFFFF; opt = &dialogOptions[dlg][n]; if(opt == icsBox) return ICSKeyEvent(event->keyval); // Intercept ICS Input Box, which needs special treatment shiftState = event->state & GDK_SHIFT_MASK; controlState = event->state & GDK_CONTROL_MASK; switch(event->keyval) { case GDK_Return: if(GenericReadout(dialogOptions[dlg], -1)) PopDown(dlg); break; case GDK_Escape: PopDown(dlg); break; default: return FALSE; } return TRUE; } void HighlightText (Option *opt, int from, int to, Boolean highlight) { # define INIT 0x8000 static GtkTextIter start, end; if(!(opt->min & INIT)) { opt->min |= INIT; // each memo its own init flag! gtk_text_buffer_create_tag(opt->handle, "highlight", "background", "yellow", NULL); gtk_text_buffer_create_tag(opt->handle, "normal", "background", "white", NULL); } gtk_text_buffer_get_iter_at_offset(opt->handle, &start, from); gtk_text_buffer_get_iter_at_offset(opt->handle, &end, to); gtk_text_buffer_apply_tag_by_name(opt->handle, highlight ? "highlight" : "normal", &start, &end); } int ShiftKeys () { // bassic primitive for determining if modifier keys are pressed return 3*(shiftState != 0) + 0xC*(controlState != 0); // rely on what last mouse button press left us } static gboolean GameListEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) { int n = (intptr_t) gdata; if(n == 4) { if(((GdkEventKey *) event)->keyval != GDK_Return) return FALSE; SetFilter(); return TRUE; } if(event->type == GDK_KEY_PRESS) { int ctrl = (((GdkEventKey *) event)->state & GDK_CONTROL_MASK) != 0; switch(((GdkEventKey *) event)->keyval) { case GDK_Up: GameListClicks(-1 - 2*ctrl); return TRUE; case GDK_Left: GameListClicks(-1); return TRUE; case GDK_Down: GameListClicks(1 + 2*ctrl); return TRUE; case GDK_Right: GameListClicks(1); return TRUE; case GDK_Prior: GameListClicks(-4); return TRUE; case GDK_Next: GameListClicks(4); return TRUE; case GDK_Home: GameListClicks(-2); return TRUE; case GDK_End: GameListClicks(2); return TRUE; case GDK_Return: GameListClicks(0); return TRUE; default: return FALSE; } } if(event->type != GDK_2BUTTON_PRESS || ((GdkEventButton *) event)->button != 1) return FALSE; GameListClicks(0); return TRUE; } static gboolean MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) { // handle mouse clicks on text widgets that need it int w, h; int button=10, f=1; Option *memo = (Option *) gdata; MemoCallback *userHandler = (MemoCallback *) memo->choice; GdkEventButton *bevent = (GdkEventButton *) event; GdkEventMotion *mevent = (GdkEventMotion *) event; GtkTextIter start, end; String val = NULL; gboolean res; gint index = 0, x, y; switch(event->type) { // figure out what's up case GDK_MOTION_NOTIFY: f = 0; w = mevent->x; h = mevent->y; break; case GDK_BUTTON_RELEASE: f = -1; // release indicated by negative button numbers w = bevent->x; h = bevent->y; button = bevent->button; break; case GDK_BUTTON_PRESS: w = bevent->x; h = bevent->y; button = bevent->button; shiftState = bevent->state & GDK_SHIFT_MASK; controlState = bevent->state & GDK_CONTROL_MASK; if(memo->type == Label) { // only clock widgets use this ((ButtonCallback*) memo->target)(button == 1 ? memo->value : -memo->value); return TRUE; } // GTK_TODO: is this really the most efficient way to get the character at the mouse cursor??? gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_WIDGET, w, h, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &start, x, y); gtk_text_buffer_place_cursor(memo->handle, &start); /* get cursor position into index */ g_object_get(memo->handle, "cursor-position", &index, NULL); /* get text from textbuffer */ gtk_text_buffer_get_start_iter (memo->handle, &start); gtk_text_buffer_get_end_iter (memo->handle, &end); val = gtk_text_buffer_get_text (memo->handle, &start, &end, FALSE); break; default: return FALSE; // should not happen } button *= f; // hand click parameters as well as text & location to user res = (userHandler) (memo, button, w, h, val, index); if(val) g_free(val); return res; } void AddHandler (Option *opt, DialogClass dlg, int nr) { switch(nr) { case 0: // history (now uses generic textview callback) case 1: // comment (likewise) break; case 3: // input box icsBox = opt; case 2: // move type-in g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (TypeInProc), (gpointer) (dlg<<16 | (opt - dialogOptions[dlg]))); break; case 5: // game list g_signal_connect(opt->handle, "button-press-event", G_CALLBACK (GameListEvent), (gpointer) 0 ); case 4: // game-list filter g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (GameListEvent), (gpointer) (intptr_t) nr ); break; case 6: // engine output (uses generic textview callback) break; } } //----------------------------Generic dialog -------------------------------------------- // cloned from Engine Settings dialog (and later merged with it) GtkWidget *shells[NrOfDialogs]; DialogClass parents[NrOfDialogs]; WindowPlacement *wp[NrOfDialogs] = { // Beware! Order must correspond to DialogClass enum NULL, &wpComment, &wpTags, NULL, NULL, NULL, &wpDualBoard, &wpMoveHistory, &wpGameList, &wpEngineOutput, &wpEvalGraph, NULL, NULL, NULL, NULL, &wpMain }; int DialogExists (DialogClass n) { // accessor for use in back-end return shells[n] != NULL; } void RaiseWindow (DialogClass dlg) { #ifdef TODO_GTK static XEvent xev; Window root = RootWindow(xDisplay, DefaultScreen(xDisplay)); Atom atom = XInternAtom (xDisplay, "_NET_ACTIVE_WINDOW", False); xev.xclient.type = ClientMessage; xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.display = xDisplay; xev.xclient.window = XtWindow(shells[dlg]); xev.xclient.message_type = atom; xev.xclient.format = 32; xev.xclient.data.l[0] = 1; xev.xclient.data.l[1] = CurrentTime; XSendEvent (xDisplay, root, False,static gboolean MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata) SubstructureRedirectMask | SubstructureNotifyMask, &xev); XFlush(xDisplay); XSync(xDisplay, False); #endif } int PopDown (DialogClass n) { //Arg args[10]; if (!shellUp[n] || !shells[n]) return 0; if(n && wp[n]) { // remember position GetActualPlacement(shells[n], wp[n]); } gtk_widget_hide(shells[n]); shellUp[n]--; // count rather than clear if(n == 0 || n >= PromoDlg) { gtk_widget_destroy(shells[n]); shells[n] = NULL; } if(marked[n]) { MarkMenuItem(marked[n], False); marked[n] = NULL; } if(!n) currentCps = NULL; // if an Engine Settings dialog was up, we must be popping it down now currentOption = dialogOptions[TransientDlg]; // just in case a transient dialog was up (to allow its check and combo callbacks to work) #ifdef TODO_GTK RaiseWindow(parents[n]); // automatic in GTK? if(parents[n] == BoardWindow) XtSetKeyboardFocus(shellWidget, formWidget); // also automatic??? #endif return 1; } /* GTK callback used when OK/cancel clicked in genericpopup for non-modal dialog */ gboolean GenericPopDown(w, resptype, gdata) GtkWidget *w; GtkResponseType resptype; gpointer gdata; { DialogClass dlg = (intptr_t) gdata; /* dialog number dlgnr */ GtkWidget *sh = shells[dlg]; currentOption = dialogOptions[dlg]; #ifdef TODO_GTK // I guess BrowserDlg will be abandoned, as GTK has a better browser of its own if(shellUp[BrowserDlg] && dlg != BrowserDlg || dialogError) return True; // prevent closing dialog when it has an open file-browse daughter #else if(browserUp || dialogError && dlg != FatalDlg) return True; // prevent closing dialog when it has an open file-browse or error-popup daughter #endif shells[dlg] = w; // make sure we pop down the right one in case of multiple instances /* OK pressed */ if (resptype == GTK_RESPONSE_ACCEPT) { if (GenericReadout(currentOption, -1)) PopDown(dlg); return TRUE; } else /* cancel pressed */ { if(dlg == BoardWindow) ExitEvent(0); PopDown(dlg); } shells[dlg] = sh; // restore return TRUE; } int AppendText(Option *opt, char *s) { char *v; int len; GtkTextIter end; GetWidgetTextGTK(opt->handle, &v); len = strlen(v); g_free(v); gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(opt->handle), &end); gtk_text_buffer_insert(opt->handle, &end, s, -1); return len; } void SetColor (char *colorName, Option *box) { // sets the color of a widget GdkColor color; /* set the colour of the colour button to the colour that will be used */ gdk_color_parse( colorName, &color ); gtk_widget_modify_bg ( GTK_WIDGET(box->handle), GTK_STATE_NORMAL, &color ); } #ifdef TODO_GTK void ColorChanged (Widget w, XtPointer data, XEvent *event, Boolean *b) { // for detecting a typed change in color char buf[10]; if ( (XLookupString(&(event->xkey), buf, 2, NULL, NULL) == 1) && *buf == '\r' ) RefreshColor((int)(intptr_t) data, 0); } #endif static void GraphEventProc(GtkWidget *widget, GdkEvent *event, gpointer gdata) { // handle expose and mouse events on Graph widget int w, h; int button=10, f=1, sizing=0; Option *opt, *graph = (Option *) gdata; PointerCallback *userHandler = graph->target; GdkEventExpose *eevent = (GdkEventExpose *) event; GdkEventButton *bevent = (GdkEventButton *) event; GdkEventMotion *mevent = (GdkEventMotion *) event; GtkAllocation a; cairo_t *cr; // if (!XtIsRealized(widget)) return; switch(event->type) { case GDK_EXPOSE: // make handling of expose events generic, just copying from memory buffer (->choice) to display (->textValue) /* Get window size */ gtk_widget_get_allocation(widget, &a); w = a.width; h = a.height; //printf("expose %dx%d @ (%d,%d): %dx%d @(%d,%d)\n", w, h, a.x, a.y, eevent->area.width, eevent->area.height, eevent->area.x, eevent->area.y); #ifdef TODO_GTK j = 0; XtSetArg(args[j], XtNwidth, &w); j++; XtSetArg(args[j], XtNheight, &h); j++; XtGetValues(widget, args, j); #endif if(w < graph->max || w > graph->max + 1 || h != graph->value) { // use width fudge of 1 pixel if(eevent->count >= 0) { // suppress sizing on expose for ordered redraw in response to sizing. sizing = 1; graph->max = w; graph->value = h; // note: old values are kept if we we don't exceed width fudge } } else w = graph->max; if(sizing && eevent->count > 0) { graph->max = 0; return; } // don't bother if further exposure is pending during resize #ifdef TODO_GTK if(!graph->textValue || sizing) { // create surfaces of new size for display widget if(graph->textValue) cairo_surface_destroy((cairo_surface_t *)graph->textValue); graph->textValue = (char*) cairo_xlib_surface_create(xDisplay, XtWindow(widget), DefaultVisual(xDisplay, 0), w, h); } #endif if(sizing) { // the memory buffer was already created in GenericPopup(), // to give drawing routines opportunity to use it before first expose event // (which are only processed when main gets to the event loop, so after all init!) // so only change when size is no longer good cairo_t *cr; if(graph->choice) cairo_surface_destroy((cairo_surface_t *) graph->choice); graph->choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); // paint white, to prevent weirdness when people maximize window and drag pieces over space next to board cr = cairo_create ((cairo_surface_t *) graph->choice); cairo_rectangle (cr, 0, 0, w, h); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0); cairo_fill(cr); cairo_destroy (cr); break; } w = eevent->area.width; if(eevent->area.x + w > graph->max) w--; // cut off fudge pixel cr = gdk_cairo_create(((GtkWidget *) (graph->handle))->window); cairo_set_source_surface(cr, (cairo_surface_t *) graph->choice, 0, 0); //cairo_set_source_rgb(cr, 1, 0, 0); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); cairo_rectangle(cr, eevent->area.x, eevent->area.y, w, eevent->area.height); cairo_fill(cr); cairo_destroy(cr); default: return; case GDK_MOTION_NOTIFY: f = 0; w = mevent->x; h = mevent->y; break; case GDK_BUTTON_RELEASE: f = -1; // release indicated by negative button numbers case GDK_BUTTON_PRESS: w = bevent->x; h = bevent->y; button = bevent->button; shiftState = bevent->state & GDK_SHIFT_MASK; controlState = bevent->state & GDK_CONTROL_MASK; } button *= f; opt = userHandler(button, w, h); #ifdef TODO_GTK if(opt) { // user callback specifies a context menu; pop it up XUngrabPointer(xDisplay, CurrentTime); XtCallActionProc(widget, "XawPositionSimpleMenu", event, &(opt->name), 1); XtPopupSpringLoaded(opt->handle); } XSync(xDisplay, False); #endif } void GraphExpose (Option *opt, int x, int y, int w, int h) { #if 0 GdkRectangle r; r.x = x; r.y = y; r.width = w; r.height = h; gdk_window_invalidate_rect(((GtkWidget *)(opt->handle))->window, &r, FALSE); #endif GdkEventExpose e; if(!opt->handle) return; e.area.x = x; e.area.y = y; e.area.width = w; e.area.height = h; e.count = -1; e.type = GDK_EXPOSE; // count = -1: kludge to suppress sizing GraphEventProc(opt->handle, (GdkEvent *) &e, (gpointer) opt); // fake expose event } void GenericCallback(GtkWidget *widget, gpointer gdata) { const gchar *name; char buf[MSG_SIZ]; int data = (intptr_t) gdata; DialogClass dlg; #ifdef TODO_GTK GtkWidget *sh = XtParent(XtParent(XtParent(w))), *oldSh; #else GtkWidget *sh, *oldSh; #endif currentOption = dialogOptions[dlg=data>>16]; data &= 0xFFFF; #ifndef TODO_GTK sh = shells[dlg]; // make following line a no-op, as we haven't found out what the real shell is yet (breaks multiple popups of same type!) #endif oldSh = shells[dlg]; shells[dlg] = sh; // bow to reality if (data == 30000) { // cancel PopDown(dlg); } else if (data == 30001) { // save buttons imply OK if(GenericReadout(currentOption, -1)) PopDown(dlg); // calls OK-proc after full readout, but no popdown if it returns false } else if(currentCps) { name = gtk_button_get_label (GTK_BUTTON(widget)); if(currentOption[data].type == SaveButton) GenericReadout(currentOption, -1); snprintf(buf, MSG_SIZ, "option %s\n", name); SendToProgram(buf, currentCps); } else ((ButtonCallback*) currentOption[data].target)(data); shells[dlg] = oldSh; // in case of multiple instances, restore previous (as this one could be popped down now) } void BrowseGTK(GtkWidget *widget, gpointer gdata) { GtkWidget *entry; GtkWidget *dialog; GtkFileFilter *gtkfilter; GtkFileFilter *gtkfilter_all; int opt_i = (intptr_t) gdata; GtkFileChooserAction fc_action; gtkfilter = gtk_file_filter_new(); gtkfilter_all = gtk_file_filter_new(); char fileext[MSG_SIZ]; /* select file or folder depending on option_type */ if (currentOption[opt_i].type == PathName) fc_action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; else fc_action = GTK_FILE_CHOOSER_ACTION_OPEN; dialog = gtk_file_chooser_dialog_new ("Open File", NULL, fc_action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); /* one filter to show everything */ gtk_file_filter_add_pattern(gtkfilter_all, "*"); gtk_file_filter_set_name (gtkfilter_all, "All Files"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),gtkfilter_all); /* filter for specific filetypes e.g. pgn or fen */ if (currentOption[opt_i].textValue != NULL) { char *q, *p = currentOption[opt_i].textValue; gtk_file_filter_set_name (gtkfilter, p); while(*p) { snprintf(fileext, MSG_SIZ, "*%s", p); while(*p) if(*p++ == ' ') break; for(q=fileext; *q; q++) if(*q == ' ') { *q = NULLCHAR; break; } gtk_file_filter_add_pattern(gtkfilter, fileext); } gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); /* activate filter */ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog),gtkfilter); } else gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog),gtkfilter_all); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); entry = currentOption[opt_i].handle; gtk_entry_set_text (GTK_ENTRY (entry), filename); g_free (filename); } gtk_widget_destroy (dialog); dialog = NULL; } gboolean ListCallback (GtkWidget *widget, GdkEventButton *event, gpointer gdata) { int n = (intptr_t) gdata & 0xFFFF; int dlg = (intptr_t) gdata >> 16; Option *opt = dialogOptions[dlg] + n; if(event->type != GDK_2BUTTON_PRESS || event->button != 1) return FALSE; ((ListBoxCallback*) opt->textValue)(n, SelectedListBoxItem(opt)); return TRUE; } #ifdef TODO_GTK // This is needed for color pickers? static char *oneLiner = "Return: redraw-display() \n \ Tab: TabProc() \n "; #endif #ifdef TODO_GTK static void SqueezeIntoBox (Option *opt, int nr, int width) { // size buttons in bar to fit, clipping button names where necessary int i, wtot = 0; Dimension widths[20], oldWidths[20]; Arg arg; for(i=1; imin = wtot; if(width <= 0) return; while(wtot > width) { int wmax=0, imax=0; for(i=1; i wmax) wmax = widths[imax=i]; widths[imax]--; wtot--; } for(i=1; imin = wtot; } #endif #ifdef TODO_GTK int SetPositionAndSize (Arg *args, Widget leftNeigbor, Widget topNeigbor, int b, int w, int h, int chaining) { // sizing and positioning most widgets have in common int j = 0; // first position the widget w.r.t. earlier ones if(chaining & 1) { // same row: position w.r.t. last (on current row) and lastrow XtSetArg(args[j], XtNfromVert, topNeigbor); j++; XtSetArg(args[j], XtNfromHoriz, leftNeigbor); j++; } else // otherwise it goes at left margin (which is default), below the previous element XtSetArg(args[j], XtNfromVert, leftNeigbor), j++; // arrange chaining ('2'-bit indicates top and bottom chain the same) if((chaining & 14) == 6) XtSetArg(args[j], XtNtop, XtChainBottom), j++; if((chaining & 14) == 10) XtSetArg(args[j], XtNbottom, XtChainTop ), j++; if(chaining & 4) XtSetArg(args[j], XtNbottom, XtChainBottom ), j++; if(chaining & 8) XtSetArg(args[j], XtNtop, XtChainTop), j++; if(chaining & 0x10) XtSetArg(args[j], XtNright, XtChainRight), j++; if(chaining & 0x20) XtSetArg(args[j], XtNleft, XtChainRight), j++; if(chaining & 0x40) XtSetArg(args[j], XtNright, XtChainLeft ), j++; if(chaining & 0x80) XtSetArg(args[j], XtNleft, XtChainLeft ), j++; // set size (if given) if(w) XtSetArg(args[j], XtNwidth, w), j++; if(h) XtSetArg(args[j], XtNheight, h), j++; // color if(!appData.monoMode) { if(!b && appData.dialogColor[0]) XtSetArg(args[j], XtNbackground, dialogColor), j++; if(b == 3 && appData.buttonColor[0]) XtSetArg(args[j], XtNbackground, buttonColor), j++; } if(b == 3) b = 1; // border XtSetArg(args[j], XtNborderWidth, b); j++; return j; } #endif static int TableWidth (Option *opt) { // Hideous work-around! If the table is 3 columns, but 2 & 3 are always occupied together, the fixing of the width of column 1 does not work while(opt->type != EndMark && opt->type != Break) if(opt->type == FileName || opt->type == PathName || opt++->type == BarBegin) return 3; // This table needs browse button return 2; // no browse button; } static int SameRow (Option *opt) { return (opt->min & SAME_ROW && (opt->type == Button || opt->type == SaveButton || opt->type == Label || opt->type == ListBox || opt->type == BoxBegin || opt->type == Icon || opt->type == Graph)); } static void Pack (GtkWidget *hbox, GtkWidget *table, GtkWidget *entry, int left, int right, int top, GtkAttachOptions vExpand) { if(hbox) gtk_box_pack_start(GTK_BOX (hbox), entry, TRUE, TRUE, 0); else gtk_table_attach(GTK_TABLE(table), entry, left, right, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL | vExpand, 2, 1); } int GenericPopUp (Option *option, char *title, DialogClass dlgNr, DialogClass parent, int modal, int topLevel) { GtkWidget *dialog = NULL; gint w; GtkWidget *label; GtkWidget *box; GtkWidget *checkbutton; GtkWidget *entry; GtkWidget *oldHbox = NULL, *hbox = NULL; GtkWidget *pane = NULL; GtkWidget *button; GtkWidget *table; GtkWidget *spinner; GtkAdjustment *spinner_adj; GtkWidget *combobox; GtkWidget *textview; GtkTextBuffer *textbuffer; GdkColor color; GtkWidget *actionarea; GtkWidget *sw; GtkWidget *list; GtkWidget *graph; GtkWidget *menuButton; GtkWidget *menuBar = NULL; GtkWidget *menu; int i, j, arraysize, left, top, height=999, width=1, boxStart=0, breakType = 0, r; char def[MSG_SIZ], *msg, engineDlg = (currentCps != NULL && dlgNr != BrowserDlg); if(dlgNr < PromoDlg && shellUp[dlgNr]) return 0; // already up if(dlgNr && dlgNr < PromoDlg && shells[dlgNr]) { // reusable, and used before (but popped down) gtk_widget_show(shells[dlgNr]); shellUp[dlgNr] = True; if(wp[dlgNr]) gtk_window_move(GTK_WINDOW(shells[dlgNr]), wp[dlgNr]->x, wp[dlgNr]->y); return 0; } dialogOptions[dlgNr] = option; // make available to callback // post currentOption globally, so Spin and Combo callbacks can already use it // WARNING: this kludge does not work for persistent dialogs, so that these cannot have spin or combo controls! currentOption = option; if(engineDlg) { // Settings popup for engine: format through heuristic int n = currentCps->nrOptions; // if(n > 50) width = 4; else if(n>24) width = 2; else width = 1; width = n / 20 + 1; height = n / width + 1; if(appData.debugMode) printf("n=%d, h=%d, w=%d\n",n,height,width); // if(n && (currentOption[n-1].type == Button || currentOption[n-1].type == SaveButton)) currentOption[n].min = SAME_ROW; // OK on same line currentOption[n].type = EndMark; currentOption[n].target = NULL; // delimit list by callback-less end mark } parents[dlgNr] = parent; #ifdef TODO_GTK shells[BoardWindow] = shellWidget; parents[dlgNr] = parent; if(dlgNr == BoardWindow) dialog = shellWidget; else dialog = XtCreatePopupShell(title, !top || !appData.topLevel ? transientShellWidgetClass : topLevelShellWidgetClass, shells[parent], args, i); #endif if(topLevel) { dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(dialog), title); box = gtk_vbox_new(FALSE,0); gtk_container_add (GTK_CONTAINER (dialog), box); } else { dialog = gtk_dialog_new_with_buttons( title, GTK_WINDOW(shells[parent]), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR | (modal ? GTK_DIALOG_MODAL : 0), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); box = gtk_dialog_get_content_area( GTK_DIALOG( dialog ) ); } shells[dlgNr] = dialog; // gtk_box_set_spacing(GTK_BOX(box), 5); arraysize = 0; for (i=0;option[i].type != EndMark;i++) { arraysize++; } table = gtk_table_new(arraysize, r=TableWidth(option), FALSE); left = 0; top = -1; for (i=0;option[i].type != EndMark;i++) { if(option[i].type == -1) continue; top++; //printf("option =%2d, top =%2d\n", i, top); if (top >= height) { gtk_table_resize(GTK_TABLE(table), height, r); if(!pane) { // multi-column: put tables in intermediate hbox if(breakType || engineDlg) pane = gtk_hbox_new (FALSE, 0); else pane = gtk_vbox_new (FALSE, 0); gtk_box_set_spacing(GTK_BOX(pane), 5 + 5*breakType); gtk_box_pack_start (GTK_BOX (/*GTK_DIALOG (dialog)->vbox*/box), pane, TRUE, TRUE, 0); } gtk_box_pack_start (GTK_BOX (pane), table, TRUE, TRUE, 0); table = gtk_table_new(arraysize - i, r=TableWidth(option + i), FALSE); top = 0; } if(!SameRow(&option[i])) { if(SameRow(&option[i+1])) { GtkAttachOptions x = GTK_FILL; // make sure hbox is always available when we have more options on same row hbox = gtk_hbox_new (option[i].type == Button && option[i].textValue || option[i].type == Graph, 0); if(!currentCps && option[i].value > 80) x |= GTK_EXPAND; // only vertically extended widgets should size vertically if (strcmp(option[i].name, "") == 0 || option[i].type == Label || option[i].type == Button) // for Label and Button name is contained inside option gtk_table_attach(GTK_TABLE(table), hbox, left, left+r, top, top+1, GTK_FILL | GTK_EXPAND, x, 2, 1); else gtk_table_attach(GTK_TABLE(table), hbox, left+1, left+r, top, top+1, GTK_FILL | GTK_EXPAND, x, 2, 1); } else hbox = NULL; //and also make sure no hbox exists if only singl option on row } else top--; switch(option[i].type) { case Fractional: snprintf(def, MSG_SIZ, "%.2f", *(float*)option[i].target); option[i].value = *(float*)option[i].target; goto tBox; case Spin: if(!currentCps) option[i].value = *(int*)option[i].target; snprintf(def, MSG_SIZ, "%d", option[i].value); case TextBox: case FileName: case PathName: tBox: label = gtk_label_new(option[i].name); /* Left Justify */ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); /* width */ w = option[i].type == Spin || option[i].type == Fractional ? 70 : option[i].max ? option[i].max : 205; if(option[i].type == FileName || option[i].type == PathName) w -= 55; if (option[i].type==TextBox && option[i].value > 80){ textview = gtk_text_view_new(); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), option[i].min & T_WRAP ? GTK_WRAP_WORD : GTK_WRAP_NONE); #ifdef TODO_GTK if(option[i].min & T_FILL) { XtSetArg(args[j], XtNautoFill, True); j++; } if(option[i].min & T_TOP) { XtSetArg(args[j], XtNtop, XtChainTop); j++; #endif /* add textview to scrolled window so we have vertical scroll bar */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), option[i].min & T_HSCRL ? GTK_POLICY_ALWAYS : GTK_POLICY_AUTOMATIC, option[i].min & T_VSCRL ? GTK_POLICY_ALWAYS : GTK_POLICY_NEVER); gtk_container_add(GTK_CONTAINER(sw), textview); gtk_widget_set_size_request(GTK_WIDGET(sw), w, -1); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_OUT); textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); /* check if label is empty */ if (strcmp(option[i].name,"") != 0) { gtk_table_attach(GTK_TABLE(table), label, left, left+1, top, top+1, GTK_FILL, GTK_FILL, 2, 1); Pack(hbox, table, sw, left+1, left+r, top, 0); } else { /* no label so let textview occupy all columns */ Pack(hbox, table, sw, left, left+r, top, GTK_EXPAND); } if ( *(char**)option[i].target != NULL ) gtk_text_buffer_set_text (textbuffer, *(char**)option[i].target, -1); else gtk_text_buffer_set_text (textbuffer, "", -1); option[i].handle = (void*)textbuffer; option[i].textValue = (char*)textview; if(option[i].choice) { // textviews can request a handler for mouse events in the choice field g_signal_connect(textview, "button-press-event", G_CALLBACK (MemoEvent), (gpointer) &option[i] ); g_signal_connect(textview, "button-release-event", G_CALLBACK (MemoEvent), (gpointer) &option[i] ); g_signal_connect(textview, "motion-notify-event", G_CALLBACK (MemoEvent), (gpointer) &option[i] ); } break; } entry = gtk_entry_new(); if (option[i].type==Spin || option[i].type==Fractional) gtk_entry_set_text (GTK_ENTRY (entry), def); else if (currentCps) gtk_entry_set_text (GTK_ENTRY (entry), option[i].textValue); else if ( *(char**)option[i].target != NULL ) gtk_entry_set_text (GTK_ENTRY (entry), *(char**)option[i].target); //gtk_entry_set_width_chars (GTK_ENTRY (entry), 18); gtk_entry_set_max_length (GTK_ENTRY (entry), w); // left, right, top, bottom if (strcmp(option[i].name, "") != 0) gtk_table_attach(GTK_TABLE(table), label, left, left+1, top, top+1, GTK_FILL, GTK_FILL, 2, 1); // leading names do not expand if (option[i].type == Spin) { spinner_adj = (GtkAdjustment *) gtk_adjustment_new (option[i].value, option[i].min, option[i].max, 1.0, 0.0, 0.0); spinner = gtk_spin_button_new (spinner_adj, 1.0, 0); gtk_table_attach(GTK_TABLE(table), spinner, left+1, left+r, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1); option[i].handle = (void*)spinner; } else if (option[i].type == FileName || option[i].type == PathName) { gtk_table_attach(GTK_TABLE(table), entry, left+1, left+2, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1); button = gtk_button_new_with_label ("Browse"); gtk_table_attach(GTK_TABLE(table), button, left+2, left+r, top, top+1, GTK_FILL, GTK_FILL, 2, 1); // Browse button does not expand g_signal_connect (button, "clicked", G_CALLBACK (BrowseGTK), (gpointer)(intptr_t) i); option[i].handle = (void*)entry; } else { Pack(hbox, table, entry, left + (strcmp(option[i].name, "") != 0), left+r, top, 0); option[i].handle = (void*)entry; } break; case CheckBox: checkbutton = gtk_check_button_new_with_label(option[i].name); if(!currentCps) option[i].value = *(Boolean*)option[i].target; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), option[i].value); gtk_table_attach(GTK_TABLE(table), checkbutton, left, left+r, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 0); option[i].handle = (void *)checkbutton; break; case Icon: option[i].handle = (void *) (label = gtk_image_new_from_pixbuf(NULL)); gtk_widget_set_size_request(label, option[i].max ? option[i].max : -1, -1); Pack(hbox, table, label, left, left+2, top, 0); break; case Label: option[i].handle = (void *) (label = gtk_label_new(option[i].name)); /* Left Justify */ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); if(option[i].min & BORDER) { GtkWidget *frame = gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(frame), label); label = frame; } gtk_widget_set_size_request(label, option[i].max ? option[i].max : -1, -1); if(option[i].target) { // allow user to specify event handler for button presses button = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(button), label); label = button; gtk_widget_add_events(GTK_WIDGET(label), GDK_BUTTON_PRESS_MASK); g_signal_connect(label, "button-press-event", G_CALLBACK(MemoEvent), (gpointer) &option[i]); gtk_widget_set_sensitive(label, TRUE); } Pack(hbox, table, label, left, left+2, top, 0); break; case SaveButton: case Button: button = gtk_button_new_with_label (option[i].name); /* set button color on view board dialog */ if(option[i].choice && ((char*)option[i].choice)[0] == '#' && !currentCps) { gdk_color_parse( *(char**) option[i-1].target, &color ); gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color ); } /* set button color on new variant dialog */ if(option[i].textValue) { gdk_color_parse( option[i].textValue, &color ); gtk_widget_modify_bg ( GTK_WIDGET(button), GTK_STATE_NORMAL, &color ); gtk_widget_set_sensitive(button, option[i].value >= 0 && (appData.noChessProgram || strstr(first.variants, VariantName(option[i].value)))); } Pack(hbox, table, button, left, left+1, top, 0); g_signal_connect (button, "clicked", G_CALLBACK (GenericCallback), (gpointer)(intptr_t) i + (dlgNr<<16)); option[i].handle = (void*)button; break; case ComboBox: label = gtk_label_new(option[i].name); /* Left Justify */ gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, left, left+1, top, top+1, GTK_FILL, GTK_FILL, 2, 1); combobox = gtk_combo_box_new_text(); for(j=0;;j++) { if ( ((char **) option[i].textValue)[j] == NULL) break; gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), ((char **) option[i].choice)[j]); } if(currentCps) option[i].choice = (char**) option[i].textValue; else { for(j=0; option[i].choice[j]; j++) { if(*(char**)option[i].target && !strcmp(*(char**)option[i].target, ((char**)(option[i].textValue))[j])) break; } /* If choice is NULL set to first */ if (option[i].choice[j] == NULL) option[i].value = 0; else option[i].value = j; } //option[i].value = j + (option[i].choice[j] == NULL); gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), option[i].value); Pack(hbox, table, combobox, left+1, left+r, top, 0); g_signal_connect(G_OBJECT(combobox), "changed", G_CALLBACK(ComboSelect), (gpointer) (intptr_t) (i + 256*dlgNr)); option[i].handle = (void*)combobox; values[i] = option[i].value; break; case ListBox: { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *store; option[i].handle = (void *) (list = gtk_tree_view_new()); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("List Items", renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); store = gtk_list_store_new(1, G_TYPE_STRING); // 1 column of text gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); g_object_unref(store); LoadListBox(&option[i], "?", -1, -1); HighlightListBoxItem(&option[i], 0); /* add listbox to scrolled window so we have vertical scroll bar */ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(sw), list); gtk_widget_set_size_request(GTK_WIDGET(sw), option[i].max ? option[i].max : -1, option[i].value ? option[i].value : -1); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_OUT); if(option[i].textValue) // generic callback for double-clicking listbox item g_signal_connect(list, "button-press-event", G_CALLBACK(ListCallback), (gpointer) (intptr_t) (dlgNr<<16 | i) ); /* never has label, so let listbox occupy all columns */ Pack(hbox, table, sw, left, left+r, top, GTK_EXPAND); } break; case Graph: option[i].handle = (void*) (graph = gtk_drawing_area_new()); // gtk_widget_set_size_request(graph, option[i].max, option[i].value); if(0){ GtkAllocation a; a.x = 0; a.y = 0; a.width = option[i].max, a.height = option[i].value; gtk_widget_set_allocation(graph, &a); } g_signal_connect (graph, "expose-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]); gtk_widget_add_events(GTK_WIDGET(graph), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); g_signal_connect (graph, "button-press-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]); g_signal_connect (graph, "button-release-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]); g_signal_connect (graph, "motion-notify-event", G_CALLBACK (GraphEventProc), (gpointer) &option[i]); if(option[i].min & FIX_H) { // logo GtkWidget *frame = gtk_aspect_frame_new(NULL, 0.5, 0.5, option[i].max/(float)option[i].value, FALSE); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(frame), graph); graph = frame; } Pack(hbox, table, graph, left, left+r, top, GTK_EXPAND); #ifdef TODO_GTK if(option[i].min & SAME_ROW) last = forelast, forelast = lastrow; #endif option[i].choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, option[i].max, option[i].value); // image buffer break; #ifdef TODO_GTK case PopUp: // note: used only after Graph, so 'last' refers to the Graph widget option[i].handle = (void*) CreateComboPopup(last, option + i, i + 256*dlgNr, TRUE, option[i].value); break; #endif case DropDown: top--; msg = _(option[i].name); // write name on the menu button // XtSetArg(args[j], XtNmenuName, XtNewString(option[i].name)); j++; // XtSetArg(args[j], XtNlabel, msg); j++; option[i].handle = (void*) (menuButton = gtk_menu_item_new_with_label(msg)); gtk_widget_show(menuButton); option[i].textValue = (char*) (menu = CreateMenuPopup(option + i, i + 256*dlgNr, -1)); gtk_menu_item_set_submenu(GTK_MENU_ITEM (menuButton), menu); gtk_menu_bar_append (GTK_MENU_BAR (menuBar), menuButton); break; case BarBegin: menuBar = gtk_menu_bar_new (); gtk_widget_show (menuBar); boxStart = i; break; case BoxBegin: option[i+1].min |= SAME_ROW; // kludge to suppress allocation of new hbox oldHbox = hbox; option[i].handle = (void*) (hbox = gtk_hbox_new(FALSE, 0)); // hbox to collect buttons gtk_box_pack_start(GTK_BOX (oldHbox), hbox, FALSE, TRUE, 0); // *** Beware! Assumes button bar always on same row with other! *** // gtk_table_attach(GTK_TABLE(table), hbox, left+2, left+3, top, top+1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 1); boxStart = i; break; case BarEnd: top--; #ifndef __APPLE__ gtk_table_attach(GTK_TABLE(table), menuBar, left, left+r, top, top+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 1); if(option[i].target) ((ButtonCallback*)option[i].target)(boxStart); // callback that can make sizing decisions #else top--; // in OSX menu bar is not put in window, so also don't count it { // in stead, offer it to OSX, and move About item to top of App menu GtkosxApplication *theApp = g_object_new(GTKOSX_TYPE_APPLICATION, NULL); extern MenuItem helpMenu[]; // oh, well... Adding items in help menu breaks this anyway gtk_widget_hide (menuBar); gtkosx_application_set_menu_bar(theApp, GTK_MENU_SHELL(menuBar)); gtkosx_application_insert_app_menu_item(theApp, GTK_MENU_ITEM(helpMenu[8].handle), 0); // hack gtkosx_application_sync_menubar(theApp); } #endif break; case BoxEnd: // XtManageChildren(&form, 1); // SqueezeIntoBox(&option[boxStart], i-boxStart, option[boxStart].max); hbox = oldHbox; top--; if(option[i].target) ((ButtonCallback*)option[i].target)(boxStart); // callback that can make sizing decisions break; case Break: breakType = option[i].min & SAME_ROW; top = height; // force next option to start in a new table break; case PopUp: top--; break; default: printf("GenericPopUp: unexpected case in switch. i=%d type=%d name=%s.\n", i, option[i].type, option[i].name); break; } } if(pane) gtk_box_pack_start (GTK_BOX (pane), table, TRUE, TRUE, 0); else gtk_table_resize(GTK_TABLE(table), top+1, r), gtk_box_pack_start (GTK_BOX (/*GTK_DIALOG (dialog)->vbox*/box), table, TRUE, TRUE, 0); option[i].handle = (void *) table; // remember last table in EndMark handle (for hiding Engine-Output pane). gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_NONE); /* Show dialog */ gtk_widget_show_all( dialog ); /* hide OK/cancel buttons */ if(!topLevel) { if((option[i].min & NO_OK)) { actionarea = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); gtk_widget_hide(actionarea); } else if((option[i].min & NO_CANCEL)) { button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT); gtk_widget_hide(button); } g_signal_connect (dialog, "response", G_CALLBACK (GenericPopDown), (gpointer)(intptr_t) dlgNr); } g_signal_connect (dialog, "delete-event", G_CALLBACK (GenericPopDown), (gpointer)(intptr_t) dlgNr); shellUp[dlgNr]++; if(dlgNr && wp[dlgNr]) { // if persistent window-info available, reposition if(wp[dlgNr]->x > 0 && wp[dlgNr]->y > 0) gtk_window_move(GTK_WINDOW(dialog), wp[dlgNr]->x, wp[dlgNr]->y); if(wp[dlgNr]->width > 0 && wp[dlgNr]->height > 0) gtk_window_resize(GTK_WINDOW(dialog), wp[dlgNr]->width, wp[dlgNr]->height); } return 1; // tells caller he must do initialization (e.g. add specific event handlers) } /* function called when the data to Paste is ready */ #ifdef TODO_GTK static void SendTextCB (Widget w, XtPointer client_data, Atom *selection, Atom *type, XtPointer value, unsigned long *len, int *format) { char buf[MSG_SIZ], *p = (char*) textOptions[(int)(intptr_t) client_data].choice, *name = (char*) value, *q; if (value==NULL || *len==0) return; /* nothing selected, abort */ name[*len]='\0'; strncpy(buf, p, MSG_SIZ); q = strstr(p, "$name"); snprintf(buf + (q-p), MSG_SIZ -(q-p), "%s%s", name, q+5); SendString(buf); XtFree(value); } #endif void SendText (int n) { #ifdef TODO_GTK char *p = (char*) textOptions[n].choice; if(strstr(p, "$name")) { XtGetSelectionValue(menuBarWidget, XA_PRIMARY, XA_STRING, /* (XtSelectionCallbackProc) */ SendTextCB, (XtPointer) (intptr_t) n, /* client_data passed to PastePositionCB */ CurrentTime ); } else SendString(p); #endif } void SetInsertPos (Option *opt, int pos) { if(opt->value > 80) ScrollToCursor(opt, pos); else gtk_editable_set_position(GTK_EDITABLE(opt->handle), pos); } void HardSetFocus (Option *opt) { FocusOnWidget(opt, 0); // second arg not used in GDK } xboard-4.7.3/gtk/xengineoutput.c0000644000175000001440000000751612262415351013602 00000000000000/* * Engine output (PV) * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include #include "common.h" #include "frontend.h" #include "backend.h" #include "dialogs.h" #include "xboard.h" #include "engineoutput.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif extern Option engoutOptions[]; // must go in header, but which? /* Module variables */ #ifdef TODO_GTK static Widget memoWidget; #endif static GdkPixbuf *iconsGTK[8]; static void ReadIcon (gchar *svgFilename, int iconNr) { char buf[MSG_SIZ]; snprintf(buf, MSG_SIZ, "%s/%s", SVGDIR, svgFilename); iconsGTK[iconNr] = gdk_pixbuf_new_from_file(buf, NULL); } void InitEngineOutput (Option *opt, Option *memo2) { // front-end, because it must have access to the pixmaps #ifdef TODO_GTK Widget w = opt->handle; memoWidget = memo2->handle; #endif ReadIcon("eo_White.svg", nColorWhite); ReadIcon("eo_Black.svg", nColorBlack); ReadIcon("eo_Unknown.svg", nColorUnknown); ReadIcon("eo_Clear.svg", nClear); ReadIcon("eo_Ponder.svg", nPondering); ReadIcon("eo_Thinking.svg", nThinking); ReadIcon("eo_Analyzing.svg", nAnalyzing); } void DrawWidgetIcon (Option *opt, int nIcon) { // as we are already in GTK front-end, so do GTK-stuff here if( nIcon != 0 ) gtk_image_set_from_pixbuf(GTK_IMAGE(opt->handle), GDK_PIXBUF(iconsGTK[nIcon])); } void InsertIntoMemo (int which, char * text, int where) { char *p; GtkTextIter start; /* the backend adds \r\n, which is needed for winboard, * for xboard we delete them again over here */ if(p = strchr(text, '\r')) *p = ' '; GtkTextBuffer *tb = (GtkTextBuffer *) (engoutOptions[which ? 12 : 5].handle); // gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(tb), &start); gtk_text_buffer_get_iter_at_offset(tb, &start, where); gtk_text_buffer_insert(tb, &start, text, -1); if(where < highTextStart[which]) { // [HGM] multiPVdisplay: move highlighting int len = strlen(text); highTextStart[which] += len; highTextEnd[which] += len; } } //------------------------------- pane switching ----------------------------------- void ResizeWindowControls (int mode) { // another hideous kludge: to have only a single pane, we resize the // second to 5 pixels (which makes it too small to display anything) if(mode) gtk_widget_show(engoutOptions[13].handle); else gtk_widget_hide(engoutOptions[13].handle); } xboard-4.7.3/readme.htm0000644000175000001440000002175512262415351011703 00000000000000 Tinkering with Winboard
by Alessandro Scotti

Last update: March 22, 2005.

This readme is about some modifications I made to Winboard 4.2.7. Some will work in Xboard too, while others are for Winboard only. Regardless, everything here is absolutely experimental and has been tested very little... so no warranties ok?

All modified sources are included in this archive, the rest can be downloaded from Tim Mann's Xboard page. Please feel free to take my changes and use them as you like, they are released under the GPL.

Game adjudication

User can adjudicate a game between two machines, using the "Action" menu. Note that this only works if two machines are playing.

Also, it is possible to adjudicate a game automatically with this parameter:

/adjudicateLossThreshold=-700

if set to a negative value, Winboard will adjudicate a game if a engine can't get a score above the specified threshold for 3 full moves (6 plies). Note that both engines must agree on the score value, and also the game is only adjudicated after the last move from the losing engine.

Adjudication is still under test!

Background textures

Add the following to winboard.ini:

/liteBackTextureFile="sandstone_w.bmp"
/darkBackTextureFile="sandstone_b.bmp"
/liteBackTextureMode=1
/darkBackTextureMode=1

Of course you can choose any file you like for texturing the light and dark squares, as long as it's a valid BMP (Windows bitmap) file.

Valid texture modes are 1 (default) and 2. In mode 1 the squares are taken from portions of the texture bitmap and copied without further processing. In mode 2, squares can also be rotated, mirrored and so on in order to provide a little more variety to the texture. The operations are selected at random so the board will look slightly different every time the program is run.

Note: to "comment out" a filename, put an asterisk in front of it, i.e. "*sandstone.bmp" will be skipped.

Additionally it is possible to override the size of the "gap" between the squares, which is otherwise selected automatically. Add this to winboard.ini:

/overrideLineGap=2

I have added this because textures usually look better with a smaller or no gap. Any negative value will ignore the override and use the standard value from Winboard.

The combination of these parameters can produce very interesting effects, see for example Alex Guerrero's page.

Font-based rendering of chess pieces

It is possible to use chess fonts to draw pieces, in place of the usual bitmaps. You have to specify the font name by adding the following to winboard.ini:

/renderPiecesWithFont="Chess Leipzig"

Chances are the program will automatically recognize the font and select the proper mapping, i.e. the correspondence between a chess piece and the corresponding font character. So if the board looks good you're set and there's nothing else to do, otherwise you'll have to find the proper mapping and tell it to the program with  this setting:

/fontPieceToCharTable="phbrqkojntwl"

The piece are in order: white pawn, knight, bishop, rook, queen, king and black pawn, knight, bishop, rook, queen, king. So the example above tells the program to use the letter "p" for a white pawn, the letter "h" for a white knight, the letter "t" for a black rook and so on.

Note: to "comment out" a font name, put an asterisk in front of it, i.e. "*Chess Merida" will be skipped because of the asterisk.

It is possible to customize the font foreground and background color, with these settings:

/fontPieceBackColorWhite=#ffffcc
/fontPieceForeColorWhite=#402010
/fontPieceBackColorBlack=#ffffcc
/fontPieceForeColorBlack=#301008

Colors are expressed in RGB notation. If you are not familiar with the RGB notation  I would suggest to leave them alone until I manage to update the GUI. In this case, the program will take the board settings as for the usual piece set.

It is also possible to control the size of the piece with respect to the square, for example this entry:

/fontPieceSize=80

tells the program to make the pieces about 20% smaller than a square (i.e. the piece size is 80%). Note that different fonts may require different values for this parameter. Usually values in the 70-80 range provide the best values, however the program accepts anything from 50 to 150.

Font-based pieces are automatically given a "roundish" look. For now, this option is not mapped to a user-definable setting.

Fast clipboard pasting

Press Ctrl-V to paste a PGN game or a FEN position from the clipboard, the program will try to autodetect the proper type.

Thread initialization bug

I've tried to fix a bug reported (and fixed) by Anastasios Milikas (of AICE), where a thread could try to access a not yet initialized variable. I've used a different approach here, where threads are started in a "suspended" state and then released only when the variable has been initialized (this has the advantage of putting all the required fix code in one place, and the disadvantage of not having been tested by Anastasios).

Protection from some buffer overflows

In just a few cases, I've tried to put some guard against buffer overflows. These are just quick attempts... a lot more work would be needed to provide some measurable benefits. I hope that bug **353 is finally fixed now. The buffer overflows were propagated across several functions so as soon as one was fixed another would crash!

Absolute scores can be converted to relative

Some engines (e.g. Crafty, Delphi) always report scores from the white side (i.e. absolute), rather than the engine side (i.e. relative). This leads to confusion and breaks features such as automatic adjudication. In order to convert the scores to relative add the following to winboard.ini:

/firstScoreAbs=false

If true, the score of the first program is absolute and will be negated when playing black. And similarly:

/secondScoreAbs=false

if true, the score of the second program is absolute and will be negated when playing black.

Engine search info can be saved in a PGN file

Add the following to winboard.ini:

/pgnExtendedInfo=true

If true, and the PGN save game option is enabled, each move will be followed by a comment  containing the engine score and thinking depth (when available).

Note: can also be set from the General options dialog.

Engine search info can be hidden in human-computer games

When "show thinking" is disabled, engine thinking is not generated at all, rather than simply hidden. It is now possible to generate the think lines (e.g. for logging or saving in the PGN) yet hide them when the engine is playing against a human player. Add the following to winboard.ini:

/hideThinkingFromHuman=true

Note: can also be set from the General options dialog.

Asymmetric time controls

Very experimental! You can enter two time controls in the usual dialog, separated by "/". If so, white will be assigned the first time and black the second. So for example "0:30/2:00" will give 30 seconds to white and 2 minutes to black.

Note: for now these times stay with black and white, rather than the corresponding player.

User interface

Options to "hide thinking from human" and "save extended info in PGN" now appears in the "General" options dialog.

xboard-4.7.3/childio.c0000644000175000001440000001657312262415351011515 00000000000000/* * childio.c -- set up communication with child processes * * Copyright 1991 by Digital Equipment Corporation, Maynard, * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, * 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: * ------------------------------------------------------------------------ * All Rights Reserved * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose and without fee is hereby granted, * provided that the above copyright notice appear in all copies and that * both that copyright notice and this permission notice appear in * supporting documentation, and that the name of Digital not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * ------------------------------------------------------------------------ * * The following terms apply to the enhanced version of XBoard * distributed by the Free Software Foundation: * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * *------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ /* This file splits into two entirely different pieces of code depending on whether USE_PTYS is 1. The whole reason for all the pty nonsense is that select() does not work on pipes in System-V derivatives (at least some of them). This is a problem because XtAppAddInput works by adding its argument to a select that is done deep inside Xlib. */ #include "config.h" #include #include #if HAVE_UNISTD_H # include #endif #include "common.h" #include "frontend.h" #include "backend.h" /* for safeStrCpy */ #if !USE_PTYS /* This code is for systems where pipes work properly */ void SetUpChildIO (int to_prog[2], int from_prog[2]) { signal(SIGPIPE, SIG_IGN); pipe(to_prog); pipe(from_prog); } #else /* USE_PTYS == 1 */ /* This code is for all systems where we must use ptys */ #include #include #include #if HAVE_STROPTS_H # include #endif /* HAVE_STROPTS_H */ #if HAVE_SYS_FCNTL_H # include #else /* not HAVE_SYS_FCNTL_H */ # if HAVE_FCNTL_H # include # endif /* HAVE_FCNTL_H */ #endif /* not HAVE_SYS_FCNTL_H */ int PseudoTTY P((char pty_name[])); int SetUpChildIO (int to_prog[2], int from_prog[2]) { char pty_name[MSG_SIZ]; if ((to_prog[1] = PseudoTTY(pty_name)) == -1) { DisplayFatalError("Can't open pseudo-tty", errno, 1); ExitEvent(1); } from_prog[0] = to_prog[1]; to_prog[0] = from_prog[1] = open(pty_name, O_RDWR, 0); #if HAVE_STROPTS_H /* do we really need this?? pipe-like behavior is fine */ if (ioctl (to_prog[0], I_PUSH, "ptem") == -1 || ioctl (to_prog[0], I_PUSH, "ldterm") == -1 || ioctl (to_prog[0], I_PUSH, "ttcompat") == -1) { # ifdef NOTDEF /* seems some systems don't have or need ptem and ttcompat */ DisplayFatalError("Can't ioctl pseudo-tty", errno, 1); ExitEvent(1); # endif /*NOTDEF*/ } #endif /* HAVE_STROPTS_H */ } #if HAVE_GRANTPT /* This code is for SVR4 */ int PseudoTTY (char pty_name[]) { extern char *ptsname(); char *ptss; int fd; fd = open("/dev/ptmx", O_RDWR); if (fd < 0) return fd; if (grantpt(fd) == -1) return -1; if (unlockpt(fd) == -1) return -1; if (!(ptss = ptsname(fd))) return -1; safeStrCpy(pty_name, ptss, sizeof(pty_name)/sizeof(pty_name[0])); return fd; } #else /* not HAVE_GRANTPT */ #if HAVE__GETPTY /* This code is for IRIX */ int PseudoTTY (char pty_name[]) { int fd; char *ptyn; ptyn = _getpty(&fd, O_RDWR, 0600, 0); if (ptyn == NULL) return -1; safeStrCpy(pty_name, ptyn, sizeof(pty_name)/sizeof(pty_name[0])); return fd; } #else /* not HAVE__GETPTY */ #if HAVE_LIBSEQ /* This code is for Sequent DYNIX/ptx. Untested. --tpm */ int PseudoTTY (char pty_name[]) { int fd; char *slave, *master; fd = getpseudotty(&slave, &master); if (fd < 0) return fd; safeStrCpy(pty_name, slave, sizeof(pty_name)/sizeof(pty_name[0])); return fd; } #else /* not HAVE_LIBSEQ */ /* This code is for all other systems */ /* The code is adapted from GNU Emacs 19.24 */ #ifndef FIRST_PTY_LETTER #define FIRST_PTY_LETTER 'p' #endif #ifndef LAST_PTY_LETTER #define LAST_PTY_LETTER 'z' #endif int PseudoTTY (char pty_name[]) { struct stat stb; register c, i; int fd; /* Some systems name their pseudoterminals so that there are gaps in the usual sequence - for example, on HP9000/S700 systems, there are no pseudoterminals with names ending in 'f'. So we wait for three failures in a row before deciding that we've reached the end of the ptys. */ int failed_count = 0; #ifdef PTY_ITERATION PTY_ITERATION #else for (c = FIRST_PTY_LETTER; c <= LAST_PTY_LETTER; c++) for (i = 0; i < 16; i++) #endif { #ifdef PTY_NAME_SPRINTF PTY_NAME_SPRINTF #else sprintf (pty_name, "/dev/pty%c%x", c, i); #endif /* no PTY_NAME_SPRINTF */ #ifdef PTY_OPEN PTY_OPEN; #else /* no PTY_OPEN */ if (stat (pty_name, &stb) < 0) { failed_count++; if (failed_count >= 3) return -1; } else failed_count = 0; fd = open (pty_name, O_RDWR, 0); #endif /* no PTY_OPEN */ if (fd >= 0) { /* check to make certain that both sides are available this avoids a nasty yet stupid bug in rlogins */ #ifdef PTY_TTY_NAME_SPRINTF PTY_TTY_NAME_SPRINTF #else sprintf (pty_name, "/dev/tty%c%x", c, i); #endif /* no PTY_TTY_NAME_SPRINTF */ #ifndef UNIPLUS if (access (pty_name, 6) != 0) { close (fd); continue; } #endif /* not UNIPLUS */ #ifdef IBMRTAIX /* On AIX, the parent gets SIGHUP when a pty attached child dies. So, we ignore SIGHUP once we've started a child on a pty. Note that this may cause xboard not to die when it should, i.e., when its own controlling tty goes away. */ signal(SIGHUP, SIG_IGN); #endif /* IBMRTAIX */ return fd; } } return -1; } #endif /* not HAVE_LIBSEQ */ #endif /* not HAVE__GETPTY */ #endif /* not HAVE_GRANTPT */ #endif /* USE_PTYS */ xboard-4.7.3/nengineoutput.c0000644000175000001440000001333512262562252013002 00000000000000/* * Engine output (PV) * * Author: Alessandro Scotti (Dec 2005) * * Copyright 2005 Alessandro Scotti * * Enhancements Copyright 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. * * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * GNU XBoard is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * ------------------------------------------------------------------------ ** See the file ChangeLog for a revision history. */ #include "config.h" #include #include #include #include #if STDC_HEADERS # include # include #else /* not STDC_HEADERS */ extern char *getenv(); # if HAVE_STRING_H # include # else /* not HAVE_STRING_H */ # include # endif /* not HAVE_STRING_H */ #endif /* not STDC_HEADERS */ #if HAVE_UNISTD_H # include #endif #include "common.h" #include "frontend.h" #include "backend.h" #include "dialogs.h" #include "menus.h" #include "engineoutput.h" #include "gettext.h" #ifdef ENABLE_NLS # define _(s) gettext (s) # define N_(s) gettext_noop (s) #else # define _(s) (s) # define N_(s) s #endif /* Module variables */ int windowMode = 1; char *mem1, *mem2; // dummies, as this dialog can never be OK'ed int highTextStart[2], highTextEnd[2]; int MemoProc P((Option *opt, int n, int x, int y, char *text, int index)); Option engoutOptions[] = { { 0, LL|T2T, 17, NULL, NULL, NULL, NULL, Icon, " " }, { 0, L2L|T2T|SAME_ROW, 163, NULL, NULL, NULL, NULL, Label, N_("engine name") }, { 0, T2T|SAME_ROW, 30, NULL, NULL, NULL, NULL, Icon, " " }, { 0, R2R|T2T|SAME_ROW, 188, NULL, NULL, NULL, NULL, Label, N_("move") }, { 0, RR|T2T|SAME_ROW, 80, NULL, NULL, NULL, NULL, Label, N_("NPS") }, {200, T_VSCRL | T_TOP, 500, NULL, (void*) &mem1, "", (char**) MemoProc, TextBox, "" }, { 0, 0, 0, NULL, NULL, "", NULL, Break , "" }, { 0, LL|T2T, 17, NULL, NULL, NULL, NULL, Icon, " " }, { 0, L2L|T2T|SAME_ROW, 163, NULL, NULL, NULL, NULL, Label, N_("engine name") }, { 0, T2T|SAME_ROW, 30, NULL, NULL, NULL, NULL, Icon, " " }, { 0, R2R|T2T|SAME_ROW, 188, NULL, NULL, NULL, NULL, Label, N_("move") }, { 0, RR|T2T|SAME_ROW, 80, NULL, NULL, NULL, NULL, Label, N_("NPS") }, {200, T_VSCRL | T_TOP, 500, NULL, (void*) &mem2, "", (char**) MemoProc, TextBox, "" }, { 0, NO_OK, 0, NULL, NULL, "", NULL, EndMark , "" } }; int MemoProc (Option *opt, int n, int x, int y, char *text, int index) { // user callback for mouse events in memo static int pressed; // keep track of button 3 state int start, end, currentPV = (opt != &engoutOptions[5]); switch(n) { case 0: // pointer motion if(!pressed) return FALSE; // only motion with button 3 down is of interest MovePV(x, y, 500/*lineGap + BOARD_HEIGHT * (squareSize + lineGap)*/); break; case 3: // press button 3 pressed = 1; if(LoadMultiPV(x, y, text, index, &start, &end, currentPV)) { highTextStart[currentPV] = start; highTextEnd[currentPV] = end; HighlightText(&engoutOptions[currentPV ? 12 : 5], start, end, TRUE); } break; case -3: // release button 3 pressed = 0; if(highTextStart[currentPV] != highTextEnd[currentPV]) HighlightText(&engoutOptions[currentPV ? 12 : 5], highTextStart[currentPV], highTextEnd[currentPV], FALSE); highTextStart[currentPV] = highTextEnd[currentPV] = 0; UnLoadPV(); break; default: return FALSE; // not meant for us; do regular event handler } return TRUE; } void SetIcon (int which, int field, int nIcon) { // first call into xengineoutput.c to pick up icon pixmap if( nIcon ) DrawWidgetIcon(&engoutOptions[STRIDE*which + field - 1], nIcon); } void DoSetWindowText (int which, int field, char *s_label) { SetWidgetLabel (&engoutOptions[STRIDE*which + field - 1], s_label); } void SetEngineOutputTitle (char *title) { SetDialogTitle(EngOutDlg, title); } void DoClearMemo (int which) { SetWidgetText(&engoutOptions[STRIDE*which + MEMO], "", -1); } void EngineOutputPopUp () { static int needInit = TRUE; static char *title = N_("Engine output"); if (GenericPopUp(engoutOptions, _(title), EngOutDlg, BoardWindow, NONMODAL, appData.topLevel)) { if(engoutOptions[STRIDE-1].type != Break) DisplayFatalError(_("Mismatch of STRIDE in nengineoutput.c\nChange and recompile!"), 0, 2); AddHandler(&engoutOptions[MEMO], EngOutDlg, 6); AddHandler(&engoutOptions[MEMO+STRIDE], EngOutDlg, 6); if( needInit ) { InitEngineOutput(&engoutOptions[0], &engoutOptions[MEMO]); // make icon bitmaps needInit = FALSE; } SetEngineColorIcon( 0 ); SetEngineColorIcon( 1 ); SetEngineState( 0, STATE_IDLE, "" ); SetEngineState( 1, STATE_IDLE, "" ); } else { SetIconName(EngOutDlg, _(title)); SetDialogTitle(EngOutDlg, _(title)); } MarkMenu("View.EngineOutput", EngOutDlg); ShowThinkingEvent(); // [HGM] thinking: might need to prompt engine for thinking output } int EngineOutputIsUp () { return shellUp[EngOutDlg]; } int EngineOutputDialogExists () { return DialogExists(EngOutDlg); } void EngineOutputProc () { if (!PopDown(EngOutDlg)) EngineOutputPopUp(); } xboard-4.7.3/stamp-vti0000644000175000001440000000014212262562277011600 00000000000000@set UPDATED 6 January 2014 @set UPDATED-MONTH January 2014 @set EDITION 4.7.3 @set VERSION 4.7.3